DeepLearning Blog

Word2Vec - первые шаги

Published Dec. 17, 2025, 2:04 p.m. by railot116

Основная идея: "Скажи мне, кто твой друг, и я скажу, кто ты". Если два слова часто встречаются в похожих контекстах (окружены одними и теми же соседями), то их векторные представления будут похожи.


🎯 Простой пример-аналогия

Представьте, что у нас есть маленький корпус текста:

"кот ловит мышь. собака гоняет кота. кот и собака не дружат."

  1. Создаём окно контекста
    Алгоритм скользит по тексту "окном" (например, размером в 1 слово слева и справа). Для слова "кот" в первом предложении контекст — это ["ловит"].

  2. Запоминаем соседей
    Алгоритм учится предсказывать: "Если в центре стоит слово 'кот', то с большой вероятностью рядом будет слово 'ловит'". Так он улавливает связи.

  3. Результат обучения
    После обработки всего текста векторы слов "кот" и "собака" станут немного похожи (они оба могут быть "агентами" в предложении), но будут далеки от вектора "мышь" (объект действия).

Самое известное свойство: Вектор("король") - Вектор("мужчина") + Вектор("женщина") ≈ Вектор("королева").


🔧 Пошаговый алгоритм (на примере архитектуры Skip-gram)

Допустим, у нас есть предложение "кислый лимон", а размер окна = 1.

Шаг 1: Подготовка * Создаём словарь: {"кислый": 0, "лимон": 1} * Инициализируем каждому слову два случайных вектора:
* V — для когда слово целевое (в центре).
* U — для когда слово контекстное (сосед).

Шаг 2: Берём первую пару
Целевое слово: Wt = "лимон". Контекстное слово: Wc = "кислый".
Наша задача: настроить векторы так, чтобы для "лимона" вероятность слова "кислый" в контексте была максимальной.

Шаг 3: Считаем вероятность (упрощённо)
1. Берем вектор-строку V_лимон (для целевого слова).
2. Берем вектор-столбец U_кислый (для контекстного).
3. Скалярное произведение V_лимон • U_кислый показывает, насколько слова "подходят" друг другу.
4. Через функцию softmax превращаем это число в вероятность (например, 0.85).

Шаг 4: Обучение (корректировка векторов) * Идеально: Вероятность для реальной пары ("лимон", "кислый") должна быть близка к 1. * Реальность: Сначала она маленькая, так как векторы случайные. * Алгоритм (например, backpropagation) сдвигает вектор V_лимон чуть ближе к вектору U_кислый, чтобы увеличить их скалярное произведение. А векторы других слов (например, "сладкий") — чуть отдаляет.

Шаг 5: Повторяем для всех пар * Проходим по всем парам (целевое слово, контекстное слово) в тексте. * Делаем тысячи таких корректировок. * В конце обучения вектор V_кислый будет близок к векторам других прилагательных, а V_лимон — к векторам других фруктов.


🗺️ Наглядная таблица: два подхода Word2Vec

Параметр Skip-gram CBOW (Continuous Bag of Words)
Задача По целевому слову угадать контекстные слова. По контекстным словам угадать целевое слово.
Аналогия "Дано слово 'программист'. Какие слова обычно его окружают? ('пишет', 'код', 'компьютер')" "Даны слова 'пишет', 'код'. Какое слово может быть в центре? ('программист')"
Работа с редкими словами Работает лучше, так как одно редкое целевое слово встречается в нескольких примерах. Хуже, так редкое слово "теряется" среди контекстных.
Скорость Медленнее Быстрее

💻 Простой код на Python (с использованием библиотеки gensim)

from gensim.models import Word2Vec

# 1. Подготовка данных: каждое предложение — список слов
sentences = [
    ["кот", "ловит", "мышь"],
    ["собака", "гоняет", "кота"],
    ["кот", "и", "собака", "не", "дружат"]
]

# 2. Обучение модели (используем Skip-gram)
model = Word2Vec(sentences, vector_size=5, window=1, sg=1, min_count=1)

# 3. Проверяем вектор слова "кот"
print("Вектор слова 'кот':", model.wv["кот"])

# 4. Находим похожие слова
print("Самые похожие на 'кот':", model.wv.most_similar("кот", topn=2))

# 5. Проверяем сходство
print("Сходство 'кот' и 'собака':", model.wv.similarity("кот", "собака"))
print("Сходство 'кот' и 'мышь':", model.wv.similarity("кот", "мышь"))

Пояснение параметров: * vector_size=5 — размерность вектора (в реальности 100-300). * window=1 — размер окна контекста (1 слово слева и справа). * sg=1 — алгоритм Skip-gram (если sg=0, то CBOW). * min_count=1 — учитывать слова, встретившиеся минимум 1 раз.


🧠 Ключевые выводы

  1. Не алгоритм машинного перевода, а метод представления слов.
  2. Основан на распределённой гипотезе: значение слова определяется его окружением.
  3. Skip-gram: лучше для редких слов. CBOW: быстрее и лучше для частых слов.
  4. Векторы захватывают не только синтаксис (часть речи), но и семантику (значение), что позволяет делать арифметические операции со смыслом.

Простая аналогия для запоминания: Представьте, что вы на вечеринке. За каждым гостем наблюдают и записывают, с кем он чаще всего общается. Через пару часов, даже не зная профессий, можно кластеризовать гостей: "эти двое из IT", "эта группа — музыканты". Word2Vec делает то же самое со словами в тексте.

Если хотите глубже, стоит почитать оригинальную статью Миколова или покрутить параметры в gensim, чтобы увидеть, как меняются векторы.

3.5
2 оценок
5★
0
4★
0
3★
0
2★
0
1★
0

Оставить отзыв

Нажмите на звезду для оценки от 1 до 5
Необязательно. Используется только для связи
0/2000

Комментарии

Все С ответами Проверенные Только 4-5★