Эмбеддинги слов
Рассмотрим задачу автоматической обработки текста (natural language processing, NLP) с помощью нейросетей. Текст представляет собой последовательность слов. Если у человека сразу возникают ассоциации, когда он читает предложение, например "мама мыла раму", то компьютеру для обработки нужно эти слова как-то представить в виде векторов вещественных чисел фиксированного размера:
Вектор вещественных чисел фиксированного размера, представляющий дискретный объект (такой как слово), называется эмбеддингом этого объекта.
Пример сопоставления словам соответствующих им эмбеддингов приведён ниже:
Помимо самих слов, часто вводят служебные слова:
-
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), в качестве которых уже могут выступать слова, служебные слова, знаки препинания, символы и группы слов.
Для выбранных токенов будут строиться свои эмбеддинги.
В общем случае любой дискретный объект представляется некоторым эмбеддингом перед его обработкой нейросетями.
В рекомендательной системе строятся эмбеддинги пользователей и товаров, в поисковой системе - эмбеддинги документов и изображений. В графе социальной сети отдельные пользователи также представляю тся в виде эмбеддингов для нейросетевой обработки.
Далее будет рассматриваться классический случай обработки текста на уровне слов.
Как и для векторов признаков, будем обозначать нижним индексом номер эмбеддинга, а верхним - индекс его отдельного элемента:
-
- эмбеддинг, отвечающий слову , например 100001-му в словаре,
-
- значение вектора эмбеддинга на -й позиции, .
Построение вручную
Каждое слово можно представить вектором признаков, описывающих это слово, например:
-
: часть речи;
-
: род (мужской/женский/средний - для существительных и прилагательных);
-
: время (прошедшее/настоящее/будущее - для глаголов);
-
: индикатор, что слово начинается с заглавной буквы;
-
: # букв;
-
: категория: машинное обучение, физика, биология, ...;
-
: подкатегория: обучение с учителем, без учителя, частичное обучение, ...;
-
...
Некоторые признаки, такие как число букв и индикатор заглавной буквы, можно посчитать сразу. Другие же требуют словаря, ставящего в соответствие каждой словоформе её часть речи, род, время и другие лингвистические признаки, а также семантические категории и подкатегории. Подобные словари есть, но они покрывают лишь наиболее общеупотребительные слова и не способны описать новые слова, которые постоянно возникают в языке.
Данное кодирование слов слишком ресурсоёмко и недостаточно информативно. Далее рассмотрим автоматические методы извлечения эмбеддингов.
Кодирование категории
Поскольку слово представляет собой категориальный признак, принимающий одно из значений (где - общее число слов языка), то к нему можно было бы применить 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] |
Если сравнивать попарные расстояния между эмбеддингами, то из него следует, что слова "уютным" и "комфортным" (почти синонимы) настолько же непохожи, как и слова "место" и "было" (между которыми нет никакой связи). Поэтому такой способ кодирования тоже не подходит.
Нам бы хотелось строить эмбеддинги слов
-
автоматически, исключая трудоёмкую разметку человеком;
-
так, чтобы более близким по смыслу словам соответствовали более похожие эмбеддинги.
Первое свойство позволит строить эмбеддинги быстро и оперативно вычислять эмбеддинги новых слов.
Второе свойство существенно упростит настройку модели, работающей с подобными эмбеддингами. Например, при классификации отзывов на положительные и отрицательные фразу "номера оказались очень уютными" и "номера в отеле оказались очень комфортными" модель будет обрабатывать единообразно и с похожим результатом!