Использование torch.nn.Embedding для GloVe: мы должны точно настроить вложения или просто использовать их как есть? - PullRequest
1 голос
/ 30 октября 2019

в то время как переводное обучение / точная настройка современных языковых моделей, таких как BERT и XLNET, является очень распространенной практикой, как это происходит в GloVe?

По сути, я вижу два варианта использования GloVe для получения плотных векторных представлений, которые могут использоваться нижестоящими NN.

1) Тонкая настройка вложений GloVe (в терминах pytorch, с включенным градиентом)

2) Просто используйте вложения без градиента.

Например, учитывая матрицу вложений GloVe, я делаю

embed = nn.Embedding.from_pretrained(torch.tensor(embedding_matrix, dtype=torch.float))
...
dense = nn.Linear(...)

Лучше ли использовать только GloVe для получения векторапредставление (и только тренировать плотный слой и, возможно, другие слои), или была бы одна тонкая настройка матрицы вложений тоже?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Нет причин не настраивать вложения GloVe, чтобы получить лучший результат для вашего конечного задания, кроме случаев, когда вам нужно сохранить связь с другой моделью, которая использует исходные вложения (например, для интерпретации ваших результатов).

При тонкой настройке вложений для вашей целевой функции, вложения слов (потенциально) теряют свои начальные свойства (что хорошо подходит для задач подобия слов и аналогий).

Использование встраивания словпросто способ не инициализировать случайными векторами, поэтому имеет ли смысл сохранять фиксированные случайные векторы?

Есть несколько статей, которые точно настраивают вложения слов, например, эта: https://arxiv.org/abs/1505.07931

Я сделал предположение, что у вас достаточно тренировочных данных. В противном случае было бы лучше разрешить встраивание слова фиксированным, поскольку оно требует меньше параметров для обучения и, таким образом, позволяет избежать переобучения.

1 голос
/ 06 ноября 2019

Вы должны абсолютно точно настроить матрицу встраивания слов. Дело в том, что когда вы инициализируете матрицу встраивания слов вложения слов GloVe, ваши вложения слов уже будут захватывать большинство семантических свойств данных. Однако вы хотите, чтобы ваши вложения в слова были адаптированы к задаче, которую вы решаете, т.е. к конкретной задаче (отметьте Yang ). Теперь, предполагая, что у вас недостаточно данных в наборе данных, вы не можете самостоятельно изучить матрицу встраивания слов (если вы инициализируете матрицу встраивания слов случайными векторами). Из-за этого вы хотите инициализировать его с помощью векторов, которые были обучены на огромных наборах данных и являются общими.

Одна очень важная вещь, которую следует иметь в виду → Поскольку остальная часть вашей модели будет инициализироваться случайным образом,когда вы начинаете тренироваться, ваша матрица встраивания слов может пострадать от катастрофического забвения (проверьте работу Говарда и Рудера и Киркпатрика и др. ), то есть градиенты будут огромными, потому что ваша модель будет резконедостаточно данных для первых нескольких партий, и вы потеряете начальные векторы полностью. Вы можете преодолеть это следующим образом:

  1. Для первых нескольких эпох не нужно тонко настраивать матрицу встраивания слов, просто оставьте ее как есть: embeddings = nn.Embedding.from_pretrained(glove_vectors, freeze=True).

  2. После того, как остальная часть модели научится соответствовать вашим тренировочным данным, уменьшите скорость обучения, разморозьте ваш модуль встраивания embeddings.weight.requires_grad = True и продолжите обучение.

Следуя вышеупомянутым шагам, вы получите лучшее из обоих миров. Другими словами, ваши вложения слов будут по-прежнему фиксировать семантические свойства, в то же время адаптируясь к вашей последующей задаче. Наконец, есть работы (см., Например, Ye Zhang ), показывающие, что можно немедленно выполнить точную настройку, но я бы выбрал более безопасный вариант.

...