Задача предсказания на неразмеченном тексте (угадать соседей по центральному слову или центральное слово по соседям) обучает таблицу эмбеддингов; из-за полного softmax по словарю каждый шаг затрагивает десятки миллионов весов, а негативное сэмплирование сокращает это число до нескольких тысяч и при этом по-прежнему выучивает статистику совместной встречаемости.
Предыдущая заметка показала, что в таблицах эмбеддингов слов (word embeddings), обученных библиотекой, слова, употребляемые в похожих контекстах, получают похожие векторы, но не объяснила почему. Слова, которые встречаются в одних и тех же контекстах, как правило, близки по смыслу (Harris, 1954; Firth, 1957), и модель, которая должна предсказывать соседей слова через узкое место (bottleneck), вынуждена давать словам с одинаковыми соседями похожие векторы в этом узком месте. Word2Vec (Mikolov et al., 2013a, 2013b) превращает это в две небольшие сети, которые можно обучать на миллиардах токенов благодаря иерархическому softmax (hierarchical softmax) или негативному сэмплированию (negative sampling); в этой заметке мы разбираем негативное сэмплирование — тот приём, который используется на практике.
Обозначения. Корпус — последовательность токенов w1,…,wT из словаря V; d — размерность эмбеддинга. Для позиции tцентральное слово — это wt, а контекст — окно Ct=(wt+j)j∈Jt, где Jt={j:1≤∣j∣≤m,1≤t+j≤T}, — до 2m соседей, повторы сохраняются; m — радиус окна. У каждого слова w два вектора: входной (центральный) вектор vw∈Rd, строка матрицы Win∈R∣V∣×d, и выходной (контекстный) вектор uw∈Rd, строка матрицы Wout∈R∣V∣×d. Win — это таблица эмбеддингов E из предыдущей заметки. σ(x)=1/(1+e−x); k — число негативных примеров (negative samples), а Pn — распределение, из которого их сэмплируют.
Базовый вариант: обучить эмбеддинги на размеченной задаче#
В предыдущей заметке перечислены источники таблицы. Обучение её как слоя классификатора работает (это проверено в заметке о CNN), но таблица узнаёт только о словах из размеченного набора и только то, что помогает предсказать метку. Размеченного текста мало; неразмеченного почти неограниченно много. Что должна предсказывать модель, когда метки нет?
Для ключевой идеи достаточно двухслойной линейной сети. Для входного слова c и целевого слова o:
берём one-hot-вектор ec∈{0,1}∣V∣ слова c;
умножаем его на первый слой: h=Win⊤ec=vc∈Rd — строку слова c (без смещения и без нелинейности);
сравниваем с h каждое слово словаря: s=Wouth∈R∣V∣, так что sw=uw⋅vc;
превращаем оценки (scores) в распределение с помощью softmax:
p(o∣c)=∑w∈Vexp(uw⋅vc)exp(uo⋅vc).
Сеть обучается с кросс-энтропией −logp(o∣c) на парах (вход, цель), вырезанных из корпуса; затем всё, кроме первого слоя, выбрасывается, и эмбеддинг — это строка vc. В коде произведение на one-hot-вектор — это выборка строки по индексу: батч индексов [B] превращается в [B,d], затем в [B,∣V∣]. У модели 2∣V∣d параметров.
Рисунок
Сеть Word2Vec: выбор строки, скалярное произведение с каждым выходным вектором, softmax
Игрушечные размеры |V| = 8 и d = 3, центральное слово coffee, наблюдаемое контекстное слово drink. Произведение one-hot-вектора слова coffee на W_in выбирает одну строку, v_coffee; смещения и нелинейности нет, поэтому скрытый вектор h — это и есть эта строка. Каждая строка u_w матрицы W_out скалярно умножается на h, что даёт одну оценку на слово словаря, а softmax превращает 8 оценок в распределение по контекстному слову (оценки и столбики вычислены по игрушечным векторам). Обучение повышает вероятность drink. После обучения сохраняется только W_in — как таблица эмбеддингов; W_out и softmax нужны только для обучающего сигнала. В CBOW на вход подаются 2m контекстных слов, а h — среднее их строк.
Две таблицы нужны потому, что с одной оценка слова в паре с самим собой, ∥vw∥2, была бы большой, хотя слово редко встречается в собственном окне; две таблицы позволяют сделать uw⋅vw малым (Goldberg and Levy, 2014). Библиотеки возвращают Win (wv в gensim).
Сеть оставляет открытым вопрос, какие слова служат входами, а какие — целями. Word2Vec определяет два варианта на одних и тех же окнах.
Непрерывный мешок слов (continuous bag of words, CBOW) предсказывает центральное слово по его контексту: среднее входных векторов контекста классифицируется среди ∣V∣ возможных центральных слов:
«Мешок» — потому что среднее игнорирует порядок слов; каждая позиция даёт один пример.
Skip-gram меняет направление: центральное слово предсказывает каждое контекстное слово по отдельности с помощью softmax из предыдущего раздела, минимизируя
LSG=−T1t=1∑Tj∈Jt∑logp(wt+j∣wt).
Каждая позиция даёт до 2m пар (центральное слово, контекстное слово).
Рисунок
Одно окно, две задачи предсказания
Предложение «we drink hot coffee every morning» с радиусом окна m = 2 и центральным словом coffee (янтарное); слово «we» лежит вне окна. Skip-gram (вверху) превращает окно в четыре отдельные обучающие пары, в каждой из которых модель должна предсказать одного соседа по coffee. CBOW (внизу) превращает то же окно в один пример: четыре вектора соседей усредняются, и среднее должно предсказать coffee. Сдвигая центр по всем шести позициям, получаем 2, 3, 4, 4, 3, 2 соседей на позицию (у краёв предложения меньше), то есть 18 обновлений skip-gram против 6 обновлений CBOW.
Разобранный пример: обучающие пары. В предложении we drink hot coffee every morning (T=6, m=2) центральное слово coffee даёт четыре пары skip-gram и один пример CBOW, в котором среднее четырёх векторов контекста предсказывает coffee (рисунок выше). У позиции i есть min(m,i−1)+min(m,T−i) соседей, так что предложение даёт 2+3+4+4+3+2=18 пар skip-gram против 6 примеров CBOW.
Нейросетевая языковая модель (Bengio et al., 2003) тоже начинается с таблицы эмбеддингов, но предсказывает следующее слово, как n-граммная модель, через дорогой нелинейный скрытый слой. Word2Vec нужна только таблица, поэтому он отказывается от нелинейности и использует контекст с обеих сторон.
CBOW вычисляет одно выходное распределение на позицию, а skip-gram — до 2m, так что CBOW дешевле примерно во столько раз, сколько слов в окне, но в сравнении Mikolov et al. (2013a), §3.1–3.2 и таблица 3 (640-мерные векторы), skip-gram был намного лучше на семантических аналогиях (55% против 24%) и немного хуже на синтаксических (59% против 64%). Также отмечают, что он лучше для редких слов (страница проекта word2vec), векторы которых CBOW обновляет только через среднее с не более чем 2m−1 другими.
Для каждого центрального слова эффективный радиус выбирается равномерно из {1,…,m} (Mikolov et al., 2013a, §3.2), поэтому сосед на расстоянии j используется с вероятностью (m−j+1)/m (1,0.8,0.6,0.4,0.2 при m=5): ближние соседи получают больший вес без явного взвешивания.
Запишем функцию потерь skip-gram одной пары (c,o) как −logp(o∣c)=−uo⋅vc+log∑w∈Vexp(uw⋅vc). Производная log-sum-exp по vc — это взвешенное по softmax среднее векторов uw, а по одному uw — это p(w∣c)vc:
Первая строка читается как «наблюдаемое минус ожидаемое»: шаг притягивает vc к контекстному слову, которое встретилось, и отталкивает от того, которое ожидает модель. Вторая ненулевая для каждогоw, поэтому одна пара обновляет все ∣V∣ строк Wout, а одному лишь нормировочному знаменателю нужны ∣V∣ скалярных произведений (Rong, 2014).
При ∣V∣=200000 и d=300 у модели 2∣V∣d=1.2×108 параметров. Одна пара стоит ∣V∣d=6×107 умножений-сложений на оценки и обновляет ∣V∣d+d=60000300 параметров, а корпус из 109 токенов при m=5 даёт до 1010 пар за один проход. Сама модель невелика; обучение невозможно из-за нормировки.
Рисунок
Сколько параметров затрагивает одна обучающая пара при росте словаря
Обе оси логарифмические; d = 300. Полный softmax читает и обновляет каждую выходную строку, поэтому его стоимость растёт пропорционально |V|. Иерархический softmax заменяет нормировку по |V| классам примерно log₂|V| бинарными решениями вдоль дерева. Негативное сэмплирование с k = 5 обновляет центральный вектор, наблюдаемый контекстный вектор и 5 сэмплированных векторов, (k + 2)d = 2100 параметров, каким бы ни был размер словаря. При |V| = 200 000 (вертикальная линия) полный softmax затрагивает 60 000 300 параметров на пару, примерно в 28 600 раз больше.
Иерархический softmax (Morin and Bengio, 2005) размещает словарь в листьях бинарного дерева (дерева Хаффмана, Mikolov et al., 2013b, §2.1), так что предсказание требует около log2∣V∣ бинарных решений, 18 для 200 000 слов. Негативное сэмплирование отказывается от нормировки; на практике это вариант по умолчанию, и ему посвящена оставшаяся часть заметки.
Softmax и негативное сэмплирование на выходной стороне skip-gram
Игрушечные размеры |V| = 8 и d = 3; слова те же, что в разобранном примере ниже: центральное coffee, наблюдаемое контекстное drink, негативные car и tax. В полном softmax (первая панель) вероятность drink нормируется по всем |V| словам, поэтому одна обучающая пара читает и обновляет каждую строку W_out. В негативном сэмплировании (вторая панель) пара (coffee, drink) — положительный пример с целевым значением 1, а k = 2 сэмплированных слова, car и tax, — негативные примеры с целевым значением 0 (целевые значения в скобках); каждый пример — независимый логистический классификатор по своей оценке; читаются и обновляются только эти k + 1 выходные строки и v_coffee. Остальной словарь не затрагивается. При |V| = 200 000, d = 300 и k = 5 это 2100 параметров на пару вместо 60 000 300.
Для наблюдаемой пары (c,o) и шумовых слов n1,…,nk∼Pn функция потерь skip-gram с негативным сэмплированием (skip-gram negative sampling, SGNS) равна
LNS(c,o)=−logσ(uo⋅vc)−i=1∑klogσ(−uni⋅vc).
σ(uw⋅vc) — вероятность, которую модель приписывает тому, что пара настоящая, а σ(−x)=1−σ(x), так что каждый член суммы — логарифм вероятности того, что шумовая пара будет распознана как подделка. С оценками so=uo⋅vc и si=uni⋅vc и с учётом dxdlogσ(x)=1−σ(x) градиенты равны
Это «наблюдаемое минус ожидаемое», в котором математическое ожидание по ∣V∣ словам заменено на k сэмплированных слов, каждое из которых взвешено тем, насколько правдоподобным его считает модель; у всех остальных строк градиент нулевой.
CBOW использует ту же функцию потерь, в которой вместо центрального вектора стоит среднее контекста ht, а положительным примером служит центральное слово:
Её градиенты — те же, что выше, с ht вместо vc. Цепное правило через среднее отправило бы каждому вектору контекста 1/∣Jt∣ градиента по ht; word2vec.c (страница проекта word2vec) и gensim (cbow_mean=1) добавляют его целиком, что равносильно большему шагу обучения для входной таблицы.
Пара обновляет (k+2)d параметров, 2100 при d=300 и k=5. Mikolov et al. (2013b), §2.2, сообщают, что для небольших обучающих наборов подходят k от 5 до 20, а для больших — от 2 до 5; gensim использует k=5.
Игрушечные числа: d=2, k=2, шаг обучения η=0.5 (большой, чтобы движение было заметно), центральное слово coffee, наблюдаемое контекстное слово drink, негативные car и tax.
Вектор
Значение
Оценка с vcoffee
σ(оценка)
Член функции потерь
vcoffee
(1.0,0.5)
udrink (наблюдаемое)
(0.8,0.6)
1.10
0.750
−logσ(1.10)=0.287
ucar (негативное)
(−0.2,0.9)
0.25
0.562
−logσ(−0.25)=0.826
utax (негативное)
(0.6,−0.4)
0.40
0.599
−logσ(−0.40)=0.913
Функция потерь равна 0.287+0.826+0.913=2.026, а градиенты равны
∂L/∂ucar=0.562(1.0,0.5)=(0.562,0.281) и ∂L/∂utax=0.599(1.0,0.5)=(0.599,0.299).
Один шаг x←x−η∂L/∂x даёт vcoffee=(0.977,0.442), udrink=(0.925,0.662), ucar=(−0.481,0.759) и utax=(0.301,−0.550); два рисунка ниже показывают, как движутся векторы и оценки, а функция потерь падает с 2.026 до 1.611. Изменились четыре строки; при 200 000 слов остальные 199 997 выходных строк даже не читались.
Рисунок
Один шаг негативного сэмплирования на плоскости
Разобранный пример с d = 2, k = 2 негативными примерами и шагом обучения 0.5. Штриховые линии — четыре вектора до шага, сплошные — после него; короткие стрелки показывают, как сдвинулся конец каждого выходного вектора (v_coffee сдвигается слишком мало для стрелки). Центральный вектор v_coffee переходит из (1.000, 0.500) в (0.977, 0.442). Наблюдаемый контекстный вектор u_drink сдвигается вдоль v_coffee, поэтому их скалярное произведение растёт; негативные векторы u_car и u_tax сдвигаются против v_coffee, поэтому их скалярные произведения уменьшаются. Каждый градиент кратен вектору, который уже есть на рисунке: выходная строка движется только вдоль v_coffee, а v_coffee — вдоль взвешенной суммы трёх выходных строк. Никакие другие строки словаря не читаются.Рисунок
Два члена функции потерь негативного сэмплирования в зависимости от оценки
Зелёная кривая: −log σ(s), функция потерь наблюдаемой пары; её наклон σ(s) − 1 становится пренебрежимо малым, когда оценка велика, так что уже распознанная пара перестаёт двигаться. Красная: −log σ(−s), функция потерь каждой негативной пары; её наклон σ(s) растёт вместе с оценкой, так что негативный пример, который модель ошибочно считает правдоподобным, получает самый сильный толчок. Точки — разобранный пример (d = 2, k = 2, шаг обучения 0.5): полые — до шага, закрашенные — после него. Наблюдаемая пара (coffee, drink) сдвигается с оценки 1.10 на 1.20, негативные car и tax — с 0.25 и 0.40 на −0.13 и 0.05; суммарная функция потерь падает с 2.026 до 1.611.
Для сравнения — полный softmax по игрушечному словарю из шести слов с тем же vcoffee: drink(0.8,0.6), hot(0.7,0.1), morning(0.3,0.5), car(−0.2,0.9), tax(0.6,−0.4) и cup(0.9,0.2). Оценки равны 1.10,0.75,0.55,0.25,0.40,1.00, вероятности — 0.243,0.171,0.140,0.104,0.121,0.220, а функция потерь — −log0.243=1.414. Градиенту по vcoffee, ∑wp(w∣c)uw−udrink=(−0.193,−0.277), нужны все шесть строк, и он понижает cup — правдоподобный контекст, стоящий на втором месте; негативное сэмплирование понижает слово, только когда оно выпало.
Негативные слова сэмплируются из униграммного распределения (unigram distribution), возведённого в степень 3/4 и заново нормированного (Mikolov et al., 2013b, §2.2):
Pn(w)=∑w′∈Vcount(w′)3/4count(w)3/4.
С игрушечными числами вхождений the 600, coffee 30 и espresso 3 сэмплирование пропорционально числу вхождений даёт вероятности 0.948,0.047,0.005, а степень 3/4 — 0.889,0.094,0.017: вероятность выбрать espresso становится в 3.5 раза выше.
Рисунок
Униграммное распределение в степени 3/4
Игрушечный словарь из 10 слов, частоты которых подчиняются закону Ципфа: частота пропорциональна 1/ранг. Серые столбики: негативные примеры выбираются пропорционально частоте (α = 1). Синие: выбор Word2Vec, α = 3/4. Штриховая линия: равномерное сэмплирование (α = 0). Степень 3/4 забирает вероятность у самых частых слов и отдаёт её редким: при α = 1 самое частое слово выбирается в 10 раз чаще самого редкого, при α = 3/4 — в 5.6 раза чаще. Значение 3/4 подобрано эмпирически.
Пар с the или a очень много, и они малоинформативны. Перед тем как формировать окна, каждое вхождение слова w с относительной частотой f(w) отбрасывается с вероятностью
Pdiscard(w)=1−θ/f(w)
при пороге θ≈10−5 и никогда не отбрасывается при f(w)≤θ (Mikolov et al., 2013b, §2.3). Для игрушечных частот 0.05, 10−3 и 10−4 вероятности отбрасывания равны 0.986, 0.9 и 0.68. Удаление токена сближает слова вокруг него, поэтому прореживание (subsampling) также расширяет эффективное окно. gensim использует вариант этого правила с порогом sample, по умолчанию 10−3.
Негативное сэмплирование оптимизирует другую целевую функцию, нежели softmax, — упрощённый вариант шумоконтрастного оценивания (noise-contrastive estimation, NCE) (Gutmann and Hyvärinen, 2010; Mnih and Teh, 2012). NCE классифицирует по исправленному логиту uo⋅vc−log(kPn(o)) и в оптимуме даёт logP(o∣c). Негативное сэмплирование использует сырую оценку (Mikolov et al., 2013b, §2.2), поэтому его оптимум сдвинут: если d достаточно велико, чтобы каждую оценку можно было задать независимо, он равен поточечной взаимной информации (pointwise mutual information, PMI), сдвинутой на logk (Levy and Goldberg, 2014, §3.1):
Со степенью 3/4 это сглаженная PMI: редкие контекстные слова получают большее Pn(o) и меньшее значение (Levy, Goldberg and Dagan, 2015, «сглаживание распределения контекстов», context distribution smoothing).
Рисунок
Целевая функция негативного сэмплирования для одной пары и её минимум
Целевая функция одной пары (c, o) как функция её оценки x = u_o · v_c, делённая на число членов, чтобы кривые помещались на одной оси. Игрушечные значения: центральное слово c встречается в #(c) = 1000 парах, P_n(o) = 0.01 и k = 5, так что o выбирается негативным примером для c в среднем 50 раз. Синяя кривая: o встречается вместе с c 200 раз, PMI = log 20 = 3.00. Янтарная: 10 раз, PMI = 0.00, ровно столько, сколько ожидается при независимости слов. Минимум каждой кривой (закрашенная точка) лежит в точке PMI − log k: 1.39 и −1.61; стрелки под осью показывают сдвиг на log 5 = 1.61 от PMI (полый маркер). Точечная кривая: у пары, которая никогда не встречается вместе, остаётся только негативный член −log σ(−x); он неотрицателен и убывает к своей нижней грани 0 при x → −∞, не достигая её, поэтому конечного минимума нет и оптимальная оценка равна −∞.
Итак, SGNS раскладывает матрицу сдвинутой PMI в произведение WinWout⊤ ранга d, и это сжатие сближает слова с похожими строками PMI. У пар, которые никогда не встречаются вместе, PMI=−∞ (точечная кривая), поэтому там разложение остаётся приближённым при любом d.
Возьмём около полумиллиона вопросов Quora, токенизированных без стоп-слов, но со знаками препинания, такими как ?, и обучим модель с d=32, радиусом окна 5 и минимальной частотой 5. Всё остальное — значения gensim по умолчанию (таблица ниже), так что это CBOW с негативным сэмплированием, k=5, и прореживанием.
У вектора слова word 32 координаты от −4.09 до 4.18 (норма 10.7), а его ближайшие соседи по косинусной близости, приведённые в предыдущей заметке, — sentence (0.836), words (0.796) и verb (0.787). Формы единственного и множественного числа стоят рядом (word/words, phrase/phrases), потому что текст не лемматизировался. Соседи тематические не меньше, чем грамматические, потому что без стоп-слов и с прореженным ? окно радиуса 5 покрывает большую часть вопроса, чем пять исходных токенов.
Вторая модель CBOW, 100-мерная, с минимальной частотой 4 и радиусом окна 5, обучается только на обучающих статьях AG News, чтобы слова тестовой выборки не просочились; она даёт входные векторы для следующей заметки.
Радиус; более широкие окна дают более тематических соседей, более узкие — более синтаксических (Jurafsky and Martin, §5.7)
5
5
min_count
Отбрасывает более редкие слова; задаёт ∣V∣
5
5 (Quora), 4 (AG News)
sg
0 = CBOW, 1 = skip-gram
0
по умолчанию
negativek
Число негативных примеров на пару; 0 вместе с hs=1 даёт иерархический softmax
5
по умолчанию
ns_exponent
Показатель степени частот в Pn
0.75
по умолчанию
sample
Порог прореживания частых слов
10−3
по умолчанию
epochs, alpha
Число проходов по корпусу; начальный шаг обучения
5, 0.025
по умолчанию
С подобранными окном, прореживанием, числом негативных примеров и показателем степени шума методы, основанные на подсчётах, и SGNS дают гораздо более близкие результаты, чем предполагали исходные сравнения (Levy, Goldberg and Dagan, 2015).
У двух более поздних статических эмбеддингов есть собственные заметки. GloVe (Pennington, Socher and Manning, 2014), который дал векторы Twitter из предыдущей заметки, подгоняет uw⋅vc+bw+bc≈logXwc к матрице совместной встречаемости X взвешенным методом наименьших квадратов; как и SGNS, он подгоняет функцию от частот совместной встречаемости скалярными произведениями, поэтому они оказываются близки (заметка о GloVe). FastText (Bojanowski et al., 2017) обучает SGNS, но представляет слово как сумму векторов его символьных n-грамм (where → <wh, whe, her, ere, re>), поэтому у родственных слов есть общие параметры, а незнакомое слово всё равно получает вектор (заметка о FastText).
Статичность. Один вектор на слово словаря: bank — единый компромисс между берегом реки и банком. Это устраняет заметка о BERT.
Закрытый словарь. Слова ниже порога min_count или отсутствующие в корпусе не получают вектора; эту проблему решают FastText и токенизация на подслова (subword).
Привязка к окну. Вектор формируют только соседи в пределах m позиций, а CBOW игнорирует их порядок; отрицание и дальние зависимости не учитываются.
Сходство означает взаимозаменяемость.good и bad, hot и cold, Monday и Tuesday встречаются в одних и тех же контекстах и оказываются близки — неподходящая геометрия для анализа тональности.
Требовательность к данным. Полмиллиона вопросов хватает для частых слов, таких как word, но не для редких; аналогии из предыдущей заметки используют миллиарды токенов.
Чувствительность и невоспроизводимость. Предобработка, окно, прореживание и k меняют соседей, а многопоточные запуски с одним seed дают разные результаты.
Skip-gram предсказывает контекст по центральному слову, CBOW — центральное слово по контексту. Сеть линейна; её первый слой Win — это таблица эмбеддингов, а выходной слой лишь даёт обучающий сигнал.
Полный softmax обновляет все ∣V∣ выходных строк на каждую пару; негативное сэмплирование классифицирует настоящую пару против k пар, сэмплированных из униграммного распределения в степени 3/4, и обновляет (k+2)d параметров.
В оптимуме SGNS выставляет uo⋅vc=PMI(c,o)−logk: векторы — низкоранговое сжатие статистики совместной встречаемости.
gensim по умолчанию обучает CBOW с k=5 негативными примерами; для skip-gram нужен sg=1.
week01_word_embeddings.ipynb. Ячейки нумеруются с 1, включая текстовые. Приведённые числа взяты из прогона, сохранённого в курсе; у ячеек, изменённых с тех пор под текущие версии библиотек, сохранённого выхода нет.
Данные (ячейки 4–31). Ячейка 4 скачивает файл с вопросами Quora, только если его нет (в репозитории он уже лежит); ячейка 6 читает data/quora.txt с диска. Ячейки 13–22 строят data_tok: wordpunct_tokenize, приведение к нижнему регистру (упражнение в ячейке 15, решение уже вписано), удаление стоп-слов NLTK, знаки препинания остаются. Лемматизированные и стеммированные варианты 537 272 вопросов (ячейки 28–31) Word2Vec не использует.
Обучение (ячейки 53–58). Текстовые ячейки вводят skip-gram и gensim (Alammar, 2019); ячейка 58 обучает Word2Vec(data_tok, vector_size=32, min_count=5, window=5), что со значениями по умолчанию даёт CBOW с 5 негативными примерами и описанным выше суммирующим обновлением контекста (cbow_mean=1), а не skip-gram.
Соседи (ячейки 59–60). Вектор слова word и его ближайшие соседи — единственные сохранённые выходы этой модели: ни кривая функции потерь, ни время обучения, ни размер словаря, ни метрика качества не сохранены. Норма 10.7, приведённая выше, вычислена по напечатанным координатам.
Аналогии (ячейки 61–66). Предобученные 100-мерные векторы GloVe Twitter и аналогии, приведённые в предыдущей заметке.
week02_NN_text_classification.ipynb, ячейки 13–15, обучает 100-мерную модель CBOW (min_count=4, window=5) только на обучающих текстах AG News, чтобы слова тестовой выборки не просочились, и превращает каждую статью в последовательность векторов для следующей заметки.
Word2Vec учится по одному окну за раз и никогда не смотрит на корпус целиком. Следующая заметка один раз подсчитывает все пары слов в матрицу совместной встречаемости, подгоняет векторы прямо к логарифмам этих частот и показывает, что оба подхода в итоге раскладывают почти одну и ту же матрицу.
J. R. Firth. A synopsis of linguistic theory 1930–1955. In Studies in Linguistic Analysis, Blackwell, 1957.
Y. Bengio, R. Ducharme, P. Vincent, C. Jauvin. A Neural Probabilistic Language Model. JMLR, 3, 2003. Предсказание следующего слова со слоем эмбеддингов.
T. Mikolov, K. Chen, G. Corrado, J. Dean. Efficient Estimation of Word Representations in Vector Space. ICLR Workshop, 2013. CBOW и skip-gram, их вычислительная сложность обучения (§3.1–3.2) и сравнение (таблица 3), случайный радиус окна (§3.2).
D. Jurafsky, J. H. Martin. Speech and Language Processing, 3rd edition draft of August 19, 2026, chapter 5 “Embeddings”, §5.5 “Word2vec” and §5.7 “Semantic properties of embeddings”. Учебное изложение skip-gram с негативным сэмплированием; влияние размера окна.
T. Mikolov et al. word2vec. Project page and reference C implementation (word2vec.c), Google Code Archive, 2013. Практическое сравнение skip-gram и CBOW («better for infrequent words»); обновление CBOW, которое добавляет весь градиент скрытого слоя к каждому вектору контекста.
J. Starmer (StatQuest). Word Embedding and Word2Vec, Clearly Explained!!!. Видео, 2023. Объяснение стоимости одного обновления и того, как негативное сэмплирование её снижает, следует этому видео.
J. Alammar. The Illustrated Word2vec. Пост в блоге, 2019. Иллюстрированный разбор skip-gram с негативным сэмплированием.