Использование torch.nn.Embedding для GloVe: следует ли настраивать вложения или просто использовать их как есть?

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

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

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

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

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

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

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


person pedjjj    schedule 30.10.2019    source источник


Ответы (2)


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

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

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

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

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

person gorjan    schedule 06.11.2019
comment
Если оптимальное количество эпох относительно невелико, например 3-5, вероятно, имеет смысл немедленно настроить вложения, не так ли? - person pedjjj; 06.11.2019
comment
Замечательный вопрос! Нет, совсем нет, вы можете обучить модель с замороженной матрицей вложения до сходимости (на самом деле, это рекомендуемый способ сделать это), а затем разморозить матрицу вложения и позволить модели тренироваться в течение пары эпох. - person gorjan; 06.11.2019
comment
Круто, спасибо! Есть ли у вас цитируемая ссылка на такую ​​процедуру? - person pedjjj; 06.11.2019
comment
Статья из Ховарда и Рудера (также включенная в ответ) является действительно хорошим источником для трансферного обучения в НЛП. Несмотря на то, что речь идет о тонкой настройке языковой модели, предлагаемые методы применимы и в других местах. - person gorjan; 06.11.2019
comment
Спасибо, очень полезно! :) - person pedjjj; 07.11.2019

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

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

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

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

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

person Stanislas Morbieu    schedule 03.11.2019