«На протяжении десятилетий подходы к машинному обучению, ориентированные на проблемы обработки естественного языка, основывались на неглубоких моделях (например, SVM и логистическая регрессия), обученных на очень многомерных и разреженных функциях. В последние несколько лет нейронные сети, основанные на плотных векторных представлениях, показали превосходные результаты в различных задачах НЛП. Эта тенденция вызвана успехом встраивания слов и методов глубокого обучения ». [1]

В этом посте мы узнаем, как использовать предварительно обученные векторы GloVe в качестве входных данных для нейронных сетей для выполнения задач НЛП в PyTorch.

Перчатка

Вместо того, чтобы обучать наши собственные векторы слов с нуля, мы будем использовать GloVe. Его авторы выпустили четыре текстовых файла со словесными векторами, обученными на различных массивных наборах веб-данных. Их можно скачать здесь.

Мы будем использовать Wikipedia 2014 + Gigaword 5, самый маленький файл (glove.6B.zip) размером 822 МБ. Он был обучен на корпусе из 6 миллиардов токенов и содержит словарь в 400 тысяч токенов.

После распаковки загруженного файла мы находим четыре текстовых файла: glove.6B.50d.txt, glove.6B.100d.txt, glove.6B.200d.txt, glove.6B.300d.txt. Как следует из их названий файлов, у них есть векторы с разными размерами. Мы выбираем самый маленький из слов, представленных векторами dim 50 («glove.6B.50d.txt»).

Если мы напечатали содержимое файла на консоли, мы могли бы увидеть, что каждая строка содержит в качестве первого элемента слово, за которым следуют 50 действительных чисел. Например, это первые две строки, соответствующие токенам «the» и «,»:

the 0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862 -0.00066023 -0.6566 0.27843 -0.14767 -0.55677 0.14658 -0.0095095 0.011658 0.10204 -0.12792 -0.8443 -0.12181 -0.016801 -0.33279 -0.1552 -0.23131 -0.19181 -1.8823 -0.76746 0.099051 -0.42125 -0.19526 4.0071 -0.18594 -0.52287 -0.31681 0.00059213 0.0074449 0.17778 -0.15897 0.012041 -0.054223 -0.29871 -0.15749 -0.34758 -0.045637 -0.44251 0.18785 0.0027849 -0.18411 -0.11514 -0.78581
, 0.013441 0.23682 -0.16899 0.40951 0.63812 0.47709 -0.42852 -0.55641 -0.364 -0.23938 0.13001 -0.063734 -0.39575 -0.48162 0.23291 0.090201 -0.13324 0.078639 -0.41634 -0.15428 0.10068 0.48891 0.31226 -0.1252 -0.037512 -1.5179 0.12612 -0.02442 -0.042961 -0.28351 3.5416 -0.11956 -0.014533 -0.1499 0.21864 -0.33412 -0.13872 0.31806 0.70358 0.44858 -0.080262 0.63003 0.32111 -0.46765 0.22786 0.36034 -0.37818 -0.56657 0.044691 0.30392

Нам нужно проанализировать файл, чтобы получить в качестве вывода: список слов, словарь, сопоставляющий каждое слово с их идентификатором (позицией) и массив векторов.

Учитывая, что в словаре есть 400k токенов, мы будем использовать bcolz для хранения массива векторов. Он предоставляет столбчатые контейнеры данных с фрагментами, которые можно сжимать как в памяти, так и на диске. Он основан на NumPy и использует его как стандартный контейнер данных для связи с объектами bcolz.

Затем мы сохраняем выходные данные на диск для использования в будущем.

Используя эти объекты, мы теперь можем создать словарь, который по заданному слову возвращает его вектор.

Например, давайте получим вектор для слова «the»:

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

PyTorch

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

Мы уже создали словарь Python с аналогичными характеристиками, но он не поддерживает автоматическое дифференцирование, поэтому не может использоваться в качестве слоя нейронной сети и также был построен на основе словаря GloVe, который, вероятно, отличается от словаря нашего набора данных. В PyTorch слой внедрения доступен через класс torch.nn.Embedding.

Мы должны построить матрицу весов, которая будет загружена в слой внедрения PyTorch. Его форма будет равна:

(длина словаря набора данных, размерность векторов слов).

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

Теперь мы создаем нейронную сеть со слоем встраивания в качестве первого слоя (мы загружаем в него матрицу весов) и слоем GRU. При выполнении прямого прохода мы должны сначала вызвать слой внедрения.

использованная литература

[1] Молодой Том, Хазарика Деваманью, Пория Суджанья, Камбрия Эрик. 2017. Последние тенденции в обработке естественного языка на основе глубокого обучения .

Шолле Франсуа. Глубокое обучение с помощью Python. 2017.