TL;DR
Полузамороженные вложения разбивают предварительно обученные вложения на две группы: обучаемая группа и afзамороженная группа, так что слова, отсутствующие в исходном предварительно обученном словаре, могут тренироваться, пока остальные остаются замороженными.
Код доступен здесь.
Введение и постановка проблемы
Идея переносного обучения заключается в том, чтобы взять современную модель, предварительно обученную на массивном наборе данных, а затем настроить ее для новой связанной задачи, когда обучающих данных недостаточно для обучения. аналогичная модель. Трансферное обучение набирает все большую популярность в мире НЛП с такими моделями, как BERT, Elmo и ULMFit, демонстрирующими огромный потенциал.
Справедливости ради, трансферное обучение существует уже довольно давно, но в более спокойной обстановке — с использованием предварительно обученных вложений слов.
К сожалению, существует огромная проблема — особенно при переносе знаний из одной области в другую — проблема несоответствия словарного запаса. Очень часто целевой домен содержит слова, которые весьма специфичны и важны, но отсутствуют в исходном домене. Очень важно включить эти слова в модель, но их отсутствие в предварительно обученном словаре встраивания делает это проблематичным.
Есть три очевидных варианта их моделирования:
- Откажитесь от предварительно обученных вложений, начните с нуля с помощью случайной инициализации.
- Установите для неизвестных слов среднее значение предварительно обученных вложений и зафиксируйте их
- Установите для неизвестных слов среднее значение предварительно обученных вложений и разморозьте весь слой
Все они имеют свои недостатки:
Вариант 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 примеров.
Вывод
Полузамороженные вложения можно использовать для точной настройки предварительно обученного встраивания слов в новый домен, оставляя исходные вложения слов неизменными.
Этот подход более стабилен, чем размораживание всего слоя встраивания, и помогает избежать переобучения.