В чём разница между 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 зависит от особенностей задачи, корпуса, языка и требований к обобщающей способности модели при встрече с новыми словами.