July 9th, 2020

with Cat The Cat

Про word2vec.

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

Его можно считать прямым использованием "дистрибутивной семантики" - смысл слова определяется его типичным окружением.

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

Есть два режима использования word2vec - предсказание непрерывного словесного окружения по слову (continuous skipgram) и предсказание слова по непрерывному словесному окружению (continuous bag of words, CBOW). В первом случае мы по слову предсказываем несколько слов из его окружения, во втором случае мы предсказываем слово по нескольким словам из окружения.

В первом случае у нас на входе слово, закодированное 1-из-N, на выходе - несколько слов, закодированных 1-из-N (softmax) или "кодированный двоичным кодом индекс слова по порядку возрастания частоты" (несколько сигмоидов на слово). Во втором случае у нас на входе сколько-то слов, кодированных так или эдак, на выходе - 1-из-N (softmax).

В первом случае вложения это строки матрицы первого полностью связного преобразования (прошу обратить внимание - там было 1-из-N), во втором случае вложения это строки матрицы второго полностью связного преобразования (снова 1-из-N).

(интересно здесь то, что "начало фразы" и "конец фразы" могут быть словами словаря и для них также может быть вычислены вложения)

Что интересного в этих вложениях?

Если использовать расстояние по косинусу угла между вложениями, то сходные слова будут расположены близко друг от друга. В частности, кластеризация через k-means (которая в исходном пакете word2vec есть из коробки) для предсказания окружения по слову давала интересные классы слов - в одном были прилагательные одного склонения, в другом - другого, и кластера слов ещё и делились по смыслу - вот в этих классах про положение на карте, а вот в этих про бытовую и электронную технику. Что интересно, разные режимы тренировок давали разные кластера и, по словам статьи, отличаются точностью решения языковых задач.

В исходной статье про word2vec давался алгоритм решения простых аналогий: чтобы вычислить "А относится к Б, как В относится к Х", надо было решить простую задачу Х=БлижайшееПоКосинусу(Вложение(Б)-Вложение(А)+Вложение(В)).

Товарищи из Фейсбука пошли чуть дальше (fasttext). В их работе слова разбиваются на части и вложения вычисляются не для слов, а для частей (n-grams - слово "будда" может быть разбито на триграммы "^бу", "удд", "дда" и "да$"). Вложение слова вычисляется простой суммой вложений частей. Таким образом, если для редко (менее 5 раз, обычно это в районе половины процента корпуса, опечатки и тому подобное) встречающихся слов word2vec не мог определить вложения, то фейсбучный подход позволяет и вложения определить, и сами слова использовать для вложений.

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

Можно сделать извлечение смысла, вычисляя вложение текста (например, сверточными сетями) и вычисляя из вложения текста краткое его содержание (encoder-decoder). На входе много слов текста, на выходе вектор размера M (вложение текста), из которого как-то (хоть простым полностью связным слоем) вычисляется несколько векторов-вложений слов смысла текста (см. выше про вложения для "конца фразы").