Машинное обучение
Word Embeddings: Word2Vec, GloVe, FastText
В 2013 году Tomas Mikolov из Google обнаружил нечто поразительное. Он обучил простую нейросеть на миллиардах слов и получил числовые векторы для каждого слова. А потом выяснилось, что с этими векторами можно делать математику: vector(king) - vector(man) + vector(woman) = vector(queen). Впервые компьютер научился выполнять арифметику смыслов. Вычитаешь мужчину из короля, добавляешь женщину - получаешь королеву. Как числа могут захватывать значения слов? И почему вычитание и сложение работают со смыслами так же, как с числами?
- **Поисковые системы** - Google, Яндекс и другие используют word embeddings для понимания запросов: поиск по 'как починить кран' находит статьи про 'ремонт смесителя', потому что embeddings знают, что эти слова семантически близки, даже если ни одно слово из запроса не встречается в документе
- **Рекомендательные системы** - Spotify, Netflix и Amazon представляют товары и контент как векторы (по аналогии с word embeddings) и рекомендуют похожие элементы через косинусную близость: если вам нравится один фильм, система найдёт ближайшие в пространстве эмбеддингов
- **Машинный перевод** - embeddings для разных языков можно выровнять в одно пространство, где 'cat' и 'кошка' будут рядом, что позволяет переводить между языками даже без параллельных корпусов (unsupervised translation)
Предварительные знания
Как слова поселили в векторном пространстве
В 2003 году Йошуа Бенжио с коллегами предложили нейросетевую языковую модель, которая выучивала плотный вектор для каждого слова, предсказывая следующее, - первое наглядное доказательство, что смысл можно упаковать в непрерывные координаты. Идея дошла до массы в 2013 году, когда команда Томаша Миколова в Google выпустила word2vec - быстрый метод, чья знаменитая арифметика "король минус мужчина плюс женщина равно королева" показала, что векторы улавливают аналогии. Год спустя Джеффри Пеннингтон, Ричард Сошер и Кристофер Мэннинг из Стэнфорда выпустили GloVe, который получал похожие эмбеддинги, факторизуя глобальные счётчики совместной встречаемости слов. Вместе они сделали предобученные векторы слов стандартной отправной точкой для NLP.
Word2Vec: слово познаётся по его окружению
В 2013 году Tomas Mikolov из Google опубликовал модель Word2Vec, которая перевернула NLP. Идея проста: **значение слова определяется его контекстом**. Если два слова появляются в похожих окружениях ("кот сидит на ...", "пёс сидит на ..."), значит они семантически близки. Word2Vec обучает нейросеть предсказывать контекст по слову (или слово по контексту), а побочный продукт обучения - **векторы слов** - оказываются невероятно полезными.
Внутри Word2Vec - простая нейросеть с одним скрытым слоем. Входное слово кодируется как one-hot вектор размером V (размер словаря, обычно 50-300 тысяч слов). Скрытый слой имеет размерность d (обычно 100-300) - именно он формирует **embedding-вектор** слова. Выходной слой предсказывает вероятности контекстных слов. После обучения мы выбрасываем входной и выходной слои и забираем только матрицу весов скрытого слоя - это и есть наши word embeddings.
**Магия Word2Vec - арифметика смыслов:** Обученные векторы ловят семантические отношения: - vector("king") - vector("man") + vector("woman") = vector("queen") - vector("Paris") - vector("France") + vector("Germany") = vector("Berlin") - vector("walking") - vector("walk") + vector("swim") = vector("swimming") Это работает потому, что Word2Vec выучивает **направления** в пространстве: - "man" -> "woman" - это направление пола - "king" -> "queen" - то же направление! Вектор (king - man) захватывает концепцию "королевская особа" без привязки к полу. Добавляя woman, мы получаем "королевская особа + женщина" = queen.
Word2Vec тренируется быстро - Google обучил модель на 100 миллиардах слов за несколько часов на кластере. Секрет скорости - **negative sampling**: вместо softmax по всем 300000 словам (дорого!), модель обучается различать настоящие контекстные пары от случайных "шумовых" пар. Это снижает вычислительную сложность на порядки без существенной потери качества.
Почему арифметика vector('king') - vector('man') + vector('woman') дает результат, близкий к vector('queen')?
GloVe: глобальная статистика совместной встречаемости
Word2Vec обучается на локальных контекстных окнах - он видит по 5-10 слов вокруг каждого слова. Но в языке есть глобальные паттерны, которые локальное окно может пропустить. В 2014 году команда из Stanford (Pennington, Socher, Manning) предложила **GloVe (Global Vectors)** - модель, которая объединяет два подхода: подсчёт глобальной статистики совместной встречаемости слов (как в классических методах) и обучение плотных векторов (как в Word2Vec).
Идея GloVe: если слово *ice* часто встречается с *solid*, а *steam* - с *gas*, то отношение их вероятностей совместного появления P(solid|ice) / P(solid|steam) будет намного больше 1. А для нейтрального слова *water* отношение P(solid|ice) / P(solid|steam) будет близко к 1. GloVe обучает векторы так, чтобы **скалярное произведение двух векторов приближало логарифм их совместной встречаемости**: w_i * w_j + b_i + b_j = log(X_ij).
**GloVe vs Word2Vec - два подхода к одной цели:** **Подсчётные методы** (LSA, HAL): строят матрицу co-occurrence и разлагают её (SVD). Используют глобальную статистику, но плохо ловят аналогии. **Предсказательные методы** (Word2Vec): обучают нейросеть на локальных контекстах. Ловят аналогии, но не используют глобальную статистику. **GloVe - объединение обоих:** - Сначала строит глобальную матрицу X (подсчёт) - Затем обучает векторы через оптимизацию (предсказание) - Функция потерь: sum_ij f(X_ij) * (w_i * w_j + b_i + b_j - log(X_ij))^2 - f(X_ij) - весовая функция, чтобы редкие пары не доминировали Результат: качество аналогий на уровне Word2Vec + лучшее использование статистики корпуса.
На практике GloVe и Word2Vec дают сопоставимое качество. GloVe популярен благодаря предобученным моделям от Stanford: **GloVe 6B** (6 млрд токенов, Wikipedia + Gigaword, размерности 50/100/200/300), **GloVe 42B** (42 млрд токенов, Common Crawl), **GloVe 840B** (840 млрд токенов, 2.2 млн слов). Для большинства задач достаточно GloVe 6B с размерностью 100 или 300 - они бесплатны, обучены на качественных данных и широко используются как baseline.
В чём главное отличие подхода GloVe от Word2Vec?
FastText: сила символьных n-грамм
Word2Vec и GloVe работают на уровне целых слов: каждое слово - отдельный вектор. Но что если модель встретит слово, которого не было в обучающих данных? Например, "прединфарктный" или новое сленговое слово? Word2Vec и GloVe просто не знают, что с ним делать - это проблема **OOV (Out-Of-Vocabulary)**. В 2016 году команда Facebook AI Research (Bojanowski, Grave, Joulin, Mikolov - тот самый!) предложила **FastText**, который решает эту проблему, работая на уровне **символьных n-грамм** (подслов).
Ключевое преимущество FastText - обработка **OOV-слов** (слов, не встреченных при обучении). Если модель никогда не видела слово "прединфарктный", она всё равно может построить его вектор из знакомых n-грамм: "пред", "инф", "арк" и т.д. Word2Vec и GloVe в такой ситуации беспомощны - они выдают ошибку. FastText особенно полезен для **морфологически богатых языков** (русский, турецкий, финский), где одно слово может иметь десятки форм: "играть", "играю", "играющий", "наигравшись" - все они будут иметь близкие векторы.
**FastText vs Word2Vec - три ключевых отличия:** 1. **Единица обучения:** - Word2Vec: целые слова - FastText: символьные n-граммы (подслова) 2. **Обработка OOV-слов:** - Word2Vec/GloVe: ошибка (слова нет в словаре) - FastText: строит вектор из n-грамм --> работает для любого слова 3. **Морфология:** - Word2Vec: "бегу" и "бежал" - два независимых вектора - FastText: общие n-граммы "бег", "бе" связывают формы слова **Когда FastText лучше:** - Морфологически богатые языки (русский, немецкий, турецкий) - Доменные тексты с редкими терминами (медицина, юриспруденция) - Тексты с опечатками или сленгом **Когда Word2Vec/GloVe достаточно:** - Английский и другие аналитические языки - Большой чистый корпус, покрывающий нужную лексику
FastText от Facebook поставляется с **предобученными моделями для 157 языков**, обученными на Common Crawl и Wikipedia. Для русского языка модель содержит 2 миллиона слов с размерностью 300. Это делает FastText лучшим выбором для мультиязычных проектов и языков с богатой морфологией.
Как FastText обрабатывает слово, которого не было в обучающих данных (OOV)?
Пространство эмбеддингов: геометрия смысла
Word2Vec, GloVe и FastText создают пространство, где каждое слово - это точка в d-мерном пространстве (обычно d = 100-300). Но это не просто набор точек - в этом пространстве есть **геометрическая структура**, отражающая семантику языка. Близкие по смыслу слова формируют кластеры, а семантические отношения кодируются как **направления** (векторы разностей). Давайте исследуем эту геометрию.
**Арифметика аналогий** - это не магический трюк, а следствие линейной структуры пространства. Вектор (king - queen) приблизительно равен вектору (man - woman), потому что оба кодируют концепцию пола. Вектор (Paris - France) приблизительно равен (Tokyo - Japan), потому что оба кодируют отношение "столица -> страна". Эти параллельные направления возникают из-за того, что слова используются в систематически похожих контекстах.
**Проблема предвзятости (bias) в эмбеддингах:** Word embeddings обучаются на текстах, написанных людьми, и впитывают **социальные стереотипы** из данных: - vector("doctor") ближе к vector("man"), чем к vector("woman") - vector("nurse") ближе к vector("woman") - vector("programmer") ближе к vector("man") Это не баг алгоритма - это отражение предвзятости в текстах. Но если использовать такие embeddings в системе подбора резюме, она будет дискриминировать по полу. **Методы борьбы:** - Debiasing (Bolukbasi et al., 2016): выделить "гендерное направление" и проецировать нейтральные слова ортогонально к нему - Curated training data: фильтровать или балансировать обучающий корпус - Post-hoc auditing: тестировать модель на bias перед деплоем
**Ограничение статических эмбеддингов - одно слово = один вектор:** Word2Vec, GloVe, FastText дают каждому слову **один фиксированный вектор**, независимо от контекста. Но многие слова многозначны: - "bank" = берег реки ИЛИ банк - "bat" = летучая мышь ИЛИ бита - "замок" = здание ИЛИ устройство для запирания Статический embedding - это **усреднение** всех значений. Для слова "bank" вектор будет где-то между "финансы" и "география". **Решение - контекстуальные эмбеддинги (ELMo, BERT, GPT):** - Вектор слова зависит от предложения - "I went to the bank to deposit money" --> вектор "bank" ближе к "finance" - "I sat on the river bank" --> вектор "bank" ближе к "shore" Word2Vec/GloVe/FastText - это фундамент, мост между человеческим языком и математикой. Те самые операции king - man + woman = queen показали, что язык имеет регулярную геометрическую структуру. Контекстуальные модели (BERT, GPT) - следующий шаг эволюции, и они строятся на этом фундаменте.
Каждое слово имеет одно фиксированное значение, поэтому один вектор на слово - это правильный подход
Статические эмбеддинги (Word2Vec, GloVe, FastText) дают одно усредненное представление для многозначных слов, например 'bank' (берег/банк). Контекстуальные модели (ELMo, BERT) решают эту проблему, создавая разные векторы в зависимости от предложения
Большинство частотных слов многозначны: 'лук' (оружие/овощ), 'ключ' (от двери/музыкальный/родник). Статический embedding усредняет все значения в один вектор, что ухудшает качество для задач, где контекст критичен. BERT и подобные модели генерируют вектор слова с учетом окружения, что позволяет различать 'I went to the bank (financial)' и 'I sat on the river bank (geographic)'.
Итоги
- **Word2Vec** обучает нейросеть предсказывать контекст слова (Skip-gram) или слово по контексту (CBOW), а побочный продукт - embedding-векторы - захватывают семантические отношения, включая арифметику аналогий
- **GloVe** объединяет подсчётный и предсказательный подходы: строит глобальную матрицу совместной встречаемости слов и обучает векторы приближать её логарифм, используя статистику всего корпуса целиком
- **FastText** работает на уровне символьных n-грамм вместо целых слов, что позволяет строить осмысленные векторы для слов, не встреченных при обучении (OOV), и лучше работать с морфологически богатыми языками
- **Пространство эмбеддингов** имеет геометрическую структуру: кластеры семантически похожих слов, параллельные направления для аналогий, но также содержит социальные предвзятости из обучающих данных - а открытие Mikolov king - man + woman = queen в 2013 году показало, что язык имеет регулярную математическую структуру, которую можно выучить из контекста
Связанные темы
Word embeddings - ключевой мост между текстовым препроцессингом и современными языковыми моделями:
- Text Preprocessing — Препроцессинг (токенизация, лемматизация, очистка) готовит текст для обучения embeddings. Качество входных данных напрямую влияет на качество векторов: мусор на входе - мусор на выходе
- BERT и GPT — Контекстуальные модели (BERT, GPT) - эволюция word embeddings: вместо одного статического вектора на слово, они создают динамические представления, зависящие от предложения. Transformer-архитектура заменила Word2Vec как стандарт NLP
- Seq2Seq — Sequence-to-sequence модели (машинный перевод, суммаризация) используют word embeddings как входной слой: слова превращаются в векторы, которые затем обрабатывает encoder-decoder архитектура
- Нейронные сети — Word2Vec - это по сути двухслойная нейросеть. Embedding-слой (матрица W1) присутствует в любой нейросети для NLP как первый слой, преобразующий дискретные слова в непрерывные векторы
Вопросы для размышления
- Word2Vec учится предсказывать контекст, а не значение слова напрямую. Почему побочный продукт (embedding-векторы) оказывается настолько полезным для семантических задач? Что это говорит о связи между контекстом и значением в естественном языке?
- FastText решает проблему OOV через символьные n-граммы. Но есть ли ситуации, когда n-граммы дадут плохой вектор для незнакомого слова? Приведите пример слова, для которого n-граммы будут вводить в заблуждение.
- Word embeddings впитывают предвзятости из обучающих текстов. Стоит ли убирать bias из embeddings (рискуя потерять полезную информацию) или лучше оставить и бороться с предвзятостью на уровне приложения? Какие компромиссы здесь возникают?
Связанные уроки
- ml-34-text-preprocessing — Эмбеддинги получают подготовленные токены
- ml-37-bert-gpt — Контекстные эмбеддинги расширяют статические векторы
- ml-36-seq2seq — Энкодеры seq2seq используют эмбеддинги
- la-13-eigenvectors — Геометрия эмбеддингов опирается на векторные пространства
- aie-09-embeddings — API-эмбеддинги играют ту же роль
- aie-12-rag-fundamentals