Машинное обучение
Математика для ML
2012 год. Торонто. Трое студентов - Крижевский, Сутскевер, Хинтон - берут ImageNet и срезают ошибку распознавания с 26% до 15% за одну ночь. AlexNet. За этим результатом стоят ровно четыре раздела математики. Не мехмат. Не аспирантура. Четыре концепции, которые умещаются в один урок.
- **Линейная алгебра** - когда Netflix перемножает матрицу «пользователи x фильмы» для рекомендаций, это matrix factorization из линейной алгебры. 200 миллионов пользователей, 15 тысяч фильмов - матрица 200M x 15K
- **Теорема Байеса** - спам-фильтры Gmail используют байесовскую классификацию, анализируя вероятность спама по каждому слову. 1.8 миллиарда аккаунтов - и всё держится на P(A|B)
- **Gradient Descent** - GPT-4 обучался на тысячах GPU. Каждый GPU миллиарды раз выполнял один алгоритм: вычислить градиент, обновить веса, повторить. 13 триллионов токенов пропущено через этот цикл
Андрей Марков и матрицы, изменившие индустрию
В 1906 году Андрей Марков анализировал чередование гласных и согласных в «Евгении Онегине» - и сформулировал понятие стохастической матрицы. Он не знал, что через 100 лет та же математика станет основой PageRank, рекомендательных систем и языковых моделей. Матрица переходов Маркова - это нейронный слой трансформера, только ещё без нейронов.
Предварительные знания
Линейная алгебра: язык данных
Любые данные в машинном обучении - это **числа, организованные в структуры**. Фотография - матрица пикселей. Клиент банка - набор признаков: возраст, доход, количество кредитов. Текст - вектор частот слов. Линейная алгебра даёт язык для описания всех этих структур.
**Вектор** - один объект данных, записанный как список чисел. Каждое число - отдельный признак (feature). Квартира описывается вектором `[площадь, этаж, комнаты, цена]`. Один вектор = одна строка в таблице. **Матрица** - набор таких векторов, сложенных друг под друга. Матрица - весь датасет целиком: строки - объекты, столбцы - признаки.
**Скалярное произведение (dot product)** двух векторов - сумма попарных произведений элементов. Результат - одно число, показывающее **степень похожести** направлений. Если два вектора «смотрят» в одну сторону - их dot product большой. Если перпендикулярны - ноль. В нейросетях dot product используется повсюду: он вычисляет, насколько входные данные соответствуют весам нейрона. GPT-4 выполняет миллиарды таких операций за один forward pass.
**Нормы** - способ измерить «длину» вектора. **L2-норма (евклидова)** - привычное расстояние по прямой: `sqrt(x1^2 + x2^2 + ...)`. **L1-норма (манхэттенская)** - расстояние «по улицам»: `|x1| + |x2| + ...`. В ML нормы используются для регуляризации - штрафа за слишком большие веса. L1 даёт sparse модели (Lasso), L2 сглаживает равномерно (Ridge).
**Зачем это ML-инженеру?** Матричное умножение - ядро нейросетей. Когда данные проходят через слой, происходит именно `output = input @ weights + bias`. GPU быстры потому что параллельно перемножают огромные матрицы. Понимая это, становятся понятны ошибки `shape mismatch` и почему batch size влияет на скорость.
Датасет из 1000 изображений, каждое описано 784 числами (пиксели 28x28). Какого размера матрица?
Теория вероятностей: работа с неопределённостью
ML-модели не дают абсолютных ответов - они дают **вероятностные оценки**. Спам-фильтр не говорит «это спам», он говорит «с вероятностью 97% это спам». Классификатор не говорит «это кошка», он говорит «кошка - 0.85, собака - 0.12, хомяк - 0.03». Теория вероятностей - математика неопределённости. GPT-4 выбирает каждый токен из 50257 вариантов - это тысячи бросков пятидесятитысячной кости за одну генерацию.
Базовые правила. **P(A)** - вероятность события A, число от 0 до 1. **P(A и B)** - вероятность того, что оба события произошли одновременно. **P(A | B)** - условная вероятность: «какова вероятность A, если B уже произошло?» Именно условная вероятность лежит в основе большинства ML-алгоритмов: какова вероятность диагноза, **если** у пациента такие-то симптомы?
**Теорема Байеса** - самая важная формула в ML. Позволяет **обновлять убеждения** при получении новых данных: `P(гипотеза | данные) = P(данные | гипотеза) * P(гипотеза) / P(данные)` Начинаем с предположения (prior), наблюдаем факты (evidence), обновляем убеждение (posterior). Именно так работают RLHF-системы: каждый human feedback - байесовское обновление модели предпочтений.
**Распределения вероятностей** описывают, как часто встречаются разные значения. **Нормальное (гауссово)** - колоколообразная кривая, описывает рост людей, ошибки измерений, шум в данных. **Бернулли** - «орёл/решка», описывает бинарные исходы (спам/не спам, клик/не клик). **Равномерное** - все значения одинаково вероятны. В Stable Diffusion каждый шаг диффузии - цепь Маркова шумо-добавления, построенная на нормальном распределении.
**MLE (Maximum Likelihood Estimation)** - принцип, по которому обучаются многие модели. Идея: найти такие параметры модели, при которых наблюдаемые данные были бы **наиболее вероятны**. Обучение модели сводится к подбору параметров распределения, лучше всего описывающего реальные данные. Cross-entropy loss, используемый в каждой LLM - это отрицательное log-правдоподобие, то есть MLE в disguise.
Спам-фильтр на основе теоремы Байеса получил новое письмо со словом «выигрыш». Prior P(спам)=0.3, P(выигрыш|спам)=0.8, P(выигрыш|не спам)=0.05. Какова апостериорная вероятность спама?
Статистика: анализ и оценка данных
Прежде чем обучать модель - нужно **понять данные**. Статистика - инструментарий для описания, визуализации и оценки. Не зная распределения признаков, выбросов и корреляций, можно построить модель, которая великолепно работает на train и полностью проваливается на prod.
**Описательная статистика** - числа, которые сжимают датасет в ключевые показатели: - **Среднее (mean)** - сумма всех значений, делённая на количество. Чувствительно к выбросам: один миллиардер в выборке сильно сдвигает среднюю зарплату. - **Медиана** - значение посередине отсортированного ряда. Устойчива к выбросам: медианная зарплата - лучший показатель «типичного» дохода. - **Дисперсия (variance)** - мера разброса: насколько значения отклоняются от среднего. - **Стандартное отклонение (std)** - корень из дисперсии, показывает разброс в тех же единицах, что и данные.
**Корреляция не означает причинность.** Продажи мороженого коррелируют с числом утоплений. Это не значит, что мороженое вызывает утопления - оба показателя растут летом (скрытый фактор - жара). В ML эта ловушка называется **spurious correlation**: модель может найти случайные связи в данных и принять их за закономерности.
**Bias-Variance tradeoff** - фундаментальная дилемма в ML. Каждая модель балансирует между двумя типами ошибок: - **High bias (underfitting)** - модель слишком простая, не улавливает закономерности. Прямая линия через облако точек, которое изгибается. - **High variance (overfitting)** - модель слишком сложная, запоминает шум в тренировочных данных. Кривая, проходящая через каждую точку, включая выбросы.
**Центральная предельная теорема (CLT)** объясняет, почему нормальное распределение встречается повсюду. Если взять достаточно много случайных выборок из **любого** распределения и вычислить их средние - эти средние будут распределены нормально. Именно поэтому SGD, усредняющий градиенты по mini-batch, работает стабильно: CLT гарантирует, что шум в градиентах имеет контролируемые свойства.
Модель идеально предсказывает результаты на обучающих данных (ошибка ~0%), но на новых данных ошибка 45%. Какая проблема?
Матанализ: оптимизация моделей
Обучение ML-модели - это **поиск минимума функции потерь (loss function)**. Loss измеряет, насколько предсказания модели далеки от реальных ответов. Цель обучения - найти веса, при которых потери минимальны. Поиск минимума функции - задача матанализа. GPT-4 прошёл этот путь 2 триллиона раз на 13 триллионах токенов.
**Производная** показывает скорость изменения функции. Если loss растёт - производная положительная. Если убывает - отрицательная. Если в минимуме - производная равна нулю. Производная отвечает на вопрос: «если я чуть-чуть изменю вес модели, потери увеличатся или уменьшатся?»
Когда у модели много весов (в нейросетях их миллиарды), нужны **частные производные** - производная по каждому весу отдельно. **Градиент** - вектор всех частных производных. Он указывает в направлении **наибольшего роста** функции. Чтобы уменьшить потери, нужно двигаться **против** градиента.
**Gradient Descent (градиентный спуск)** - алгоритм обучения: 1. Инициализировать веса случайно 2. Вычислить loss на текущих весах 3. Вычислить градиент - «в какую сторону растёт ошибка?» 4. Сдвинуть веса **против** градиента: `w = w - lr * gradient` 5. Повторять шаги 2-4 до сходимости **Learning rate (lr)** - размер шага. Слишком большой - перепрыгиваешь минимум. Слишком маленький - обучение займёт вечность.
**Chain rule и Backpropagation.** Нейросеть - это композиция функций: `output = f3(f2(f1(input)))`. Чтобы узнать, как изменение веса на первом слое влияет на итоговый loss, нужно «размотать» цепочку - **chain rule** говорит, что производная всей цепочки = произведение производных каждого звена. **Backpropagation** - это chain rule, применённый к нейросети. Этот алгоритм - причина, по которой нейросети вообще способны обучаться.
Чтобы заниматься ML, нужно сначала идеально выучить всю высшую математику на уровне мехмата
Для практического ML достаточно интуитивного понимания ключевых концепций (векторы, градиент, вероятность), а глубокое понимание математики нужно по мере роста - для разработки новых архитектур и исследований
Современные библиотеки (PyTorch, TensorFlow, scikit-learn) скрывают математику за абстракциями. Практик может обучить модель, понимая что делает gradient descent и зачем нужна loss function, без доказательства теорем. Но для state-of-the-art исследований глубокая математика незаменима
Gradient descent обновляет веса по формуле w = w - lr * gradient. Почему знак минус?
Ключевые идеи
- **Линейная алгебра** - язык данных: вектор = один объект, матрица = датасет, матричное умножение = ядро нейросетей (`output = input @ weights`)
- **Теория вероятностей** - язык неопределённости: теорема Байеса позволяет обновлять убеждения при новых данных, MLE подбирает параметры модели
- **Статистика** - инструмент анализа: описательные статистики помогают понять данные, bias-variance tradeoff определяет баланс между простотой и сложностью
- **Матанализ** - инструмент оптимизации: gradient descent находит минимум loss function, backpropagation передаёт сигнал ошибки через слои нейросети
Связанные темы
Математические основы пронизывают все последующие темы ML:
- Введение в ML — Типы ML-задач, для которых нужна эта математика
- Линейная регрессия — Первая модель, где все 4 столпа работают вместе: матрицы данных, loss function, gradient descent
- Gradient Descent в деталях — Углублённый разбор алгоритма: SGD, mini-batch, Adam и другие оптимизаторы
- PCA: снижение размерности — Собственные векторы и собственные значения в действии - поиск главных направлений в данных
Вопросы для размышления
- Почему нейросети обучаются на GPU, а не на CPU? Подсказка: подумайте о ключевой операции из линейной алгебры.
- Если модель показывает 99% accuracy на тесте для задачи, где 99% данных принадлежат одному классу - это хорошая модель? Какие статистические метрики помогут разобраться?
- Gradient descent находит локальный минимум, а не глобальный. Почему на практике это часто не проблема для нейросетей с миллиардами параметров?
Связанные уроки
- ml-09-gradient-descent — Gradient descent - прямое применение производных и матричных операций
- ml-06-linear-regression — Линейная регрессия - первая модель где все 4 столпа работают вместе
- ml-19-pca — PCA применяет собственные векторы - продвинутая линейная алгебра
- ml-15-naive-bayes — Наивный Байес - прямое применение теоремы Байеса из теорвера
- prob-04-bayes — Полный байесовский фреймворк строится поверх условной вероятности
- calc-19-gradient — Градиент в многомерном пространстве - математическая основа backprop
- opt-01 — Выпуклая оптимизация формализует задачу минимизации loss function
- la-02-dot-product
- calc-01-sequences