Линейная алгебра

Скалярное произведение: число, которое держит нейросети

За каждым поиском по сходству в Spotify, Shazam или Qdrant стоит одна операция - скалярное произведение двух векторов. Cosine similarity между эмбеддингами трека и запроса вычисляется миллиарды раз в секунду. Это не абстракция - это производительная система.

  • Рекомендации: cosine similarity между эмбеддингами - скалярное произведение нормированных векторов
  • Attention в трансформере: Q·Kᵀ - матрица скалярных произведений всех пар токенов
  • Физика: работа силы F·d - скалярное произведение вектора силы и перемещения
  • Компьютерное зрение: сходство между feature map-ами в нейросети
  • Сигналы: корреляция двух сигналов во времени - скалярное произведение

Скалярное произведение: число, которое держит нейросети

**ChatGPT читает вопрос и решает, какое слово важно для какого - через одну операцию.** FAISS находит ближайший документ среди миллиарда за миллисекунды - через ту же. Spotify сравнивает вкусы пользователя с треком - снова она. Эта операция - ~скалярное произведение~{dot product, inner product - умножение соответствующих компонент с суммой результатов}. Она превращает вопрос «насколько два вектора похожи?» в одно число. И это число управляет большей частью современного ML.

**Чему этот урок учит на самом деле**: не «как перемножить компоненты», а почему одна простая операция лежит в основе cosine similarity, механизма attention в трансформерах и проекции в PCA. После урока эти три концепции окажутся одним и тем же.

Что главное в концепте «Скалярное произведение: число, которое держит нейросети»?

Проверка усвоения материала концепта.

Формула: проще некуда

Формула: проще некуда

Скалярное произведение - это сумма попарных произведений компонент. Никаких сложностей - просто умножаем i-ю на i-ю и складываем:

ФОРМУЛА (n-мерный случай): a · b = a₁b₁ + a₂b₂ + ... + aₙbₙ = Σ aᵢbᵢ ПРИМЕР: a = (3, 1, 2) b = (1, 4, 2) a · b = 3×1 + 1×4 + 2×2 = 3 + 4 + 4 = 11 В numpy - одна строка: a @ b или np.dot(a, b) или (a * b).sum()

Что главное в концепте «Формула: проще некуда»?

Проверка усвоения материала концепта.

Геометрический смысл: угол между векторами

Геометрический смысл: угол между векторами

Та же операция имеет второе лицо - через угол между векторами. Обе формулы дают одинаковое число, но думать о них по-разному:

a · b = |a| · |b| · cos(θ) где θ - угол между векторами ЧТО ЧИТАЕТСЯ ИЗ ФОРМУЛЫ: cos(0°) = 1 → сонаправленные → максимум cos(90°) = 0 → перпендикулярные → ноль cos(180°)= -1 → противоположные → минимум ОТСЮДА ФОРМУЛА УГЛА: cos(θ) = (a · b) / (|a| · |b|) Для единичных векторов (|a| = |b| = 1): cos(θ) = a · b ← одно умножение, никаких делений Именно поэтому OpenAI нормирует эмбеддинги заранее.

Значение a·bУгол θЧто это значит
a·b > 00° - 90°Векторы смотрят "в одну сторону"
a·b = 090°Векторы перпендикулярны - полная независимость
a·b < 090° - 180°Векторы смотрят "в разные стороны"
a·b = |a|·|b|0°Сонаправленные - максимальное сходство

Что главное в концепте «Геометрический смысл: угол между векторами»?

Проверка усвоения материала концепта.

Применение 1: cosine similarity - сердце поиска

Применение 1: cosine similarity - сердце поиска

**Cosine similarity** - это dot product нормированных векторов. Qdrant, FAISS, pgvector - все хранят нормированные эмбеддинги именно потому, что поиск ближайшего соседа тогда сводится к поиску максимального dot product.

ФОРМУЛА: cosine_sim(a, b) = (a · b) / (|a| · |b|) Диапазон: от -1 (противоположные) до 1 (идентичные) Для нормированных векторов (||a|| = ||b|| = 1): cosine_sim(a, b) = a · b ← просто dot product! ПРИМЕР с эмбеддингами: sim("кот", "кошка") ≈ 0.95 ← почти одно sim("кот", "собака") ≈ 0.70 ← похожи (животные) sim("кот", "алгебра") ≈ 0.10 ← несвязаны

**Почему не евклидово расстояние?** Для эмбеддингов важно направление, не длина. Два документа одного смысла, но разной длины, дают одинаковый угол после нормировки - но разное расстояние. Cosine similarity устойчив к масштабу текста.

Что главное в концепте «Применение 1: cosine similarity - сердце поиска»?

Проверка усвоения материала концепта.

Применение 2: attention в трансформерах

Применение 2: attention в трансформерах

Механизм self-attention в GPT, BERT и каждом современном трансформере - это матрица dot products. Каждый токен спрашивает у каждого другого: «насколько этот токен важен?» - и получает ответ именно через скалярное произведение.

ATTENTION SCORE между токенами i и j: score(i, j) = qᵢ · kⱼ / sqrt(d_k) где: qᵢ - query-вектор токена i ("что ищу") kⱼ - key-вектор токена j ("что предлагаю") d_k - размерность (например 64) - нормировка против взрывного роста при большой размерности ВСЕ ПАРЫ СРАЗУ (матричная запись): Scores = Q · Kᵀ / sqrt(d_k) shape: (seq_len, seq_len) Каждый элемент матрицы Scores - это один dot product. Для GPT-4 с контекстом 8192 токенов это 8192² = 67 млн скалярных произведений за один проход attention-головки.

**Весь attention - это dot products.** Scores = Q·Kᵀ - буквально матрица скалярных произведений. Затем softmax нормирует их в веса, и output = веса · V. Если понятен dot product - понятен принцип трансформеров.

Что главное в концепте «Применение 2: attention в трансформерах»?

Проверка усвоения материала концепта.

Применение 3: проекция - основа PCA

Применение 3: проекция - основа PCA

Проекция вектора **a** на направление **b** - это буквально «тень» **a** вдоль оси **b**. В PCA этот приём повторяется для каждого объекта и каждой главной компоненты: признаки проецируются на новые оси.

СКАЛЯРНАЯ ПРОЕКЦИЯ (длина тени): proj_b(a) = (a · b) / |b| = |a| · cos(θ) Если |b| = 1 (единичный вектор): proj_b(a) = a · b ← снова просто dot product ВЕКТОРНАЯ ПРОЕКЦИЯ (вектор-тень): proj_b(a) = ((a · b) / |b|²) · b ПРИМЕР: a = (4, 3), b = (1, 0) ← ось X a · b = 4×1 + 3×0 = 4 Проекция на ось X = 4 ← это x-координата, что логично В PCA: Данные X shape (n_samples, n_features) Главная компонента pc shape (n_features,), ||pc||=1 Проекция всех объектов: X @ pc shape (n_samples,) Одна матрично-векторная операция - весь PCA-шаг.

**Связь трёх применений**: cosine similarity, attention, PCA - одна операция в трёх костюмах. Cosine similarity = dot product нормированных. Attention = матрица dot products с softmax. PCA-проекция = dot product с главной компонентой. Понять dot product - понять основу всех трёх.

Что главное в концепте «Применение 3: проекция - основа PCA»?

Проверка усвоения материала концепта.

Связь с длиной вектора

Связь с длиной вектора

Один частный случай dot product стоит выделить отдельно: вектор на самого себя.

a · a = a₁² + a₂² + ... + aₙ² = |a|² ОТСЮДА: |a| = sqrt(a · a) ЧИСЛОВОЙ ПРИМЕР: a = (3, 4) a · a = 9 + 16 = 25 |a| = sqrt(25) = 5 ← теорема Пифагора В numpy: np.sqrt(a @ a) # то же, что np.linalg.norm(a) ВАЖНЫЙ ФАКТ: угол между a и a равен 0°, cos(0°) = 1, поэтому a·a = |a|·|a|·1 = |a|². Оба определения согласованы.

Что главное в концепте «Связь с длиной вектора»?

Проверка усвоения материала концепта.

Где скалярное произведение работает сегодня

Где скалярное произведение работает сегодня

Скалярное произведение в современных системах

Одна операция - разные имена в разных контекстах

КомпонентРольДетали
Cosine similarity / векторный поискdot product нормированных эмбеддинговFAISS, Qdrant, pgvector, Pinecone - поиск по миллиарду документов
Attention (трансформеры)Scores = Q · Kᵀ / sqrt(d_k)GPT-4, BERT, T5, LLaMA, Stable Diffusion - каждый слой attention
PCA / проекцииX @ principal_componentСнижение размерности, feature extraction, whitening
Рекомендацииuser_emb · item_embTwo-tower: YouTube, Netflix, Spotify - матрица dot products
Линейный классификаторscore(class) = w_class · xПоследний слой ImageNet-классификаторов, softmax поверх dot products
3D-графика: освещениеbrightness = light · normalМодель Ламберта - основа любого 3D-рендеринга от OpenGL до Unreal

Что главное в концепте «Где скалярное произведение работает сегодня»?

Проверка усвоения материала концепта.

Практика: рекомендательная система

Практика: рекомендательная система

Вопросы для собеседования

Почему в attention score стоит деление на sqrt(d_k)?

- При d_k-мерных случайных векторах дисперсия dot product растёт как d_k - Деление на sqrt(d_k) возвращает дисперсию к 1 - Без нормировки при d_k=64 scores становятся очень большими - softmax даёт почти one-hot - One-hot weights убивают градиент - модель не обучается - Vaswani et al. 2017 («Attention Is All You Need») объясняют это в разделе 3.2.1

Cosine similarity и евклидово расстояние - в чём разница для нормированных векторов?

- |a - b|² = |a|² - 2(a·b) + |b|² - Для нормированных: |a - b|² = 2 - 2(a·b) - Значит |a - b| = sqrt(2 - 2·cosine_sim) - монотонная функция от cosine_sim - Для нормированных векторов они эквивалентны по ранжированию - Qdrant по умолчанию использует dot product как метрику именно поэтому

Проекция вектора x на единичный вектор u - как это связано с dot product?

- proj_u(x) = (x · u) · u, длина тени = x · u - dot product x · u = |x| cos(θ) - именно длина проекции x на u - В PCA каждая строка данных проецируется на главные компоненты - это матричное умножение X @ Vᵀ - Ортогональность компонент гарантируется тем, что dot product между ними = 0

Что главное в концепте «Практика: рекомендательная система»?

Проверка усвоения материала концепта.

Что унести из урока

  • **a · b = Σ aᵢbᵢ = |a||b|cos(θ)** - две формулы, одно число
  • **Знак** кодирует направление: > 0 = попутные, 0 = перпендикуляр, < 0 = встречные
  • **Cosine similarity** = dot product нормированных - основа всего векторного поиска
  • **Attention** = матрица Q·Kᵀ / sqrt(d_k) - весь GPT держится на этом dot product
  • **Проекция** x на u (единичный) = x · u - именно это делает PCA с каждым признаком
  • **a · a = |a|²** - длина через dot product; нормировка = деление на sqrt(a·a)

Куда дальше

Dot product - строительный блок. Вот что на нём строится:

  • Матрицы и операции — Умножение матриц = набор dot products строк на столбцы
  • Собственные векторы и SVD — PCA использует SVD; главные компоненты - ортогональны (dot product = 0)
  • Линейные преобразования — Каждый линейный слой нейросети - матрица dot products входа с весами

Связанные уроки

  • ml-31-transformers
  • ml-35-word-embeddings
  • ml-13-svm
  • stat-08-correlation
Скалярное произведение: число, которое держит нейросети

0

1

Войти