Всем, привет! Меня зовут Даня, я учусь в Центральном Университете. Сегодня я хочу рассказать, как компьютер понимает о чем говорится в тексте.

Ты открываешь новостную ленту, там множество категорий: спорт, политика, развлечения - всё перемешано. Представь, что нужно разложить тысячи статей по категориям без единого человека.

Звучит как магия? На самом деле - математика. Сегодня расскажу, как это работает.

Часть 1: Как превратить слова в числа

Компьютеры не понимают слов, они работают с числами. Как перевести статью в язык машин?

Можно, конечно, каждому слову дать его уникальное число (скаляр). Но как тогда сравнивать два слова? Как понимать, что одно слово по смыслу похоже на другое? Как передавать контекст одним числом?

Скаляр - это слишком мало. Поэтому слово преобразовывают в вектор (набор чисел). Вектор способен передать богатый смысл, контекст и связи между словами.

One-Hot Encoding: самый простой способ

Представь, что у тебя есть словарь из N уникальных слов. Самый простой способ - создать вектор длиной N, где на позиции слова стоит 1, а все остальные значения - 0.

Формально:

Для слова w_iв словаре размера N, его one-hot вектор \mathbf{v}_i:

\mathbf{v}_i = [\underbrace{0, 0, \ldots, 0}_{i-1}, 1, 0, \ldots, 0]

Пример:

Допустим, у нас текст из 5 сл��в:

Индекс

Слово

1

cat

2

dog

3

apple

4

house

5

tree

Тогда векторы:

\text{cat} = [1, 0, 0, 0, 0]

\text{dog} = [0, 1, 0, 0, 0]

\text{apple} = [0, 0, 1, 0, 0]

В чём проблема?

Кажется, что мы решили задачу. Но есть огромная проблема: мы не учитываем смысл слов.

Посмотри на математику:

Расстояние между любыми двумя one-hot векторами всегда одинаковое:

d(\mathbf{v}_i, \mathbf{v}_j) = \sqrt{\sum_{k=1}^{N} (v_{ik} - v_{jk})^2} = \sqrt{2} \quad \text{(для } i \neq j \text{)}

Косинус угла между любыми двумя векторами всегда 90°:

\cos(\theta) = \frac{\mathbf{v}_i \cdot \mathbf{v}_j}{\|\mathbf{v}_i\| \|\mathbf{v}_j\|} = 0

Эмбеддинги Cat, Dog, Yacht на плоскости
Эмбеддинги Cat, Dog, Yacht на плоскости

Если у нас текст "Cat Dog Yacht", то векторы примут такой вид:

\text{Cat} = [1, 0, 0]

\text{Dog} = [0, 1, 0]

\text{Yacht} = [0, 0, 1]

Слева показано как это будет выглядеть в пространстве .

Расстояние между любыми двумя векторами равно: \sqrt{1^2 + 1^2} = \sqrt{2}, а угол 90°

Что это значит на практике?

Для компьютера:

  • "кот" и "собака" так же далеки, как "кот" и "яхта"

  • Расстояние одинаковое:\sqrt{2}

  • Угол всегда 90°

One-Hot Encoding не понимает, что "кот" и "собака" - оба животные. Нужен способ, который учитывает смысл, не просто номер в тексте.

И здесь плавно появляется такое понятие, как GloVe (Global Vectors for Word Representation).

Что такое GloVe?

Важная оговорка: вектор слова называют эмбеддингом. Дальше это понятие будет использоваться часто.

Эмбеддинги GloVe, были построены учеными из Стэнфорда (Pennington et al., 2014).

Они основаны на простой идее:

Если два слова часто оказываются рядом в текстах, эти слова имеют смысловую связь

Например:

  • Cлова "кот" и "собака" встречаются рядом куда чаще, чем слова "кот" и "яхта"

  • Слова "футбол" и "спорт" ближе друг к другу, чем "футбол" и "политика"

Упрощенный пример с GloVe эмбеддингами
Упрощенный пример с GloVe эмбеддингами

Если упростить, то эмбеддинги слова "Cat", "Dog", "Yacht" (Кошка, Собака, Яхта соотвественно), в двухмерной плоскости будут выглядеть примерно так.

Cat и Dog слова, похожие по смыслу, оба относятся к животным и в целом достаточно часто встречаются в ��екстах рядом.

Абсолютно противоположная ситуация с Яхтой, она никак не связана с Кошкой и Собакой, поэтому её эмбеддинг смотрит в противоположную сторону.

Чтобы формализовать эту идею, учёные проанализировали огромное количество текстов (Википедия, интернет-страницы) и подобрали для каждого слова эмбеддинг так, чтобы слова из одного контекста имели близкие векторы.

С точки зрения математики, процесс обучения сложный. Но в результате мы получаем векторы, которые понимают смысл.

Самое удивительное: с этими векторами можно делать арифметические операции:

король - мужчина + женщина ≈ королева

Отношения между словами. Зеленая стрелка показывает направление "королевской власти" (man → king). Применяя то же направление к woman, мы получаем точку, близкую к queen.
Отношения между словами. Зеленая стрелка показывает направление "королевской власти" (man → king). Применяя то же направление к woman, мы получаем точку, близкую к queen.

Что мы видим:

  • Синие точки - слова с "мужской" окраской (king, prince, man, boy)

  • Красные точки - слова с "женской" окраской (queen, girl, woman)

  • Зеленая стрелка - вектор "королевская власть" (от man к king)

  • Оранжевая пунктирная линия - применяем тот же вектор королевской власти к woman

Что это значит:

Когда мы вычитаем из "king" вектор "man" и добавляем "woman", получаем точку, которая оказывается близко к настоящему слову "queen".

Модель не знает, что такое корона или трон. Но она видела, что слова "king" и "queen" используются в похожих контекстах, и выучила это отношение.

Часть 2: Кластеризация новостей

Мы взяли 500 новостей из разных сфер: спорт, политика, развлечения. Задача была амбициозной: разложить их по трём категориям, не подсказывая компьютеру, где какая.

Как сравнить две новости?

У нас есть вектор для каждого слова. Но как получить вектор для целой статьи?

Мы использовали простой, но эффективный трюк: усреднение.

Вектор новости = среднее арифметическое векторов всех слов в ней

Как это работает:

Если в статье много слов вроде "гол", "матч", "команда" - их векторы "тянут" общий вектор новости в сторону спортивного кластера. Если "закон", "выборы", "депутат" - в сторону политики.

Но как понять, что две новости похожи? Есть два способа:

  1. Расстояние (Евклидово): просто измеряем длину отрезка между точками

  2. Косинусное сходство (Cosine Similarity): измеряем угол между векторами

Почему мы выбрали косинус? Представь две статьи об одном и том же матче. Одна короткая (100 слов), другая подробная (1000 слов). Их векторы будут разной длины, но направлены в одну сторону. Косинус игнорирует длину и смотрит только на направление.

Что такое кластеризация (K-Means)?

Мы использовали алгоритм K-Means. Его суть можно описать так:

  1. Бросаем маяки. Случайным образом ставим 3 точки (количество точек зависит от того, сколько у нас категорий) в пространстве (это будущие центры кластеров).

  2. Распределяем новости. Каждая новость "прилипает" к ближайшему маяку.

  3. Двигаем маяки. Пересчитываем центры кластеров как среднее точек внутри них.

  4. Повторяем. Маяки двигаются, новости перераспределяются, пока всё не стабилизируется.

Визуализация алгоритма K-Means
Визуализация алгоритма K-Means

Мы запустили алгоритм и посмотрели, что получилось. Компьютер не видел меток категорий, он работал только с текстами новостей превращенными в эмбеддинги.

Визуализация кластеризации компьютером и человеком. Результаты практически идентичны
Визуализация кластеризации компьютером и человеком. Результаты практически идентичны

Точность совпадения с ручной разметкой - около 99%.

Компьютер не понимал смысл слов по-человечески. Но он увидел паттерны в числах и разложил всё по полочкам лучше, чем многие люди.

Вывод: Эмбеддинги GloVe действительно захватывают смысл текста. Но всегда ли это хорошо? Об этом - в следующей части.