Перейти к основному содержимому

Эмбеддинги слов

Рассмотрим задачу автоматической обработки текста (natural language processing, NLP) с помощью нейросетей. Текст представляет собой последовательность слов. Если у человека сразу возникают ассоциации, когда он читает предложение, например "мама мыла раму", то компьютеру для обработки нужно эти слова как-то представить в виде векторов вещественных чисел фиксированного размера.

wvwRDw\to v_w \in \mathbb{R}^D
Эмбеддинг

Вектор вещественных чисел фиксированного размера, представляющий дискретный объект (такой, как слово) называется эмбеддингом этого объекта.

Пример сопоставления словам их эмбеддингов приведён ниже:

Помимо самих слов, часто вводят служебные слова:

  • PAD - обозначает отсутствие слова

  • BOS - обозначает начало последовательности (beginning of sequence)

  • EOS - обозначает конец последовательности (end of sequence)

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

Токены, а не слова, в общем случае

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

Пример:

He took part in collaboration with Microsoft corporation

можно обрабатывать как последовательность

[He] [took part] [in] [collaboration] [with] [Microsoft corporation]

поскольку - [took part] - устойчивое выражение, а [Microsoft corporation] - единая сущность, соответствующая компании.

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

Для выбранных токенов будут строиться свои эмбеддинги.

В общем случае любой дискретный объект представляется некоторым эмбеддингом перед его обработкой нейросетями.

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

Далее будет рассматриваться классический случай обработки текста на уровне слов.

Как и для векторов признаков будем обозначать нижним индексом номер эмбеддинга, а верхним - индекс отдельного его отдельного элемента:

  • vwv_w - эмбеддинг, отвечающий слову ww, например 100001-му в словаре,

  • viv^i - значение вектора эмбеддинга на ii-й позиции, i=1,2,...Di=1,2,...D.

Построение вручную

Каждое слово можно представить вектором признаков, описывающих это слово, например

  • v1v^{1}: часть речи

  • v2v^{2}: род (мужской/женский/средний - для существительных и прилагательных)

  • v3v^{3}: время (прошедшее/настоящее/будущее - для глаголов)

  • v4v^{4}: индикатор, что слово начинается с заглавной буквы

  • v5v^{5}: # букв

  • v6v^{6}: категория: машинное обучение, физика, биология, ...

  • v7v^{7}: подкатегория: обучение с учителем, без учителя, частичное обучение, ...

  • ...

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

  • соответствовать разным смыслам, например

    • замок как крепость,

    • замок как запирающее устройство;

  • соответствовать разным частям речи, например

    • watch как существительное: I forgot my watch at home;

    • watch как глагол: I like to watch movies from time to time.

Всё это делает кодирование слов вручную слишком неоднозначным и ресурсоёмким. Поэтому этот подход нам не подходит.

Кодирование категории

Поскольку слово представляет собой категориальный признак, принимающий одно из SS значений (где SS - общее число слов языка), то к нему можно было бы применить one-hot кодирование.

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

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

Действительно, представим каждое слово фразы "место было уютным и комфортным" в виде one-hot кодирования:

словоэмбеддинг
место[1,0,0,0,0]
было[0,1,0,0,0]
уютным[0,0,1,0,0]
и[0,0,0,1,0]
комфортным[0,0,0,0,1]

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

Нам бы хотелось строить эмбеддинги слов

  1. автоматически, исключая трудоёмкую разметку человеком;

  2. и так, чтобы более близким по смыслу словам соответствовали более похожие эмбеддинги.

Первое свойство позволит строить эмбеддинги быстро и оперативно довычислять эмбеддинги новых слов.

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

Автоматическое построение эмбеддингов

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

Слова, близкие по смыслу часто встречаются совместно.

Человек, читающий текст с новыми для него терминами, восстанавливает их примерный смысл по контексту. Рассмотрим слово "гаплотип". Даже не зная его точного значения, но прочитав текст вида

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

можно догадаться, что слово гаплотип по смыслу связан с генетикой!

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

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

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

Применимость

Все методы, рассматриваемые далее, применимы не только к текстам, как последовательностям слов, но и к любым последовательностям дискретных объектов.

Например, к поведению пользователя на сайте, состоящем из последовательности переходов по веб-страницам, к ДНК как цепочке нуклеотидов и т.д.