В чём разница между GloVe и FastText?

GloVe и FastText — это два разных подхода к построению векторных представлений слов (word embeddings), широко применяемых в задачах обработки естественного языка (NLP). Несмотря на общую цель — представить слова в виде плотных векторов, отражающих их семантику и синтаксис, эти модели используют разные принципы построения эмбеддингов.

GloVe (Global Vectors for Word Representation)

Основная идея:

GloVe обучается не на основе локального контекста, как Word2Vec, а на глобальной статистике совместной встречаемости слов в корпусе. Он стремится получить такие векторы, чтобы их скалярное произведение приближало логарифм вероятности совместной встречаемости слов.

Формулировка:

Пусть:

  • XijX_{ij} — количество раз, когда слово jj встречается в контексте слова ii.

  • Xi=∑kXikX_i = \sum_k X_{ik} — общее число контекстов у слова ii.

  • Pij=XijXiP_{ij} = \frac{X_{ij}}{X_i} — вероятность встретить слово jj в контексте слова ii.

Модель GloVe обучается так, чтобы:

wi⊤⋅w~j+bi+b~j=log(Xij)w_i^\\top \\cdot \\tilde{w}\_j + b_i + \\tilde{b}\_j = \\log(X_{ij})

где:

  • wiw_i, w~j\tilde{w}_j — векторы слов и контекстов,

  • bib_i, b~j\tilde{b}_j — соответствующие смещения (biases).

Используется взвешенная функция потерь с понижающим влиянием для слишком редких и слишком частых пар слов.

Свойства GloVe:

  • Быстро обучается на разреженной матрице совместных частот.

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

  • Представления фиксированы после обучения, не подстраиваются под новые слова или контексты.

  • Не учитывает морфологию слов (корни, приставки, суффиксы).

FastText (от Facebook AI)

Основная идея:

FastText расширяет Word2Vec, моделируя не только сами слова, но и их подстроки (n-граммы). Каждое слово представляется как сумма векторов символных n-грамм. Это позволяет обрабатывать даже незнакомые слова и учитывать морфологические особенности.

Формулировка:

Пусть слово "where" разбивается на 3-граммы (n=3):

  • <wh, whe, her, ere, re>, где < и > обозначают начало и конец слова.

Вектор слова = сумма векторов всех его n-грамм:

v(where)=∑g∈Gwherezgv(\text{where}) = \sum_{g \in G_{\text{where}}} z_g

где zgz_g — вектор n-граммы.

Затем используется тот же skip-gram механизм, как в Word2Vec, для обучения.

Свойства FastText:

  • Захватывает внутреннюю структуру слов.

  • Хорошо работает с редкими и неизвестными словами, т.к. можно сгенерировать вектор даже для слова, которого нет в словаре.

  • Эмбеддинги обучаются с учетом морфологии (например, "run", "running", "runner" будут иметь похожие вектора).

  • Больше памяти и времени на обучение из-за хранения n-грамм.

Сравнение GloVe vs FastText

Характеристика GloVe FastText
Метод обучения Обучение на глобальной матрице со-встречаемости Обучение локально, как в Skip-gram, с n-граммами
--- --- ---
Контекст Использует статистику по всему корпусу Использует окно контекста
--- --- ---
Обработка неизвестных слов Невозможно (Out-Of-Vocabulary) Возможна (через n-граммы)
--- --- ---
Морфология Не учитывается Учитывается (разложение на символные n-граммы)
--- --- ---
Производительность на редких словах Низкая Хорошая
--- --- ---
Память Более компактен Более затратен по памяти
--- --- ---
Качество семантики Высокое на частых словах Лучше на морфологически близких и редких словах
--- --- ---
Скорость обучения Быстрее, особенно на больших корпусах Медленнее (n-граммы требуют доп. вычислений)
--- --- ---
Примеры реализации Stanford GloVe Facebook FastText
--- --- ---

Примеры использования в Python

GloVe (через gensim):

from gensim.models import KeyedVectors
model = KeyedVectors.load_word2vec_format("glove.6B.300d.txt", binary=False, no_header=True)
vector = model\["king"\]
similar = model.most_similar("king")

FastText:

from gensim.models import FastText
sentences = \[\["this", "is", "a", "sentence"\], \["another", "sentence"\]\]
model = FastText(sentences, vector_size=100, window=3, min_count=1, sg=1)
vector = model.wv\["sentence"\]

Или использовать предобученные эмбеддинги от Facebook:

import fasttext
model = fasttext.load_model("cc.en.300.bin")
vector = model.get_word_vector("unseenword")

Когда использовать GloVe, а когда FastText?

  • Если у вас чистый текст без неологизмов и опечаток, и вы работаете с распространёнными словами — GloVe может быть быстрее и достаточно точен.

  • Если у вас много редких, составных, морфологически сложных слов (например, агглютинативные языки, медицинские тексты, соцсети с ошибками) — FastText будет предпочтительнее.

  • Если необходимо обрабатывать неизвестные слова на инференсе, то GloVe не подойдёт, а FastText справится благодаря n-граммам.

Таким образом, выбор между GloVe и FastText зависит от особенностей задачи, корпуса, языка и требований к обобщающей способности модели при встрече с новыми словами.