Переобучение

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
 
(10 промежуточных версий не показаны.)
Строка 1: Строка 1:
-
'''Переобучение''', '''переподгонка''' (overtraining, overfitting) — нежелательное побочное явление, возникающее в задачах обучения по прецедентам, когда вероятность ошибки обученного алгоритма на новых (тестовых) прецедентах оказывается существенно выше, чем средняя ошибка на [[обучающая выборка|обучающей выборке]].
+
{{TOCright}}
-
'''Обобщающая способность''' (generalization ability, generalization performance) — понятие, тесно связанное с понятием ''переобучения''.
+
'''Градиент''' (англ. ''gradient'') — вектор, характеризующий направление и скорость наиболее быстрого локального возрастания [[Функция|скалярной функции]] нескольких переменных. Координатами градиента служат [[Частная производная|частные производные]] функции по всем её аргументам.
-
Говорят, что алгоритм обучения обладает ''способностью к обобщению'', если вероятность ошибки на тестовых данных достаточно мала или хотя бы предсказуема, то есть не сильно отличается от ошибки на обучающей выборке.
+
-
== О природе переобучения ==
+
Если функция <tex>f:\mathbb{R}^n\to\mathbb{R}</tex> зависит от переменных <tex>x_1,\ldots,x_n</tex>, то её градиент имеет вид
-
''Эмпирическим риском'' называется средняя ошибка алгоритма на обучающей выборке.
+
::<tex>\nabla f(x)=\left(\frac{\partial f}{\partial x_1}(x),\ldots,\frac{\partial f}{\partial x_n}(x)\right)^\top.</tex>
-
Метод ''[[Минимизация эмпирического риска|минимизации эмпирического риска]]'' наиболее часто применяется для построения алгоритмов обучения.
+
-
{{S|Он состоит}} в том, чтобы в рамках заданной модели выбрать алгоритм, допускающей минимальное число ошибок на заданной обучающей выборке.
+
-
С переобучением метода минимизации эмпирического риска связано два утверждения, которые на первый взгляд могут показаться парадоксальными.
+
Градиент является одним из основных понятий [[Математический анализ|математического анализа]], [[Численная оптимизация|численной оптимизации]] и [[Машинное обучение|машинного обучения]]. В задачах обучения моделей он показывает, как изменится [[Функция потерь|функция потерь]] при малом изменении каждого параметра. На вычислении градиента основаны [[Градиентный спуск|градиентный спуск]], [[Метод стохастического градиента|метод стохастического градиента]], [[Метод обратного распространения ошибки|обратное распространение ошибки]] и многие современные методы обучения [[Нейронная сеть|нейронных сетей]].
-
'''Утверждение 1.'''
+
В строгом смысле градиент определяется не только функцией, но и выбранным [[Скалярное произведение|скалярным произведением]] в пространстве. Привычный вектор частных производных соответствует стандартному евклидову скалярному произведению.
-
''Минимизация эмпирического риска не гарантирует, что вероятность ошибки на тестовых данных будет мала.''
+
-
Легко предложить абсурдный алгоритм обучения, который минимизирует эмпирический риск до нуля, но при этом абсолютно не способен обучаться.
+
-
Алгоритм состоит в следующем.
+
-
Получив обучающую выборку, он запоминает её и строит функцию, которая сравнивает предъявляемый объект с запомненными обучающими объектами.
+
-
Если предъявляемый объект в точности совпадает с одним из обучающих, то эта функция выдаёт для него запомненный правильный ответ.
+
-
Иначе выдаётся произвольный ответ (например, случайный или всегда один и тот же).
+
-
Эмпирический риск алгоритма равен нулю, однако он не восстанавливает зависимость и не обладает никакой способностью к обобщению.
+
-
Вывод: ''для успешного обучения необходимо не только запоминать, но и обобщать''.
+
== Мотивация ==
-
'''Утверждение 2.'''
+
Для функции одной переменной [[Производная|производная]] <tex>f'(x)</tex> показывает скорость локального изменения функции. Если аргумент является вектором <tex>x\in\mathbb{R}^n</tex>, двигаться можно во множестве направлений, поэтому одной числовой производной недостаточно.
-
''Переобучение появляется именно вследствие минимизации эмпирического риска.''
+
-
Пусть задано конечное множество из ''D'' алгоритмов, которые допускают ошибки независимо и с одинаковой вероятностью.
+
-
Число ошибок любого из этих алгоритмов на заданной обучающей выборке подчиняется одному и тому же [[биномиальное распределение|биномиальному распределению]].
+
-
Минимум эмпирического риска — это случайная величина, равная минимуму из ''D'' независимых одинаково распределённых биномиальных случайных величин.
+
-
{{S|Её ожидаемое}} значение уменьшается {{S|с ростом ''D''}}.
+
-
Соотвественно, {{S|с ростом ''D''}} увеличивается ''переобученность'' — разность вероятности ошибки и частоты ошибок на обучении.
+
-
{{S|В данном}} модельном примере легко построить доверительный интервал переобученности, так как функция распределения минимума известна.
+
Градиент объединяет информацию о локальном изменении функции по всем координатам. Для малого приращения <tex>h\in\mathbb{R}^n</tex> выполняется приближение первого порядка
-
Однако {{S|в реальной}} ситуации алгоритмы имеют различные вероятности ошибок, не являются независимыми,
+
-
{{S|а множество}} алгоритмов, из которого выбирается лучший, может быть бесконечным.
+
-
Поэтому вывод количественных оценок переобученности является сложной задачей.
+
-
{{S|Ею занимается}} [[теория вычислительного обучения]].
+
-
{{S|До сих пор}} остаётся открытой проблема чрезвычайной завышенности верхних оценок переобучения.
+
 +
::<tex>f(x+h)\approx f(x)+\nabla f(x)^\top h.</tex>
-
== Основные определения ==
+
Скалярное произведение <tex>\nabla f(x)^\top h</tex> приближённо показывает, насколько изменится функция при переходе из точки <tex>x</tex> в точку <tex>x+h</tex>.
-
== Теоретические верхние оценки переобученности ==
+
В машинном обучении вектор <tex>x</tex> обычно заменяется вектором параметров модели <tex>\theta</tex>, а функция <tex>f</tex> — функцией потерь <tex>\mathcal{L}(\theta)</tex>. Компонента
-
== Переобучение и сложность ==
+
::<tex>\frac{\partial\mathcal{L}}{\partial\theta_j}</tex>
-
== Эмпирическое измерение переобучения ==
+
показывает локальную чувствительность потерь к изменению параметра <tex>\theta_j</tex>. Если эта производная положительна, малое увеличение параметра увеличивает потери в линейном приближении. Если производная отрицательна, малое увеличение параметра уменьшает потери.
-
== Ссылки ==
+
Градиент позволяет ответить на три практически важных вопроса:
-
[http://en.wikipedia.org/wiki/Overfitting Overfitting] — статья о переобучении в англоязычной Википедии.
+
 
 +
* в каком направлении следует изменить параметры, чтобы уменьшить функцию потерь;
 +
* насколько чувствительна функция к каждому параметру;
 +
* является ли рассматриваемая точка кандидатом на локальный экстремум.
 +
 
 +
== Определение ==
 +
 
 +
=== Градиент в евклидовом пространстве ===
 +
 
 +
Пусть функция <tex>f:U\subseteq\mathbb{R}^n\to\mathbb{R}</tex> дифференцируема в точке <tex>x\in U</tex>. '''Градиентом функции''' <tex>f</tex> в точке <tex>x</tex> называется вектор
 +
 
 +
::<tex>\nabla f(x)=\left(\frac{\partial f}{\partial x_1}(x),\ldots,\frac{\partial f}{\partial x_n}(x)\right)^\top.</tex>
 +
 
 +
Также употребляются обозначения <tex>\mathrm{grad}\,f(x)</tex>, <tex>\nabla_x f(x)</tex> и <tex>\frac{\partial f}{\partial x}</tex>. Последнее обозначение зависит от принятого соглашения: в разных источниках производная по вектору может записываться как строка или как столбец. В данной статье градиент считается вектором-столбцом.
 +
 
 +
Нижний индекс в записи <tex>\nabla_x f</tex> полезен, если функция зависит от нескольких групп переменных. Например, для функции <tex>f(x,\theta)</tex> выражения <tex>\nabla_x f</tex> и <tex>\nabla_\theta f</tex> обозначают градиенты по разным аргументам.
 +
 
 +
Существование всех частных производных в одной точке само по себе не гарантирует дифференцируемости функции. Достаточным условием дифференцируемости является непрерывность всех частных производных в некоторой окрестности рассматриваемой точки.
 +
 
 +
=== Определение через дифференциал ===
 +
 
 +
Более общее определение использует [[Дифференциал функции|дифференциал]]. Если функция <tex>f</tex> дифференцируема в точке <tex>x</tex>, то существует линейный функционал <tex>df_x</tex>, для которого
 +
 
 +
::<tex>f(x+h)=f(x)+df_x(h)+o(\|h\|),\qquad h\to 0.</tex>
 +
 
 +
В евклидовом пространстве любой линейный функционал можно представить как скалярное произведение с некоторым вектором. Градиент определяется равенством
 +
 
 +
::<tex>df_x(h)=\langle\nabla f(x),h\rangle.</tex>
 +
 
 +
Для стандартного скалярного произведения это равенство принимает вид
 +
 
 +
::<tex>df_x(h)=\sum_{j=1}^{n}\frac{\partial f}{\partial x_j}(x)h_j.</tex>
 +
 
 +
Дифференциал и градиент связаны, но не являются одним и тем же объектом. Дифференциал является линейным функционалом, или ковектором (англ. ''covector''), а градиент — его векторным представлением относительно выбранного скалярного произведения.
 +
 
 +
=== Зависимость от скалярного произведения ===
 +
 
 +
Пусть скалярное произведение задаётся симметричной положительно определённой матрицей <tex>G</tex>:
 +
 
 +
::<tex>\langle u,v\rangle_G=u^\top Gv.</tex>
 +
 
 +
Градиент относительно этого скалярного произведения определяется условием
 +
 
 +
::<tex>df_x(h)=\langle\nabla_G f(x),h\rangle_G.</tex>
 +
 
 +
Отсюда следует
 +
 
 +
::<tex>\nabla_G f(x)=G^{-1}\nabla f(x),</tex>
 +
 
 +
где <tex>\nabla f(x)</tex> — обычный евклидов градиент.
 +
 
 +
Таким образом, направление градиента зависит от выбранной геометрии пространства. Эта зависимость используется в предобусловленных методах (англ. ''preconditioning''), римановой оптимизации (англ. ''Riemannian optimization'') и методе естественного градиента (англ. ''natural gradient'').
 +
 
 +
== Геометрический смысл ==
 +
 
 +
=== Производная по направлению ===
 +
 
 +
Пусть <tex>v\in\mathbb{R}^n</tex> — направление движения. [[Производная по направлению]] (англ. ''directional derivative'') определяется как
 +
 
 +
::<tex>D_vf(x)=\lim_{t\to 0}\frac{f(x+tv)-f(x)}{t}.</tex>
 +
 
 +
Для дифференцируемой функции
 +
 
 +
::<tex>D_vf(x)=\nabla f(x)^\top v.</tex>
 +
 
 +
Если <tex>\|v\|_2=1</tex>, то из [[Неравенство Коши — Буняковского|неравенства Коши — Буняковского]] следует
 +
 
 +
::<tex>D_vf(x)\leq\|\nabla f(x)\|_2.</tex>
 +
 
 +
Максимальное значение достигается при
 +
 
 +
::<tex>v=\frac{\nabla f(x)}{\|\nabla f(x)\|_2},</tex>
 +
 
 +
если <tex>\nabla f(x)\ne 0</tex>. Следовательно, градиент направлен в сторону наиболее быстрого локального возрастания функции, а антиградиент <tex>-\nabla f(x)</tex> — в сторону наиболее быстрого локального убывания.
 +
 
 +
Это утверждение предполагает, что направления сравниваются по евклидовой норме. Для другой нормы направление наиболее быстрого изменения функции может не совпадать с евклидовым градиентом.
 +
 
 +
=== Линии и поверхности уровня ===
 +
 
 +
Множеством уровня (англ. ''level set'') функции называется множество
 +
 
 +
::<tex>M_c=\{x\in\mathbb{R}^n\mid f(x)=c\}.</tex>
 +
 
 +
Если <tex>\nabla f(x)\ne 0</tex>, градиент перпендикулярен касательным направлениям к поверхности уровня, проходящей через точку <tex>x</tex>. При движении вдоль поверхности уровня значение функции не меняется, поэтому для любого касательного вектора <tex>v</tex>
 +
 
 +
::<tex>\nabla f(x)^\top v=0.</tex>
 +
 
 +
В двумерном пространстве градиент перпендикулярен линии уровня, а в трёхмерном — поверхности уровня.
 +
 
 +
=== Стационарные точки ===
 +
 
 +
Точка <tex>x^\ast</tex> называется стационарной точкой (англ. ''stationary point''), если
 +
 
 +
::<tex>\nabla f(x^\ast)=0.</tex>
 +
 
 +
Для дифференцируемой функции обращение градиента в нуль является необходимым условием внутреннего локального минимума или максимума. Однако оно не является достаточным: стационарная точка может быть локальным минимумом, локальным максимумом, седловой точкой (англ. ''saddle point'') или частью плоской области функции.
 +
 
 +
Для классификации стационарных точек исследуют вторые производные и [[Вычисление матриц Якоби и Гессе|матрицу Гессе]].
 +
 
 +
== Связь с производной, якобианом и матрицей Гессе ==
 +
 
 +
В литературе по машинному обучению термины «производная», «градиент», «якобиан» и «гессиан» иногда употребляются нестрого. Выбор объекта зависит от размерностей входа и выхода функции.
 +
 
 +
{| class="wikitable"
 +
! Отображение
 +
! Объект первого порядка
 +
! Размерность
 +
|-
 +
| <tex>f:\mathbb{R}\to\mathbb{R}</tex>
 +
| [[Производная]] <tex>f'(x)</tex>
 +
| скаляр
 +
|-
 +
| <tex>f:\mathbb{R}^n\to\mathbb{R}</tex>
 +
| градиент <tex>\nabla f(x)</tex>
 +
| <tex>n\times 1</tex>
 +
|-
 +
| <tex>g:\mathbb{R}^n\to\mathbb{R}^m</tex>
 +
| [[Вычисление матриц Якоби и Гессе|матрица Якоби]] <tex>J_g(x)</tex>
 +
| <tex>m\times n</tex>
 +
|-
 +
| <tex>f:\mathbb{R}^n\to\mathbb{R}</tex>
 +
| [[Вычисление матриц Якоби и Гессе|матрица Гессе]] <tex>H_f(x)</tex>
 +
| <tex>n\times n</tex>
 +
|}
 +
 
 +
Матрица Якоби, или якобиан (англ. ''Jacobian matrix''), функции <tex>g=(g_1,\ldots,g_m)^\top</tex> имеет вид
 +
 
 +
::<tex>J_g(x)=\left(\begin{array}{c}\nabla g_1(x)^\top\\ \vdots\\ \nabla g_m(x)^\top\end{array}\right).</tex>
 +
 
 +
Матрица Гессе, или гессиан (англ. ''Hessian matrix''), скалярной функции представляет собой якобиан её градиента:
 +
 
 +
::<tex>H_f(x)=J_{\nabla f}(x)=\left[\frac{\partial^2f}{\partial x_i\partial x_j}\right]_{i,j=1}^{n}.</tex>
 +
 
 +
Если вторые частные производные непрерывны, матрица Гессе симметрична:
 +
 
 +
::<tex>H_f(x)=H_f(x)^\top.</tex>
 +
 
 +
Градиент описывает локальный наклон функции, тогда как матрица Гессе описывает её локальную кривизну.
 +
 
 +
== Правила вычисления ==
 +
 
 +
=== Линейность ===
 +
 
 +
Для дифференцируемых функций <tex>f</tex> и <tex>g</tex> и констант <tex>\alpha,\beta</tex>
 +
 
 +
::<tex>\nabla(\alpha f+\beta g)=\alpha\nabla f+\beta\nabla g.</tex>
 +
 
 +
=== Произведение функций ===
 +
 
 +
::<tex>\nabla(fg)=g\nabla f+f\nabla g.</tex>
 +
 
 +
=== Частное функций ===
 +
 
 +
Если <tex>g(x)\ne 0</tex>, то
 +
 
 +
::<tex>\nabla\left(\frac{f}{g}\right)=\frac{g\nabla f-f\nabla g}{g^2}.</tex>
 +
 
 +
=== Сложная функция ===
 +
 
 +
Пусть <tex>g:\mathbb{R}^n\to\mathbb{R}^m</tex>, <tex>\varphi:\mathbb{R}^m\to\mathbb{R}</tex>, а <tex>f(x)=\varphi(g(x))</tex>. Тогда [[Правило дифференцирования сложной функции|цепное правило]] (англ. ''chain rule'') записывается как
 +
 
 +
::<tex>\nabla_x f(x)=J_g(x)^\top\nabla_z\varphi(z)\big|_{z=g(x)}.</tex>
 +
 
 +
Транспонирование якобиана необходимо для согласования размерностей. Цепное правило является математической основой [[Граф вычислений|вычислительных графов]] и [[Метод обратного распространения ошибки|обратного распространения ошибки]].
 +
 
 +
=== Квадратичная форма ===
 +
 
 +
Для функции
 +
 
 +
::<tex>f(x)=\frac12x^\top Ax+b^\top x+c</tex>
 +
 
 +
градиент равен
 +
 
 +
::<tex>\nabla f(x)=\frac12(A+A^\top)x+b.</tex>
 +
 
 +
Если матрица <tex>A</tex> симметрична, формула упрощается:
 +
 
 +
::<tex>\nabla f(x)=Ax+b.</tex>
 +
 
 +
Матрица Гессе этой функции равна
 +
 
 +
::<tex>H_f(x)=\frac12(A+A^\top).</tex>
 +
 
 +
=== Норма вектора ===
 +
 
 +
Для <tex>x\ne 0</tex>
 +
 
 +
::<tex>\nabla_x\|x\|_2=\frac{x}{\|x\|_2}.</tex>
 +
 
 +
Для квадрата нормы
 +
 
 +
::<tex>\nabla_x\frac12\|x\|_2^2=x.</tex>
 +
 
 +
Последняя формула используется при дифференцировании квадратичных функций потерь и [[Регуляризация|регуляризаторов]]. Функция <tex>\|x\|_2</tex> не дифференцируема в точке <tex>x=0</tex>. В этой точке вместо градиента можно рассматривать субградиенты.
 +
 
 +
== Градиенты по матрицам ==
 +
 
 +
Параметры моделей машинного обучения часто представлены матрицами и многомерными массивами. Раздел математического анализа, рассматривающий производные по таким объектам, называют матричным дифференцированием (англ. ''matrix calculus'').
 +
 
 +
Пусть <tex>f:\mathbb{R}^{m\times n}\to\mathbb{R}</tex>. Градиент по матрице <tex>W</tex> обычно определяется равенством
 +
 
 +
::<tex>df=\mathrm{tr}\left((\nabla_Wf)^\top dW\right),</tex>
 +
 
 +
где <tex>\mathrm{tr}</tex> — [[След матрицы|след матрицы]]. При таком соглашении матрица <tex>\nabla_Wf</tex> имеет ту же форму, что и <tex>W</tex>:
 +
 
 +
::<tex>(\nabla_Wf)_{ij}=\frac{\partial f}{\partial W_{ij}}.</tex>
 +
 
 +
Например, для функции
 +
 
 +
::<tex>f(W)=\frac12\|WX-Y\|_F^2</tex>
 +
 
 +
получается
 +
 
 +
::<tex>\nabla_Wf=(WX-Y)X^\top,</tex>
 +
 
 +
где <tex>\|\cdot\|_F</tex> — норма Фробениуса (англ. ''Frobenius norm'').
 +
 
 +
Разные источники и программные библиотеки могут использовать разные соглашения о расположении производных. Поэтому при выводе формул необходимо проверять размерность каждого промежуточного выражения.
 +
 
 +
== Примеры ==
 +
 
 +
=== Функция двух переменных ===
 +
 
 +
Рассмотрим функцию
 +
 
 +
::<tex>f(x,y)=x^2+3xy+2y^2.</tex>
 +
 
 +
Её частные производные равны
 +
 
 +
::<tex>\frac{\partial f}{\partial x}=2x+3y,\qquad\frac{\partial f}{\partial y}=3x+4y.</tex>
 +
 
 +
Следовательно,
 +
 
 +
::<tex>\nabla f(x,y)=\left(\begin{array}{c}2x+3y\\3x+4y\end{array}\right).</tex>
 +
 
 +
В точке <tex>(1,-1)</tex>
 +
 
 +
::<tex>\nabla f(1,-1)=\left(\begin{array}{c}-1\\-1\end{array}\right).</tex>
 +
 
 +
Наиболее быстрое локальное возрастание происходит в направлении <tex>(-1,-1)</tex>, а наиболее быстрое убывание — в направлении <tex>(1,1)</tex>.
 +
 
 +
=== Линейная регрессия ===
 +
 
 +
Пусть задана матрица признаков <tex>X\in\mathbb{R}^{m\times n}</tex>, вектор ответов <tex>y\in\mathbb{R}^m</tex> и вектор параметров <tex>w\in\mathbb{R}^n</tex>. Для модели [[Линейная регрессия|линейной регрессии]] и квадратичной функции потерь
 +
 
 +
::<tex>\mathcal{L}(w)=\frac{1}{2m}\|Xw-y\|_2^2</tex>
 +
 
 +
градиент равен
 +
 
 +
::<tex>\nabla_w\mathcal{L}(w)=\frac1mX^\top(Xw-y).</tex>
 +
 
 +
Приравнивание градиента к нулю приводит к нормальным уравнениям
 +
 
 +
::<tex>X^\top Xw=X^\top y.</tex>
 +
 
 +
Если матрица <tex>X^\top X</tex> обратима, формально можно записать
 +
 
 +
::<tex>w=(X^\top X)^{-1}X^\top y.</tex>
 +
 
 +
На практике обратную матрицу обычно не вычисляют явно. Для численно устойчивого решения [[Метод наименьших квадратов|задачи наименьших квадратов]] используют QR-разложение, [[Сингулярное разложение|сингулярное разложение]] или специализированные методы решения систем линейных уравнений.
 +
 
 +
=== Логистическая регрессия ===
 +
 
 +
Для бинарной [[Логистическая регрессия|логистической регрессии]]
 +
 
 +
::<tex>p_i=\sigma(x_i^\top w),\qquad\sigma(z)=\frac{1}{1+\exp(-z)},</tex>
 +
 
 +
средняя логарифмическая функция потерь имеет вид
 +
 
 +
::<tex>\mathcal{L}(w)=-\frac1m\sum_{i=1}^{m}\left[y_i\log p_i+(1-y_i)\log(1-p_i)\right].</tex>
 +
 
 +
Если <tex>p=(p_1,\ldots,p_m)^\top</tex>, то
 +
 
 +
::<tex>\nabla_w\mathcal{L}(w)=\frac1mX^\top(p-y).</tex>
 +
 
 +
Вектор <tex>p-y</tex> содержит различия между предсказанными вероятностями и истинными ответами, а умножение на <tex>X^\top</tex> распределяет эти ошибки между параметрами модели.
 +
 
 +
=== Softmax и перекрёстная энтропия ===
 +
 
 +
В задаче многоклассовой классификации модель часто выдаёт логиты (англ. ''logits'') <tex>z_1,\ldots,z_K</tex>. Вероятности классов вычисляются функцией softmax:
 +
 
 +
::<tex>p_k=\frac{\exp(z_k)}{\sum_{j=1}^{K}\exp(z_j)}.</tex>
 +
 
 +
Для одного объекта с истинным классом <tex>y</tex> потеря перекрёстной энтропии (англ. ''cross-entropy loss'') равна
 +
 
 +
::<tex>\ell(z,y)=-\log p_y.</tex>
 +
 
 +
Её производная по логиту <tex>z_k</tex> имеет вид
 +
 
 +
::<tex>\frac{\partial\ell}{\partial z_k}=p_k-\mathbf{1}[k=y],</tex>
 +
 
 +
где <tex>\mathbf{1}[k=y]</tex> — индикатор того, что <tex>k</tex> является истинным классом.
 +
 
 +
Эта формула часто служит начальной точкой обратного прохода в нейронных сетях для многоклассовой классификации.
 +
 
 +
== Способы вычисления градиента ==
 +
 
 +
=== Аналитическое дифференцирование ===
 +
 
 +
При аналитическом дифференцировании формула градиента выводится вручную с помощью правил дифференцирования. Такой подход позволяет исследовать структуру задачи и получать упрощённые выражения, но становится трудоёмким для моделей с большим числом промежуточных операций.
 +
 
 +
=== Символьное дифференцирование ===
 +
 
 +
Символьное дифференцирование (англ. ''symbolic differentiation'') преобразует математическое выражение в новое выражение для его производной. Оно используется в системах компьютерной алгебры.
 +
 
 +
При работе с большими составными выражениями символьное дифференцирование может приводить к быстрому росту размера формул и многократному повторению одинаковых подвыражений.
 +
 
 +
=== Численное дифференцирование ===
 +
 
 +
Частную производную можно приближённо вычислить с помощью конечных разностей (англ. ''finite differences''):
 +
 
 +
::<tex>\frac{\partial f}{\partial x_j}(x)\approx\frac{f(x+he_j)-f(x)}{h},</tex>
 +
 
 +
где <tex>e_j</tex> — <tex>j</tex>-й базисный вектор, а <tex>h</tex> — малый шаг.
 +
 
 +
Центральная разность имеет вид
 +
 
 +
::<tex>\frac{\partial f}{\partial x_j}(x)\approx\frac{f(x+he_j)-f(x-he_j)}{2h}.</tex>
 +
 
 +
Центральная разность обычно точнее односторонней, но требует двух вычислений функции для каждой координаты.
 +
 
 +
Слишком большое значение <tex>h</tex> приводит к ошибке аппроксимации, а слишком малое — к накоплению ошибок округления при вычитании близких чисел. Для функции с <tex>n</tex> аргументами конечные разности требуют порядка <tex>n</tex> дополнительных вычислений функции.
 +
 
 +
Поэтому численное дифференцирование редко применяется для обучения крупных моделей, но используется для проверки аналитически или автоматически вычисленного градиента.
 +
 
 +
=== Автоматическое дифференцирование ===
 +
 
 +
Автоматическое дифференцирование (англ. ''automatic differentiation'', ''autodiff'') применяет цепное правило к последовательности элементарных операций программы.<ref name="Baydin">{{статья
 +
|автор = Baydin A. G., Pearlmutter B. A., Radul A. A., Siskind J. M.
 +
|заглавие = Automatic Differentiation in Machine Learning: a Survey
 +
|ссылка = https://www.jmlr.org/papers/v18/17-468.html
 +
|издание = Journal of Machine Learning Research
 +
|год = 2018
 +
|том = 18
 +
|номер = 153
 +
|страницы = 1—43
 +
}}</ref>
 +
 
 +
В отличие от численных разностей, автоматическое дифференцирование не заменяет производную приближённой разностной формулой. В отличие от символьного дифференцирования, оно не обязано строить полное символьное выражение производной.
 +
 
 +
Вычисления представляются в виде [[Граф вычислений|графа вычислений]] (англ. ''computational graph''), вершины которого соответствуют операциям, а рёбра передаваемым значениям.
 +
 
 +
Различают два основных режима автоматического дифференцирования.
 +
 
 +
'''Прямой режим''' (англ. ''forward mode'') эффективно вычисляет произведение матрицы Якоби на вектор:
 +
 
 +
::<tex>J_f(x)v.</tex>
 +
 
 +
Такое произведение называют произведением якобиана на вектор (англ. ''Jacobian-vector product'', JVP).
 +
 
 +
'''Обратный режим''' (англ. ''reverse mode'') эффективно вычисляет произведение транспонированного якобиана на вектор:
 +
 
 +
::<tex>J_f(x)^\top u.</tex>
 +
 
 +
Такое произведение называют произведением вектора на якобиан (англ. ''vector-Jacobian product'', VJP).
 +
 
 +
Для функции с большим числом входов и одним скалярным выходом <tex>f:\mathbb{R}^n\to\mathbb{R}</tex> обратный режим особенно эффективен: все компоненты градиента могут быть получены за один обратный проход после вычисления значения функции. Эта ситуация типична для машинного обучения, где параметров много, а итоговая функция потерь является скаляром.
 +
 
 +
Обратный режим требует хранения промежуточных значений прямого прохода или их повторного вычисления. Поэтому возникает компромисс между расходом памяти и временем вычисления.
 +
 
 +
=== Обратное распространение ошибки ===
 +
 
 +
[[Метод обратного распространения ошибки|Обратное распространение ошибки]] (англ. ''backpropagation'') представляет собой применение обратного режима автоматического дифференцирования к вычислительному графу нейронной сети.
 +
 
 +
На прямом проходе (англ. ''forward pass'') вычисляются активации слоёв и значение функции потерь. На обратном проходе (англ. ''backward pass'') локальные производные последовательно объединяются по цепному правилу.<ref name="Rumelhart">{{статья
 +
|автор = Rumelhart D. E., Hinton G. E., Williams R. J.
 +
|заглавие = Learning representations by back-propagating errors
 +
|ссылка = https://doi.org/10.1038/323533a0
 +
|издание = Nature
 +
|год = 1986
 +
|том = 323
 +
|страницы = 533—536
 +
|doi = 10.1038/323533a0
 +
}}</ref>
 +
 
 +
Обратное распространение не является методом оптимизации. Оно вычисляет градиент функции потерь. Обновление параметров выполняется отдельным алгоритмом, например [[Градиентный спуск|градиентным спуском]], [[Метод стохастического градиента|методом стохастического градиента]], методом моментов или Adam.
 +
 
 +
== Градиент в оптимизации ==
 +
 
 +
Подробнее о соответствующем алгоритме см. в статье [[Градиентный спуск]].
 +
 
 +
Рассмотрим задачу безусловной минимизации
 +
 
 +
::<tex>\min_{\theta\in\mathbb{R}^n}\mathcal{L}(\theta).</tex>
 +
 
 +
Простейший градиентный метод строит последовательность
 +
 
 +
::<tex>\theta_{t+1}=\theta_t-\eta_t\nabla\mathcal{L}(\theta_t),</tex>
 +
 
 +
где <tex>\eta_t>0</tex> — шаг метода, или скорость обучения (англ. ''learning rate'').
 +
 
 +
Знак «минус» используется потому, что антиградиент является направлением наиболее быстрого локального убывания функции в евклидовой норме. Однако это локальное утверждение не гарантирует уменьшения функции при произвольно большом шаге.
 +
 
 +
Пусть градиент функции является липшицевым (англ. ''Lipschitz continuous gradient'') с константой <tex>L</tex>:
 +
 
 +
::<tex>\|\nabla\mathcal{L}(x)-\nabla\mathcal{L}(y)\|_2\leq L\|x-y\|_2.</tex>
 +
 
 +
Тогда выполняется оценка
 +
 
 +
::<tex>\mathcal{L}(y)\leq\mathcal{L}(x)+\nabla\mathcal{L}(x)^\top(y-x)+\frac{L}{2}\|y-x\|_2^2.</tex>
 +
 
 +
Подставляя <tex>y=x-\eta\nabla\mathcal{L}(x)</tex>, получают
 +
 
 +
::<tex>\mathcal{L}(x-\eta\nabla\mathcal{L}(x))\leq\mathcal{L}(x)-\eta\left(1-\frac{L\eta}{2}\right)\|\nabla\mathcal{L}(x)\|_2^2.</tex>
 +
 
 +
Следовательно, при <tex>0<\eta<2/L</tex> ненулевой градиент обеспечивает уменьшение функции в рамках этой оценки.
 +
 
 +
Для гладких [[Выпуклая функция|выпуклых функций]] градиентный спуск имеет сублинейную скорость сходимости по значению функции. Для гладких сильно выпуклых функций при подходящем постоянном шаге достигается линейная сходимость.<ref name="Nocedal">{{книга
 +
|автор = Nocedal J., Wright S. J.
 +
|заглавие = Numerical Optimization
 +
|ссылка = https://doi.org/10.1007/978-0-387-40065-5
 +
|издание = 2nd ed.
 +
|место = New York
 +
|издательство = Springer
 +
|год = 2006
 +
|isbn = 978-0-387-40065-5
 +
}}</ref><ref name="Boyd">{{книга
 +
|автор = Boyd S., Vandenberghe L.
 +
|заглавие = Convex Optimization
 +
|ссылка = https://web.stanford.edu/~boyd/cvxbook/
 +
|место = Cambridge
 +
|издательство = Cambridge University Press
 +
|год = 2004
 +
|isbn = 978-0-521-83378-3
 +
}}</ref>
 +
 
 +
Для невыпуклых функций, типичных для глубоких нейронных сетей, малая норма градиента обычно означает лишь близость к стационарной точке и не гарантирует нахождения глобального минимума.
 +
 
 +
== Полный, стохастический и мини-пакетный градиент ==
 +
 
 +
Во многих задачах машинного обучения функция потерь является средним по обучающей выборке:
 +
 
 +
::<tex>\mathcal{L}(\theta)=\frac1m\sum_{i=1}^{m}\ell_i(\theta),</tex>
 +
 
 +
где <tex>\ell_i</tex> — потеря модели на <tex>i</tex>-м объекте.
 +
 
 +
Полный градиент (англ. ''full-batch gradient'') равен
 +
 
 +
::<tex>\nabla\mathcal{L}(\theta)=\frac1m\sum_{i=1}^{m}\nabla\ell_i(\theta).</tex>
 +
 
 +
Его точное вычисление требует обработки всей обучающей выборки.
 +
 
 +
В [[Метод стохастического градиента|стохастическом градиентном методе]] на каждой итерации используется один случайно выбранный объект или небольшая группа объектов — мини-пакет (англ. ''mini-batch'') <tex>B</tex>:
 +
 
 +
::<tex>g_B(\theta)=\frac1{|B|}\sum_{i\in B}\nabla\ell_i(\theta).</tex>
 +
 
 +
При равномерном случайном выборе мини-пакета
 +
 
 +
::<tex>\mathbb{E}[g_B(\theta)]=\nabla\mathcal{L}(\theta).</tex>
 +
 
 +
Следовательно, мини-пакетный градиент является несмещённой случайной оценкой полного градиента. Его вычисление дешевле, но оценка содержит стохастический шум (англ. ''gradient noise'').
 +
 
 +
Увеличение размера пакета обычно уменьшает дисперсию оценки, но увеличивает стоимость одной итерации и объём необходимой памяти.
 +
 
 +
Теоретической основой стохастических градиентных методов стала теория [[Стохастическая аппроксимация|стохастической аппроксимации]] (англ. ''stochastic approximation''), предложенная Гербертом Роббинсом и Саттоном Монро в 1951 году.<ref name="RobbinsMonro">{{статья
 +
|автор = Robbins H., Monro S.
 +
|заглавие = A Stochastic Approximation Method
 +
|ссылка = https://doi.org/10.1214/aoms/1177729586
 +
|издание = The Annals of Mathematical Statistics
 +
|год = 1951
 +
|том = 22
 +
|номер = 3
 +
|страницы = 400—407
 +
|doi = 10.1214/aoms/1177729586
 +
}}</ref>
 +
 
 +
== Масштабирование и геометрия градиента ==
 +
 
 +
=== Разный масштаб параметров ===
 +
 
 +
Если параметры или признаки имеют существенно различающиеся масштабы, компоненты градиента также могут сильно различаться. Траектория градиентного метода начинает колебаться поперёк узкой вытянутой области функции потерь, что замедляет сходимость.
 +
 
 +
Для квадратичной функции поведение метода связано со спектром матрицы Гессе. Большое [[Число обусловленности|число обусловленности]] (англ. ''condition number'') означает, что кривизна функции сильно различается по направлениям.
 +
 
 +
Для уменьшения этой проблемы применяются:
 +
 
 +
* [[Нормализация данных|нормализация]] и стандартизация признаков;
 +
* изменение параметризации модели;
 +
* предобусловливание;
 +
* адаптивное масштабирование координат;
 +
* методы, использующие информацию о кривизне;
 +
* [[Метод Ньютона-Рафсона|метод Ньютона]];
 +
* квазиньютоновские методы (англ. ''quasi-Newton methods'').
 +
 
 +
=== Естественный градиент ===
 +
 
 +
Обычный евклидов градиент зависит от параметризации модели. Разные системы параметров могут описывать одно и то же вероятностное распределение, но приводить к различным направлениям евклидова градиента.
 +
 
 +
Естественный градиент (англ. ''natural gradient'') использует матрицу [[Информация Фишера|информации Фишера]] <tex>F(\theta)</tex>:
 +
 
 +
::<tex>\widetilde{\nabla}\mathcal{L}(\theta)=F(\theta)^{-1}\nabla\mathcal{L}(\theta).</tex>
 +
 
 +
Такое направление учитывает локальную геометрию семейства вероятностных распределений, а не только евклидово расстояние между параметрами.<ref name="Amari">{{статья
 +
|автор = Amari S.
 +
|заглавие = Natural Gradient Works Efficiently in Learning
 +
|ссылка = https://doi.org/10.1162/089976698300017746
 +
|издание = Neural Computation
 +
|год = 1998
 +
|том = 10
 +
|номер = 2
 +
|страницы = 251—276
 +
|doi = 10.1162/089976698300017746
 +
}}</ref>
 +
 
 +
Вычисление и обращение полной матрицы Фишера для крупных моделей обычно слишком дорого, поэтому применяются диагональные, блочно-диагональные и другие приближённые варианты.
 +
 
 +
== Градиент при наличии ограничений ==
 +
 
 +
Если параметры должны принадлежать допустимому множеству <tex>C</tex>, обычный шаг по антиградиенту может вывести точку за его пределы.
 +
 
 +
В проекционном градиентном методе (англ. ''projected gradient descent'') используется обновление
 +
 
 +
::<tex>\theta_{t+1}=\Pi_C\left(\theta_t-\eta_t\nabla\mathcal{L}(\theta_t)\right),</tex>
 +
 
 +
где <tex>\Pi_C</tex> — проекция на множество <tex>C</tex>.
 +
 
 +
Для ограничений в форме равенств и неравенств используются [[Множители Лагранжа|множители Лагранжа]], [[Условия Каруша — Куна — Таккера|условия Каруша — Куна — Таккера]], штрафные функции и барьерные методы.
 +
 
 +
Если допустимое множество является гладким многообразием, евклидов градиент проецируется на касательное пространство. Такой подход применяется в римановой оптимизации.
 +
 
 +
== Негладкие функции ==
 +
 
 +
Градиент существует только в точках дифференцируемости. Многие функции, используемые в машинном обучении, являются негладкими.
 +
 
 +
Например, функция
 +
 
 +
::<tex>f(x)=|x|</tex>
 +
 
 +
не имеет производной при <tex>x=0</tex>. Функция активации ReLU (англ. ''rectified linear unit'')
 +
 
 +
::<tex>\mathrm{ReLU}(x)=\max(0,x)</tex>
 +
 
 +
также не дифференцируема в нуле.
 +
 
 +
Для выпуклой функции вместо градиента можно использовать субградиент (англ. ''subgradient''). Вектор <tex>g</tex> является субградиентом выпуклой функции <tex>f</tex> в точке <tex>x</tex>, если
 +
 
 +
::<tex>f(y)\geq f(x)+g^\top(y-x)</tex>
 +
 
 +
для всех допустимых <tex>y</tex>.
 +
 
 +
Множество всех субградиентов называется субдифференциалом (англ. ''subdifferential'') и обозначается <tex>\partial f(x)</tex>. В точках дифференцируемости
 +
 
 +
::<tex>\partial f(x)=\{\nabla f(x)\}.</tex>
 +
 
 +
Для функции <tex>f(x)=|x|</tex>
 +
 
 +
::<tex>\partial f(0)=[-1,1].</tex>
 +
 
 +
Методы оптимизации негладких функций рассматриваются в статье [[Субградиентные методы (оптимизация)]].
 +
 
 +
Библиотеки автоматического дифференцирования обычно задают некоторое условное значение производной в отдельных точках негладкости. Такое вычислительное соглашение не означает, что классический градиент в этой точке существует.
 +
 
 +
Негладкость также возникает в задачах с [[L1 регуляризация|L1-регуляризацией]] и [[LASSO-регрессия|LASSO-регрессией]]. Для таких задач часто применяются субградиентные и проксимальные методы (англ. ''proximal methods'').
 +
 
 +
== Исчезающие и взрывающиеся градиенты ==
 +
 
 +
В глубоких и [[Рекуррентная нейронная сеть|рекуррентных нейронных сетях]] градиент может содержать произведение большого числа матриц Якоби. Нормы таких произведений способны быстро стремиться к нулю или неограниченно возрастать.
 +
 
 +
'''Исчезающий градиент''' (англ. ''vanishing gradient'') затрудняет передачу обучающего сигнала к ранним слоям или далёким моментам времени. Параметры получают крайне малые обновления, и модель плохо обучается долгосрочным зависимостям.
 +
 
 +
'''Взрывающийся градиент''' (англ. ''exploding gradient'') приводит к чрезмерно большим обновлениям и численной неустойчивости. Результатом могут стать переполнение, бесконечные значения или появление значений <tex>\mathrm{NaN}</tex>.
 +
 
 +
Проблема особенно выражена в рекуррентных сетях, где одна и та же матрица преобразования многократно участвует в цепном правиле. Теоретический анализ этих явлений был дан в работах Бенжио, Симара и Фраскони, а также Паскану, Миколова и Бенжио.<ref name="Bengio1994">{{статья
 +
|автор = Bengio Y., Simard P., Frasconi P.
 +
|заглавие = Learning Long-Term Dependencies with Gradient Descent Is Difficult
 +
|ссылка = https://doi.org/10.1109/72.279181
 +
|издание = IEEE Transactions on Neural Networks
 +
|год = 1994
 +
|том = 5
 +
|номер = 2
 +
|страницы = 157—166
 +
|doi = 10.1109/72.279181
 +
}}</ref><ref name="Pascanu">{{статья
 +
|автор = Pascanu R., Mikolov T., Bengio Y.
 +
|заглавие = On the Difficulty of Training Recurrent Neural Networks
 +
|ссылка = https://proceedings.mlr.press/v28/pascanu13.html
 +
|издание = Proceedings of the 30th International Conference on Machine Learning
 +
|год = 2013
 +
|том = 28
 +
|страницы = 1310—1318
 +
}}</ref>
 +
 
 +
Для ограничения взрывающихся градиентов используется обрезка градиента (англ. ''gradient clipping''). При обрезке по норме можно использовать преобразование
 +
 
 +
::<tex>g_{\mathrm{clip}}=\min\left(1,\frac{\tau}{\|g\|_2}\right)g,</tex>
 +
 
 +
где <tex>\tau>0</tex> — заданный порог.
 +
 
 +
Для уменьшения проблемы исчезающих градиентов применяются:
 +
 
 +
* подходящая инициализация параметров;
 +
* функции активации без сильного насыщения;
 +
* нормализация активаций;
 +
* остаточные связи (англ. ''residual connections'');
 +
* архитектуры [[Долгая краткосрочная память|LSTM]] и GRU;
 +
* контроль спектральных свойств весовых матриц.
 +
 
 +
== Проверка корректности градиента ==
 +
 
 +
Ошибочный градиент может не приводить к немедленной ошибке программы, но способен вызвать неправильное или нестабильное обучение. Для проверки производных используется проверка градиента (англ. ''gradient checking'').
 +
 
 +
Для координаты <tex>j</tex> центральная разностная оценка имеет вид
 +
 
 +
::<tex>g_j^{\mathrm{num}}=\frac{f(x+he_j)-f(x-he_j)}{2h}.</tex>
 +
 
 +
Её сравнивают с аналитическим или автоматически вычисленным значением
 +
 
 +
::<tex>g_j^{\mathrm{analyt}}=\frac{\partial f}{\partial x_j}(x).</tex>
 +
 
 +
Относительную ошибку можно оценивать выражением
 +
 
 +
::<tex>\varepsilon_{\mathrm{rel}}=\frac{\|g^{\mathrm{num}}-g^{\mathrm{analyt}}\|_2}{\max\left(1,\|g^{\mathrm{num}}\|_2,\|g^{\mathrm{analyt}}\|_2\right)}.</tex>
 +
 
 +
Проверку рекомендуется проводить:
 +
 
 +
* в арифметике повышенной точности;
 +
* на небольших случайных входных данных;
 +
* вдали от точек негладкости;
 +
* при нескольких значениях шага <tex>h</tex>;
 +
* отдельно для каждой новой или нестандартной операции.
 +
 
 +
Для модели с большим числом параметров можно проверять не каждую координату, а случайное направление <tex>v</tex>:
 +
 
 +
::<tex>\frac{f(x+hv)-f(x-hv)}{2h}\approx\nabla f(x)^\top v.</tex>
 +
 
 +
Такой подход называют проверкой производной по направлению.
 +
 
 +
== Типичные ошибки ==
 +
 
 +
=== Пропущенное транспонирование ===
 +
 
 +
Для композиции <tex>f(x)=\varphi(g(x))</tex> градиент вычисляется как
 +
 
 +
::<tex>\nabla_x f=J_g(x)^\top\nabla\varphi.</tex>
 +
 
 +
Пропуск транспонирования приводит к несовместимости размерностей или к неверной формуле, которая может случайно выглядеть правильной в одномерном случае.
 +
 
 +
=== Смешение суммы и среднего ===
 +
 
 +
Функции потерь могут суммироваться или усредняться по объектам:
 +
 
 +
::<tex>\mathcal{L}_{\mathrm{sum}}=\sum_{i=1}^{m}\ell_i,\qquad\mathcal{L}_{\mathrm{mean}}=\frac1m\sum_{i=1}^{m}\ell_i.</tex>
 +
 
 +
Их градиенты различаются множителем <tex>m</tex>. Это влияет на эффективную скорость обучения и относительную силу регуляризации.
 +
 
 +
=== Игнорирование зависимости промежуточной переменной ===
 +
 
 +
Если <tex>z=z(x)</tex>, то производная выражения, содержащего <tex>z</tex>, должна учитывать зависимость <tex>z</tex> от <tex>x</tex>. Рассмотрение промежуточной переменной как константы разрывает вычислительный граф и приводит к вычислению частной, а не полной производной.
 +
 
 +
В библиотеках автоматического дифференцирования такое поведение может возникать при явном отсоединении значения от вычислительного графа (англ. ''stop gradient'', ''detach'').
 +
 
 +
=== Численно неустойчивые выражения ===
 +
 
 +
Математически эквивалентные формулы могут иметь разную численную устойчивость. Например, прямое вычисление экспонент в softmax может вызвать переполнение.
 +
 
 +
Устойчивая форма имеет вид
 +
 
 +
::<tex>p_k=\frac{\exp(z_k-z_{\max})}{\sum_j\exp(z_j-z_{\max})},\qquad z_{\max}=\max_j z_j.</tex>
 +
 
 +
Вычитание одной и той же константы из всех логитов не изменяет вероятности, но уменьшает риск переполнения.
 +
 
 +
=== Интерпретация малого градиента как доказательства оптимальности ===
 +
 
 +
Малая норма градиента может наблюдаться около локального минимума, локального максимума или седловой точки, на плоском участке функции, в области насыщения функции активации либо вследствие округления.
 +
 
 +
Поэтому значение <tex>\|\nabla f\|</tex> следует рассматривать вместе со значением функции, кривизной, динамикой оптимизации и поведением модели на данных.
 +
 
 +
=== Изменение параметров во время вычисления градиента ===
 +
 
 +
Если промежуточные значения или параметры изменяются после прямого прохода, но до завершения обратного прохода, вычисленный градиент может перестать соответствовать исходной функции. Особенно осторожно следует использовать операции, изменяющие массивы на месте (англ. ''in-place operations'').
 +
 
 +
== История ==
 +
 
 +
Идеи, близкие к современному методу наискорейшего спуска (англ. ''steepest descent''), появились в работе Огюстена Луи Коши 1847 года «Méthode générale pour la résolution des systèmes d'équations simultanées». В ней решение системы уравнений связывалось с последовательным уменьшением вспомогательной функции.<ref name="Cauchy">{{статья
 +
|автор = Cauchy A.-L.
 +
|заглавие = Méthode générale pour la résolution des systèmes d'équations simultanées
 +
|ссылка = https://sites.mathdoc.fr/cgi-bin/oeitem?id=OE_CAUCHY_1_10_399_1
 +
|издание = Comptes rendus hebdomadaires des séances de l'Académie des sciences
 +
|год = 1847
 +
|том = 25
 +
|страницы = 536—538
 +
}}</ref>
 +
 
 +
В 1951 году Герберт Роббинс и Саттон Монро предложили метод стохастической аппроксимации для нахождения корня уравнения по зашумлённым наблюдениям.<ref name="RobbinsMonro"/> Развитие этого подхода привело к современным стохастическим градиентным алгоритмам.
 +
 
 +
В 1970 году Сеппо Линнайнмаа описал общий способ обратного накопления производных, соответствующий современному обратному режиму автоматического дифференцирования.<ref name="Baydin"/>
 +
 
 +
Методы обратного вычисления производных развивались также в теории управления, динамическом программировании и других областях. Публикация Дэвида Румельхарта, Джеффри Хинтона и Рональда Уильямса 1986 года сыграла важную роль в распространении обратного распространения ошибки как практического способа обучения многослойных нейронных сетей.<ref name="Rumelhart"/>
 +
 
 +
Обратное распространение ошибки существовало в различных формах до 1986 года. Поэтому работу Румельхарта, Хинтона и Уильямса корректнее связывать с популяризацией метода в нейронных сетях, а не с первоначальным открытием цепного правила или обратного автоматического дифференцирования.
 +
 
 +
== Практическое значение ==
 +
 
 +
Градиент используется не только для обновления параметров модели. Он также служит инструментом исследования и интерпретации алгоритмов машинного обучения.
 +
 
 +
Основные применения включают:
 +
 
 +
* оптимизацию параметров моделей;
 +
* оценивание чувствительности функции к признакам и параметрам;
 +
* построение карт значимости (англ. ''saliency maps'');
 +
* исследование состязательных примеров (англ. ''adversarial examples'');
 +
* оптимизацию входных данных;
 +
* решение обратных задач;
 +
* дифференцируемое программирование (англ. ''differentiable programming'');
 +
* обучение вероятностных моделей;
 +
* [[Вариационный вывод|вариационный вывод]];
 +
* оптимизацию гиперпараметров;
 +
* анализ влияния обучающих объектов;
 +
* методы [[Обучение с подкреплением|обучения с подкреплением]], основанные на градиенте стратегии.
 +
 
 +
При интерпретации градиентов необходимо учитывать масштаб признаков, параметризацию модели, насыщение нелинейностей и локальный характер производной. Большая компонента градиента означает высокую локальную чувствительность, но не обязательно высокую глобальную значимость соответствующего признака.
 +
 
 +
== См. также ==
 +
 
 +
* [[Производная]]
 +
* [[Частная производная]]
 +
* [[Производная по направлению]]
 +
* [[Дифференциал функции]]
 +
* [[Вычисление матриц Якоби и Гессе]]
 +
* [[Градиентный спуск]]
 +
* [[Метод стохастического градиента]]
 +
* [[Субградиентные методы (оптимизация)]]
 +
* [[Метод обратного распространения ошибки]]
 +
* [[Граф вычислений]]
 +
* [[Метод Ньютона-Рафсона]]
 +
* [[Метод Ньютона-Гаусса]]
 +
* [[Линейная регрессия]]
 +
* [[Логистическая регрессия]]
 +
* [[Функция потерь]]
 +
* [[Регуляризация]]
 +
* [[L1 регуляризация]]
 +
* [[LASSO-регрессия]]
 +
* [[Переобучение]]
 +
* [[Нейронная сеть]]
 +
* [[Численная оптимизация]]
 +
* [[Выпуклая оптимизация]]
 +
 
 +
== Примечания ==
 +
 
 +
<references/>
== Литература ==
== Литература ==
-
# ''Hastie T., Tibshirani R., Friedman J.'' The Elements of Statistical Learning. — Springer, 2001. ISBN 0-387-95284-5.
+
 
-
# ''Vapnik V.N. '' Statistical learning theory. — N.Y.: John Wiley & Sons, Inc., 1998. [http://lib.mexmat.ru/books/9220]
+
* {{книга
 +
|автор = Nocedal J., Wright S. J.
 +
|заглавие = Numerical Optimization
 +
|ссылка = https://doi.org/10.1007/978-0-387-40065-5
 +
|издание = 2nd ed.
 +
|место = New York
 +
|издательство = Springer
 +
|год = 2006
 +
|страниц = 664
 +
|isbn = 978-0-387-40065-5
 +
}}
 +
 
 +
* {{книга
 +
|автор = Boyd S., Vandenberghe L.
 +
|заглавие = Convex Optimization
 +
|ссылка = https://web.stanford.edu/~boyd/cvxbook/
 +
|место = Cambridge
 +
|издательство = Cambridge University Press
 +
|год = 2004
 +
|страниц = 716
 +
|isbn = 978-0-521-83378-3
 +
}}
 +
 
 +
* {{книга
 +
|автор = Goodfellow I., Bengio Y., Courville A.
 +
|заглавие = Deep Learning
 +
|ссылка = https://www.deeplearningbook.org/
 +
|место = Cambridge, Massachusetts
 +
|издательство = MIT Press
 +
|год = 2016
 +
|страниц = 800
 +
|isbn = 978-0-262-03561-3
 +
}}
 +
 
 +
* {{книга
 +
|автор = Griewank A., Walther A.
 +
|заглавие = Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation
 +
|ссылка = https://doi.org/10.1137/1.9780898717761
 +
|издание = 2nd ed.
 +
|место = Philadelphia
 +
|издательство = Society for Industrial and Applied Mathematics
 +
|год = 2008
 +
|страниц = 438
 +
|isbn = 978-0-89871-659-7
 +
}}
 +
 
 +
* {{статья
 +
|автор = Baydin A. G., Pearlmutter B. A., Radul A. A., Siskind J. M.
 +
|заглавие = Automatic Differentiation in Machine Learning: a Survey
 +
|ссылка = https://www.jmlr.org/papers/v18/17-468.html
 +
|издание = Journal of Machine Learning Research
 +
|год = 2018
 +
|том = 18
 +
|номер = 153
 +
|страницы = 1—43
 +
}}
 +
 
 +
* {{статья
 +
|автор = Robbins H., Monro S.
 +
|заглавие = A Stochastic Approximation Method
 +
|ссылка = https://doi.org/10.1214/aoms/1177729586
 +
|издание = The Annals of Mathematical Statistics
 +
|год = 1951
 +
|том = 22
 +
|номер = 3
 +
|страницы = 400—407
 +
|doi = 10.1214/aoms/1177729586
 +
}}
 +
 
 +
* {{статья
 +
|автор = Rumelhart D. E., Hinton G. E., Williams R. J.
 +
|заглавие = Learning representations by back-propagating errors
 +
|ссылка = https://doi.org/10.1038/323533a0
 +
|издание = Nature
 +
|год = 1986
 +
|том = 323
 +
|страницы = 533—536
 +
|doi = 10.1038/323533a0
 +
}}
 +
 
 +
* {{статья
 +
|автор = Bengio Y., Simard P., Frasconi P.
 +
|заглавие = Learning Long-Term Dependencies with Gradient Descent Is Difficult
 +
|ссылка = https://doi.org/10.1109/72.279181
 +
|издание = IEEE Transactions on Neural Networks
 +
|год = 1994
 +
|том = 5
 +
|номер = 2
 +
|страницы = 157—166
 +
|doi = 10.1109/72.279181
 +
}}
 +
 
 +
* {{статья
 +
|автор = Pascanu R., Mikolov T., Bengio Y.
 +
|заглавие = On the Difficulty of Training Recurrent Neural Networks
 +
|ссылка = https://proceedings.mlr.press/v28/pascanu13.html
 +
|издание = Proceedings of the 30th International Conference on Machine Learning
 +
|год = 2013
 +
|том = 28
 +
|страницы = 1310—1318
 +
}}
 +
 
 +
* {{статья
 +
|автор = Amari S.
 +
|заглавие = Natural Gradient Works Efficiently in Learning
 +
|ссылка = https://doi.org/10.1162/089976698300017746
 +
|издание = Neural Computation
 +
|год = 1998
 +
|том = 10
 +
|номер = 2
 +
|страницы = 251—276
 +
|doi = 10.1162/089976698300017746
 +
}}
 +
 
 +
[[Категория:Математический анализ]]
 +
[[Категория:Методы оптимизации]]
 +
[[Категория:Машинное обучение]]
 +
[[Категория:Энциклопедия анализа данных]]

Текущая версия

Содержание

Градиент (англ. gradient) — вектор, характеризующий направление и скорость наиболее быстрого локального возрастания скалярной функции нескольких переменных. Координатами градиента служат частные производные функции по всем её аргументам.

Если функция f:\mathbb{R}^n\to\mathbb{R} зависит от переменных x_1,\ldots,x_n, то её градиент имеет вид

\nabla f(x)=\left(\frac{\partial f}{\partial x_1}(x),\ldots,\frac{\partial f}{\partial x_n}(x)\right)^\top.

Градиент является одним из основных понятий математического анализа, численной оптимизации и машинного обучения. В задачах обучения моделей он показывает, как изменится функция потерь при малом изменении каждого параметра. На вычислении градиента основаны градиентный спуск, метод стохастического градиента, обратное распространение ошибки и многие современные методы обучения нейронных сетей.

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

Мотивация

Для функции одной переменной производная f'(x) показывает скорость локального изменения функции. Если аргумент является вектором x\in\mathbb{R}^n, двигаться можно во множестве направлений, поэтому одной числовой производной недостаточно.

Градиент объединяет информацию о локальном изменении функции по всем координатам. Для малого приращения h\in\mathbb{R}^n выполняется приближение первого порядка

f(x+h)\approx f(x)+\nabla f(x)^\top h.

Скалярное произведение \nabla f(x)^\top h приближённо показывает, насколько изменится функция при переходе из точки x в точку x+h.

В машинном обучении вектор x обычно заменяется вектором параметров модели \theta, а функция f — функцией потерь \mathcal{L}(\theta). Компонента

\frac{\partial\mathcal{L}}{\partial\theta_j}

показывает локальную чувствительность потерь к изменению параметра \theta_j. Если эта производная положительна, малое увеличение параметра увеличивает потери в линейном приближении. Если производная отрицательна, малое увеличение параметра уменьшает потери.

Градиент позволяет ответить на три практически важных вопроса:

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

Определение

Градиент в евклидовом пространстве

Пусть функция f:U\subseteq\mathbb{R}^n\to\mathbb{R} дифференцируема в точке x\in U. Градиентом функции f в точке x называется вектор

\nabla f(x)=\left(\frac{\partial f}{\partial x_1}(x),\ldots,\frac{\partial f}{\partial x_n}(x)\right)^\top.

Также употребляются обозначения \mathrm{grad}\,f(x), \nabla_x f(x) и \frac{\partial f}{\partial x}. Последнее обозначение зависит от принятого соглашения: в разных источниках производная по вектору может записываться как строка или как столбец. В данной статье градиент считается вектором-столбцом.

Нижний индекс в записи \nabla_x f полезен, если функция зависит от нескольких групп переменных. Например, для функции f(x,\theta) выражения \nabla_x f и \nabla_\theta f обозначают градиенты по разным аргументам.

Существование всех частных производных в одной точке само по себе не гарантирует дифференцируемости функции. Достаточным условием дифференцируемости является непрерывность всех частных производных в некоторой окрестности рассматриваемой точки.

Определение через дифференциал

Более общее определение использует дифференциал. Если функция f дифференцируема в точке x, то существует линейный функционал df_x, для которого

f(x+h)=f(x)+df_x(h)+o(\|h\|),\qquad h\to 0.

В евклидовом пространстве любой линейный функционал можно представить как скалярное произведение с некоторым вектором. Градиент определяется равенством

df_x(h)=\langle\nabla f(x),h\rangle.

Для стандартного скалярного произведения это равенство принимает вид

df_x(h)=\sum_{j=1}^{n}\frac{\partial f}{\partial x_j}(x)h_j.

Дифференциал и градиент связаны, но не являются одним и тем же объектом. Дифференциал является линейным функционалом, или ковектором (англ. covector), а градиент — его векторным представлением относительно выбранного скалярного произведения.

Зависимость от скалярного произведения

Пусть скалярное произведение задаётся симметричной положительно определённой матрицей G:

\langle u,v\rangle_G=u^\top Gv.

Градиент относительно этого скалярного произведения определяется условием

df_x(h)=\langle\nabla_G f(x),h\rangle_G.

Отсюда следует

\nabla_G f(x)=G^{-1}\nabla f(x),

где \nabla f(x) — обычный евклидов градиент.

Таким образом, направление градиента зависит от выбранной геометрии пространства. Эта зависимость используется в предобусловленных методах (англ. preconditioning), римановой оптимизации (англ. Riemannian optimization) и методе естественного градиента (англ. natural gradient).

Геометрический смысл

Производная по направлению

Пусть v\in\mathbb{R}^n — направление движения. Производная по направлению (англ. directional derivative) определяется как

D_vf(x)=\lim_{t\to 0}\frac{f(x+tv)-f(x)}{t}.

Для дифференцируемой функции

D_vf(x)=\nabla f(x)^\top v.

Если \|v\|_2=1, то из неравенства Коши — Буняковского следует

D_vf(x)\leq\|\nabla f(x)\|_2.

Максимальное значение достигается при

v=\frac{\nabla f(x)}{\|\nabla f(x)\|_2},

если \nabla f(x)\ne 0. Следовательно, градиент направлен в сторону наиболее быстрого локального возрастания функции, а антиградиент -\nabla f(x) — в сторону наиболее быстрого локального убывания.

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

Линии и поверхности уровня

Множеством уровня (англ. level set) функции называется множество

M_c=\{x\in\mathbb{R}^n\mid f(x)=c\}.

Если \nabla f(x)\ne 0, градиент перпендикулярен касательным направлениям к поверхности уровня, проходящей через точку x. При движении вдоль поверхности уровня значение функции не меняется, поэтому для любого касательного вектора v

\nabla f(x)^\top v=0.

В двумерном пространстве градиент перпендикулярен линии уровня, а в трёхмерном — поверхности уровня.

Стационарные точки

Точка x^\ast называется стационарной точкой (англ. stationary point), если

\nabla f(x^\ast)=0.

Для дифференцируемой функции обращение градиента в нуль является необходимым условием внутреннего локального минимума или максимума. Однако оно не является достаточным: стационарная точка может быть локальным минимумом, локальным максимумом, седловой точкой (англ. saddle point) или частью плоской области функции.

Для классификации стационарных точек исследуют вторые производные и матрицу Гессе.

Связь с производной, якобианом и матрицей Гессе

В литературе по машинному обучению термины «производная», «градиент», «якобиан» и «гессиан» иногда употребляются нестрого. Выбор объекта зависит от размерностей входа и выхода функции.

Отображение Объект первого порядка Размерность
f:\mathbb{R}\to\mathbb{R} Производная f'(x) скаляр
f:\mathbb{R}^n\to\mathbb{R} градиент \nabla f(x) n\times 1
g:\mathbb{R}^n\to\mathbb{R}^m матрица Якоби J_g(x) m\times n
f:\mathbb{R}^n\to\mathbb{R} матрица Гессе H_f(x) n\times n

Матрица Якоби, или якобиан (англ. Jacobian matrix), функции g=(g_1,\ldots,g_m)^\top имеет вид

J_g(x)=\left(\begin{array}{c}\nabla g_1(x)^\top\\ \vdots\\ \nabla g_m(x)^\top\end{array}\right).

Матрица Гессе, или гессиан (англ. Hessian matrix), скалярной функции представляет собой якобиан её градиента:

H_f(x)=J_{\nabla f}(x)=\left[\frac{\partial^2f}{\partial x_i\partial x_j}\right]_{i,j=1}^{n}.

Если вторые частные производные непрерывны, матрица Гессе симметрична:

H_f(x)=H_f(x)^\top.

Градиент описывает локальный наклон функции, тогда как матрица Гессе описывает её локальную кривизну.

Правила вычисления

Линейность

Для дифференцируемых функций f и g и констант \alpha,\beta

\nabla(\alpha f+\beta g)=\alpha\nabla f+\beta\nabla g.

Произведение функций

\nabla(fg)=g\nabla f+f\nabla g.

Частное функций

Если g(x)\ne 0, то

\nabla\left(\frac{f}{g}\right)=\frac{g\nabla f-f\nabla g}{g^2}.

Сложная функция

Пусть g:\mathbb{R}^n\to\mathbb{R}^m, \varphi:\mathbb{R}^m\to\mathbb{R}, а f(x)=\varphi(g(x)). Тогда цепное правило (англ. chain rule) записывается как

\nabla_x f(x)=J_g(x)^\top\nabla_z\varphi(z)\big|_{z=g(x)}.

Транспонирование якобиана необходимо для согласования размерностей. Цепное правило является математической основой вычислительных графов и обратного распространения ошибки.

Квадратичная форма

Для функции

f(x)=\frac12x^\top Ax+b^\top x+c

градиент равен

\nabla f(x)=\frac12(A+A^\top)x+b.

Если матрица A симметрична, формула упрощается:

\nabla f(x)=Ax+b.

Матрица Гессе этой функции равна

H_f(x)=\frac12(A+A^\top).

Норма вектора

Для x\ne 0

\nabla_x\|x\|_2=\frac{x}{\|x\|_2}.

Для квадрата нормы

\nabla_x\frac12\|x\|_2^2=x.

Последняя формула используется при дифференцировании квадратичных функций потерь и регуляризаторов. Функция \|x\|_2 не дифференцируема в точке x=0. В этой точке вместо градиента можно рассматривать субградиенты.

Градиенты по матрицам

Параметры моделей машинного обучения часто представлены матрицами и многомерными массивами. Раздел математического анализа, рассматривающий производные по таким объектам, называют матричным дифференцированием (англ. matrix calculus).

Пусть f:\mathbb{R}^{m\times n}\to\mathbb{R}. Градиент по матрице W обычно определяется равенством

df=\mathrm{tr}\left((\nabla_Wf)^\top dW\right),

где \mathrm{tr}след матрицы. При таком соглашении матрица \nabla_Wf имеет ту же форму, что и W:

(\nabla_Wf)_{ij}=\frac{\partial f}{\partial W_{ij}}.

Например, для функции

f(W)=\frac12\|WX-Y\|_F^2

получается

\nabla_Wf=(WX-Y)X^\top,

где \|\cdot\|_F — норма Фробениуса (англ. Frobenius norm).

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

Примеры

Функция двух переменных

Рассмотрим функцию

f(x,y)=x^2+3xy+2y^2.

Её частные производные равны

\frac{\partial f}{\partial x}=2x+3y,\qquad\frac{\partial f}{\partial y}=3x+4y.

Следовательно,

\nabla f(x,y)=\left(\begin{array}{c}2x+3y\\3x+4y\end{array}\right).

В точке (1,-1)

\nabla f(1,-1)=\left(\begin{array}{c}-1\\-1\end{array}\right).

Наиболее быстрое локальное возрастание происходит в направлении (-1,-1), а наиболее быстрое убывание — в направлении (1,1).

Линейная регрессия

Пусть задана матрица признаков X\in\mathbb{R}^{m\times n}, вектор ответов y\in\mathbb{R}^m и вектор параметров w\in\mathbb{R}^n. Для модели линейной регрессии и квадратичной функции потерь

\mathcal{L}(w)=\frac{1}{2m}\|Xw-y\|_2^2

градиент равен

\nabla_w\mathcal{L}(w)=\frac1mX^\top(Xw-y).

Приравнивание градиента к нулю приводит к нормальным уравнениям

X^\top Xw=X^\top y.

Если матрица X^\top X обратима, формально можно записать

w=(X^\top X)^{-1}X^\top y.

На практике обратную матрицу обычно не вычисляют явно. Для численно устойчивого решения задачи наименьших квадратов используют QR-разложение, сингулярное разложение или специализированные методы решения систем линейных уравнений.

Логистическая регрессия

Для бинарной логистической регрессии

p_i=\sigma(x_i^\top w),\qquad\sigma(z)=\frac{1}{1+\exp(-z)},

средняя логарифмическая функция потерь имеет вид

\mathcal{L}(w)=-\frac1m\sum_{i=1}^{m}\left[y_i\log p_i+(1-y_i)\log(1-p_i)\right].

Если p=(p_1,\ldots,p_m)^\top, то

\nabla_w\mathcal{L}(w)=\frac1mX^\top(p-y).

Вектор p-y содержит различия между предсказанными вероятностями и истинными ответами, а умножение на X^\top распределяет эти ошибки между параметрами модели.

Softmax и перекрёстная энтропия

В задаче многоклассовой классификации модель часто выдаёт логиты (англ. logits) z_1,\ldots,z_K. Вероятности классов вычисляются функцией softmax:

p_k=\frac{\exp(z_k)}{\sum_{j=1}^{K}\exp(z_j)}.

Для одного объекта с истинным классом y потеря перекрёстной энтропии (англ. cross-entropy loss) равна

\ell(z,y)=-\log p_y.

Её производная по логиту z_k имеет вид

\frac{\partial\ell}{\partial z_k}=p_k-\mathbf{1}[k=y],

где \mathbf{1}[k=y] — индикатор того, что k является истинным классом.

Эта формула часто служит начальной точкой обратного прохода в нейронных сетях для многоклассовой классификации.

Способы вычисления градиента

Аналитическое дифференцирование

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

Символьное дифференцирование

Символьное дифференцирование (англ. symbolic differentiation) преобразует математическое выражение в новое выражение для его производной. Оно используется в системах компьютерной алгебры.

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

Численное дифференцирование

Частную производную можно приближённо вычислить с помощью конечных разностей (англ. finite differences):

\frac{\partial f}{\partial x_j}(x)\approx\frac{f(x+he_j)-f(x)}{h},

где e_jj-й базисный вектор, а h — малый шаг.

Центральная разность имеет вид

\frac{\partial f}{\partial x_j}(x)\approx\frac{f(x+he_j)-f(x-he_j)}{2h}.

Центральная разность обычно точнее односторонней, но требует двух вычислений функции для каждой координаты.

Слишком большое значение h приводит к ошибке аппроксимации, а слишком малое — к накоплению ошибок округления при вычитании близких чисел. Для функции с n аргументами конечные разности требуют порядка n дополнительных вычислений функции.

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

Автоматическое дифференцирование

Автоматическое дифференцирование (англ. automatic differentiation, autodiff) применяет цепное правило к последовательности элементарных операций программы.[1]

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

Вычисления представляются в виде графа вычислений (англ. computational graph), вершины которого соответствуют операциям, а рёбра — передаваемым значениям.

Различают два основных режима автоматического дифференцирования.

Прямой режим (англ. forward mode) эффективно вычисляет произведение матрицы Якоби на вектор:

J_f(x)v.

Такое произведение называют произведением якобиана на вектор (англ. Jacobian-vector product, JVP).

Обратный режим (англ. reverse mode) эффективно вычисляет произведение транспонированного якобиана на вектор:

J_f(x)^\top u.

Такое произведение называют произведением вектора на якобиан (англ. vector-Jacobian product, VJP).

Для функции с большим числом входов и одним скалярным выходом f:\mathbb{R}^n\to\mathbb{R} обратный режим особенно эффективен: все компоненты градиента могут быть получены за один обратный проход после вычисления значения функции. Эта ситуация типична для машинного обучения, где параметров много, а итоговая функция потерь является скаляром.

Обратный режим требует хранения промежуточных значений прямого прохода или их повторного вычисления. Поэтому возникает компромисс между расходом памяти и временем вычисления.

Обратное распространение ошибки

Обратное распространение ошибки (англ. backpropagation) представляет собой применение обратного режима автоматического дифференцирования к вычислительному графу нейронной сети.

На прямом проходе (англ. forward pass) вычисляются активации слоёв и значение функции потерь. На обратном проходе (англ. backward pass) локальные производные последовательно объединяются по цепному правилу.[1]

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

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

Подробнее о соответствующем алгоритме см. в статье Градиентный спуск.

Рассмотрим задачу безусловной минимизации

\min_{\theta\in\mathbb{R}^n}\mathcal{L}(\theta).

Простейший градиентный метод строит последовательность

\theta_{t+1}=\theta_t-\eta_t\nabla\mathcal{L}(\theta_t),

где \eta_t>0 — шаг метода, или скорость обучения (англ. learning rate).

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

Пусть градиент функции является липшицевым (англ. Lipschitz continuous gradient) с константой L:

\|\nabla\mathcal{L}(x)-\nabla\mathcal{L}(y)\|_2\leq L\|x-y\|_2.

Тогда выполняется оценка

\mathcal{L}(y)\leq\mathcal{L}(x)+\nabla\mathcal{L}(x)^\top(y-x)+\frac{L}{2}\|y-x\|_2^2.

Подставляя y=x-\eta\nabla\mathcal{L}(x), получают

\mathcal{L}(x-\eta\nabla\mathcal{L}(x))\leq\mathcal{L}(x)-\eta\left(1-\frac{L\eta}{2}\right)\|\nabla\mathcal{L}(x)\|_2^2.

Следовательно, при 0<\eta<2/L ненулевой градиент обеспечивает уменьшение функции в рамках этой оценки.

Для гладких выпуклых функций градиентный спуск имеет сублинейную скорость сходимости по значению функции. Для гладких сильно выпуклых функций при подходящем постоянном шаге достигается линейная сходимость.[1][1]

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

Полный, стохастический и мини-пакетный градиент

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

\mathcal{L}(\theta)=\frac1m\sum_{i=1}^{m}\ell_i(\theta),

где \ell_i — потеря модели на i-м объекте.

Полный градиент (англ. full-batch gradient) равен

\nabla\mathcal{L}(\theta)=\frac1m\sum_{i=1}^{m}\nabla\ell_i(\theta).

Его точное вычисление требует обработки всей обучающей выборки.

В стохастическом градиентном методе на каждой итерации используется один случайно выбранный объект или небольшая группа объектов — мини-пакет (англ. mini-batch) B:

g_B(\theta)=\frac1{|B|}\sum_{i\in B}\nabla\ell_i(\theta).

При равномерном случайном выборе мини-пакета

\mathbb{E}[g_B(\theta)]=\nabla\mathcal{L}(\theta).

Следовательно, мини-пакетный градиент является несмещённой случайной оценкой полного градиента. Его вычисление дешевле, но оценка содержит стохастический шум (англ. gradient noise).

Увеличение размера пакета обычно уменьшает дисперсию оценки, но увеличивает стоимость одной итерации и объём необходимой памяти.

Теоретической основой стохастических градиентных методов стала теория стохастической аппроксимации (англ. stochastic approximation), предложенная Гербертом Роббинсом и Саттоном Монро в 1951 году.[1]

Масштабирование и геометрия градиента

Разный масштаб параметров

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

Для квадратичной функции поведение метода связано со спектром матрицы Гессе. Большое число обусловленности (англ. condition number) означает, что кривизна функции сильно различается по направлениям.

Для уменьшения этой проблемы применяются:

  • нормализация и стандартизация признаков;
  • изменение параметризации модели;
  • предобусловливание;
  • адаптивное масштабирование координат;
  • методы, использующие информацию о кривизне;
  • метод Ньютона;
  • квазиньютоновские методы (англ. quasi-Newton methods).

Естественный градиент

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

Естественный градиент (англ. natural gradient) использует матрицу информации Фишера F(\theta):

\widetilde{\nabla}\mathcal{L}(\theta)=F(\theta)^{-1}\nabla\mathcal{L}(\theta).

Такое направление учитывает локальную геометрию семейства вероятностных распределений, а не только евклидово расстояние между параметрами.[1]

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

Градиент при наличии ограничений

Если параметры должны принадлежать допустимому множеству C, обычный шаг по антиградиенту может вывести точку за его пределы.

В проекционном градиентном методе (англ. projected gradient descent) используется обновление

\theta_{t+1}=\Pi_C\left(\theta_t-\eta_t\nabla\mathcal{L}(\theta_t)\right),

где \Pi_C — проекция на множество C.

Для ограничений в форме равенств и неравенств используются множители Лагранжа, условия Каруша — Куна — Таккера, штрафные функции и барьерные методы.

Если допустимое множество является гладким многообразием, евклидов градиент проецируется на касательное пространство. Такой подход применяется в римановой оптимизации.

Негладкие функции

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

Например, функция

f(x)=|x|

не имеет производной при x=0. Функция активации ReLU (англ. rectified linear unit)

\mathrm{ReLU}(x)=\max(0,x)

также не дифференцируема в нуле.

Для выпуклой функции вместо градиента можно использовать субградиент (англ. subgradient). Вектор g является субградиентом выпуклой функции f в точке x, если

f(y)\geq f(x)+g^\top(y-x)

для всех допустимых y.

Множество всех субградиентов называется субдифференциалом (англ. subdifferential) и обозначается \partial f(x). В точках дифференцируемости

\partial f(x)=\{\nabla f(x)\}.

Для функции f(x)=|x|

\partial f(0)=[-1,1].

Методы оптимизации негладких функций рассматриваются в статье Субградиентные методы (оптимизация).

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

Негладкость также возникает в задачах с L1-регуляризацией и LASSO-регрессией. Для таких задач часто применяются субградиентные и проксимальные методы (англ. proximal methods).

Исчезающие и взрывающиеся градиенты

В глубоких и рекуррентных нейронных сетях градиент может содержать произведение большого числа матриц Якоби. Нормы таких произведений способны быстро стремиться к нулю или неограниченно возрастать.

Исчезающий градиент (англ. vanishing gradient) затрудняет передачу обучающего сигнала к ранним слоям или далёким моментам времени. Параметры получают крайне малые обновления, и модель плохо обучается долгосрочным зависимостям.

Взрывающийся градиент (англ. exploding gradient) приводит к чрезмерно большим обновлениям и численной неустойчивости. Результатом могут стать переполнение, бесконечные значения или появление значений \mathrm{NaN}.

Проблема особенно выражена в рекуррентных сетях, где одна и та же матрица преобразования многократно участвует в цепном правиле. Теоретический анализ этих явлений был дан в работах Бенжио, Симара и Фраскони, а также Паскану, Миколова и Бенжио.[1][1]

Для ограничения взрывающихся градиентов используется обрезка градиента (англ. gradient clipping). При обрезке по норме можно использовать преобразование

g_{\mathrm{clip}}=\min\left(1,\frac{\tau}{\|g\|_2}\right)g,

где \tau>0 — заданный порог.

Для уменьшения проблемы исчезающих градиентов применяются:

  • подходящая инициализация параметров;
  • функции активации без сильного насыщения;
  • нормализация активаций;
  • остаточные связи (англ. residual connections);
  • архитектуры LSTM и GRU;
  • контроль спектральных свойств весовых матриц.

Проверка корректности градиента

Ошибочный градиент может не приводить к немедленной ошибке программы, но способен вызвать неправильное или нестабильное обучение. Для проверки производных используется проверка градиента (англ. gradient checking).

Для координаты j центральная разностная оценка имеет вид

g_j^{\mathrm{num}}=\frac{f(x+he_j)-f(x-he_j)}{2h}.

Её сравнивают с аналитическим или автоматически вычисленным значением

g_j^{\mathrm{analyt}}=\frac{\partial f}{\partial x_j}(x).

Относительную ошибку можно оценивать выражением

\varepsilon_{\mathrm{rel}}=\frac{\|g^{\mathrm{num}}-g^{\mathrm{analyt}}\|_2}{\max\left(1,\|g^{\mathrm{num}}\|_2,\|g^{\mathrm{analyt}}\|_2\right)}.

Проверку рекомендуется проводить:

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

Для модели с большим числом параметров можно проверять не каждую координату, а случайное направление v:

\frac{f(x+hv)-f(x-hv)}{2h}\approx\nabla f(x)^\top v.

Такой подход называют проверкой производной по направлению.

Типичные ошибки

Пропущенное транспонирование

Для композиции f(x)=\varphi(g(x)) градиент вычисляется как

\nabla_x f=J_g(x)^\top\nabla\varphi.

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

Смешение суммы и среднего

Функции потерь могут суммироваться или усредняться по объектам:

\mathcal{L}_{\mathrm{sum}}=\sum_{i=1}^{m}\ell_i,\qquad\mathcal{L}_{\mathrm{mean}}=\frac1m\sum_{i=1}^{m}\ell_i.

Их градиенты различаются множителем m. Это влияет на эффективную скорость обучения и относительную силу регуляризации.

Игнорирование зависимости промежуточной переменной

Если z=z(x), то производная выражения, содержащего z, должна учитывать зависимость z от x. Рассмотрение промежуточной переменной как константы разрывает вычислительный граф и приводит к вычислению частной, а не полной производной.

В библиотеках автоматического дифференцирования такое поведение может возникать при явном отсоединении значения от вычислительного графа (англ. stop gradient, detach).

Численно неустойчивые выражения

Математически эквивалентные формулы могут иметь разную численную устойчивость. Например, прямое вычисление экспонент в softmax может вызвать переполнение.

Устойчивая форма имеет вид

p_k=\frac{\exp(z_k-z_{\max})}{\sum_j\exp(z_j-z_{\max})},\qquad z_{\max}=\max_j z_j.

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

Интерпретация малого градиента как доказательства оптимальности

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

Поэтому значение \|\nabla f\| следует рассматривать вместе со значением функции, кривизной, динамикой оптимизации и поведением модели на данных.

Изменение параметров во время вычисления градиента

Если промежуточные значения или параметры изменяются после прямого прохода, но до завершения обратного прохода, вычисленный градиент может перестать соответствовать исходной функции. Особенно осторожно следует использовать операции, изменяющие массивы на месте (англ. in-place operations).

История

Идеи, близкие к современному методу наискорейшего спуска (англ. steepest descent), появились в работе Огюстена Луи Коши 1847 года «Méthode générale pour la résolution des systèmes d'équations simultanées». В ней решение системы уравнений связывалось с последовательным уменьшением вспомогательной функции.[1]

В 1951 году Герберт Роббинс и Саттон Монро предложили метод стохастической аппроксимации для нахождения корня уравнения по зашумлённым наблюдениям.[1] Развитие этого подхода привело к современным стохастическим градиентным алгоритмам.

В 1970 году Сеппо Линнайнмаа описал общий способ обратного накопления производных, соответствующий современному обратному режиму автоматического дифференцирования.[1]

Методы обратного вычисления производных развивались также в теории управления, динамическом программировании и других областях. Публикация Дэвида Румельхарта, Джеффри Хинтона и Рональда Уильямса 1986 года сыграла важную роль в распространении обратного распространения ошибки как практического способа обучения многослойных нейронных сетей.[1]

Обратное распространение ошибки существовало в различных формах до 1986 года. Поэтому работу Румельхарта, Хинтона и Уильямса корректнее связывать с популяризацией метода в нейронных сетях, а не с первоначальным открытием цепного правила или обратного автоматического дифференцирования.

Практическое значение

Градиент используется не только для обновления параметров модели. Он также служит инструментом исследования и интерпретации алгоритмов машинного обучения.

Основные применения включают:

  • оптимизацию параметров моделей;
  • оценивание чувствительности функции к признакам и параметрам;
  • построение карт значимости (англ. saliency maps);
  • исследование состязательных примеров (англ. adversarial examples);
  • оптимизацию входных данных;
  • решение обратных задач;
  • дифференцируемое программирование (англ. differentiable programming);
  • обучение вероятностных моделей;
  • вариационный вывод;
  • оптимизацию гиперпараметров;
  • анализ влияния обучающих объектов;
  • методы обучения с подкреплением, основанные на градиенте стратегии.

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

См. также

Примечания


Литература

  • Baydin A. G., Pearlmutter B. A., Radul A. A., Siskind J. M. Automatic Differentiation in Machine Learning: a Survey // Journal of Machine Learning Research. — 2018. — Т. 18. — № 153. — С. 1—43.
  • Rumelhart D. E., Hinton G. E., Williams R. J. Learning representations by back-propagating errors // Nature. — 1986. — Т. 323. — С. 533—536.
  • Bengio Y., Simard P., Frasconi P. Learning Long-Term Dependencies with Gradient Descent Is Difficult // IEEE Transactions on Neural Networks. — 1994. — Т. 5. — № 2. — С. 157—166.
  • Amari S. Natural Gradient Works Efficiently in Learning // Neural Computation. — 1998. — Т. 10. — № 2. — С. 251—276.
Личные инструменты