Word to vec алгоритм

Обновлено: 07.07.2024

В последнее время я работаю с несколькими проектами, связанными с НЛП на работе. Некоторые из них имели какое-то отношение к обучению компании внедрению слов в компании. На работе задачи в основном выполнялись с помощью библиотеки Python:gensim, Тем не менее, я решил реализовать модель Word2vec с нуля только с помощью Python и NumPy, потому что переосмысление колеса - это, как правило, отличный способ глубоко изучить что-то.

Встраивание слов ничего особенного, нометоды представления слов в числовой форме, Более конкретно, методы для отображения словарей на векторы.

Самым простым методом может быть использование однократного кодирования для сопоставления каждого слова с однократным вектором.

Хотя горячее кодирование довольно просто, есть несколько недостатков. Наиболее заметным является то, что этоне легко измерить отношения между словами математическим путем,

Word2vecпредставляет собой структуру нейронной сети, которая генерирует встраивание слов, обучая модель контролируемой проблеме классификации. Такой метод был впервые представлен в статьеЭффективная оценка словесных представлений в векторном пространстве by Mikolov et al., 2013, и было доказано, что он достаточно успешен в достижении встраивания слов, которое можно использовать для измерения синтаксического и семантического сходства между словами.

В работе Mikolov et al., 2013 были представлены две модельные архитектуры: модель Continuous Bag-of-Words и модель Skip-грамм. Я буду погружаться в последнее в этой статье.

Чтобы объяснить модель скип-граммы, я случайно цитирую фрагмент текста из книги, которую я сейчас читаю,Маленькая книга здравого смыслаДжон Богл:

После вычета затрат на инвестирование, победа на фондовом рынке - игра для проигравших.

Как я уже упоминал выше, это контролируемая проблема классификации, которую пытается оптимизировать модель word2vec. Более конкретно,учитывая «контекстное слово», мы хотим обучить модель так, чтобы модель могла предсказать «целевое слово», одно из слов появилось в пределах заранее определенного размера окна из контекстного слова.


Возьмем, к примеру, приведенное выше предложение, учитывая контекстное слово «инвестирование» и размер окна 5, и мы хотим, чтобы модель генерировала одно из базовых слов. (одно из слов в [вычет, издержки, избиение, акции, рынок,] в данном случае.)

Обзор модели

Ниже показана исходная диаграмма, представленная в статье Mikolov et al., 2013.

Я сделал еще один график с чуть более подробной информацией


Слой внедрения слов по сути представляет собой матрицу с формой (количество уникальных слов в корпусе, размер внедрения слов).Каждая строка матрицы представляет собой слово в корпусе, Размер вложения слова - это гиперпараметр, который нужно определить и который можно представить каксколько функций мы хотели бы использовать для представления каждого слова, Последняя часть модели представляет собой просто логистическую регрессию в форме нейронной сети.

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

Подготовка к тренировочным данным

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

Далее мы назначаем целое число каждому слову в качестве его идентификатора. Кроме того, используя word_to_id а также id_to_word записать отношения отображения.

В конце концов, мы генерируем обучающие данные для модели. Для каждого контекстного слова tokens[i] сгенерировать: (tokens[i], tokens[i-window_size]), . (tokens[i], tokens[i-1]), (tokens[i], tokens[i+1]), . (tokens[i], tokens[i+window_size]) , Взять контекстное слово investing с размером окна 5, например, мы будем генерировать (investing, deduction), (investing, of), (investing, the), (investing, costs), (investing, of), (investing, beating), (investing, the), (investing, stock), (investing, market), (investing, is) , Примечание. В коде обучающие пары (x, y) представлены в идентификаторах слов.

Ниже приведен код для генерации обучающих данных:

Обзор учебного процесса

После генерации обучающих данных давайте перейдем к модели. Подобно большинству моделей нейронных сетей, шаги для обучения модели word2vec:инициализация весов (параметров, которые мы хотим обучить), распространение вперед, вычисление стоимости, распространение назад и обновление весов.Весь процесс будет повторяться в течение нескольких итераций в зависимости от того, сколько эпох мы хотим обучить.

Инициализация параметров для обучения

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

Форма встраивания слова будет (vocab_size, emb_size) , Почему это? Если мы хотим использовать вектор с emb_size элементы, чтобы представить словарь и общее количество словарей нашего корпуса vocab_size, тогда мы можем представить все словари с vocab_size x emb_size матрица скаждая строка представляет слово,

Ниже приведен код для инициализации:

Прямой проход


Три шага в прямом распространении,получение векторного представления входного слова из встраивания слова,передавая вектор в плотный слойа потомприменение функции softmaxдо выхода плотного слоя.

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

Остальная часть процесса - просто мультиклассовая модель линейной регрессии.

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


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

Ниже приведен код для прямого распространения:

Расчет стоимости (л)

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


Ниже приведен код для расчета стоимости:

Обратный проход (обратное распространение)


Во время обратного распространения мы хотели бы рассчитатьградиенты обучаемых весов относительно функции потерьи обновите вес с соответствующим градиентом. Обратное распространение - это методы, используемые для расчета этих градиентов. Ничего особенного, ноПравило цепив исчислении:


Это веса в плотном слое и слое вложения слов, которые мы хотели бы тренировать. Поэтому нам нужно рассчитать градиенты для этих весов:



Следующим шагом является обновление весов с помощью следующей формулы:


Ниже приведен код для обратного распространения:

Примечание: вы, возможно, задавались вопросом, почему существует фактор 1/m в dL_dW пока не в dL_dword_vec , В каждом проходе мы обрабатываем m тренировочные примеры вместе. Для весов в плотном слое мы хотели бы обновить их с помощьюсреднийиз m градиентные спуски. Для весов в векторе слова каждый вектор имеет свои веса, которые приводят к его собственному градиентному спуску, поэтому нам не нужно агрегировать m градиентные спуски пока мы обновляем.

Модельное Обучение

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

Ниже приведен код для обучения модели:

оценка

После обучения модели данными, сгенерированными из приведенного выше примера предложения, с размером окна 3 для 5000 эпох (с простым затуханием скорости обучения), мы можем видеть, что модель может выводить большинство соседних слов по каждому слову в качестве входного слова.


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

Это мой первый средний пост. Спасибо ребята за чтение. Не стесняйтесь оставлять мне отзывы или задавать вопросы.

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

Когда я попытался обучить модель выше с большим набором данных, я обнаружил, что потребление памяти продолжало увеличиваться в процессе обучения, и ядро ​​python наконец-то закрылось. Позже я понял, что проблема связана с тем, как я накормил этикетки. Y в модель.

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

Проблема использования памяти исчезает после того, как я начну кормить этикетку только связанным словом ind. Мы сократили пространство с O (размер словарного запаса * м) до O (м)

Ниже приведена моя реализация кода (необходимо изменить только 2 места):

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

Спасибо, что прочитали больше. Опять же, пожалуйста, не стесняйтесь оставлять мне отзывы или задавать вопросы.


Статья, которая поможет вам разобраться в принципе работы и идее, стоящей за Word2Vec.

В предыдущей статье я рассказывал об основах NLP (Natural Language Processing — обработка естественного языка), и сегодня мы продолжим изучение этой темы.

Если вы еще не читали мою предыдущую статью, то советую вам сделать это: NLP - Text Encoding: A Beginner's Guide

Перед тем, как мы начнем, обратите внимание на несколько моментов, касаемых статьи:

Я использую в статье как полное название Word2Vec, так и сокращенное w2v.

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

Я не буду слишком углубляться в аспекты глубокого обучения w2v, потому как хотел бы, чтобы эта статья была кратким обзором процесса, его интуитивным объяснением.

Хорошо, теперь, когда мы обозначили все моменты, давайте начнем.

Word2Vec — буквально переводится как “слово, представленное в виде числового вектора”. В этом и заключается вся суть. Главный вопрос КАК это происходит? Что ж, в этом и кроется подвох. Без паники, позвольте мне разложить все вопросы по полочкам — мы во всем с вами разберемся.

Вопрос 1: Что такое w2v?

Вопрос 2: Каким образом модель фиксирует семантическое и синтаксическое сходство в векторах слов?

Здесь нужно объяснить многое, но я постараюсь не усложнять.

Сначала давайте разберемся, как мы можем понять семантическое сходство между двумя словами? Как объяснить то, что при преобразовании слов в числа расстояние расположения слов по отношению друг к другу зависит от сходства значения? Это несколько очевидных вопросов, ответить на которые мы сможем, когда поймем, что из себя представляют выходные данные модели, и как измерить близость. Затем мы узнаем, как создаются эти векторы.

Давайте разберем следующий пример:

возьмем 4 слова: King (король), Queen (королева), Man (мужчина), Woman (женщина).

Если бы я группировал похожие слова вместе, очевидно я бы сделал это следующим образом: (King, Man) и (Queen, Woman). А если, я бы группировал противоположные слова вместе, я бы сделал это так (King, Queen) и (Man, Woman).

Вы могли обратить внимание, что слово King схоже по значению с Man и противоположно Queen, а слово Queen схоже с Woman и противоположно King.

Теперь главный вопрос: как векторное представление сможет уловить эту суть?

Возможно ли это вообще? Да, это возможно.

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

Чаще всего метрики сходства делятся на две разные группы:

Метрики сходства:

Корреляция Пирсона
Корреляция Спирмена
Коэффициент корреляции Кендэлла
Коэффициент Охаи
Коэффициента Жаккарда

2. Метрики расстояния:

Евклидово расстояние
Манхэттенское расстояние

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

Вы можете представить это как:

1 - Расстояние = Сходство или

1 - Сходство = Расстояние.

Сходство и Расстояние обратно пропорциональны друг другу.

Итак, теперь мы понимаем принцип сравнения двух векторов по их сходству. Вернемся к нашему примеру с набором слов King, Queen, Man и Woman, наше общее понимание будет следующим:

Вектор слова King должен иметь высокий коэффициент сходства и меньшее расстояние с вектором слова Man, а вектор слова Queen должен иметь высокий коэффициент сходства и меньшее расстояние с вектором слова Woman и наоборот.

Для того, чтобы лучше понять это, взгляните на график:

Векторы слов в многомерном пространстве

Векторы слов в многомерном пространстве

Теперь мы знаем, как можно измерять синонимы и антонимы слов математическим способом.

Возникает главный вопрос: как получить наши целевые векторы?

Вопрос 3: Как w2v преобразует слова в числовые векторы, сохраняя семантическое значение?

Это можно сделать двумя способами, а именно:

CBOW: попытаться предсказать целевое слово, используя слова из контекста.

2. Skip-Gram: попытаться предсказать слова контекста, используя целевое слово.

Давайте об этом поподробнее:

Но прежде чем мы начнем, давайте обозначим ключевые слова и их значение:

Целевое слово (Target Word): слово, которое предсказывается.

Контекстное слово (Context Word): каждое слово в предложении, кроме целевого слова.

Размерность вложения (Embedding Dimension): количество измерений пространства векторов, в которые мы хотим преобразовать слова.

Разберемся на примере:

Предложение: “The quick brown fox jumps over the lazy dog”(Перевод: “Шустрая бурая лиса прыгает через ленивого пса.”).

Допустим, мы пытаемся предсказать слово “fox”, тогда “fox” будет нашим целевым словом.

Остальные слова будут контекстными.

CBOW, Continuous Bag of Words, — это процесс, в котором мы пытаемся предсказать целевое слово с помощью контекста. Мы обучим нашу модель запомнить слово “fox” в контексте, который мы используем в качестве входных данных. CBOW обычно хорошо работает на небольших наборах данных.

Skip-Gram — это процесс, в котором мы пытаемся предсказать контекстные слова с помощью целевого слова, что в точности противоположно CBOW. Skip-gram лучше работает на больших наборах данных.

Источник: Google

Источник: Google

Мы избрали размерность нашего вектора равной 300, поэтому каждое наше слово будет преобразовано в 300-мерный вектор.

Последний слой нашей модели w2v — это классификатор Softmax, который определяет наиболее вероятное выходное слово.

Строки матрицы весов скрытого слоя на самом деле являются векторами слов (встраивание слов)!

Скрытый слой работает как справочная таблица. Выходные данные скрытого слоя — это «вектор слов» для входного слова.

Количество нейронов на скрытом слое должно равняться размерности вложений, которую мы задаем.

Допустим, в нашем корпусе 5 слов:

Предложение 1: Have a Good Day

Предложение 2: Have a Great Day

Сколько уникальных слов в этих примерах? “have”, “a”, “good”, “great”, “day” = 5

Теперь предположим, что наше целевое слово для предложения 1 — “good”.

Когда я скармливаю остальную часть контекстных слов своей модели, она должна понять, что “good” - это именно то слово, которое она должна предсказать для предложения 1.

Предположим, что для предложения 2 наше целевое слово — “great”.

Когда я скармливаю своей модели остальную часть контекстных слов, она должна понять, что для предложения 2 корректное слово для предсказания — “great”.

Если вы внимательно посмотрите, то увидите, что когда мы уберем целевые слова, останутся одинаковые для двух предложений контекстные слова. Так каким образом модель точно предскажет, какое из них подойдет? На самом деле это не имеет значения, потому что она предсказывает наиболее вероятное слово, и в нашем случае нет неправильного варианта — подойдут оба “good” и “great”. Таким образом, возвращаясь к фиксации синонимов, тут оба слова “good” и “great” будут по сути означать одно и тоже и являться очень вероятным выходным словом для этих конкретных контекстных слов. Именно так наша модель изучает семантическое значение слов. Говоря простыми словами, если я могу использовать слова взаимозаменяемо, тогда изменяется только мое целевое слово, а не контекстные слова, т.е. любые два похожих слова, имеющих один синоним, будут весьма вероятным результатом для контекстных слов, скормленных модели — они будут иметь почти одинаковые числовые значения. Если у них почти одинаковые числовые значения, их векторы должны располагаться близко согласно их метрикам сходства. Таким образом мы фиксируем семантические значения.

Вопрос 4: Как работает модель?

Мы разберемся с архитектурой модели за четыре шага.

Собственно из этих структур и состоит модель.

Подготовка данных:

Для начала давайте разберемся, как происходит подготовка и передача данных в нашу модель.

Рассмотрим предыдущий пример еще раз — ‘have a good day’. Модель преобразует это предложение в пары слов вида (контекстное слово, целевое слово). Пользователем устанавливается размер окна для контекстного слова и если оно равно двум, то пары слов будут выглядеть следующим образом: ([have, good], a), ([a, day], good). С помощью этих пар слов модель пытается предсказать целевое слово с учетом контекстных слов.

Давайте разберем на примерах:

Предположим, что в нашем текстовом корпусе 10000 уникальных слов, и мы хотим, чтобы наша размерность вложения соответствовала 300-мерному вектору.

Таким образом, входными данными будет вектор с размерностью 10000 с 0 для всех других слов, в то время как контекстное слово будет 1. Размерность нашего входного вектора составляет 1 x 10000.

Скрытый слой:

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

Теперь нейроны в скрытом слое точно равны размерности вложений, которую мы выбираем, т.е. 300.

Таким образом, размерность нашей матрицы весов составляет 10000 x 300.

Выходной слой:

Выходной слой — это не что иное, как слой softmax, который использует значения вероятности для прогнозирования результатов среди 10000 векторов, которые у нас есть. Размер нашего выходного вектора равен 1 x 300.

Теперь давайте попробуем понять базовую математику, которая за этим стоит

Скрытый слой: 10000 x 300

Выше я объяснил архитектуру CBOW, а чтобы понять Skip-gram, нам просто нужно изменить порядок ввода и вместо контекстного слова и определения целевых слов, вводить целевые слова и пытаться определить контекстные слова. CBOW — это несколько способов ввода и только один вывод, Skip-gram — это один ввод и несколько выводов.

В Skip-gram мы можем определять количество контекстных слов, которое по нашему желанию бы предсказывалось, и, соответственно, мы можем создать пары входных-выходных значений.

Например: ‘have a good day’

Если мы установим размер окна равным 2, то обучающие пары будут следующими:

Целевое слово: good

Контекстные слова: have, a, day

Таким образом, модель учится и пытается предсказать слова, близкие к целевому слову.

Вопрос 5: Какова цель преобразования слов в векторы?

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

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

Реализация:

Мы не будем создавать модель w2v с нуля, поскольку у нас уже есть библиотека Gensim, которая может нам помочь, если у нас есть собственный конкретный доменно-ориентированный корпус данных.

Или, если вы работаете с общими текстовыми данными на английском языке, я бы порекомендовал вам попробовать GloveVectors, которая была создана Стэнфордским Университетом с использованием миллиардов текстов из Wikipedia, Twitter и Common Crawl.

Заключение:

Мы разобрались в концепциях Word2Vec и теперь лучше понимаем, что такое вложения (embedding) слов. Теперь мы понимаем разницу между Skip-Gram и CBOW. Мы также интуитивно понимаем, как создаются вложения слов, и что скрытый слой представляет собой гигантскую таблицу поиска вложений слов. Также у нас появилось понимание того, как фиксируются семантические и синтаксические значения. Вложения слов могут быть очень полезными, а для многих задач NLP даже фундаментальными, не только для традиционного текста, но и для генов, языков программирования и других типов языков.

В следующий раз мы рассмотрим BeRT преобразование текста, а пока желаю вам успехов в обучении!

Векторное представление слов (англ. word embedding) — общее название для различных подходов к моделированию языка и обучению представлений в обработке естественного языка, направленных на сопоставление словам из некоторого словаря векторов небольшой размерности.

Содержание


Рисунок 1. Пример one-hot encoding для словаря из 9 слов. Источник

Пусть число различных слов равно [math]K[/math] . Сопоставим слову с номером [math]i[/math] вектор длины [math]K[/math] , в котором [math]i[/math] -тая координата равна единице, а все остальные — нулям (рис. 1). Недостатком one-hot encoding является то, что по векторным представлениям нельзя судить о схожести смысла слов. Также вектора имеют очень большой размер, из-за чего их неэффективно хранить в памяти.


Рисунок 2. Полученные векторы-слова отражают различные грамматические и семантические концепции.
[math]W_ + (W_ - W_) = W_[/math]
[math]W_ - W_ = W_ - W_[/math]

word2vec — способ построения сжатого пространства векторов слов, использующий нейронные сети. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл) (рис. 2), в векторном представлении имеют высокое косинусное сходство (англ. cosine similarity):

В word2vec существуют две основных модели обучения: Skip-gram (рис. 3) и CBOW (англ. Continuous Bag of Words) (рис. 4). В модели Skip-gram по слову предсказываются слова из его контекста, а в модели CBOW по контексту подбирается наиболее вероятное слово. На выходном слое используется функция [math]softmax[/math] или его вариация, чтобы получить на выходе распределение вероятности каждого слова. В обеих моделях входные и выходные слова подаются в one-hot encoding, благодаря чему при умножении на матрицу [math]W[/math] , соединяющую входной и скрытый слои, происходит выбор одной строки [math]W[/math] . Размерность [math]N[/math] является гиперпараметром алгоритма, а обученная матрица [math]W[/math] — выходом, так как ее строки содержат векторные представления слов.

Для ускорения обучения моделей Skip-gram и CBOW используются модификации [math]softmax[/math] , такие как иерархический [math]softmax[/math] и negative sampling, позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.



Недостатком word2vec является то, что с его помощью не могут быть представлены слова, не встречающиеся в обучающей выборке. fastText решает эту проблему с помощью [math]N[/math] -грамм символов. Например, [math]3[/math] -граммами для слова яблоко являются ябл, бло, лок, око. Модель fastText строит векторные представления [math]N[/math] -грамм, а векторным представлением слова является сумма векторных представлений всех его [math]N[/math] -грамм. Части слов с большой вероятностью встречаются и в других словах, что позволяет выдавать векторные представления и для редких слов.


ELMO — это многослойная двунаправленная рекуррентная нейронная сеть c LSTM (рис. 5). При использовании word2vec или fastText не учитывается семантическая неоднозначность слов. Так, word2vec назначает слову один вектор независимо от контекста. ELMO решает эту проблему. В основе стоит идея использовать скрытые состояния языковой модели многослойной LSTM.

Было замечено, что нижние слои сети отвечают за синтаксис и грамматику, а верхние — за смысл слов. Пусть даны токены [math]t_, . t_[/math] , на которые поделено предложение. Будем считать логарифм правдоподобия метки слова в обоих направлениях, учитывая контекст слева и контекст справа, то есть на основании данных от начала строки до текущего символа и данных от текущего символа и до конца строки. Таким образом, модель предсказывает вероятность следующего токена с учетом истории.

[math]\left \< ^>, \overrightarrow^>, \overleftarrow^> | j = 1, . L \right \> = \left \< h_^ | j = 1, . L \right \>[/math] .

Здесь [math]x_^[/math] — входящий токен, а [math]\overrightarrow^>[/math] и [math]\overleftarrow^>[/math] — скрытые слои в одном и в другом направлении.

Тогда результат работы ELMO будет представлять из себя выражение: [math]ELMO_^ = \gamma^\sum_^ s_^h_^[/math] .

Обучаемый общий масштабирующий коэффициент [math]\gamma^[/math] регулирует то, как могут отличаться друг от друга по норме векторные представления слов.

Коэффициенты [math]s_^[/math] — это обучаемые параметры, нормализованные функцией [math]Softmax[/math] .

Модель применяют дообучая ее: изначально берут предобученную ELMO, а затем корректируют [math]\gamma[/math] и [math]s_[/math] под конкретную задачу. Тогда вектор, который подается в используемую модель для обучения, будет представлять собой взвешенную сумму значений этого векторах на всех скрытых слоях ELMO.

На данный момент предобученную модель ELMO можно загрузить и использовать в языке программирования Python.


BERT — это многослойный двунаправленный кодировщик Transformer. В данной архитектуре (рис. 6) используется двунаправленное самовнимание (англ. self-attention). Модель используется в совокупности с некоторым классификатором, на вход которого подается результат работы BERT — векторное представление входных данных. В основе обучения модели лежат две идеи.

Первая заключается в том, чтобы заменить [math]15\%[/math] слов масками и обучить сеть предсказывать эти слова.

Второй трюк состоит в том, чтобы дополнительно научить BERT определять, может ли одно предложение идти после другого.

Точно так же, как и в обычном трансформере, BERT принимает на вход последовательность слов, которая затем продвигается вверх по стеку энкодеров. Каждый слой энкодера применяет самовнимание и передает результаты в сеть прямого распространения, после чего направляет его следующему энкодеру.

Для каждой позиции на выход подается вектор размерностью [math]hiddenSize[/math] ( [math]768[/math] в базовой модели). Этот вектор может быть использован как входной вектор для классификатора.

Bert поддерживается в качестве модели в языке Python, которую можно загрузить.


A BС D* E Fг* H I JК L* МNO P Q R S T U V W X Y Z

* обозначает статьи за Средним платным доступом

Без дальнейших подробностей, давайте смиримся. Векторы слов - это числовые представления слов, которые сохраняют семантические отношения между словами. Например, вектор словаКот, будет очень похож на вектор словасобака, Тем не менее, вектор длякарандашбудет сильно отличаться от слова вектораКот, И это сходство определяется частотой двух рассматриваемых слов (т. Е. [Котопес] или [кошка, карандаш]), используются в одном контексте. Например, рассмотрим следующие предложения,


Я не думаю, что мне нужно изложить нечетное в приведенных выше предложениях, и, очевидно, те, которые скарандаш, как пропущенное слово. Почему вы считаете это странным предложением? Правописание в порядке, грамматика правильная, тогда почему? Это потому чтоконтекст, словокарандашиспользуется не правильно. Это должно убедить вас в том, что контекст слова влияет на само слово. Алгоритмы векторов слов используют контекст слов для изучения числовых представлений слов, так что слова, используемые в одном и том же контексте, имеют сходные по виду векторы слов.

Чтобы получить представление о значении методов Word2vec, попробуйте следующее. Давай и воспитыватьGoogle ученый, Введите некоторые задачи, связанные с НЛП (например, ответ на вопрос, чат-боты, машинный перевод и т. Д.). Фильтруйте статьи, опубликованные после 2013 года (тогда появились методы Word2vec). Получите соотношение статей с использованием векторов слов к общему количеству статей. Могу поспорить, что эта пропорция будет довольно высокой. Чтобы сделать утверждение конкретным, используются векторы слов для,

  • Языковое моделирование
  • Chatbots
  • Машинный перевод
  • Ответ на вопрос
  • . и многое другое

Вы можете видеть, что все захватывающие границы НЛП на самом деле сильно зависят от векторов слов. Теперь давайте обсудим, какое значение имеют векторы слова, чтобы сделать модель лучше. При использовании векторов слов семантически близкие слова будут казаться похожими вычислениями в модели, где другие слова будут выполнять вычисления другого вида. Это желательное свойство, поскольку при кодировании такой информации в самом вводе модель будет работать с меньшими данными.

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

  1. Создайте кортежи данных в формате [входное слово, выходное слово], где каждое слово представлено как горячие векторы из исходного текста
  2. Определите модель, которая может принимать векторы с одним горячим током в качестве входов и выходов для обучения
  3. Определите функцию потерь, которая предсказывает правильное слово, которое фактически находится в контексте входного слова, чтобы оптимизировать модель
  4. Оцените модель, убедившись, что похожие слова имеют одинаковые векторы слов

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

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

Кот отодвинул стекло от стола

Данные, созданные из этого предложения, будут выглядеть следующим образом. Каждая строка после предложения представляет одну точку данных. Синее поле представляет горячее входное слово (среднее слово, называемое целевым словом), а красное поле представляет горячее выходное слово (любое слово в контекстном окне, кроме среднего слова, называемое контекстными словами). Две точки данных создаются из одного контекстного окна. Размер окна контекста определяется пользователем. Чем больше размер окна контекста, тем выше производительность модели Но, имея большой размер окна контекста, вы будете платить за вычислительное время по мере увеличения объема данных.Не путайте целевое слово с целевым (правильный вывод) для нейронной сети, это две совершенно разные вещи.


Нейронная сеть используется для изучения структурированных данных, определенных выше. Тем не менее, это идет с изюминкой! Чтобы прояснить, у вас есть следующие компоненты.

  • Пакет входов представлен в виде горячих векторов
  • Пакет выходов, представленных в виде векторов с одним горячим током (только на этапе обучения)
  • Слой встраивания
  • Нейронная сеть

Не нужно бояться, если вы не почувствовали, что и как выполняют последние два компонента. Мы исследуем каждый из этих компонентов, чтобы понять, что они делают.

Первое в нашей повестке днявстраиваемый слой, Слой встраивания хранит векторы слов всех слов, найденных в словаре. Как вы можете визуализировать это огромная матрица (размером[размер словаря x размер вложения]). Этот размер вложения является настраиваемым пользователем параметром. Чем оно выше, тем лучше будет работать ваша модель. Но вы не получите большого выигрыша в производительности / размере, превышающем определенный уровень (скажем, размер вложения 500). Эта гигантская матрица инициализируется случайным образом (точно так же, как нейронная сеть) и корректируется в процессе оптимизации, чтобы выявить мощные векторы слов. Вот как это выглядит.


Следующим в очереди является последний блок LEGO нашей модели; нейронная сеть. Во время обучения нейронная сеть принимает входное слово и пытается предсказать выходное слово. Затем, используя функцию потерь, мы штрафуем модель за неправильную классификацию и вознаграждаем модель за правильную классификацию. Мы будем ограничивать наш разговор обработкой одного ввода и одного вывода за раз. Однако в действительности вы обрабатываете данные партиями (скажем, 64 точки данных). Давайте опишем точный процесс, используемый во время обучения:

  1. Для заданного входного слова (целевого слова) найдите соответствующий вектор слова из слоя внедрения
  2. Подайте слово вектор в нейронную сеть, затем попытайтесь предсказать правильное выходное слово (контекстное слово)
  3. Сравнивая прогноз и истинное контекстное слово, вычисляем потери
  4. Используйте потери вместе со стохастическим оптимизатором, чтобы оптимизировать нейронную сеть и слой внедрения

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

Зная все основные моменты алгоритма Word2vec, мы можем собрать все части вместе. Так что, как только эта модель обучена, все, что нам нужно сделать, этосохранить встроенный слой на диск, Тогда мы можем наслаждаться семантически сохраненными векторами слов в любое время суток. Ниже мы видим, как выглядит полная картина.


Такое частичное расположение данных и макет модели известны какалгоритм скип-грамм; алгоритм Word2vec. И это то, на чем мы собираемся сосредоточиться. Другой алгоритм называется моделью непрерывного набора слов (CBOW).

Одна важная часть информации, которую мы до сих пор не обсуждали, но очень важна - это функция потерь. Обычно, стандартSoftmax перекрестная потеря энтропииявляется хорошей функцией потерь для задачи классификации. Использование этой потери не очень практично для модели Word2vec, как для более простой задачи, такой как анализ настроений (где у вас есть 2 возможных результата: положительный или отрицательный). Здесь все может стать веселее. В реальном словесном задании, которое потребляет миллиарды слов, размер словарного запаса может легко увеличиться до 100 000 или даже больше. Это делает вычисление нормализации softmax тяжелым. Это связано с тем, что для полного расчета softmax требуется рассчитать перекрестные энтропийные потери по отношению ко всем выходным узлам.

Таким образом, мы идем с более разумной альтернативой, называемойОтобранные потери Softmax, При выборочной потере softmax вы делаете следующее. Обратите внимание, что по сравнению со стандартной кросс-энтропийной потерей softmax происходит довольно много изменений. Сначала вы вычисляете кросс-энтропийную потерю между истинным идентификатором слова контекста для заданного целевого слова и прогнозным значением, соответствующим истинному идентификатору слова контекста. Затем к этому мы добавим кросс-энтропийную потерю K Отрицательные образцы мы отбирали в соответствии с некоторым распределением шума. На высоком уровне мы определяем потери следующим образом:

  • Индекс, заданный истинным ID слова контекста в векторе предсказания (слова в окне контекста)
  • K индексы, которые указывают идентификаторы слов и считаются шумом (слова вне контекстного окна)

Я далее визуализирую это, иллюстрируя пример.


Получение положительных и отрицательных образцов для выборочного слоя softmax

Здесь мы извергнем то, что мы только что обсудили, в реализацию. Это доступно как упражнениеВот, В этом разделе мы собираемся реализовать следующее.

  • Генератор данных
  • Модель скип-граммы (с TensorFlow)
  • Запуск алгоритма пропуска

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

Сначала мы определим некоторые гиперпараметры, необходимые для модели.

batch_size определяет количество точек данных, которые мы обрабатываем в данный момент времени. Тогда embedding_size размер слова вектора. Следующий гиперпараметр window_size определяет размер контекстного окна, которое мы визуализировали выше. в заключение num_sampled определяет количество отрицательных выборок в функции потерь ( K ). Затем мы определяем заполнители TensorFlow для входов и выходов.

Здесь train_dataset принимает список идентификаторов слов batch_size который представляет выбранный набор целевых слов. В заключение, train_labels представляет batch_size список соответствующих контекстных слов для выбранных целевых слов. Далее мы определяем параметры модели, необходимые для определения модели: слой внедрения, а также веса и смещения нейронной сети.

Мы определили слой внедрения как переменную TensorFlow: embeddings , Затем мы определяем веса нейронной сети ( softmax_weights ) и уклоны ( softmax_biases ). После этого мы определяем ключевую операцию, необходимую для соединения уровня внедрения с нейронной сетью для совместной оптимизации уровня внедрения и нейронной сети.

tf.nn.embedding_lookup функция принимает наш слой встраивания в качестве входных данных и набор идентификаторов слов ( train_dataset ) и выводит соответствующие векторы слов в переменную embed , Определяя встроенную функцию поиска, мы можем определить выборочную функцию потерь softmax, которую мы обсуждали выше.

Здесь tf.nn.sampled_softmax_loss функция принимает в наборе весов ( softmax_weights ), уклоны ( softmax_biases ), набор векторов слов, соответствующих идентификаторам слов, найденным в train_dataset , Идентификаторы правильных контекстных слов ( train_labels ), количество образцов шума ( num_sampled ) и размер словаря ( vocabulary_size ). С определенными операциями расчета выходных данных и определенными потерями мы можем определить оптимизатор для оптимизации потерь по отношению к параметрам уровня внедрения и нейронной сети.

Затем мы получаем нормализованный слой вложения, делая величину вектора равной 1.

Здесь мы собираемся обсудить детали того, как запустить ранее определенную модель TensorFlow. Сначала мы определяем session а затем случайным образом инициализировать все переменные TensorFlow.

Теперь для заданного количества шагов мы генерируем пакеты данных: целевые слова ( batch_data ) и контекстные слова ( batch_labels ).

Здесь каждые 5000 шагов мы печатаем среднюю потерю в качестве наглядного пособия.

Наконец, мы получаем последние вложения, которые мы позже используем для визуализации определенных слов.

Наконец, если вы визуализируете вложения, используя алгоритм обучения многообразия, такой как t-SNE, вы получите следующее.


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

Это подводит нас к концу нашего разговора. Векторы слов - это очень мощное представление слов, которое помогает моделям машинного обучения работать лучше. Мы прошли процесс генерации данных, а также различные компоненты, найденные в модели Word2vec. Затем мы обсудили один конкретный вариант алгоритма Word2vec; модель скип-грамм. Мы прошли реализацию алгоритма в TensorFlow. Наконец, мы визуализировали вложения и увидели, что выученные вложения действительно отображают некоторую полезную семантику. Вы можете найти файл упражненияВот

Небольшая заметка: Я рад сообщить, что моя книга по обработке естественного языка с TensorFlow была выпущена и готова к использованию! Книга идеально подходит для читателей начального / среднего уровня, ищущих практическую перспективу современных решений для глубокого обучения. Книга сопровождается упражнениями, помогающими читателю реализовать различные приложения НЛП.

Не забудьте хлопать в ладоши, если вы узнали или получили удовольствие от статьи. Ура!

Читайте также: