Эмбеддинги: слова как точки в пространстве

Чтобы модель понимала, что «кот» и «кошка» — почти одно и то же, а «кошка» и «трактор» — нет, каждое слово превращают в точку в пространстве смыслов. Это и есть эмбеддинг.

Главная мысль урока: компьютер не чувствует смысл слов. Поэтому каждое слово ему выдают как набор координат — точку в пространстве, — и устраивают так, что близкие по смыслу слова стоят рядом, а далёкие — далеко. Расстояние между точками превращается в «похожесть» смыслов.

Зачем превращать слова в точки

Представь рекомендации в музыкальном приложении. Ты послушал один трек, и тебе тут же подсовывают десяток похожих. Откуда приложение знает, что они похожи? Оно ведь не «слушает» музыку как ты. На самом деле каждая песня для него — это набор чисел: насколько она быстрая, насколько громкая, сколько в ней электроники и так далее. Песни с близкими наборами чисел оказываются «рядом», и их-то тебе и предлагают.

С текстом нужно провернуть ровно тот же трюк. В прошлом уроке про токены мы выяснили, что модель режет текст на кусочки-токены и каждому токену присваивает номер из словаря. Но номер сам по себе бессмысленный: то, что «кошка» — это номер 8417, а «кот» — номер 290, ничего не говорит об их родстве. Номера соседние или далёкие случайно, по алфавиту словаря, а не по смыслу.

Сегодня мы починим эту проблему. К концу урока ты своими глазами увидишь в коде, как слова, у которых похожий смысл, оказываются ближе друг к другу по числовому расстоянию — и почему «кошка» окажется рядом с «котёнком», а не с «бетоном».

Эмбеддинг — это представление слова или объекта в виде точки в многомерном пространстве, где похожие смыслы лежат рядом.

Метафора: карта смыслов

Вспомни обычную географическую карту. Каждый город на ней задан двумя числами — широтой и долготой. Москва и Тверь близко, потому что их координаты похожи. Москва и Владивосток далеко — координаты сильно различаются. Карта превратила «насколько города близки» в простое расстояние между точками.

Эмбеддинги делают то же самое, только не с городами, а со словами, и не на плоскости из двух чисел, а в пространстве из сотен чисел. Каждое слово получает свой набор координат, и этот набор подбирается так, чтобы:

  • «кошка», «кот», «котёнок» стояли тесной кучкой — это «город кошачьих»;
  • «собака», «щенок», «пёс» — рядом друг с другом, но в другом районе;
  • «трактор» и «бетон» — вообще на другом конце карты, далеко от всех животных.

Заметь важную вещь: координаты придумываются не вручную. Никто не садится и не пишет «у слова кошка координата 0.7». Эти числа модель сама подбирает во время обучения — тем же спуском по ошибке, что мы разбирали в модуле про обучение. Об этом чуть ниже.

Почему одного числа мало

Можно ли обойтись одной координатой — выстроить все слова на одной прямой, как на линейке? Нет, и вот почему. На линейке у каждого слова только два соседа. Но «кошка» похожа на «собаку» (оба животные), на «котёнка» (тот же зверь) и на «мурлыкать» (что кошка делает) — сразу по разным причинам. На прямой их всех рядом не уместить.

Поэтому берут много координат — в настоящих моделях их сотни или тысячи. Каждая координата как бы отвечает за свою скрытую черту смысла: «это животное?», «это про движение?», «это что-то большое?». Человек эти черты обычно не может назвать словами — модель нащупывает их сама. Но идея простая: чем больше координат, тем больше разных «похожестей» можно уместить одновременно.

Связь с признаками из модуля про машинное обучение

Если тебе кажется, что про координаты-черты ты уже что-то слышал — так и есть. В модуле, где мы отличали кошку от собаки, мы вручную задавали признаки: круглые ли уши, громкий ли лай, длинный ли хвост. Каждый признак — это число, описывающее объект. Картинка кошки превращалась в список признаков, и по нему модель принимала решение.

Эмбеддинг — это ровно тот же список чисел-признаков, но с двумя отличиями:

Признаки (модуль про ML)Эмбеддинг (этот урок)
Придумывает человек («форма ушей»)Модель находит сама во время обучения
Понятны и называются словамиЧаще безымянны, скрытый смысл
Описывают картинку или объектОписывают слово или токен
Несколько штукСотни и тысячи координат

То есть эмбеддинг — это автоматически найденные признаки слова. Тот же фокус «объект → список чисел», только теперь объект — это слово, а числа никто не задаёт руками. Если ты понял признаки кошки и собаки, ты уже понял половину идеи эмбеддингов.

Разбираем на коде: расстояние между словами

Давай сделаем игрушечный эмбеддинг руками, чтобы пощупать главную идею. Возьмём всего две координаты на слово (в жизни их сотни, но для наглядности хватит двух). Условимся, что:

  • первая координата — «насколько это животное» (0 — не животное, 1 — точно животное);
  • вторая координата — «насколько это про технику» (0 — не техника, 1 — точно техника).

Зададим несколько слов как точки и посчитаем, насколько они близки. Близость измерим обычным расстоянием между точками — как по карте: чем меньше число, тем ближе слова по смыслу.

// каждое слово — точка [животное, техника]
const words = {
  "кошка":   [0.9, 0.0],
  "котёнок": [0.85, 0.05],
  "собака":  [0.8, 0.0],
  "трактор": [0.0, 0.95],
  "бетон":   [0.0, 0.7],
};

// расстояние между двумя точками (как по карте)
function distance(a, b) {
  const dx = a[0] - b[0];
  const dy = a[1] - b[1];
  return Math.sqrt(dx * dx + dy * dy);
}

const cat = words["кошка"];
for (const name in words) {
  if (name === "кошка") continue;
  const d = distance(cat, words[name]);
  console.log("кошка \u2194 " + name + ": расстояние = " + d.toFixed(2));
}

Вывод:

кошка ↔ котёнок: расстояние = 0.07
кошка ↔ собака: расстояние = 0.10
кошка ↔ трактор: расстояние = 1.31
кошка ↔ бетон: расстояние = 1.14

Смотри, что получилось. «Котёнок» и «собака» стоят к «кошке» почти вплотную — расстояние около 0.1. А «трактор» и «бетон» — за тридевять земель, расстояние больше 1. Мы не объясняли коду, что кошка — это животное, мы просто задали удачные координаты, и расстояние само превратилось в «похожесть смыслов». Это и есть весь фокус эмбеддингов в миниатюре.

Находим ближайшее слово

Раз у нас есть расстояние, мы можем сделать самую частую операцию с эмбеддингами — найти ближайшего соседа. Именно так работают рекомендации и поиск похожего: берём слово и ищем, какое из остальных к нему ближе всех.

const words = {
  "кошка":   [0.9, 0.0],
  "котёнок": [0.85, 0.05],
  "собака":  [0.8, 0.0],
  "трактор": [0.0, 0.95],
};

function distance(a, b) {
  const dx = a[0] - b[0], dy = a[1] - b[1];
  return Math.sqrt(dx * dx + dy * dy);
}

function nearest(target) {
  let best = null, bestDist = Infinity;
  for (const name in words) {
    if (name === target) continue;
    const d = distance(words[target], words[name]);
    if (d < bestDist) { bestDist = d; best = name; }
  }
  return best;
}

console.log("ближе всего к 'кошка':   " + nearest("кошка"));
console.log("ближе всего к 'трактор': " + nearest("трактор"));

Вывод:

ближе всего к 'кошка':   котёнок
ближе всего к 'трактор': собака

К «кошке» ближе всех «котёнок» — логично. А вот к «трактору» ближайшим оказалась «собака» — но только потому, что в нашем игрушечном словаре просто нет других слов про технику. Это полезный урок: эмбеддинг ищет ближайшего из тех, кто есть, а не «правильного по жизни». Если похожих слов в словаре нет, ближайшим окажется наименее далёкое — что иногда выглядит странно.

Кстати, ровно по этому принципу работают рекомендации, которые ты видишь каждый день. Лента в соцсети превращает каждый ролик в точку-эмбеддинг, твои просмотры — тоже в точки, и дальше система ищет ролики, чьи координаты ближе всего к тому, что тебе уже зашло. Поиск по фразе устроен похоже: твой запрос превращают в точку и ищут страницы, чьи эмбеддинги к ней ближе всех. Везде одна и та же операция — «найди ближайшего соседа в пространстве смыслов», которую ты только что написал в пять строк кода.

Откуда берутся настоящие координаты

В нашем примере координаты мы вписали руками. У настоящих моделей их никто не вписывает — модель находит их сама, и принцип удивительно простой. Его сформулировали так: «слово узнаётся по компании, в которой ходит». То есть смысл слова — это то, рядом с какими словами оно обычно встречается в текстах.

Вспомни наш второй сквозной пример — фразу «Кошка пьёт ...». В миллионах текстов после «кошка пьёт» чаще всего стоит «молоко» или «воду». А ещё рядом с «кошкой» постоянно встречаются «мяукает», «лапы», «хвост», «мурлычет». Рядом с «собакой» — «лает», «гавкает», «хвост», «лапы». Заметь: у кошки и собаки много общих соседей (хвост, лапы, питомец). Поэтому модель и ставит их координаты близко.

Происходит это так. Модель пытается предсказать слово по его соседям — ровно как языковая модель предсказывает следующее слово. Когда она ошибается, она подкручивает не только веса, но и сами координаты слов — тем самым спуском по ошибке из прошлого модуля. Слова, что часто появляются в похожем окружении, постепенно сползаются в одну точку. Никто не размечает «кошка похожа на котёнка» — это всплывает само из того, что они стоят в похожих фразах.

Здесь важно почувствовать масштаб. В нашем игрушечном словаре было пять слов и две координаты — ты мог проследить каждую цифру глазами. У настоящей модели слов сотни тысяч, а координат у каждого — сотни или тысячи. Чтобы расставить их все по местам, модель прочитывает горы текста: книги, статьи, форумы, субтитры. Каждая прочитанная фраза — это крошечная подсказка о том, какие слова дружат между собой. Миллиарды таких подсказок, сложенные вместе, и лепят ту самую карту смыслов, где «кошка» сама собой оказывается рядом с «котёнком». Никто не рисует эту карту — она проявляется из текста, как фотография в проявителе.

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

Частые ошибки и подводные камни

Когда впервые знакомятся с эмбеддингами, спотыкаются примерно об одно и то же. Разберём, чтобы ты не наступил на эти грабли.

1. Думать, что координаты что-то «значат» по отдельности

В нашем игрушечном примере первая координата была «животное», вторая — «техника». Это было удобно для объяснения, но в настоящих моделях отдельная координата обычно ничего понятного не означает. Смысл живёт не в одном числе, а в сочетании всех координат сразу. Не пытайся найти «координату доброты» или «координату цвета» — её там, скорее всего, нет в чистом виде.

2. Путать номер токена с эмбеддингом

Номер токена из словаря (например, 8417) и эмбеддинг — это разные вещи. Номер — просто адрес слова в словаре, он случаен по смыслу. Эмбеддинг — это уже осмысленные координаты, которые модель достаёт по этому номеру. Сначала текст режут на токены и находят их номера, и только потом каждому номеру сопоставляют его точку-эмбеддинг.

3. Считать, что близкие слова — это обязательно синонимы

Рядом в пространстве смыслов оказываются не только синонимы. «Кошка» и «собака» стоят близко, хотя это разные животные, — просто они часто встречаются в похожих фразах (питомец, лапы, хвост). А ещё рядом могут оказаться антонимы: «горячий» и «холодный» появляются в похожих предложениях про температуру. Близость означает «встречается в похожих контекстах», а не «значит то же самое».

4. Забывать, что у слова один эмбеддинг на все значения

У слова «коса» три смысла: причёска, инструмент и песчаная отмель. У базового эмбеддинга на всё слово координата одна — она получается смешанной, усреднённой по всем смыслам. Это известное ограничение. Чуть позже в курсе мы увидим, что трансформер умеет уточнять смысл слова по соседям прямо на лету — но об этом в следующих уроках.

5. Думать, что модель «понимает» слова

Честный момент. То, что «кошка» и «котёнок» стоят рядом, не значит, что модель знает, что такое кошка, любит её или представляет себе пушистого зверя. Она лишь подобрала числа так, что слова из похожих фраз оказались рядом. Это мощный инструмент, но это статистика встреч слов, а не понимание в человеческом смысле.

Мини-практика: собери свою карту смыслов

Теперь твоя очередь. Возьми за основу первый пример и расширь его. Задание:

  1. Добавь в словарь words ещё несколько слов из одной темы — например про еду: «молоко», «хлеб», «вода». Придумай им координаты по тем же двум осям (животное / техника) или добавь третью ось «еда» и расширь функцию distance на три координаты.
  2. Посчитай расстояния от слова «молоко» до всех остальных. К каким словам оно окажется ближе?
  3. Вспомни наш сквозной пример «Кошка пьёт ...». Поставь координаты так, чтобы «молоко» и «вода» стояли рядом друг с другом, но далеко от «трактора». Проверь расстоянием.
  4. Сломай специально: задай «кошке» и «бетону» одинаковые координаты. Что покажет nearest("кошка")? Почему так вышло?

Это лучший способ закрепить идею: не просто прочитать про координаты, а самому подвигать слова по карте и увидеть, как меняется их «похожесть».

Итоги

Сегодня ты разобрал, как слова превращаются в точки, — мостик от «компьютер видит только числа» к настоящему пониманию текста.

  • Эмбеддинг — это представление слова в виде точки (набора координат) в многомерном пространстве смыслов, где похожие слова лежат рядом.
  • Близость измеряется расстоянием между точками — как города на карте. Маленькое расстояние означает похожий смысл.
  • Эмбеддинг — это те же признаки из модуля про машинное обучение, только модель находит их сама, их сотни, и они описывают слово, а не картинку.
  • Координаты не задают руками: модель подбирает их во время обучения по принципу «слово узнаётся по компании, в которой ходит». Похожее окружение в текстах → близкие точки.
  • Близость — это «встречается в похожих контекстах», а не «значит то же самое». И это статистика, а не понимание.

Теперь у нас есть слова-токены, превращённые в осмысленные точки. Но точка у слова пока одна на все его значения, и она не учитывает, что вокруг. В следующем уроке мы посмотрим, как модель предсказывает следующий токен — и вернёмся к фразе «Кошка пьёт ...», чтобы увидеть, как из этих самых эмбеддингов рождается осмысленное продолжение текста.

Проверьте себя
1. Что такое эмбеддинг?
AНомер слова в словаре токенов
BПредставление слова в виде точки в многомерном пространстве, где похожие смыслы лежат рядом
CПрограмма, которая переводит текст с одного языка на другой
DПравильный ответ для обучающего примера
2. Почему слова представляют не одним числом, а множеством координат?
AТак быстрее работает компьютер
BОдного числа хватило бы, просто так принято
CСлово похоже на другие сразу по разным причинам, и на прямой их всех рядом не уместить
DЧтобы зашифровать текст от посторонних
3. Как эмбеддинги связаны с признаками из модуля про машинное обучение?
AЭто совершенно не связанные вещи
BЭмбеддинг — это те же числа-признаки объекта, только модель находит их сама, и их гораздо больше
CПризнаки описывают слова, а эмбеддинги — картинки
DЭмбеддинги задаёт человек вручную, а признаки модель находит сама
4. Откуда модель берёт координаты эмбеддингов для настоящих слов?
AИх вписывает человек вручную для каждого слова
BОни берутся из алфавитного порядка слов в словаре
CМодель находит их сама при обучении: слова с похожим окружением в текстах получают близкие координаты
DИх случайно генерируют один раз и больше не меняют
5. Что означает малое расстояние между двумя словами-точками?
AЧто это обязательно синонимы с одинаковым значением
BЧто слова встречаются в похожих контекстах и потому близки по смыслу
CЧто у слов одинаковый номер токена
DЧто слова стоят рядом в алфавите
6. Почему у обычного эмбеддинга проблема со словом «коса» (причёска / инструмент / отмель)?
AМодель вообще не может работать с такими словами
BУ слова один эмбеддинг на все значения, поэтому координаты получаются смешанными
CТакие слова занимают слишком много памяти
DУ каждого значения свой отдельный эмбеддинг, и они конфликтуют