🔴 Сложный ⏱️ 45 минут

Введение в оптимизацию

📋 Содержание урока

Введение в оптимизацию 🎯

За последние 25 уроков ты прошёл через динамическое программирование, жадные алгоритмы, backtracking (поиск с возвратом), алгоритмы на строках и вычислительную геометрию — и в каждом из них, если присмотреться, пряталась одна и та же скрытая идея. Кратчайший путь Дейкстры — это минимизация суммы весов рёбер. Минимальное остовное дерево — это минимизация суммарного веса рёбер, соединяющих все вершины. Рюкзак в динамическом программировании — это максимизация ценности при ограничении на вес. Ты уже 25 уроков подряд решал задачи оптимизации, просто они были дискретными, а инструменты — комбинаторными: перебор с отсечениями, рекуррентные соотношения, жадный выбор. Теперь настало время назвать эту идею её собственным именем и превратить её из побочного эффекта алгоритмов в самостоятельный предмет изучения.

Это не смена темы, а смена масштаба. Блок «Алгоритмы и структуры данных» научил тебя находить точное оптимальное решение для задач с конечным, пусть и огромным, числом вариантов. Блок «Оптимизация», который начинается прямо сейчас и продлится 25 уроков, посвящён куда более общей и куда более трудной задаче: найти наилучшую точку в непрерывном, часто многомерном, часто невыпуклом пространстве, где вариантов не миллион и не миллиард, а континуум — буквально каждая точка $\mathbb{R}^n$ является кандидатом. Здесь уже не получится перебрать все варианты за разумное время ни при каком остроумии алгоритма. Нужен принципиально другой инструментарий: производные, градиенты, выпуклый анализ, множители Лагранжа, итеративные численные методы.

И вот главная причина, по которой этот блок — не факультативное дополнение к курсу, а его смысловой центр: обучение абсолютно любой модели машинного обучения — это задача оптимизации. Когда ты вызываешь model.fit(X, y) в scikit-learn, optimizer.step() в PyTorch или model.compile(...).fit(...) в TensorFlow, под капотом происходит ровно одно и то же — подбираются такие параметры модели, при которых некоторая скалярная функция, называемая функцией потерь, принимает наименьшее возможное значение. Линейная регрессия — это минимизация суммы квадратов ошибок. Логистическая регрессия и нейросети-классификаторы — это минимизация кросс-энтропии. Градиентный бустинг — это последовательная минимизация остатков. Метод опорных векторов — это минимизация нормы разделяющей гиперплоскости при ограничениях на отступ. Кластеризация k-means (метод k-средних) — это минимизация суммарного внутрикластерного разброса. За фасадом любого алгоритма обучения, каким бы разным он ни выглядел снаружи, стоит одна и та же математическая конструкция: целевая функция и процедура её минимизации.

Именно поэтому следующие 25 уроков устроены как последовательное раскрытие этой единой идеи. Сначала — теоретический фундамент: выпуклые множества и функции (уроки 277–278), условия оптимальности и теорема Каруша — Куна — Таккера (урок 279). Затем — структурированные задачи с явной формой ограничений: линейное, квадратичное и целочисленное программирование (уроки 280–284). А дальше — сердце современного машинного обучения: градиентный спуск и его модификации, метод Ньютона, квазиньютоновские методы, метод сопряжённых градиентов (уроки 285–289 и далее), которые обучают буквально каждую нейросеть, о которой ты когда-либо слышал. Этот урок — карта всей территории: здесь ты получишь словарь и систему координат, без которых всё дальнейшее содержание блока будет набором разрозненных техник, а не единой картиной.

История

Задача оптимизации в её математически строгой форме — сравнительно молодая дисциплина, но интуитивное стремление «найти наилучшее» так же старо, как сама математика. Уже древнегреческие геометры решали изопериметрические задачи — например, доказывали, что из всех плоских фигур с заданным периметром наибольшую площадь имеет круг, — не имея никакого формального аппарата, кроме геометрических рассуждений. Первый по-настоящему аналитический инструмент появился в XVII веке вместе с дифференциальным исчислением: Ферма сформулировал правило, что в точке экстремума гладкой функции касательная горизонтальна, — фактически открыв необходимое условие первого порядка за десятилетия до того, как Ньютон и Лейбниц оформили матанализ как систему.

Решающий шаг к оптимизации с ограничениями сделал Жозеф Луи Лагранж в 1788 году в трактате «Аналитическая механика». Он предложил метод множителей, который позволяет свести задачу условной оптимизации к задаче без ограничений, вводя дополнительные переменные — сегодня их называют множителями Лагранжа в его честь, а сам метод ты подробно разберёшь в уроке 279 этого блока, когда дойдёшь до условий Каруша — Куна — Таккера. Этот приём оказался настолько универсальным, что спустя два с половиной века он остаётся одним из центральных инструментов теории оптимизации — от механики и экономики до современного машинного обучения, где на нём построена вся теория метода опорных векторов.

XX век превратил оптимизацию из раздела чистой математики в прикладную инженерную дисциплину. В 1939–1947 годах Леонид Канторович в СССР и Джордж Данциг в США независимо разработали линейное программирование и симплекс-метод для его решения — изначально ради задач планирования производства и логистики (тебе предстоит увидеть это в уроках 280–281). А начиная с 1950-х, с появлением компьютеров, итеративные численные методы — градиентный спуск, метод Ньютона — из теоретических конструкций стали практическими алгоритмами, которые можно реально запускать на реальных данных. Ирония истории в том, что метод градиентного спуска, предложенный ещё Огюстеном Луи Коши в 1847 году для совершенно других задач астрономии, спустя почти два века стал алгоритмом, который в модифицированном виде обучает GPT, Stable Diffusion и любую другую крупную нейросеть, о которой ты слышал в новостях.

Задача оптимизации в общем виде

Интуиция

Прежде чем переходить к формулам, стоит зафиксировать общий шаблон, в который укладывается буквально любая задача оптимизации, каким бы разным ни было её конкретное содержание. У задачи всегда есть три ингредиента: величина, которую мы хотим сделать как можно меньше или как можно больше (её называют целевой функцией), набор переменных, которыми мы можем управлять, и, возможно, правила игры — ограничения, которым эти переменные обязаны подчиняться. Инженер, минимизирующий вес моста при условии, что он выдержит заданную нагрузку; логист, минимизирующий стоимость доставки при условии, что каждый заказ будет выполнен; исследователь данных, минимизирующий ошибку модели при условии, что параметры не превышают разумную величину, — все они решают структурно одну и ту же задачу, просто с разным содержанием переменных, функции и ограничений.

Определение

Задача оптимизации в общем виде записывается как

$$\min_{x \in X} f(x) \quad \text{(или } \max_{x \in X} f(x)\text{)},$$

где $f: \mathbb{R}^n \to \mathbb{R}$ — целевая функция (objective function), $x = (x_1, \dots, x_n)$ — вектор переменных решения, а $X \subseteq \mathbb{R}^n$ — допустимое множество (feasible set), то есть множество всех значений $x$, которые разрешено рассматривать как кандидаты на решение. Точка $x^* \in X$, на которой достигается $\min_{x \in X} f(x)$, называется точкой оптимума (или точкой минимума/максимума), а значение $f(x^*)$ — оптимальным значением задачи. Задача максимизации всегда сводится к задаче минимизации заменой $f$ на $-f$: $\max_x f(x) = -\min_x (-f(x))$, поэтому в теории почти всегда по умолчанию говорят именно о минимизации.

Обрати внимание на последнюю фразу определения — она не техническая деталь, а рабочий приём, которым ты будешь пользоваться постоянно: если библиотека оптимизации (а почти все они писаны именно так) умеет только минимизировать, а тебе нужно максимизировать прибыль, точность классификатора или ожидаемую награду агента, достаточно домножить целевую функцию на $-1$ и передать в ту же самую функцию minimize.

Разбор примеров

Пример 1. Компания производит один товар в количестве $q$ единиц. Выручка равна $p \cdot q$ при фиксированной цене $p$, а издержки производства описываются функцией $c(q) = 0{,}01q^2 + 5q + 200$. Требуется найти объём производства, максимизирующий прибыль $\pi(q) = pq - c(q)$ при цене $p = 25$. Запишем задачу в стандартной форме минимизации: $\min_q \big[-\pi(q)\big] = \min_q \big[0{,}01q^2 - 20q + 200\big]$, при этом допустимое множество — все $q \geq 0$ (объём производства не может быть отрицательным). Это простая безусловная (если не считать ограничения неотрицательности) задача с квадратичной целевой функцией — её экстремум находится приравниванием производной к нулю, что мы проделаем позже в этом уроке.

Пример 2. Обучение линейной регрессии на выборке $\{(x_i, y_i)\}_{i=1}^{N}$ — это задача $\min_{w, b} \frac{1}{N}\sum_{i=1}^{N}(y_i - (w x_i + b))^2$. Здесь целевая функция $f(w, b)$ — среднеквадратичная ошибка (MSE), переменные решения — параметры модели $w$ и $b$, а допустимое множество $X = \mathbb{R}^2$ — вся плоскость, потому что никаких ограничений на веса линейной регрессии по умолчанию нет. Это ровно тот же шаблон, что и в примере 1, только вместо «объёма производства» переменной решения выступают параметры модели, а вместо «минус прибыли» — ошибка предсказания.

Пример 3. Логистика: транспортная компания минимизирует суммарную стоимость доставки $\sum_{i,j} c_{ij} x_{ij}$, где $x_{ij}$ — объём груза, перевозимого со склада $i$ в магазин $j$, а $c_{ij}$ — стоимость перевозки единицы груза по этому маршруту. Здесь допустимое множество $X$ задаётся не всей плоскостью, а системой ограничений: суммарный объём, вывезенный со склада $i$, не должен превышать его запасы, а суммарный объём, доставленный в магазин $j$, должен покрывать его спрос, плюс $x_{ij} \geq 0$. Это классическая транспортная задача линейного программирования — ты вернёшься к ней в уроке 280.

Почему это важно

Этот шаблон — «целевая функция плюс допустимое множество» — не абстрактная формальность ради красоты записи. Это язык, на котором единообразно описываются задачи из совершенно разных областей: экономика, инженерия, логистика, машинное обучение. Когда ты научишься переводить содержательную задачу («хочу, чтобы модель ошибалась как можно меньше», «хочу минимизировать себестоимость перевозки») на этот формальный язык, ты автоматически получаешь доступ ко всему арсеналу методов, которые следующие 25 уроков будут для этого языка разрабатывать — от точных аналитических решений до градиентного спуска, обучающего нейросети с миллиардами параметров.

Безусловная и условная оптимизация

Интуиция

Представь два сценария поиска самой низкой точки местности. В первом ты можешь идти куда угодно — по всей карте без ограничений, и ищешь глобально самую низкую впадину. Во втором тебе разрешено ходить только по размеченным тропам парка — и даже если за оградой парка есть более глубокая впадина, она тебе недоступна, а значит, лучшая точка, которую ты можешь найти, — это самая низкая точка именно среди троп, а не среди всей местности вообще. Это и есть разница между безусловной и условной оптимизацией: в первом случае искать можно во всём пространстве переменных, во втором — только в подмножестве, заданном дополнительными правилами.

Определение

Безусловная оптимизация (unconstrained optimization) — это задача $\min_{x \in \mathbb{R}^n} f(x)$, в которой допустимое множество совпадает со всем пространством переменных, $X = \mathbb{R}^n$, то есть никаких дополнительных ограничений на $x$ не накладывается.

Условная оптимизация (constrained optimization) — это задача, в которой допустимое множество задаётся системой ограничений-равенств и ограничений-неравенств:

$$\min_{x} f(x) \quad \text{при условиях} \quad g_i(x) \leq 0,\ i = 1,\dots,m, \qquad h_j(x) = 0,\ j = 1,\dots,p,$$

где функции $g_i$ задают ограничения-неравенства, а функции $h_j$ — ограничения-равенства. Допустимое множество в этом случае — это пересечение всех точек, удовлетворяющих одновременно всем $m + p$ условиям: $X = \{x \in \mathbb{R}^n : g_i(x) \leq 0 \ \forall i,\ h_j(x) = 0 \ \forall j\}$.

Разбор примеров

Пример 1 (безусловная). Классическая линейная регрессия без регуляризации, которую мы уже разбирали, — безусловная задача: веса $w$ и смещение $b$ могут принимать любые вещественные значения, никакое ограничение их не сужает. Ровно поэтому у неё есть явное аналитическое решение — нормальные уравнения, — которое мы обсудим в разделе про карту методов.

Пример 2 (условная). Метод опорных векторов (SVM) в жёсткой постановке ищет разделяющую гиперплоскость $w \cdot x + b = 0$, минимизируя $\frac{1}{2}\|w\|^2$ при условии, что каждая точка выборки классифицирована правильно с отступом не меньше единицы: $y_i (w \cdot x_i + b) \geq 1$ для всех $i$. Здесь $m$ ограничений-неравенств (по одному на каждый объект обучающей выборки) явно сужают допустимое множество весов — не любая гиперплоскость допустима, а только та, что отделяет классы с нужным зазором. Именно эта задача с ограничениями-неравенствами станет главным сквозным примером урока 279 про условия KKT.

Пример 3 (условная через штраф — скрытая форма). Гребневая регрессия (Ridge) минимизирует $\text{MSE}(\theta) + \lambda \|\theta\|^2$ — на первый взгляд это безусловная задача, потому что в записи нет явного знака неравенства. Но по теореме Лагранжа эта штрафная формулировка эквивалентна условной задаче $\min_\theta \text{MSE}(\theta)$ при условии $\|\theta\|^2 \leq C$ для некоторого $C$, зависящего от $\lambda$: чем больше $\lambda$, тем меньше эффективный радиус допустимой области $C$. Это важный практический вывод — регуляризация в машинном обучении почти всегда является скрытой формой условной оптимизации, просто ограничение «зашито» в целевую функцию штрафным слагаемым, а не выписано отдельным неравенством.

Пример 4 (условная, целочисленная). Классическая задача о рюкзаке из блока динамического программирования — максимизировать суммарную ценность предметов при условии, что их суммарный вес не превышает вместимость рюкзака, — тоже задача условной оптимизации, только с дополнительным требованием целочисленности переменных (предмет либо берём целиком, либо не берём). С точки зрения оптимизации это частный случай целочисленного программирования, который ты формально увидишь в уроке 284, хотя алгоритмически уже решал его через ДП в блоке 270.

Почему это важно

Тип задачи — безусловная или условная — определяет, каким инструментом её вообще можно решать. Для безусловной оптимизации гладкой функции работает вся линейка методов на основе градиента (уроки 285–289): двигайся против направления роста функции, пока не окажешься в точке, где градиент обнуляется. Для условной оптимизации это в общем случае не работает напрямую — точка минимума самой функции $f$ без учёта ограничений может лежать вне допустимого множества, и тогда нужны специальные конструкции: множители Лагранжа, проекция градиента на допустимую область, штрафные функции, симплекс-метод для линейных ограничений. Умение с первого взгляда классифицировать задачу — это первый практический навык инженера по оптимизации, потому что он сразу отсекает половину неприменимых методов ещё до того, как ты открыл документацию библиотеки.

Локальный и глобальный экстремум: практический взгляд

Интуиция

Ты уже встречался с понятиями локального и глобального экстремума в курсе математического анализа для функций нескольких переменных — там это была чисто теоретическая конструкция, доказываемая через частные производные и матрицу Гессе. Здесь тот же аппарат нужен не ради доказательства теорем, а ради практического, зачастую тревожного вопроса: когда алгоритм оптимизации, остановившийся в некоторой точке, действительно нашёл лучшее решение из всех возможных, а когда он просто застрял в удобной, но далеко не самой глубокой яме рельефа функции?

Определение

Точка $x^* \in X$ называется точкой локального минимума функции $f$ на допустимом множестве $X$, если существует такая окрестность $U(x^*)$ (например, шар малого радиуса $\varepsilon$ вокруг $x^*$), что $f(x^*) \leq f(x)$ для всех $x \in U(x^*) \cap X$. Иными словами, $x^*$ не хуже своих непосредственных соседей, но про далёкие от неё точки утверждение может быть ложным.

Точка $x^* \in X$ называется точкой глобального минимума, если $f(x^*) \leq f(x)$ выполняется для всех $x \in X$ без исключения — то есть это лучшая точка среди абсолютно всех допустимых вариантов, а не только среди соседей. Для максимума определения зеркальны, с обратным знаком неравенства. Каждый глобальный минимум по определению является и локальным, но обратное неверно: у функции может быть множество локальных минимумов, из которых лишь один (или несколько, если значения совпадают) — глобальный.

Разбор примеров

Пример 1. Рассмотрим функцию $f(x) = x^4 - 8x^2 + 5$ — классическая «двугорбая» яма. Её производная $f'(x) = 4x^3 - 16x = 4x(x^2 - 4)$ обнуляется в точках $x = 0, \, x = 2, \, x = -2$. Вторая производная $f''(x) = 12x^2 - 16$: в точках $x = \pm 2$ она равна $12 \cdot 4 - 16 = 32 > 0$ — это локальные минимумы, а в точке $x = 0$ она равна $-16 < 0$ — локальный максимум. Считаем значения: $f(2) = f(-2) = 16 - 32 + 5 = -11$, а $f(0) = 5$. Оба локальных минимума дают одинаковое значение $-11$, и поскольку функция $x^4-8x^2+5$ стремится к $+\infty$ на обоих концах числовой прямой, других претендентов на глобальный минимум нет — значит, обе точки $x = 2$ и $x = -2$ одновременно являются точками глобального минимума. Это первый важный урок: глобальных минимумов может быть несколько, если их значения совпадают.

Пример 2. Функция $f(x) = x^3 - 3x$ имеет производную $f'(x) = 3x^2 - 3 = 0$ в точках $x = 1$ и $x = -1$. По второй производной $f''(x) = 6x$: в $x=1$ она положительна (локальный минимум, $f(1) = -2$), в $x=-1$ отрицательна (локальный максимум, $f(-1) = 2$). Но у кубической функции при $x \to -\infty$ значение $f(x) \to -\infty$, а при $x \to +\infty$ значение $f(x) \to +\infty$ — функция не ограничена ни снизу, ни сверху. Значит, у неё вообще нет ни глобального минимума, ни глобального максимума на всей числовой прямой, хотя локальные экстремумы есть. Это второй важный урок: наличие локальных экстремумов ничего не гарантирует о существовании глобальных — иногда глобального решения просто не существует, и задачу нужно доопределять ограничением области (например, искать минимум не на всей прямой, а на отрезке $[-3, 3]$).

Пример 3. Функция потерь глубокой нейросети как функция от миллионов весов — это, как правило, крайне невыпуклый ландшафт с астрономическим количеством критических точек. Долгое время в машинном обучении господствовало опасение, что градиентный спуск будет застревать в плохих локальных минимумах с высоким значением потерь. Однако современные исследования (в том числе основанные на анализе случайных матриц) показывают, что в высокой размерности куда более распространённая и опасная проблема — не плохие локальные минимумы, а седловые точки: точки, в которых градиент равен нулю, но по одним направлениям функция растёт, а по другим убывает, то есть это вовсе не экстремум. Рассмотрим простейший пример седла $f(x, y) = x^2 - y^2$: градиент $\nabla f(0, 0) = (0, 0)$, но вдоль оси $x$ функция имеет минимум в этой точке, а вдоль оси $y$ — максимум, так что в целом точка $(0,0)$ не является ни локальным минимумом, ни локальным максимумом функции $f$ на плоскости.

Почему это важно

Практический вывод для машинного обучения звучит так: за исключением специально устроенных выпуклых моделей (линейная и логистическая регрессия, SVM, о которых ниже), почти никакой современный алгоритм обучения не гарантирует нахождение глобального минимума функции потерь — он гарантирует лишь сходимость к некоторой точке, где градиент близок к нулю, а это может быть и локальный минимум, и седловая точка на плоском участке. И тем не менее на практике обучение нейросетей работает: эмпирически подавляющее большинство локальных минимумов, которые находит стохастический градиентный спуск в реалистичных архитектурах, дают близкое к оптимальному качество, а само отсутствие теоретической гарантии глобальности не мешает инженерной практике. Понимание этого различия — практический иммунитет от иллюзии, что «модель обучилась не до конца, потому что не нашла глобальный минимум»: чаще всего вопрос не в этом, а в архитектуре, данных или гиперпараметрах.

Выпуклость: почему одни задачи решаются легко, а другие — нет

Интуиция

Среди всех задач оптимизации есть особый и чрезвычайно привилегированный класс — выпуклые задачи. Представь форму миски: в какую бы сторону ты ни толкнул шарик внутри миски, он скатится к единственному дну и никогда не застрянет в промежуточном углублении, потому что углублений просто не бывает по форме самой миски. А теперь представь горный хребет с десятками впадин разной глубины — шарик, отпущенный в случайном месте, застрянет в ближайшей впадине, и эта впадина почти наверняка окажется не самой глубокой точкой всего хребта. Выпуклые задачи оптимизации устроены как миска, невыпуклые — как горный хребет. Это различие — не техническая деталь, а буквально то, что отделяет задачи, гарантированно решаемые эффективным алгоритмом, от задач, для которых в общем случае доказано, что эффективного алгоритма не существует.

Определение

Множество $X \subseteq \mathbb{R}^n$ называется выпуклым, если для любых двух точек $x_1, x_2 \in X$ и любого $t \in [0, 1]$ отрезок, соединяющий их, целиком лежит внутри множества: $t x_1 + (1-t) x_2 \in X$.

Функция $f: X \to \mathbb{R}$, определённая на выпуклом множестве $X$, называется выпуклой, если для любых $x_1, x_2 \in X$ и $t \in [0, 1]$ выполняется неравенство

$$f(t x_1 + (1-t) x_2) \leq t f(x_1) + (1-t) f(x_2),$$

то есть график функции между любыми двумя точками лежит не выше хорды, соединяющей эти точки. Задача $\min_{x \in X} f(x)$ называется выпуклой задачей оптимизации, если и допустимое множество $X$, и целевая функция $f$ выпуклы. Ключевой факт, ради которого всё это определяется (полное доказательство — в уроке 278): в выпуклой задаче любой локальный минимум автоматически является глобальным.

Разбор примеров

Пример 1. Функция $f(x) = x^2$ — выпуклая: её вторая производная $f''(x) = 2 > 0$ на всей прямой (для гладких функций одной переменной положительность второй производной всюду — достаточное условие выпуклости, строгое доказательство — в уроке 278). У неё единственная критическая точка $x = 0$, и это одновременно и локальный, и глобальный минимум — противоречий между «локально лучшее» и «глобально лучшее» здесь в принципе быть не может.

Пример 2. Функция $f(x) = x^4 - 8x^2 + 5$ из предыдущего раздела не выпукла: $f''(x) = 12x^2 - 16$ отрицательна при $|x| < \sqrt{4/3}$, значит на этом интервале функция вогнута, а не выпукла. Именно поэтому у неё оказалось два разных локальных экстремума разного типа (минимумы в $\pm 2$ и максимум в $0$) — в выпуклой функции подобная «многоямность» невозможна в принципе.

Пример 3. MSE-функция потерь линейной регрессии $f(w) = \frac{1}{N}\sum_i (y_i - w \cdot x_i)^2$ — выпуклая функция параметров $w$ (это квадратичная форма с неотрицательно определённой матрицей вторых производных, что мы формализуем в уроке 278). Именно поэтому линейная регрессия — редкий пример модели, для которой градиентный спуск из любой начальной точки гарантированно сходится к глобально наилучшим весам, а не к какому-то из многих локальных минимумов: у выпуклой функции просто нет альтернативы, кроме единственной (или единственного связного множества) точки минимума.

Пример 4. Функция потерь глубокой полносвязной или свёрточной нейросети как функция от всех её весов — типичный пример невыпуклой функции: она получается композицией многих нелинейных слоёв, и уже сама операция композиции, как правило, разрушает выпуклость. Именно поэтому для нейросетей не существует аналога «гарантированно найдём глобальный минимум» — и именно поэтому многолетние исследования сходимости, инициализации весов и архитектур во многом посвящены тому, чтобы сделать ландшафт потерь настолько «дружелюбным», насколько это вообще возможно для невыпуклой функции.

Почему это важно

Это раздел-анонс: строгие определения выпуклых множеств, признаки выпуклости функций и полное доказательство того, почему в выпуклой задаче локальный минимум — всегда глобальный, займут два следующих урока — 277 «Выпуклые множества» и 278 «Выпуклые функции», а вывод условий оптимальности через выпуклый анализ завершится в уроке 279 теоремой Каруша — Куна — Таккера. Но интуицию, зачем всё это нужно, важно унести уже сейчас: когда ты формализуешь задачу машинного обучения, первый вопрос, который стоит себе задать после «какая у меня целевая функция», — это «выпукла ли она». Ответ «да» означает, что задача решается предсказуемо, и любой сошедшийся алгоритм даёт лучшее из возможных решений. Ответ «нет» означает, что придётся смириться с тем, что найденное решение — хорошее, но не гарантированно наилучшее, и вся дальнейшая инженерия (инициализация, скорость обучения — learning rate, архитектура, регуляризация) направлена на то, чтобы это «хорошее» было как можно ближе к «наилучшему».

Обучение модели — это оптимизация

Интуиция

Этот раздел — не ещё один пример среди прочих, а формулировка центрального тезиса всего блока, ради которого имеет смысл проходить следующие 24 урока. Когда ты говоришь «модель обучается», за этой фразой скрывается совершенно конкретный, ничем не таинственный процесс: есть функция, которая по параметрам модели вычисляет число — насколько плохо модель справляется с задачей на имеющихся данных, — и есть процедура, которая ищет такие параметры, при которых это число минимально. Всё. Никакой дополнительной магии в понятии «обучение» с точки зрения оптимизации не заложено.

Определение

Обучение модели с параметрами $\theta \in \mathbb{R}^p$ на обучающей выборке $\{(x_i, y_i)\}_{i=1}^{N}$ формально записывается как задача оптимизации

$$\min_{\theta \in \mathbb{R}^p} \ \mathcal{L}(\theta) = \frac{1}{N}\sum_{i=1}^{N} \ell\big(f_\theta(x_i), y_i\big) + \lambda R(\theta),$$

где $f_\theta$ — модель (например, линейная функция, дерево решений или нейросеть) с параметрами $\theta$, $\ell$ — функция потерь на одном примере (loss function; например, квадрат ошибки или кросс-энтропия), $\mathcal{L}(\theta)$ — усреднённая по выборке функция потерь, которую и минимизирует процесс обучения, $R(\theta)$ — необязательный регуляризатор, штрафующий за сложность модели, а $\lambda \geq 0$ — коэффициент, задающий его вес. «Обучить модель» и «решить задачу $\min_\theta \mathcal{L}(\theta)$» — буквально синонимы.

Разбор примеров

Пример 1. Линейная регрессия: $f_\theta(x) = \theta^T x$, $\ell(f_\theta(x_i), y_i) = (y_i - \theta^T x_i)^2$, без регуляризации ($\lambda = 0$). Задача обучения — $\min_\theta \frac{1}{N}\sum_i (y_i - \theta^T x_i)^2$ — это в точности пример, который мы уже разбирали: безусловная выпуклая квадратичная оптимизация, обладающая явным аналитическим решением через нормальные уравнения. Это самый простой, но и самый показательный случай: здесь вообще не нужен итеративный алгоритм, задача решается за один шаг матричной алгебры.

Пример 2. Логистическая регрессия для бинарной классификации: $f_\theta(x) = \sigma(\theta^T x)$ (сигмоида), $\ell$ — функция логистических потерь (бинарная кросс-энтропия) $-\big[y_i \log f_\theta(x_i) + (1-y_i)\log(1 - f_\theta(x_i))\big]$. Задача $\min_\theta \mathcal{L}(\theta)$ по-прежнему выпуклая (это важный факт, который доказывается в уроке 278), но у неё уже нет замкнутого аналитического решения — уравнение $\nabla \mathcal{L}(\theta) = 0$ трансцендентно и не решается в элементарных функциях. Поэтому логистическая регрессия обучается итеративно, градиентным методом — и, поскольку задача выпуклая, градиентный спуск из любой начальной точки гарантированно сходится к глобальному минимуму.

Пример 3. Глубокая свёрточная нейросеть для классификации изображений: $f_\theta$ — композиция десятков нелинейных слоёв с миллионами или миллиардами параметров $\theta$, $\ell$ — кросс-энтропия по классам, $\mathcal{L}(\theta)$ — невыпуклая функция астрономической размерности. Здесь у обучения нет ни аналитического решения, ни гарантии сходимости к глобальному минимуму — но задача остаётся ровно той же самой: минимизировать усреднённую функцию потерь по параметрам. Различие с предыдущими примерами — исключительно в свойствах целевой функции (гладкость, выпуклость, размерность), а не в самой постановке задачи, и именно поэтому один и тот же концептуальный каркас работает и для линейной регрессии из первого урока курса по статистике, и для трансформера с миллиардами весов.

Пример 4. Регуляризация как явная часть целевой функции: гребневая регрессия добавляет $R(\theta) = \|\theta\|_2^2$, Lasso — $R(\theta) = \|\theta\|_1$. Важно осознать, что регуляризация не «довесок сбоку», а буквально изменение самой оптимизационной задачи: минимизируется уже не чистая ошибка на обучающей выборке, а её сумма со штрафом за величину весов. Как мы уже видели в разделе про безусловную и условную оптимизацию, это эквивалентно неявному ограничению допустимой области параметров — регуляризация превращает почти любую задачу обучения в скрыто условную.

Почему это важно

Если вынести из этого урока одну мысль, пусть это будет она: практически вся работа специалиста по машинному обучению на этапе построения модели — это выбор трёх вещей, которые целиком определяют задачу оптимизации. Во-первых, архитектура модели $f_\theta$ — она определяет, насколько сложную зависимость можно выразить и насколько невыпуклой окажется итоговая целевая функция. Во-вторых, функция потерь $\ell$ — она определяет, что именно значит «модель ошибается» и в какую сторону оптимизатор будет двигать параметры. В-третьих, регуляризатор $R$ и метод решения задачи оптимизации — они определяют, как именно (и насколько надёжно) будет найдено приближённое решение. Библиотеки вроде scikit-learn, PyTorch и TensorFlow автоматизируют вычислительную часть — но понимание того, что происходит под капотом, есть понимание именно этой оптимизационной конструкции, а не магии «нейросеть учится сама».

Карта методов оптимизации

Интуиция

Раз задача оптимизации — универсальный язык, логично спросить: а какими инструментами её вообще решают? Здесь стоит сразу отказаться от иллюзии «один метод на все случаи жизни» — методы принципиально различаются тем, сколько информации о целевой функции они используют, и это прямо определяет, для каких задач они годятся.

Определение

Методы решения задач оптимизации по объёму используемой информации о функции $f$ делятся на три крупных класса.

  1. Аналитические методы — используют точное решение уравнения $\nabla f(x) = 0$ (необходимое условие экстремума) в замкнутой форме, без итераций. Применимы, только когда такое уравнение действительно решается явно — как правило, для линейных и квадратичных целевых функций.
  2. Методы на основе градиента (методы первого и второго порядка) — используют информацию о производных функции в текущей точке, чтобы итеративно двигаться к минимуму: градиентный спуск и его модификации (методы первого порядка, используют только $\nabla f$), метод Ньютона и квазиньютоновские методы (методы второго порядка, используют ещё и матрицу вторых производных или её приближение).
  3. Методы нулевого порядка (безградиентные, derivative-free) — используют только значения самой функции $f(x)$ в разных точках, без каких-либо производных. Применяются, когда функция недифференцируема, зашумлена или её производную невозможно (либо слишком дорого) вычислить — например, функция задана «чёрным ящиком».

Разбор примеров

Пример 1 (аналитический метод). Обучение линейной регрессии решается точно через нормальные уравнения: приравнивая градиент MSE по $\theta$ к нулю, получаем $X^T X \theta = X^T y$, откуда $\theta^* = (X^T X)^{-1} X^T y$ — явная формула, вычисляемая за один проход матричной алгебры, без единой итерации. Это возможно строго потому, что целевая функция квадратичная, а значит, уравнение $\nabla f(\theta) = 0$ линейно и решается обращением матрицы. Как только модель перестаёт быть линейной (логистическая регрессия, нейросеть), аналитического решения в общем случае уже нет.

Пример 2 (градиентный метод). Рассмотрим простейшую квадратичную функцию $f(x) = x^2$ и одну итерацию градиентного спуска из точки $x_0 = 5$ с шагом (скоростью обучения) $\eta = 0{,}1$: $f'(x) = 2x$, поэтому $x_1 = x_0 - \eta f'(x_0) = 5 - 0{,}1 \cdot 10 = 4$. Ещё одна итерация: $x_2 = 4 - 0{,}1 \cdot 8 = 3{,}2$. Значение $x$ монотонно приближается к точке минимума $x^*=0$, используя на каждом шаге только производную функции в текущей точке, — ровно этот механизм, применённый к функции потерь с миллионами параметров вместо одной переменной, обучает подавляющее большинство современных нейросетей, только называется он там стохастическим градиентным спуском (урок 286) из-за огромного размера обучающей выборки.

Пример 3 (метод нулевого порядка). Подбор гиперпараметров модели — скорости обучения, числа слоёв, коэффициента регуляризации — типичная задача, где градиент недоступен в принципе: целевая функция здесь — это «запусти полное обучение модели с такими гиперпараметрами и верни точность на валидационной выборке», и она не является гладкой аналитической функцией гиперпараметров, дифференцировать её нечем. Поэтому подбор гиперпараметров решают методами нулевого порядка: случайный поиск (random search), поиск по сетке (grid search) или более продвинутая байесовская оптимизация, которая строит вероятностную модель зависимости качества от гиперпараметров и на её основе выбирает следующую точку для пробы.

Почему это важно

Эта тройка методов — буквально оглавление всего оставшегося блока курса. Уроки 280–284 разбирают структурированные задачи (линейное, квадратичное, целочисленное программирование), для которых существуют специализированные точные алгоритмы вроде симплекс-метода — по духу близкие к аналитическим методам, только для задач с ограничениями. Уроки 285 и далее — это полное погружение в методы на основе градиента: градиентный спуск, стохастический градиентный спуск, метод Ньютона, квазиньютоновские методы, метод сопряжённых градиентов — именно они обучают подавляющее большинство моделей машинного обучения, от линейной регрессии до трансформеров. А методы нулевого порядка, которые здесь упомянуты лишь для полноты картины, пригодятся тебе на практике каждый раз, когда придётся настраивать гиперпараметры или оптимизировать что-то, что нельзя продифференцировать — от архитектуры нейросети до параметров симуляции. Держи эту карту перед глазами: каждый следующий урок блока будет закрашивать на ней одну конкретную область.

Практика: 30 заданий

Базовые задания (1–10)

Задание 1. Запиши задачу минимизации функции $f(x) = (x-3)^2$ в стандартной форме «$\min \dots$ при условии $\dots$» и укажи, безусловная она или условная.


Задание 2. Найди глобальный минимум функции $f(x, y) = x^2 + y^2$ и укажи его значение.


Задание 3. Обучение линейной регрессии минимизирует MSE по весам $w$ без каких-либо ограничений на их значения. Это задача безусловной или условной оптимизации?


Задание 4. Есть ли у функции $f(x) = x^3$ глобальный минимум на всей числовой прямой $\mathbb{R}$?


Задание 5. К какому из трёх классов методов (аналитический, градиентный, нулевого порядка) относится решение линейной регрессии через нормальные уравнения $\theta^* = (X^TX)^{-1}X^Ty$?


Задание 6. Опиши словами, что такое допустимое множество $X$ для задачи $\min_x c^T x$ при условии $Ax \leq b$, $x \geq 0$.


Задание 7. Найди вершину параболы $f(x) = x^2 - 4x + 3$ аналитически и определи, является ли она глобальным минимумом.


Задание 8. Обучение SVM минимизирует $\frac{1}{2}\|w\|^2$ при условии $y_i(w \cdot x_i + b) \geq 1$ для каждого объекта выборки. Условная это задача или безусловная?


Задание 9. Из перечисленных методов — (а) метод Ньютона, (б) случайный поиск гиперпараметров, (в) градиентный спуск — выбери метод нулевого порядка.


Задание 10. Функция $f(x) = |x|$ не дифференцируема в точке $x = 0$. Как это связано с классификацией методов оптимизации из карты этого урока?

Средние задания (11–20)

Задание 11. Найди все локальные экстремумы функции $f(x) = x^3 - 3x$ и определи, существует ли у неё глобальный минимум на $\mathbb{R}$.


Задание 12. Проверь выпуклость функции $f(x) = e^x$ через вторую производную.


Задание 13. Проверь выпуклость функции $f(x) = -x^2$ и перепиши задачу $\max_x (-x^2)$ в виде задачи минимизации выпуклой функции.


Задание 14. Компания максимизирует прибыль $\pi(q) = 25q - c(q)$, $c(q) = 0{,}01q^2+5q+200$, при условии $0 \leq q \leq Q_{\max}=500$. Запиши задачу как условную минимизацию.


Задание 15. Объясни, как штрафная формулировка Ridge-регрессии $\min_\theta \text{MSE}(\theta) + \lambda\|\theta\|^2$ связана с условной задачей $\min_\theta \text{MSE}(\theta)$ при $\|\theta\|^2 \leq C$.


Задание 16. Найди глобальный минимум функции $f(x,y) = (x-1)^2 + (y+2)^2 + 5$ и его значение.


Задание 17. Оцени, почему перебор всех возможных наборов весов нейросети с $10^7$ параметрами, даже если рассмотреть всего по 10 значений на параметр, вычислительно неосуществим.


Задание 18. К какому классу методов относится поиск по сетке (grid search) по скорости обучения и числу слоёв, и почему градиентный метод здесь напрямую неприменим?


Задание 19. Для $f(x) = x^2$ сделай одну итерацию градиентного спуска из $x_0 = 5$ с шагом $\eta = 0{,}1$.


Задание 20. Логистическая регрессия с L1-регуляризацией (Lasso-логрегрессия) — определи тип задачи по двум осям: безусловная/условная и выпуклая/невыпуклая.

Продвинутые задания (21–30)

Задание 21. Обоснуй (без формального доказательства из урока 278, а на уровне идеи), почему в выпуклой задаче любой локальный минимум является глобальным.


Задание 22. Для $f(x) = x^4 - 4x^2$ найди все критические точки, классифицируй их и укажи, выпукла ли функция.


Задание 23. Задача $\min_x x^2$ при условиях $x \geq 5$ и $x \leq 2$. Что происходит с такой задачей?


Задание 24. Покажи, что точка $(0,0)$ функции $f(x,y) = x^2 - y^2$ — критическая, но не является ни минимумом, ни максимумом.


Задание 25. Задача линейного программирования $\max c^Tx$ при $Ax\leq b$, $x\geq 0$. Объясни, почему допустимое множество здесь выпукло и как это связано с уроками 277 и 280.


Задание 26. Объясни, почему мини-батчевый стохастический градиентный спуск (SGD) — это метод первого порядка, а не аналитический и не нулевого порядка.


Задание 27. Две одинаковые по архитектуре нейросети, обученные из разных случайных инициализаций весов, сошлись к разным, но близким по качеству точкам. Объясни это с точки зрения выпуклости.


Задание 28. Сравни качественно, как растёт число локальных минимумов с ростом размерности для типичной невыпуклой функции против выпуклой функции той же размерности.


Задание 29. Модель нужно одновременно оптимизировать по точности и по времени инференса. Почему нельзя просто минимизировать обе величины одной целевой функцией без выбора весов компромисса?


Задание 30. Спроектируй (планом, без полной реализации) формализацию задачи «обучить модель предсказания цены недвижимости так, чтобы предсказанная цена никогда не была отрицательной».

Частые ошибки

Ошибка 1. Путают функцию потерь (которую минимизируют) с метрикой качества вроде accuracy (доли правильных ответов) или F1-меры (которую хотят максимизировать), и пытаются напрямую подставить метрику в градиентный оптимизатор.

Как выглядит: попытка написать «минимизировать 1 - accuracy» напрямую как целевую функцию градиентного спуска.

Почему возникает: метрика — то, что действительно волнует в конце (доля правильных ответов), и кажется естественным оптимизировать именно её напрямую.

Как правильно: accuracy как функция параметров модели кусочно-постоянна и почти всюду имеет нулевую производную (небольшое изменение весов почти никогда не меняет решение классификатора) — она недифференцируема в полезном смысле. Поэтому оптимизируют гладкую дифференцируемую суррогатную функцию потерь (кросс-энтропию), которая коррелирует с метрикой, но допускает вычисление градиента.

Ошибка 2. Считают, что если градиентный метод сошёлся (градиент близок к нулю), значит, найден глобальный минимум.

Как выглядит: утверждение «модель обучилась до сходимости, значит нашла лучшее возможное решение» применительно к невыпуклой нейросети.

Почему возникает: в задачах из учебника (линейная регрессия, простая парабола) сходимость градиентного спуска действительно означает нахождение глобального минимума, и это ожидание неявно переносится на любые задачи.

Как правильно: условие $\nabla f(x)=0$ — необходимое, но не достаточное условие даже локального экстремума (вспомни седловую точку из задания 24), а для невыпуклой функции локальный минимум тем более не гарантирует глобальности; для нейросетей это нормальное и ожидаемое ограничение, а не признак ошибки.

Ошибка 3. Забывают, что регуляризация меняет саму целевую функцию, и воспринимают её как отдельный «пост-обработка» шаг после обучения.

Как выглядит: сначала «обучаем модель», потом «добавляем регуляризацию», как будто это два независимых этапа.

Почему возникает: в коде регуляризация часто задаётся отдельным параметром (alpha, weight_decay), что визуально отделяет её от «основной» функции потерь.

Как правильно: регуляризатор входит в целевую функцию с самого первого шага оптимизации — при $\lambda \neq 0$ оптимизируется уже другая функция $\mathcal{L}(\theta)+\lambda R(\theta)$, и её минимум, как правило, не совпадает с минимумом чистой $\mathcal{L}(\theta)$.

Ошибка 4. Пытаются применить градиентный метод к целевой функции, которая на самом деле недифференцируема или задана «чёрным ящиком» (например, к качеству на валидации как функции гиперпараметров).

Как выглядит: попытка вычислить «производную accuracy по learning rate», не имеющую формального смысла в общем случае.

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

Как правильно: если производная целевой функции недоступна или не определена, нужны методы нулевого порядка (grid search, random search, байесовская оптимизация) — они спроектированы именно для таких ситуаций и не требуют дифференцируемости.

Ошибка 5. Не проверяют, является ли допустимое множество задачи непустым, прежде чем запускать алгоритм решения.

Как выглядит: оптимизатор с ограничениями либо зависает, либо возвращает бессмысленный результат, а причина — противоречивые ограничения (см. задание 23), не совместимые ни при каком $x$.

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

Как правильно: прежде чем решать условную задачу, стоит убедиться (хотя бы для простых случаев — вручную, для сложных — через специальные методы проверки совместности), что допустимое множество не пусто.

Ошибка 6. Автоматически считают любую задачу оптимизации задачей минимизации, забывая явно проверить знак и превратить максимизацию в минимизацию корректно.

Как выглядит: передают функцию прибыли напрямую в библиотеку, которая по умолчанию минимизирует переданную функцию, — и получают на выходе решение, минимизирующее, а не максимизирующее прибыль.

Почему возникает: большинство библиотек оптимизации по умолчанию именно минимизируют, а не максимизируют, и это соглашение легко упустить из виду.

Как правильно: всегда явно домножать целевую функцию на $-1$ при переходе от максимизации к минимизации (как в задании 14) и после решения задачи домножать оптимальное значение обратно на $-1$, если нужно восстановить исходный смысл (максимальную прибыль, а не минимальную «минус прибыль»).

Главное запомнить

  • Задача оптимизации в общем виде — это $\min_{x\in X} f(x)$: целевая функция $f$, переменные решения $x$ и допустимое множество $X$; максимизация всегда сводится к минимизации заменой $f$ на $-f$.

  • Безусловная оптимизация ищет минимум по всему пространству $\mathbb{R}^n$; условная — только по подмножеству, заданному ограничениями-равенствами и ограничениями-неравенствами.

  • Регуляризация в машинном обучении (Ridge, Lasso) — скрытая форма условной оптимизации: штрафное слагаемое в целевой функции эквивалентно явному ограничению на норму параметров по теореме Лагранжа.

  • Локальный минимум лучше своих непосредственных соседей; глобальный минимум лучше вообще всех допустимых точек. Каждый глобальный минимум — локальный, но не наоборот.

  • В высокоразмерных невыпуклых задачах (обучение нейросетей) седловые точки, где градиент равен нулю без экстремума, зачастую опаснее плохих локальных минимумов.

  • Выпуклая задача — та, где и целевая функция, и допустимое множество выпуклы; её ключевое свойство — любой локальный минимум автоматически является глобальным.

  • Обучение любой модели машинного обучения — это задача $\min_\theta \mathcal{L}(\theta)$, где $\mathcal{L}$ — усреднённая по выборке функция потерь плюс, возможно, регуляризатор; архитектура модели, функция потерь и метод решения целиком определяют эту задачу.

  • Линейная и логистическая регрессия — выпуклые задачи, поэтому градиентный спуск гарантированно сходится к глобальному минимуму; функция потерь глубокой нейросети, как правило, невыпукла, и такой гарантии нет.

  • Методы решения задач оптимизации делятся на три класса по объёму используемой информации: аналитические (точная формула), градиентные (используют производные), нулевого порядка (используют только значения функции).

  • Следующие 25 уроков блока последовательно раскрывают эту карту: выпуклость и условия оптимальности (277–279), структурированные задачи с ограничениями (280–284), градиентные методы, обучающие современное машинное обучение (285 и далее).

Связь с темами курса

Что нужно было знать до этого урока

Этот урок напрямую опирается на понятия производной, градиента и частных производных из блоков математического анализа, а также на определения локального и глобального экстремума функций нескольких переменных, с которыми ты уже встречался там в чисто теоретическом контексте. Он также продолжает блок «Алгоритмы и структуры данных» (уроки 251–275): динамическое программирование, жадные алгоритмы и вычислительная геометрия — это дискретные частные случаи той же самой идеи «найти наилучшее решение», только для конечных или комбинаторных пространств вариантов вместо непрерывных.

Что изучить дальше

Следующие два урока — 277 «Выпуклые множества» и 278 «Выпуклые функции» — дают строгий математический аппарат для той интуиции о выпуклости, которую этот урок только анонсировал: точные определения, признаки выпуклости через производные, важнейшие примеры выпуклых множеств и функций, встречающихся в машинном обучении. Урок 279 завершает теоретический фундамент теоремой Каруша — Куна — Таккера — универсальными условиями оптимальности для задач с ограничениями, которые объясняют, например, почему метод опорных векторов работает именно так, как работает. Дальше блок переходит к линейному, квадратичному и целочисленному программированию (280–284) и к градиентным методам (285 и далее), которые обучают подавляющее большинство моделей машинного обучения на практике.

Где это нужно в жизни

🤖 Машинное обучение и ИИ. Буквально каждый этап пайплайна — от линейной регрессии до обучения больших языковых моделей — сводится к минимизации функции потерь по параметрам; понимание этой связки объясняет, почему модель обучается именно так, а не иначе, и что означают такие термины, как «сошёлся», «застрял в локальном минимуме» или «переобучился».

🏭 Производство и логистика. Планирование производства, маршрутизация транспорта, распределение ресурсов между заводами — классические задачи линейного и целочисленного программирования, разбираемые в уроках 280–284, спасающие компаниям реальные деньги за счёт математически оптимальных, а не интуитивных решений.

💰 Финансы. Оптимизация инвестиционного портфеля по модели Марковица — это задача квадратичного программирования: минимизировать риск (дисперсию доходности) при заданном ожидаемом доходе или наоборот — прямое применение аппарата условной оптимизации из этого блока.

⚙️ Инженерное проектирование. Минимизация веса конструкции при условии её прочности, минимизация энергопотребления при условии производительности — инженерные задачи с ограничениями решаются тем же математическим языком, что и обучение нейросети, только с другой предметной областью.

Интересные факты

  • Метод множителей Лагранжа, без которого невозможно строго решить ни одну задачу условной оптимизации с ограничениями-равенствами, был предложен Жозефом Луи Лагранжем в 1788 году в трактате по механике — за полтора века до того, как появились первые компьютеры, способные применять этот метод к задачам с тысячами переменных.

  • Метод градиентного спуска, обучающий сегодня практически каждую крупную нейросеть в мире, был предложен Огюстеном Луи Коши ещё в 1847 году — но не для машинного обучения, а для решения астрономических вычислений, связанных с определением орбит небесных тел; идея пролежала «невостребованной» больше века до эпохи компьютерного обучения моделей.

  • Долгое время главным опасением при обучении глубоких нейросетей считались плохие локальные минимумы. Работы 2014 года (в частности, Дофин и соавторы) показали, что в задачах высокой размерности статистически куда более вероятны седловые точки, чем плохие локальные минимумы, — это открытие заметно изменило понимание того, почему стохастический градиентный спуск на практике эффективно обучает огромные модели, несмотря на отсутствие теоретических гарантий сходимости к глобальному минимуму.

  • Не существует единого алгоритма оптимизации, который был бы лучшим для всех возможных задач без исключения — это утверждение (неформально известное как принцип «no free lunch») означает, что выбор метода из карты этого урока — аналитического, градиентного или нулевого порядка — всегда должен основываться на конкретных свойствах решаемой задачи, а не на слепом следовании одному «универсальному» инструменту.

Лайфхаки

  • Прежде чем выбирать метод решения, всегда явно выпиши целевую функцию и все ограничения в стандартной форме — половина сложности реальных задач исчезает уже на этапе аккуратной формализации, а не в момент запуска алгоритма.

  • Если задача максимизации, сразу домножь целевую функцию на $-1$ и работай с ней как с задачей минимизации — почти весь программный инструментарий (scipy.optimize, PyTorch, солверы линейного программирования) по умолчанию именно минимизирует.

  • Прежде чем выбирать между аналитическим, градиентным и безградиентным методом, задай себе один вопрос: доступна ли производная целевой функции хотя бы приближённо? Ответ сразу отсекает минимум один из трёх классов методов.

  • Если есть возможность проверить выпуклость целевой функции и допустимого множества — сделай это в первую очередь: выпуклость сразу даёт гарантию, что найденное решение градиентного метода будет не просто «каким-то», а лучшим из возможных.

  • Не путай метрику качества (accuracy, F1, время инференса) с функцией потерь, которую реально минимизирует оптимизатор, — метрика часто недифференцируема, и для неё почти всегда используется гладкая суррогатная функция потерь.

  • Регуляризацию в моделях машинного обучения полезно мысленно переводить в форму условного ограничения (по теореме Лагранжа) — это упрощает интуицию о том, что делает коэффициент $\lambda$: чем он больше, тем «теснее клетка» для параметров модели.

  • Если несколько запусков обучения одной и той же нейросети из разных случайных инициализаций дают немного разное, но в целом хорошее качество, не воспринимай это как ошибку — прими это как ожидаемое следствие невыпуклости ландшафта функции потерь, а не как повод искать несуществующий баг.

Ты только что получил карту территории размером в 25 уроков — и, как любая хорошая карта, она пока даёт лишь общее очертание: где горы (невыпуклые задачи), где ровная долина (выпуклые задачи), где проложены безопасные тропы (аналитические и градиентные методы) и где придётся идти вслепую, ориентируясь только по значениям функции (методы нулевого порядка). Дальше эта карта начнёт заполняться подробностями: в следующем уроке ты строго докажешь, почему выпуклость — это не просто удобное свойство, а математическая гарантия, а затем шаг за шагом пройдёшь путь от абстрактной теории условий оптимальности до градиентного спуска, который в этот самый момент где-то в дата-центре обучает очередную модель, меняющую мир. Задача оптимизации, которую ты сегодня научился формализовать, — это в буквальном смысле сердце машинного обучения. Осталось научиться его качественно решать.

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!