Векторы слов - это просто векторы чисел, которые представляют значение слова. На данный момент это не очень ясно, но мы вернемся к этому чуть позже. Прежде всего полезно рассмотреть, почему векторы слов считаются таким шагом вперед по сравнению с традиционными представлениями слов.

Традиционные подходы к НЛП, такие как одноразовое кодирование и модели набора слов (т. Е. Использование фиктивных переменных для представления наличия или отсутствия слова в наблюдении (например, в предложении)), в то время как полезны для некоторого машинного обучения (ML ) задачи, не собирают информацию о значении слова или контексте. Это означает, что потенциальные отношения, такие как контекстная близость, не отражаются в наборах слов. Например, одноразовое кодирование не может зафиксировать простые отношения, такие как определение того, что слова «собака» и «кошка» оба относятся к животным, которые часто обсуждаются в контексте домашних животных. Такие кодировки часто обеспечивают достаточную основу для простых задач НЛП (например, классификаторы спама в электронной почте), но им не хватает сложности для более сложных задач, таких как перевод и распознавание речи. По сути, традиционные подходы к NLP, такие как одноразовое кодирование, не фиксируют синтаксические (структура) и семантические (значение) отношения между наборами слов и, следовательно, очень наивно представлять язык.

Напротив, векторы слов представляют слова как многомерные непрерывные числа с плавающей запятой, где семантически похожие слова отображаются в ближайшие точки в геометрическом пространстве. Проще говоря, вектор слова - это строка действительных чисел (в отличие от фиктивных чисел), где каждая точка фиксирует размерность слова значение и , где семантически похожие слова имеют похожие векторы. Это означает, что такие слова, как wheel и двигатель должен иметь векторы слов, аналогичные слову автомобиль (из-за схожести их значений), тогда как слово банан должно быть довольно далеким. Другими словами, слова, которые используются в аналогичном контексте, будут отображаться в приближенное векторное пространство (мы узнаем, как создаются эти векторы слов ниже). Прелесть представления слов в виде векторов в том, что они поддаются математическим операторам. Например, мы можем складывать и вычитать векторы - канонический пример здесь показывает, что, используя векторы слов, мы можем определить, что:

король - мужчина + женщина = королева

Другими словами, мы можем вычесть одно значение из вектора слова для короля (т. Е. Мужественность), добавить другое значение (женственность) и показать, что этот новый вектор слова (король - мужчина + женщина) наиболее точно соответствует вектору слова для королевы. .

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

Упрощенное представление векторов слов

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

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

Мы можем использовать библиотеку Python NLP spaCy (ознакомьтесь с моим введением здесь: https://dataflume.wordpress.com/2017/03/17/intro-nlp-python-spacy/, это также недавно был перенесен на R https://github.com/kbenoit/spacyr) для быстрого доступа к некоторым предварительно обученным 300-мерным векторам слов. Мы создаем список слов, применяем синтаксический анализатор spaCy, извлекаем вектор для каждого слова, складываем их вместе, а затем извлекаем два основных компонента для целей визуализации.

Https://gist.github.com/conormm/ca0cdf78fa7a91fdacf500ff4dff0645

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

Похожие слова отображаются вместе в векторном пространстве. Обратите внимание на то, насколько близко кошка и собака находятся к домашнему животному, как сгруппированы слон, лев и тигр и как описательные слова также сгруппированы вместе.

Также интересно то, насколько близко соотносятся друг с другом слова «дикий», «зоопарк» и «одомашненный». Это имеет смысл, учитывая, что это слова, которые часто используются для описания животных, но подчеркивают удивительную силу слов-векторов!

Откуда берутся векторы слов?

Отличный вопрос: откуда берутся эти размеры и вес ?! Есть два распространенных способа генерации векторов слов:

  1. Количество совпадений слова / контекста
  2. Предсказания контекста данного слова (модели нейронных сетей с пропуском грамм, например word2vec)

* Примечание: ниже я описываю высокоуровневый подход word2vec к генерации векторов слов, но хороший обзор подхода подсчета / совпадения можно найти здесь (https://medium.com/ai-society/jkljlj-7d6e699895c4) .

Оба подхода к созданию векторов слов основаны на гипотезе распределения Фёрта (1957), которая гласит:

«Вы должны знать слово по компании, в которой оно находится»

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

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

  1. Глубокое обучение, НЛП и представления (http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/)
  2. Удивительная сила векторов слов (https://blog.acolyer.org/2016/04/21/the-amazing-power-of-word-vectors/)
  3. Учебное пособие по Word2Vec - Модель Skip-Gram (http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/)

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

Модель обучается на словах, контекстных парах для каждого слова в корпусе, то есть:

(собака, в)

(собака, пушистая)

(собака, лаяла)

(собака, как)

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

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

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

Примечание. Этот концептуальный NN - близкий друг диаграммы в сообщении блога Криса Маккормика, ссылка на который приведена выше

Ценность прохождения этого процесса состоит в том, чтобы извлечь веса, полученные нейронами скрытого слоя модели. Именно эти веса формируют вектор слов, т.е. если у вас есть скрытый слой из 300 нейронов, вы создадите вектор слов из 300 измерений для каждого слова в корпусе. Таким образом, результатом этого процесса является преобразование слова в вектор с размером n- входных слов * n - нейронов скрытого слоя.

Спасибо за чтение, надеюсь, вы узнали что-то новое :)