Содержание курса 07 / 37

07 / 37 · Распределённые представления

Векторные представления слов

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

На этой странице 10

До сих пор каждая модель считала токен атомом. Классификатор на мешке слов дал cat и dog ортогональные координаты; n-граммная модель считала cat sat и dog sat несвязанными событиями. Всё, что было выучено об одном слове, было бесполезно для другого. Эта заметка спрашивает, какое представление позволило бы переносить знание между похожими словами, по очереди пробует очевидные кодирования и приходит к плотному вектору, на котором построена каждая следующая модель курса.

Обозначения. VV — словарь, dd — размерность эмбеддинга. One-hot-вектор токена ii — это ei∈{0,1}∣V∣e_i \in \{0, 1\}^{|V|} с единственной единицей в позиции ii. Таблица эмбеддингов — E∈R∣V∣×dE \in \mathbb R^{|V| \times d}, а EiE_i обозначает её ii-ю строку.

Отправная точка: one-hot-векторы#

Токен — вектор длины ∣V∣|V| с единицей в позиции своего индекса. У любой пары различных токенов скалярное произведение равно 0, а евклидово расстояние — 2\sqrt 2: cat ровно так же далёк от dog, как от therefore. Понятия сходства в этом представлении нет, а его размер равен размеру словаря. У модели, первый линейный слой которой работает с one-hot-входами, ∣V∣×h|V| \times h весов при размере скрытого слоя hh; при ∣V∣=3×106|V| = 3 \times 10^6 (словарь слов веб-масштаба) и h=100h = 100 это 3×1083 \times 10^8 параметров в одном слое, а активация для предложения из 20 токенов — матрица 20×3 000 00020 \times 3\,000\,000, почти целиком состоящая из нулей.

Четыре попытки#

У проблемы две части: векторы слишком велики и не несут сходства. Каждая попытка исправляет одно и обнаруживает следующее ограничение.

  1. Одно число на слово. Заменим one-hot-вектор его индексом, одним целым числом. Проблема размера решена. Но индекс произволен: cool может получить 1502, awesome — 7, а therefore — 1503. Слова с одинаковым смыслом оказываются далеко друг от друга, а соседи слова в этом кодировании бессмысленны.
  2. Близкие числа для похожих слов. Назначим индексы так, чтобы синонимы стояли рядом: cool — 1502, awesome — 1503. Теперь одно число должно кодировать сразу все оси сходства. cool близко к awesome по одной оси (одобрение) и к cold по другой (температура); на прямой нельзя поставить его рядом с обоими. Для сарказма и многозначности места нет вовсе.
  3. Короткий вектор выбранных признаков. Дадим каждому слову несколько придуманных вручную координат (тональность, конкретность, часть речи). Это правильная форма, но признаки нужно придумать и разметить вручную для каждого слова, и те, что важны для задачи, редко совпадают с теми, которые пришли бы нам в голову.
  4. Короткий вектор выученных признаков. Сохраним форму попытки 3 и позволим координатам выучиться из данных. Ничего не проектируется: dd-мерный вектор каждого слова — параметр, и обучение его сдвигает.

Таблица эмбеддингов#

Попытка 4 — это матрица E∈R∣V∣×dE \in \mathbb R^{|V| \times d}. Вектор токена ii — строка EiE_i. В коде это поиск по индексу, а в линейной алгебре — произведение на one-hot-вектор:

E⊤ei=Ei∈Rd,E^\top e_i = E_i \in \mathbb R^{d},

и именно этот взгляд через умножение матриц делает первый линейный слой сети над one-hot-входами равным поиску в таблице эмбеддингов: матрица весов ∣V∣×h|V| \times h, умноженная на one-hot-вектор, просто считывает одну строку. Слой nn.Embedding(|V|, d) — это такая матрица, где умножение заменено индексированием.

Рисунок

Слой эмбеддингов — это поиск строки в таблице

Поиск строк в таблице эмбеддинговТокены the (id 4), cat (id 812), sat (id 1093) указывают на три строки таблицы E из 12 показанных строк; эти строки, собранные по порядку, образуют выходную матрицу из трёх строк. Внизу: Eᵀeᵢ = Eᵢ.таблица E|V| строк, d столбцоввыход [T, d]строка на токенthe4cat812sat1093Eᵀeᵢ = Eᵢ: умножение на one-hot-вектор читает одну строку EПоиск строк в таблице эмбеддинговТокены the (id 4), cat (id 812), sat (id 1093) указывают на три строки таблицы E из 12 показанных строк; эти строки, собранные по порядку, образуют выходную матрицу из трёх строк. Внизу: Eᵀeᵢ = Eᵢ.таблица E|V| строк, d столбцоввыход [T, d]строка на токенthe4cat812sat1093Eᵀeᵢ = Eᵢ: умножение на one-hot-вектор читает одну строку E
Что делает nn.Embedding. Каждый токен сначала становится идентификатором (здесь условным), идентификатор выбирает строку таблицы E размера |V| × d, и выбранные строки, собранные в порядке токенов, образуют выход формы [T, d] (для батча — [B, T, d]). То же самое получается, если умножить one-hot-вектор токена на E, поэтому первый линейный слой над one-hot-входами и есть таблица эмбеддингов; поиск по индексу лишь избавляет от умножения на нули. Таблица — обычный параметр: обучение сдвигает строки встреченных токенов, и похожие токены оказываются рядом. Оттенки клеток условны.

Размерности для батча: идентификаторы токенов [B, T] (размер батча, длина последовательности) после поиска становятся [B, T, d]. При ∣V∣=30 000|V| = 30\,000 и d=100d = 100 в таблице 3 млн параметров, независимо от длины последовательности; последовательность из 20 токенов даёт активацию 20×10020 \times 100 вместо 20×30 00020 \times 30\,000.

Откуда берутся значения? Три варианта, которые используются в курсе в таком порядке:

  • Обучаются вместе с задачей. Таблица — параметр классификатора и получает градиенты от функции потерь классификации. Так делает и измеряет эффект заметка о CNN.
  • Предобучаются на неразмеченном тексте. Таблицу обучают на большом корпусе с целью обучения с самоконтролем (self-supervision), а затем используют как фиксированные входные признаки. Эту цель строит следующая заметка.
  • Скачиваются. Таблицы, обученные другими на миллиардах токенов, например векторы GloVe, обученные на Twitter, которые используются ниже.

Как читать векторное пространство#

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

Косинусное сходство сравнивает направления и не учитывает длину:

cos⁡(u,v)=u⋅v∥u∥ ∥v∥=∑j=1dujvj∑juj2 ∑jvj2∈[−1,1].\cos(u, v) = \frac{u \cdot v}{\|u\|\,\|v\|} = \frac{\sum_{j=1}^d u_j v_j}{\sqrt{\sum_j u_j^2}\,\sqrt{\sum_j v_j^2}} \in [-1, 1].

Длины векторов эмбеддингов зависят от того, как часто и в скольких контекстах встречается слово, по причинам, не связанным со смыслом, поэтому обычной мерой служит угол. 32-мерная модель, обученная на 537 272 вопросах Quora, перечисляет в качестве ближайших соседей слова word слова sentence (0.836), words, verb, phrase, sentences, pronounce, noun — слова, которые встречаются в вопросах того же рода. «Похожие» здесь означает используемые в похожих контекстах: другого сигнала у обучения не было.

Аналогии проверяют, осмысленны ли разности векторов. Если направление от man к woman кодирует пол, то, прибавив его к king, мы должны оказаться рядом с queen:

vking−vman+vwoman≈vqueen.v_{\text{king}} - v_{\text{man}} + v_{\text{woman}} \approx v_{\text{queen}}.

На 100-мерных векторах GloVe, обученных на Twitter, ближайшее к этой сумме слово (если исключить три входных) — queen с косинусом 0.705, за ним prince (0.667) и mother (0.644). Та же арифметика с latte − milk + water возвращает macchiato (0.608), cappuccino, warm, espresso, coffee: ось напитков переживает подстановку, конкретный ответ спорен. А head − foot + sock даёт pants (0.621), butt, blow, и beanie (шапка, которую можно было бы ожидать) оказывается лишь на шестом месте. Аналогии — качественная проба: когда они работают, они показывают, что некоторые направления в пространстве согласованы; когда возвращают мусор, показывают, каких закономерностей не было в корпусе. Они не доказывают, что пространство линейно по смыслу, а стандартные бенчмарки аналогий, как известно, чувствительны к тому, как поиск исключает входные слова (Linzen, 2016).

Проекция на плоскость. Чтобы посмотреть на пространство, уменьшим dd до 2. Метод главных компонент (PCA) находит направления наибольшей дисперсии: для центрированной матрицы X∈Rn×dX \in \mathbb R^{n \times d} из nn векторов слов он решает задачу min⁡W∥XWW⊤−X∥F2\min_W \|X W W^\top - X\|_F^2 по W∈Rd×2W \in \mathbb R^{d \times 2} с ортонормированными столбцами, и решение — первые два правых сингулярных вектора XX. График — линейная тень пространства: глобальная структура сохраняется, локальные окрестности часто сминаются. t-SNE (van der Maaten and Hinton, 2008) вместо этого размещает точки так, чтобы пары, близкие в Rd\mathbb R^d, оставались близкими на плоскости, ценой искажения больших расстояний и зависимости от параметра perplexity. Расстояния между кластерами на графике t-SNE мало что значат, и сами кластеры могут вводить в заблуждение: при малой перплексии точки из одного гауссова распределения уже образуют видимые сгустки (Wattenberg, Viégas and Johnson, 2016). Кластеру стоит доверять, только если он сохраняется при разных перплексиях и случайных зёрнах, а его слова близки и по косинусу в Rd\mathbb R^d. Оба метода — чтобы смотреть, а не чтобы измерять.

Разобранный пример#

Три слова при d=2d = 2 (значения условные):

vcat=(0.9, 0.4),vdog=(0.8, 0.5),vtherefore=(−0.3, 0.9).v_{\text{cat}} = (0.9,\ 0.4),\qquad v_{\text{dog}} = (0.8,\ 0.5),\qquad v_{\text{therefore}} = (-0.3,\ 0.9). cos⁡(cat,dog)=0.72+0.200.97 0.89=0.920.929=0.990,cos⁡(cat,therefore)=−0.27+0.360.97 0.90=0.090.934=0.096.\cos(\text{cat}, \text{dog}) = \frac{0.72 + 0.20}{\sqrt{0.97}\,\sqrt{0.89}} = \frac{0.92}{0.929} = 0.990, \qquad \cos(\text{cat}, \text{therefore}) = \frac{-0.27 + 0.36}{\sqrt{0.97}\,\sqrt{0.90}} = \frac{0.09}{0.934} = 0.096.

Два слова о животных смотрят в одну сторону; связка почти ортогональна им. При one-hot-кодировании все три косинуса были бы равны 0.

От слов к предложениям, пока что#

Классификатору нужен один вектор на документ, а таблица эмбеддингов даёт по одному на токен. Простейший способ агрегации — среднее векторов токенов (токены вне словаря пропускаются, а если не осталось ни одного, возвращаются нули). Со 100-мерной таблицей это даёт 100-мерный вектор документа, почти в 300 раз меньший, чем 29 350-мерный вектор TF-IDF, и он уже позволяет искать ближайших соседей: построить вектор вопроса-запроса, посчитать его косинус с каждым сохранённым вопросом и вернуть первые kk. Усреднение отбрасывает порядок и позволяет частым словам доминировать, поэтому заметки о CNN и RNN заменяют его моделями, которые читают последовательность.

Ограничения#

  • Один вектор на тип слова. У bank один вектор, о чём бы ни было предложение — о реках или о деньгах. Вектор — компромисс между значениями, и ничто в представлении не знает, какое значение имеется в виду. Это ограничение снимают контекстные эмбеддинги в заметке о BERT.
  • Закрытый словарь. У слова, которого нет в таблице, нет вектора. Токены-подслова из заметки о токенизации уменьшают проблему; модели на символьных n-граммах снимают её, но не бесплатно.
  • Сходство — это совместная встречаемость. Антонимы (hot, cold) встречаются в одних и тех же контекстах и оказываются рядом. Ошибка ли это, зависит от задачи.
  • Пространство отражает корпус. Векторы, обученные на Twitter, воспроизводят словоупотребление Twitter, включая его предубеждения и стереотипы, а аналогии позволяют их измерить (Bolukbasi et al., 2016).
  • Усреднение теряет информацию. Среднее векторов слов — это мешок слов в пространстве меньшей размерности; порядок и отрицание всё так же потеряны.

Что нужно запомнить#

  • One-hot-векторы ∣V∣|V|-мерны и попарно ортогональны: нет сходства — нет переноса.
  • Таблица эмбеддингов E∈R∣V∣×dE \in \mathbb R^{|V|\times d} сопоставляет каждому токену выученную строку; nn.Embedding — произведение на one-hot-вектор, записанное как поиск по индексу.
  • Косинусное сходство сравнивает направления; ближайшие соседи в выученном пространстве — слова, используемые в похожих контекстах.
  • Аналогии и двумерные проекции — качественные пробы геометрии, а не метрики.
  • Статические эмбеддинги дают один вектор на тип слова независимо от контекста.

Ноутбук#

week01_word_embeddings.ipynb. Номера ячеек считают все ячейки, включая текстовые, начиная с 1. Приведённые числа взяты из прогона, сохранённого в курсе; у ячеек, изменённых с тех пор под текущие версии библиотек, сохранённого выхода нет.

  • Ячейка 58 обучает 32-мерную модель Word2Vec на токенизированных вопросах Quora (min_count=5, window=5); ячейка 59 считывает один вектор, а ячейка 60 перечисляет приведённых выше ближайших соседей слова word.
  • Ячейка 62 скачивает 100-мерные векторы glove-twitter-100; ячейки 64–66 решают три аналогии, сохранённые выходы которых — числа выше.
  • Ячейки 67–70 берут 1000 самых частых слов; ячейки 71–76 проецируют их методом главных компонент (целевая функция и её решение через SVD приведены в ячейке 71) и рисуют интерактивную диаграмму рассеяния; ячейки 77–79 повторяют то же с t-SNE (perplexity=3).
  • Ячейки 80–85 определяют эмбеддинг фразы как среднее векторов слов и рисуют около 1000 вопросов; ячейки 86–91 реализуют поиск ближайших соседей по косинусу среди первых 1000 вопросов. Функции эмбеддинга и поиска были упражнениями; теперь в ноутбуке записаны решения, а у этих ячеек нет сохранённых выходов.

Дальше#

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

Литература#