Линейная алгебра
Скалярное произведение: число, которое держит нейросети
За каждым поиском по сходству в 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 > 0 | 0° - 90° | Векторы смотрят "в одну сторону" |
| a·b = 0 | 90° | Векторы перпендикулярны - полная независимость |
| a·b < 0 | 90° - 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_emb | Two-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 входа с весами