Языковое моделирование

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

Задача

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

Ноутбук

(ноутбук проекта)

Выводы

В данном проекте мы решали задачу языкового моделирования. Мы обучили несколько нейросетевых моделей предсказывать слова на основе предыдущего текста. Качество предсказаний мы оценивали по перплексии. Обучение моделей производилось на наборе данных, составленном из комментариев на сервисе IMDB.

Мы предобработали данные, разбили их на отдельные предложения и сформировали словарь из 40 тысяч наиболее часто встречающихся слов. В этот словарь мы также добавили служебные слова-токены:

  • <unk> — токен для замены слов, отсутствующих в словаре (unknown)
  • <bos> — токен начала предложения (begin of sentence)
  • <eos> — токен конца предложения (end of sentence)
  • <pad> — токен паддинга (padding)

Полученные таким образом данные были собраны в модуль, содержащий обучающую, валидационную и тестовую выборки.

Для проведения экспериментов мы описали класс базовой модели. Базовая модель была представлена следующими слоями:

  • слой эмбедингов
  • рекуррентный слой (RNN, LSTM или GRU)
  • слой нормализации
  • линейный слой с dropout
  • нелинейный слой
  • слой получения предсказаний

Взяв за основу базовую модель мы провели следующие эксперименты:

  1. сравнили архитектуры RNN, LSTM и GRU
  2. попробовали использовать предобученные эмбединги на основе векторов FastText
  3. попробовали увеличить размер скрытого представления
  4. увеличили количество рекуррентных слоёв и добавили dropout

Результаты экспериментов представлены в таблице:

Модель Перплексия Сгенерированное предложение
RNN 103.24 <bos> the movie is a bit of a movie that is not a good movie . <eos>
LSTM 94.20 <bos> the movie is a bit of a very good film . <eos>
GRU 95.09 <bos> the movie is a bit slow , and it 's not a good movie . <eos>
LSTM + FastText 90.92 <bos> the movie is a bit slow , but it 's not funny . <eos>
LSTM + FT, hidden_dim: 512 86.75 <bos> the movie is a very good movie . <eos>
LSTM + FT, hidden_dim: 1024 87.86 <bos> the movie is a bit of a letdown . <eos>
LSTM + FT, h_d: 512, n_layers: 2, dropout 83.67 <bos> the movie is a bit slow and the pace is very slow and the story is very good . <eos>

Из вышеприведённой таблицы видно, что наименьшего значения целевой метрики на валидационных данных удалось достичь при использовании двухслойной LSTM с dropout с предобученными эмбедингами, полученными на основе векторов FastText, и увеличенным скрытым представлением. Данная модель была использована для получения значения перплексии на тестовых данных: 83.78, что немногим больше значения на валидационных данных.

Из таблицы также видно, что все модели генерируют текст, похожий на осмысленный, но довольно странный. Единственное исключение — <bos> the movie is a bit of a letdown . <eos>. Это может быть связано с тем, что во всех случаях мы использовали жадный алгоритм выбора следующего слова, возможно применение других алгоритмов позволило бы немного повысить качество создаваемого текста. Кроме того, можно попробовать обучить нашу модель на расширенной выборке, в которую можно включить 50 тысяч комментариев из набора unsupervised. Однако для получения наилучших результатов следует использовать более современные модели на основе механизма внимания, например, трансформеры.