Эмбеддинги: как слова превращаются в числа и почему «король» близок к «королеве»
Компьютер не понимает букв — он умеет считать. Чтобы нейросеть работала с языком, каждое слово сначала превращают в набор чисел. Самое удивительное, что в этих числах прячется смысл, и его можно складывать как векторы.
Нейросеть не видит слова «кот» — она видит список из сотен чисел, и в этом списке зашифровано, что кот ближе к собаке, чем к табуретке.
Эмбеддинг — это способ дать каждому слову координаты в пространстве смыслов, где расстояние означает похожесть.
Почему нельзя просто пронумеровать слова
Кажется логичным: дать слову «кот» номер 1, «собака» — 2, «банан» — 3. Но тогда машина решит, что кот и собака так же далеки друг от друга, как кот и банан, а ещё что «банан больше кота втрое». Числа-ярлыки несут ложный смысл. Нужен способ кодировать слова так, чтобы близкие по значению оказывались близки и в числах.
Идея: координаты смысла
Решение — представить каждое слово не одним числом, а вектором из десятков или сотен чисел. Это и есть эмбеддинг. Представьте карту, но не двумерную, а с сотней осей. На ней слова со схожим значением стоят рядом: «кот», «котёнок», «кошка» собираются в одну область, «радость» и «счастье» — в другую, далёкую.
Каждую ось можно условно считать каким-то признаком смысла — например, «живое/неживое», «крупное/мелкое», «эмоция/предмет». На деле оси не подписаны и сеть выбирает их сама, но интуиция верная: вектор слова — это его профиль по сотне скрытых характеристик.
Откуда сеть знает смысл
Главный принцип лингвистики: слово узнаётся по компании, в которой встречается. «Кот» и «собака» часто соседствуют с «погладить», «лапы», «корм» — значит, они похожи. Модель читает гигантские объёмы текста и для каждого слова подбирает такой вектор, чтобы по нему можно было угадывать соседей. Слова, живущие в похожем окружении, естественным образом получают похожие векторы. Никто не вписывает смысл руками — он сам проступает из статистики языка.
Арифметика смысла
Самое поразительное: с этими векторами можно делать арифметику. Классический пример — отношение «мужчина/женщина» оказывается одним и тем же направлением в пространстве:
$$\text{король} - \text{мужчина} + \text{женщина} \approx \text{королева}$$
Вычитая из «короля» признак «мужчина» и прибавляя «женщину», мы попадаем почти точно в «королеву». Похоже работает «Париж − Франция + Италия ≈ Рим». Смысловые отношения превратились в геометрию.
Как измеряют близость
Чтобы понять, насколько два слова похожи, считают, насколько сонаправлены их векторы. Чем меньше угол между ними — тем ближе смысл.
import math
def similarity(a, b):
dot = sum(x * y for x, y in zip(a, b))
na = math.sqrt(sum(x * x for x in a))
nb = math.sqrt(sum(y * y for y in b))
return dot / (na * nb)
cat = [0.9, 0.1, 0.8]
dog = [0.8, 0.2, 0.7]
banana = [0.1, 0.9, 0.0]
print(round(similarity(cat, dog), 3)) # 0.985 — почти совпадают
print(round(similarity(cat, banana), 3)) # 0.272 — далекиПочему это фундамент
Эмбеддинги — это входной язык всех современных моделей, работающих с текстом. Прежде чем сеть начнёт переводить, отвечать или писать код, она превращает слова в векторы и дальше думает уже числами. Тот же приём работает не только со словами: в векторы кодируют картинки, музыку, товары и пользователей. Идея одна — превратить «похоже» в «близко», а смысл — в координаты.