Нейросетевые модели для определения перефразировок вопросов (5)

Jul 01, 2017 09:00

[начало тут http://kelijah.livejournal.com/212124.html]
Использование word2vec встраиваний и обучаемость слоя Embedding
Для word-level моделей слова переводятся в понятную сетке числовую векторную форму с помощью слоя Embedding (https://keras.io/layers/embeddings/). Матрицу весов можно инициализировать случайными числами, а можно загрузить векторы из word2vec модели и инициализировать матрицу ими. Большинство сеточных решений в данном соревновании брали готовые модели GoogleNews-vectors-negative300.bin или glove.840B.300d.txt, которые можно свободно скачать (https://github.com/mmihaltz/word2vec-GoogleNews-vectors/blob/master/GoogleNews-vectors-negative300.bin.gz и https://nlp.stanford.edu/projects/glove/). Размерность векторов в этих моделях весьма значительна, поэтому сетки обучаются долго и требуют много памяти.

Я попробовал готовить векторную модель самостоятельно по текстовому корпусу, состоящему из англоязычной википедии с добавленным корпусом из текста вопросов соревнования. Идея была в том, что в тренировочном корпусе соревнования были слова, которых нет в упомянутых ранее готовых моделях. Это касается и опечаток, и разных терминов, названий моделей телефонов и так далее. Обучая свою word2vec модель на объединенном корпусе, мы получаем векторные встраивания для всех наших слов. Библиотека gensim (https://radimrehurek.com/gensim/), которую я использую для получения word2vec встраиваний, поддерживает замечательный способ обучать модель по нескольким тестовым корпусам, не объединяя физически многогигабайтные текстовые файлы. Создав простой класс-итератор, который будет последовательно вычитывать строки из нескольких текстовых файлов, мы подаем экземпляр этого класса на вход gensim.models.Word2Vec и получаем искомые встраивания. Код для этой вспомогательной задачи можно посмотреть на гитхабе https://github.com/Koziev/QuoraQuestionPairs/blob/master/w2v.py. Но эксперименты показали крайне неоднозначный результат использования своих самодельных встраиваний, даже с учетом меньшего размера векторов и, соответственно, меньших шансов получить переобучение. В итоге я тоже остановился на варианте использования готовых моделей.

Загрузив готовые векторы встраиваний слов в Embedding, мы оказываемся перед альтернативой: разрешать ли тонкую подстройку этих весов в ходе обратного распространения ошибок при обучении модели. Из общих соображений кажется, что такая тонкая подстройка улучшит качество, так как позволит адаптировать векторы под нашу конкретную задачу. Как ни странно, эксперименты опровергают это предположение. Задание параметра trainable=True для слоя Embedding в word-level моделях безусловно ухудшает результат и делает процесс обучения очень нестабильным.

Для char-level моделей, само собой, настройка встраиваний для символов является необходимой опцией.

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

соревнования, vector space model, gensim, kaggle, word2vec, vector model, python, word embedding, machine learning

Previous post Next post
Up