1. Математический фундамент: линейная алгебра, математический анализ и методы оптимизации в машинном обучении
Современные библиотеки машинного обучения позволяют обучить сложную модель тремя строками кода. model.fit(X, y) скрывает за собой миллионы математических операций, создавая иллюзию, что глубокое понимание математики больше не требуется. Эта иллюзия разрушается в тот момент, когда модель начинает выдавать NaN вместо предсказаний, градиенты затухают, а функция потерь уходит в бесконечность. В промышленных задачах невозможно отладить архитектуру или оптимизировать процесс обучения методом слепого перебора гиперпараметров. Способность читать математические формулы алгоритмов и переводить их в векторизованный код — это водораздел между пользователем готовых API и инженером машинного обучения.
Линейная алгебра как язык представления данных
В машинном обучении мы редко работаем с одиночными числами (скалярами). Любой объект реального мира, будь то пиксель изображения, профиль пользователя или текст, переводится в векторное пространство.
Вектор представляет собой упорядоченный набор из чисел, где каждое число характеризует отдельный признак объекта. Геометрически вектор можно интерпретировать как точку в -мерном пространстве или как направленный отрезок из начала координат в эту точку.
Ключевой операцией при работе с векторами является скалярное произведение (dot product). Для двух векторов и одинаковой размерности оно вычисляется как сумма попарных произведений их координат:
Помимо алгебраической записи, скалярное произведение имеет фундаментальный геометрический смысл:
Здесь — евклидова норма (длина) вектора, а — угол между векторами. Если векторы нормализованы (их длины равны единице), скалярное произведение становится в точности равно косинусу угла между ними. Это свойство лежит в основе оценки сходства объектов: если косинус близок к , векторы сонаправлены (объекты похожи), если равен — ортогональны (признаки независимы), если — противоположны.
Матрицы в машинном обучении выполняют две основные роли. Первая — это хранение датасета. Матрица признаков размерности содержит объектов (строк), каждый из которых описывается признаками (столбцами). Вторая роль — линейные преобразования. Умножение вектора на матрицу весов переводит вектор из одного признакового пространства в другое.
Если имеет размерность , а — размерность , то результат будет вектором размерности . Вся архитектура полносвязных нейронных сетей строится на последовательности таких матричных умножений, перемежающихся нелинейными функциями активации.
Математический анализ и концепция градиента
Цель любого алгоритма машинного обучения — минимизировать функцию потерь (loss function) , которая измеряет, насколько сильно предсказания модели расходятся с истинными ответами. Вектор содержит обучаемые параметры модели. Чтобы понять, как изменить параметры для уменьшения ошибки, используется аппарат дифференциального исчисления.
Производная функции одной переменной показывает скорость изменения функции. В многомерном случае, когда функция зависит от вектора параметров , мы используем частные производные. Частная производная показывает, как изменится значение функции потерь при бесконечно малом изменении одного конкретного параметра , при условии, что все остальные параметры зафиксированы.
Вектор, составленный из всех частных производных, называется градиентом и обозначается символом набла :
Градиент обладает важнейшим геометрическим свойством: он всегда указывает направление наискорейшего возрастания функции в данной точке. Следовательно, антиградиент (вектор ) указывает направление наискорейшего убывания. Если мы визуализируем функцию потерь как топографическую карту, где линии уровня соединяют точки с одинаковым значением ошибки, то вектор градиента в любой точке будет строго перпендикулярен линии уровня, проходящей через эту точку.
Цепное правило и вычислительные графы
Функции потерь в реальных моделях редко бывают простыми. Чаще всего это сложные композиции функций. Например, входной вектор умножается на матрицу, затем применяется нелинейность, затем снова умножение, и только потом вычисляется ошибка. Для дифференцирования таких композиций используется цепное правило (chain rule).
Для скалярных функций композиции цепное правило гласит:
В контексте машинного обучения вычисления удобно представлять в виде направленного ациклического графа (вычислительного графа). Узлы графа — это математические операции или переменные, а ребра — потоки данных (тензоры).
!Структура вычислительного графа для сложной функции
При прямом проходе (forward pass) данные движутся от входов к выходу, вычисляя значение функции потерь. При обратном проходе (backward pass) градиенты ошибки распространяются от выхода к входам, последовательно перемножаясь согласно цепному правилу. Этот механизм позволяет алгоритмически вычислять градиенты для моделей с миллионами параметров, не выводя аналитическую формулу для каждого из них вручную.
Оптимизация: алгоритм градиентного спуска
Зная направление наискорейшего убывания функции потерь, мы можем итеративно обновлять параметры модели, чтобы найти минимум. Этот процесс называется градиентным спуском (Gradient Descent).
Формула обновления параметров на итерации выглядит следующим образом:
Здесь (эта) — это гиперпараметр, называемый шагом обучения (learning rate). Он определяет, насколько сильно мы сдвигаем параметры в направлении антиградиента.
Выбор правильного значения критически важен для успешной оптимизации.
Если шаг обучения слишком мал, модель будет сходиться к минимуму недопустимо долго, а в случае невыпуклых функций потерь рискует «застрять» в локальном минимуме. Если шаг обучения слишком велик, алгоритм может «перепрыгнуть» оптимум. В худшем случае это приводит к расходимости: на каждом шаге параметры отлетают всё дальше от минимума, значения градиентов экспоненциально растут, и в коде возникает ошибка переполнения (overflow, приводящий к NaN).
!Влияние learning rate на сходимость градиентного спуска
Ограничения градиентного спуска и матрица Гессе
Градиентный спуск опирается только на первую производную функции потерь. Это метод оптимизации первого порядка. Он «видит» только наклон поверхности в текущей точке, но не знает о её кривизне.
Информацию о кривизне поверхности дает матрица вторых частных производных — гессиан (Hessian), обозначаемая как . Элемент матрицы равен . Методы оптимизации второго порядка (например, метод Ньютона) используют гессиан для вычисления оптимального размера шага и направления, что позволяет сходиться за гораздо меньшее число итераций. Формула обновления в методе Ньютона:
Однако в машинном обучении методы второго порядка применяются крайне редко. Причина кроется в вычислительной сложности. Если модель имеет параметров, гессиан представляет собой матрицу размера . Вычисление обратной матрицы имеет сложность . Для современной модели с 10 миллионами параметров вычисление гессиана потребует хранения матрицы из элементов, а её обращение займет годы вычислений на суперкомпьютерах. Поэтому индустрия сосредоточилась на модификациях методов первого порядка (Adam, RMSprop), которые аппроксимируют информацию о кривизне, не вычисляя гессиан напрямую.
Практический вывод: градиент для линейной регрессии
Чтобы перевести абстрактную математику в код, необходимо уметь выводить градиенты аналитически. Разберем этот процесс от начала до конца на примере классической задачи — множественной линейной регрессии.
Предположим, у нас есть обучающая выборка из объектов. Каждый объект описывается вектором признаков . Истинный ответ для -го объекта обозначим как . Модель линейной регрессии делает предсказание путем скалярного произведения вектора весов и вектора признаков:
В качестве функции потерь мы используем среднеквадратичную ошибку (Mean Squared Error, MSE). В математических выводах MSE часто записывают с множителем :
Множитель не влияет на положение минимума (так как это константа), но он элегантно сократится с двойкой, которая появится при дифференцировании квадрата, что сделает итоговую формулу градиента более чистой.
Наша задача — найти градиент , то есть вектор частных производных по каждому весу . Вычислим производную по -му компоненту вектора весов, используя цепное правило.
Внешняя функция — это квадрат, внутренняя — выражение под квадратом. Сумма и константа выносятся за знак производной в силу линейности оператора дифференцирования:
Двойки сокращаются. Теперь нужно найти производную внутренней части . Распишем скалярное произведение: . При дифференцировании этой суммы по все слагаемые, кроме , обращаются в ноль (так как они считаются константами относительно ). Производная от также равна нулю. Производная от по равна просто .
Подставляем это обратно:
Эта формула дает нам компоненту градиента для одного веса. Заметим интуитивный смысл: обновление веса пропорционально величине ошибки и значению самого признака . Если признак был равен нулю, он не внес вклада в ошибку, и соответствующий вес не будет обновлен.
Чтобы получить полный вектор градиента , мы собираем все частные производные в вектор. Вектор из элементов для всех — это просто исходный вектор признаков . Следовательно, градиент равен:
Матричное дифференцирование и векторизация
Полученная выше формула с суммой математически корректна, но её реализация в Python через цикл for будет работать катастрофически медленно. Интерпретатор Python тратит много времени на накладные расходы при итерациях. Для эффективных вычислений необходимо использовать векторизацию — выполнение операций над целыми массивами данных с помощью оптимизированных библиотек на C/C++, таких как NumPy.
Для этого функцию потерь и её градиент нужно переписать в матричном виде. Соберем все векторы признаков (как строки) в матрицу размерности . Истинные ответы соберем в вектор-столбец размерности .
Тогда вектор всех предсказаний модели для всей выборки можно записать одним матричным умножением: . Функция потерь MSE в матричном виде записывается через квадрат евклидовой нормы вектора ошибок:
Используя правила матричного дифференцирования (в частности, для симметричной матрицы ), можно вывести градиент напрямую из матричной формы. Но мы можем просто перевести полученную ранее формулу с суммами в матричный вид.
Выражение — это скалярная ошибка на -м объекте. Вектор всех таких ошибок — это . Нам нужно умножить каждый признак каждого объекта на соответствующую ошибку и просуммировать по всем объектам. Эта операция эквивалентна умножению транспонированной матрицы признаков на вектор ошибок:
Проверка размерностей — главный инструмент отладки
При работе с матричными формулами важнейшим навыком является постоянный контроль размерностей (dimensionality tracking). Это позволяет выявлять ошибки еще до написания кода. Проверим полученную формулу градиента:
Размерность полученного градиента в точности совпадает с размерностью вектора весов . Это означает, что операция в алгоритме градиентного спуска выполнится корректно. В NumPy вся эта сложная математика сожмется до одной элегантной строки: grad = (1/N) * X.T @ (X @ w - y).
Владение векторной алгеброй и понимание того, как производные управляют движением алгоритма в пространстве параметров, формируют базис. Без этого базиса невозможно понять, почему регуляризация сжимает веса, как деревья решений дробят признаковое пространство, и по каким законам обучаются глубокие нейронные сети. Переход от математической абстракции к матричным вычислениям — это первый шаг к созданию производительных и надежных систем машинного обучения.