TL;DR

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

Код доступен здесь.

Введение и постановка проблемы

Идея переносного обучения заключается в том, чтобы взять современную модель, предварительно обученную на массивном наборе данных, а затем настроить ее для новой связанной задачи, когда обучающих данных недостаточно для обучения. аналогичная модель. Трансферное обучение набирает все большую популярность в мире НЛП с такими моделями, как BERT, Elmo и ULMFit, демонстрирующими огромный потенциал.

Справедливости ради, трансферное обучение существует уже довольно давно, но в более спокойной обстановке — с использованием предварительно обученных вложений слов.

К сожалению, существует огромная проблема — особенно при переносе знаний из одной области в другую — проблема несоответствия словарного запаса. Очень часто целевой домен содержит слова, которые весьма специфичны и важны, но отсутствуют в исходном домене. Очень важно включить эти слова в модель, но их отсутствие в предварительно обученном словаре встраивания делает это проблематичным.

Есть три очевидных варианта их моделирования:

  1. Откажитесь от предварительно обученных вложений, начните с нуля с помощью случайной инициализации.
  2. Установите для неизвестных слов среднее значение предварительно обученных вложений и зафиксируйте их
  3. Установите для неизвестных слов среднее значение предварительно обученных вложений и разморозьте весь слой

Все они имеют свои недостатки:
Вариант 1. отбрасывает любое понятие трансферного обучения.
Вариант 2. рассматривает все неизвестные слова одинаково и сохраняет их замороженными, поэтому неспособность эффективно смоделировать их.
В моих экспериментах вариант 3. в конечном итоге приведет к потере всех предыдущих знаний и переоснащению обучающего набора.

Поэтому я предлагаю компромисс: полузамороженные вложения. Модуль полузамороженных вложений разделит вложения на две группы: замороженную группу и обучаемую группу. замороженная группа будет состоять из предварительно обученных вложений слов и будет (да) заморожена — она НЕ будет обновляться во время обучения. Обучаемая группа будет содержать новые слова, которые необходимо настроить. Они инициализируются средним значением предварительно обученных вложений и обновляются в процессе обучения.

Я реализовал такой модуль в pytorch и оценил четыре метода на Hack the News datathon task 2, организованном Data Science Society. Простая модель bi-LSTM, использующая полузамороженные вложения, выводит нас на 3-е место в таблице лидеров (команда Antiganda)!

Модель была обучена с помощью потрясающей библиотеки fast.ai, а векторы слов перчатки использовались для предварительно обученных вложений. Пожалуйста, проверьте блокнот для получения дополнительной информации.

Эксперименты и результаты

Четыре модели были запущены в общей сложности в течение 16 эпох с размером пакета 64 и максимальным числом. скорость обучения 3e-3.

Что очевидно в модели, так это то, что модели Random init и Unfrozen быстро превосходят тренировочный набор по мере расхождения потерь при проверке.

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

Хотя в этом случае улучшение минимально, я считаю, что обучение на большем наборе данных принесет больше пользы — в этом случае у нас есть только 15 000 примеров.

Вывод

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

Этот подход более стабилен, чем размораживание всего слоя встраивания, и помогает избежать переобучения.