Козиев Илья (kelijah) wrote,
Козиев Илья
kelijah

Categories:

На каком слое BERT'а самые лучшие эмбеддинги токенов?

Как побочный результат некоторых экспериментов с эмбеддингами предложений получен вот такой не совсем очевидный заранее результат.
Берем модель BERT, точнее выходы ее последнего слоя, без усреднения.
По сути, получаем для каждого входного токена контексто-зависимый эмбеддинг.
Далее, упаковываем эту последовательность векторов токенов в вектор предложения с помощью LSTM.
И ставим финальный декодер - из полученного вектора предложения восстанавливаем входной список токенов.
Получается несимметричный автоэнкодер. На входе у него - токены BPE, на выходе - они же:


Сюрприз обнаруживается, если проверить, как влияет количество трансформеров (или в общем случае сложность BERT) на качество получающегося автоэнкодера.
Для экспериментов надо уметь делать модели BERT разной сложности, и сравнивать их с дефолтной конфигурацией (768 на эмбеддинг токена, 12 трансформеров и т.д.). Я использовал библиотеку keras-bert, чтобы быстро тренировать BERT с заданной конфигураций на своем датасете диалоговых данных. Диалоговые данные нужны, чтобы работала NSP objective в стандартной схеме тренировки BERT'а.


На русскоязычной модели BERT от DeepPavlov описываемый эффект тоже есть, но из-за большого размера модели исследовать его намного труднее :(
Важно заметить, что архитектура автоэнкодеров *после* BERT'а для всех случаев взята одинаковой. В частности, вектор предложения = 64. Это сделано, что чтобы устранить влияние емкости этой части на кривую обучения автоэнкодера.
Слои претренированной BERT замораживаются, когда обучается автоэнкодер. Таким образом, BERT выступает только в роли поставщика эмбеддингов BPE токенов.
В итоге, обучение энкодеров во всех случаях идентично по сложности, и на качество автоэнкодера влияет только содержание эмбеддингов токенов.


Пример предложений на выходе такого автоэнкодера, где видны ошибки:




Теперь результаты
Прослеживается четкая зависимость - чем проще BERT, тем точнее работает автоэнкодер на ее основе.
Показаны результаты для сеток, начиная с вырожденного случая BERT'а с одним трансформером.
График log loss'а для валидационной порции данных (чем ниже кривая, тем лучше):

По оси абсцисс везде дается количество эпох тренировки автоэнкодера.
Видно, что синяя линяя, соответствующая самой простой архитектуре BERT, расположена ниже всех, и по мере увеличения сложности
BERT кривая функции потерь идет все выше, то есть автоэнкодер работет хуже.
А вот доля предложений, которые полностью правильно восстановлены на выходе автоэнкодера (чем выше кривая, чем лучше):
Опять синяя линия соответствует самой простой архитектуре BERT. Чем проще BERT, тем больше доля правильно кодируемых и декодируемых предложений.
Аналогично ведет себя похожесть цепочки токенов на выходе автоэнкодера и входной цепочки (коэф. Жаккара):
То есть всё выглядит так, что наращивание числа трансформеров в BERT все сильнее размывает информацию о каждом слове.


Как влияет batch size


Все результаты я получал с batch_size=100.


Любопытства ради посмотрел, как ведет себя обучение автоэнкодера для самой простой архитектуры BERT при трех разных значениях размера батча. Тут все не так однозначно:


В целом, небольшой батч ожидаемого увеличивает рандомность обучения.
Похожие работы
Репозиторий https://github.com/RussianNLP/rusenteval содержит инструменты для исследования эмбеддингов на некоторых лингвистических
задачах типа определения грамматического рода или части речи по слоям моделей.
Вот с этого момента в презентации Татьяна Шаврина поясняет суть и результаты пробинга: https://www.youtube.com/watch?v=RqPW2E6PhTk&t=4147s
Исходные тексты для воспроизведения экспериментов
1. Обучение BERT с заданной конфигурацией: https://gist.github.com/Koziev/9b09420113db7050c1f8aa934c74566e
2. Тренировка автоэнкодера с использование обученной в п.1 модели BERT, сохранение кривых обучения и и.д.: https://gist.github.com/Koziev/abfd79b23b58d369da042ec8b5f93cda
3. Тренировка автоэнкодера с использованием предобученной модели BERT от DeepPavlov или мультиязычной от Google.: https://gist.github.com/Koziev/1ce6c9db4d73563ef3274e482c3fd8e0
Tags: autoencoder, bert
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 3 comments