Линейная алгебра
Операции с векторами: арифметика, на которой стоит ML
Вектор - это не просто список чисел. Это точка в пространстве, направление движения, эмбеддинг слова, пиксель изображения. Операции над векторами - это язык, на котором написан весь ML: от линейной регрессии до GPT.
- ML: каждый пример обучающей выборки - вектор признаков
- NLP: слово 'king' - вектор 768 чисел в пространстве BERT
- Компьютерная графика: позиция, нормаль, цвет вершины - всё векторы
- Физика: скорость, ускорение, сила - векторные величины
- Финансы: портфель активов - вектор весов
Операции с векторами: арифметика, на которой стоит ML
**Нейросеть на 4 слоя - это 4 раза сложение и умножение на матрицу.** Style transfer в Stable Diffusion - линейная комбинация латентных векторов. Батч-нормализация в каждом слое ResNet - вычитание среднего и деление на стандартное отклонение. Операции над векторами кажутся скучной математикой, но именно они - весь forward pass любой нейросети. Ни одной лишней строки кода помимо них нет.
**Чему урок учит на самом деле**: не «как сложить компоненты», а почему одни и те же четыре операции дают и школьную геометрию, и word2vec, и линейные слои нейросетей. К концу урока "сложить векторы" и "сделать forward pass" окажутся одним и тем же.
Что главное в концепте «Операции с векторами: арифметика, на которой стоит ML»?
Проверка усвоения материала концепта.
Сложение: покомпонентно, всегда
Сложение: покомпонентно, всегда
Два вектора складываются строго по компонентам: i-я с i-й. Никакого смешивания между разными позициями.
ФОРМУЛА: a + b = (a₁ + b₁, a₂ + b₂, ..., aₙ + bₙ) ПРИМЕР: a = (3, 1, 4) b = (1, 5, 2) ───────────── a + b = (4, 6, 6) ← каждая компонента отдельно В numpy: a + b ← broadcasting, одна операция на весь массив
**Геометрический смысл**: конец одного вектора - начало следующего. Сумма - стрелка из старта первого в конец второго. Именно так работает батч-сложение bias в линейном слое: к каждому вектору в батче прибавляется один и тот же вектор b.
Свойства сложения - не академический список, а инструменты для упрощения вычислений:
- **Коммутативность**: a + b = b + a (порядок не важен)
- **Ассоциативность**: (a + b) + c = a + (b + c) (скобки можно переставлять)
- **Нулевой вектор**: a + 0 = a (сложение с нулём ничего не меняет)
- **Противоположный**: a + (-a) = 0 (вычитание вектора из самого себя)
Что главное в концепте «Сложение: покомпонентно, всегда»?
Проверка усвоения материала концепта.
Вычитание: разность как смещение
Вычитание: разность как смещение
Вычитание - это сложение с противоположным вектором. Геометрически **a - b** - стрелка **из конца b в конец a** (при общем начале). Именно эту операцию используют, чтобы найти «направление» от одного объекта к другому в embedding-пространстве.
ФОРМУЛА: a - b = (a₁ - b₁, a₂ - b₂, ..., aₙ - bₙ) ПРИМЕР: a = (5, 3, 1) b = (2, 1, 4) ───────────── a - b = (3, 2, -3) INTUITION (word2vec): v(king) - v(man) = «вектор монархии без признака пола» v(Paris) - v(France) = «вектор столичности» Это буквально вычитание векторов - ничего сложнее.
Что главное в концепте «Вычитание: разность как смещение»?
Проверка усвоения материала концепта.
Умножение на скаляр: ползунок громкости
Умножение на скаляр: ползунок громкости
Умножение на число k масштабирует каждую компоненту. Направление остаётся - меняется только «интенсивность».
ФОРМУЛА: k · a = (k·a₁, k·a₂, ..., k·aₙ) ЧТО ПРОИСХОДИТ ПРИ РАЗНЫХ k: k = 2: то же направление, в 2 раза длиннее k = 0.5: то же направление, в 2 раза короче k = -1: разворот на 180°, та же длина k = 0: вектор схлопывается в ноль ПРИМЕР: v = (2, -1, 3) 3v = (6, -3, 9) -v = (-2, 1, -3) 0.5v = (1, -0.5, 1.5)
**ML-применение - style steering**: исследователи обнаружили, что умножение вектора активации на скаляр меняет «интонацию» ответа LLM. Статья «Activation Addition» (2023): простое сложение вектора 1.5 · emb("happy") к скрытому состоянию модели устойчиво делает ответы позитивнее. Без дообучения, без RLHF - просто скалярное умножение.
Что главное в концепте «Умножение на скаляр: ползунок громкости»?
Проверка усвоения материала концепта.
Линейная комбинация: фундамент нейросетей
Линейная комбинация: фундамент нейросетей
**Линейная комбинация** - это взвешенная сумма векторов. На этой операции держится буквально каждый нейрон.
ОБЩАЯ ФОРМА: α₁v₁ + α₂v₂ + ... + αₙvₙ ПРИМЕР - разложение через стандартный базис R²: e₁ = (1, 0), e₂ = (0, 1) (3, 5) = 3·e₁ + 5·e₂ ← линейная комбинация базисных ОДИН НЕЙРОН = ЛИНЕЙНАЯ КОМБИНАЦИЯ + НЕЛИНЕЙНОСТЬ: output = σ(w₁x₁ + w₂x₂ + ... + wₙxₙ + b) = σ(w · x + b) где w · x - это ровно линейная комбинация компонент x с весами w. Умножение матрицы на вектор = набор линейных комбинаций = forward pass линейного слоя.
**Критически важный факт**: линейная комбинация линейных комбинаций - снова линейная комбинация. Поэтому сеть без нелинейных активаций эквивалентна одному линейному слою, сколько бы слоёв ни было. Именно нелинейности (ReLU, GELU, sigmoid) превращают стек из матричных умножений в мощный аппроксиматор.
Что главное в концепте «Линейная комбинация: фундамент нейросетей»?
Проверка усвоения материала концепта.
Нормализация: единичная длина как стандарт
Нормализация: единичная длина как стандарт
Нормализация вектора - деление на его длину. Результат - вектор той же направленности, но единичной длины. Именно нормированные векторы лежат в основе cosine similarity и векторных баз.
ФОРМУЛА: v̂ = v / ||v|| где ||v|| = sqrt(v₁² + v₂² + ... + vₙ²) ПРОВЕРКА: ||v̂|| = ||v/||v|||| = ||v||/||v|| = 1 ✓ ПРИМЕР: v = (3, 4) ||v|| = sqrt(9 + 16) = 5 v̂ = (3/5, 4/5) = (0.6, 0.8) ||v̂|| = sqrt(0.36 + 0.64) = 1 ✓ ОСОБЫЙ СЛУЧАЙ: Нулевой вектор нормализовать нельзя (деление на 0). В numpy: np.linalg.norm([0,0,0]) = 0.0
Нулевой вектор нормализовать нельзя - у него нет направления. В production-коде всегда проверять: if np.linalg.norm(v) > 1e-8 before normalization.
Что главное в концепте «Нормализация: единичная длина как стандарт»?
Проверка усвоения материала концепта.
Батч-нормализация: вычитание и масштабирование в нейросетях
Батч-нормализация: вычитание и масштабирование в нейросетях
**Batch Normalization** (BatchNorm) - один из ключевых приёмов в глубоком обучении. Внутри - вычитание вектора среднего и деление на вектор стандартного отклонения. Буквально операции над векторами из этого урока.
**Почему BatchNorm работает**: без нормализации активации в глубоких сетях «дрейфуют» - среднее и дисперсия постепенно смещаются, градиенты взрываются или затухают. BatchNorm фиксирует распределение после каждого слоя. Результат - ResNet-50 сходится за часы, не дни. Все операции - вычитание вектора, деление на вектор.
Что главное в концепте «Батч-нормализация: вычитание и масштабирование в нейросетях»?
Проверка усвоения материала концепта.
Где матричные операции крутятся прямо сейчас
Где матричные операции крутятся прямо сейчас
Векторные операции в ML-системах
От базовой операции к реальному применению
| Компонент | Роль | Детали |
|---|---|---|
| Сложение: bias в линейном слое | output = W @ x + b | Каждый линейный слой нейросети: прибавление вектора b к каждому элементу батча |
| Вычитание: word2vec аналогии | v(king) - v(man) + v(woman) ≈ v(queen) | Difference vectors в embedding-пространстве - семантические оси |
| Умножение: style steering в LLM | hidden += scale * steering_vector | Activation Addition: управление тоном модели без fine-tuning |
| Линейная комбинация: forward pass | W @ x = набор dot products | Каждый слой Dense/Linear в PyTorch, TensorFlow, JAX |
| Нормализация: векторные базы | v / ||v|| перед upsert в Qdrant/FAISS | OpenAI ada-002 возвращает уже нормализованные; другие - нормировать самому |
| Батч-операции: BatchNorm / LayerNorm | (X - mean) / std + gamma * x + beta | ResNet, ViT, Transformer - BatchNorm или LayerNorm после каждого слоя |
Что главное в концепте «Где матричные операции крутятся прямо сейчас»?
Проверка усвоения материала концепта.
Практика: L2-нормализация
Практика: L2-нормализация
Вопросы для собеседования
Почему два линейных слоя подряд можно заменить одним линейным слоем?
- Первый слой: y = W₁x + b₁ - Второй слой: z = W₂y + b₂ = W₂(W₁x + b₁) + b₂ = (W₂W₁)x + (W₂b₁ + b₂) - Это тоже линейный слой: z = Wx + b, где W = W₂W₁, b = W₂b₁ + b₂ - Любое число линейных слоёв без активаций = один линейный слой - Именно поэтому нелинейные активации (ReLU, GELU) необходимы
В чём смысл нормализации эмбеддингов перед косинусной близостью?
- cosine_sim(a,b) = (a·b) / (||a||·||b||) - при нормировке делитель = 1 - Нормированная версия: просто a · b - один dot product вместо трёх операций - Длина вектора не несёт семантического смысла - важно направление - FAISS с Inner Product metric требует нормированных входов - OpenAI ada-002 нормирует заранее - это соглашение, не математическая необходимость
BatchNorm и LayerNorm - в чём принципиальная разница?
- BatchNorm: среднее/std по оси batch (axis=0) - статистики по всему батчу - LayerNorm: среднее/std по оси features (axis=-1) - статистики по одному примеру - При batch_size=1 BatchNorm вырождается - LayerNorm стабилен всегда - Трансформеры используют LayerNorm: авторегрессивная генерация идёт по одному токену - CNN с большими батчами - BatchNorm: ResNet, VGG, EfficientNet
Что главное в концепте «Практика: L2-нормализация»?
Проверка усвоения материала концепта.
Что унести из урока
- **Сложение/вычитание** - покомпонентно; a + b в нейросети = прибавление bias b к каждому элементу батча
- **Умножение на скаляр** - масштабирование без изменения направления; основа style steering в LLM
- **Линейная комбинация** = один нейрон = одна строка матрицы весов W умноженная на вход x
- **Нормализация** v/||v|| - стандарт перед векторным поиском; делает cosine_sim равным dot product
- **BatchNorm** - вычитание вектора среднего и деление на вектор std; не магия, просто векторные операции
- Два линейных слоя без активации = один линейный слой; нелинейность - не опция, а необходимость
Куда дальше
Операции над векторами - азбука. Дальше - матрицы и то, что с ними делать.
- Скалярное произведение — dot product - основа cosine similarity, attention и проекций
- Матрицы и их операции — Умножение матрицы на вектор = пакет линейных комбинаций = один слой нейросети
- Собственные векторы и SVD — PCA проецирует данные на главные компоненты через те же dot products