13
правок
Изменения
Внесение первого набора правок
=Проблема взрывающегося (затухающего) градиента в нейронных сетях = Постановка проблемы == Определение ==
Напомним, что градиентом в [[Нейронные сети, перцептрон | нейронных сетях]] называется вектор частных производных функции потерь по весам нейронной сети. Таким образом, он указывает на направление наибольшего роста этой функции для всех весов по совокупности. Градиент считается в процессе тренировки нейронной сети и используется в оптимизаторе весов для улучшения качества модели.
В процессе [[Обратное распространение ошибки | обратного распространения ошибки]] при прохождении через слои нейронной сети в элементах градиента могут накапливаться большие значения, что будет приводить к сильным изменениям весов. Это в свою очередь может сделать нестабильным алгоритм обучения нейронной сети. В таком случае элементы градиента могут переполнить тип данных, в котором они хранятся. Такое явление называется взрывающимся градиентом ''(англ. exploding gradient)''.
Существует аналогичная обратная проблема, когда в процессе обучения при обратном распространении ошибки через слои нейронной сети градиент становится все меньше. Это приводит к тому, что веса при обновлении изменяются на слишком малые значения, и обучение проходит неэффективно или останавливается, то есть алгоритм обучения не сходится. Это явление называется исчезающим затухающим градиентом ''(англ. vanishing gradient)''.
Таким образом, увеличение числа слоев нейронной сети с одной стороны увеличивает ее способности к обучению и расширяет ее возможности, но с другой стороны может порождать данную проблему. Поэтому для решения сложных задач с помощью нейронных сетей необходимо уметь определять и устранять ее.
== Причины ==
[[Файл:SigmoidDerivative.png|upright=1.0|thumb|Рис. Рисунок 1: График сигмоиды и ее производной<ref>[https://towardsdatascience.com/derivative-of-the-sigmoid-function-536880cf918e towardsdatascience.com {{---}} Derivative of the sigmoid function]</ref>]]В Такая проблема может возникнуть при использовании нейронных сетях классической [[Практики реализации нейронных сетей#Функции активации | функцией активации]] ''(англ. activation function)'' для слоев является сигмоида сигмоиды ''(англ. sigmoid)'':
$\sigma(x) = \frac{1}{1 + e^{-x}}.$
Пусть сеть состоит из подряд идущих нейронов с функцией активации $\frac{\partialsigma(L(wx))}{\partial$; функция потерть ''(u_dангл. loss function)} = \frac{\partial('' $L(wy))}{\partial= MSE(a)} y, \cdot \frachat{\partial(a)y}{\partial(u_d)} = (y - a\hat{y}) \cdot \sigma^2$ ''(w_d англ. MSE {{---}} Mean Square Error)''; $u_d) $ {{---}} значение, поступающее на вход нейрону на слое $d$; $w_d \leq 2 \cdot \frac$ {{1---}}вес нейрона на слое $d$; $y$ {4{---}} w_d$выход из последнего слоя. Оценим частные производные по весам такой нейронной сети на каждом слое. Оценка для производной сигмоиды видна из рисунка 1.
$\frac{\partial(L(wy))}{\partial(u_w_d)} = \frac{\partial(L(y))}{\partial(y)} \cdot \frac{\partial(y)}{\partial(w_d)} = 2 (y - \hat{y}) \cdot \sigma'(w_d u_d) u_d \leq 2 (y - \hat{y}) \cdot \frac{1}{4} u_d$ $\frac{\partial(L(y))}{\partial(w_{d - 1})} = \frac{\partial(L(wy))}{\partial(u_dw_d)} \cdot \frac{\partial(u_dw_d)}{\partial(u_w_{d - 1})} \leq 2 (y - \hat{y}) \cdot (\frac{1}{4})^2 w_d w_u_d u_{d-1}$
$\ldots$
Откуда видно, что оценка элементов градиента растет экспоненциально при увеличении числа рассмотрении частных производных по весам слоевв направлении входа в нейронную сеть (уменьшения номера слоя). Это в свою очередь может приводить либо к экспоненциальному росту градиента от слоя к слою, когда входные значения нейронов {{---}} числа, по модулю большие $1$, либо к затуханию, когда эти значения {{---}} числа, по модулю меньшие $1$. Однако, входные значения скрытых слоев есть выходные значения функций активаций предшествующих им слоев. В частности, сигмоида насыщается ''(англ. saturates)'' при стремлении аргумента к $+\infty$ или $-\infty$, то есть имеет там конечный предел. Это приводит к тому, что более отдаленные слои обучаются медленнее, так как увеличение или уменьшение аргумента насыщенной функции вносит малые изменения, и градиент становится все меньше. Это и есть проблема затухающего градиента.
== Способы определения ==
Возникновение проблемы взрывающегося градиента можно определить по следующим признакам:
* Модель плохо обучается на данных, что отражается в высоком значении функции потерь;.* Модель нестабильна, что отражается в значительных скачках значения функции потерь;.
* Значение функции потерь принимает значение <code>NaN</code>.
Более непрозрачные признаки, которые могут подтвердить возникновение проблемы:
* Веса модели растут экспоненциально;.
* Веса модели принимают значение <code>NaN</code>.
Признаки проблемы затухающего градиента:
* Модель Точность модели растет медленно улучшает свою точность, при этом возможно раннее срабатывание критерия останова, так как алгоритм может решить, что дальнейшее обучение не окажет будет оказывать существенного влияния на качество модели;.* Градиент ближе к концу показывает более сильные изменения, в то время как градиент ближе к началу почти не показывает никакие изменения;.* Веса модели уменьшаются экспоненциально во время обучения;.
* Веса модели стремятся к $0$ во время обучения.
=== Использование другой функции активации ===
[[Файл:SigmoidTanhReLUSoftplus.png|upright=1.0|thumb|Рис. Рисунок 2: Графики функций активации: sigmoid, tanh, ReLU, softplus]] Как уже упоминалось выше, подверженность нейронной сети проблемам взрывающегося или затухающего градиента во многом зависит от свойств используемых [[Практики реализации нейронных сетей#Функции активации | функций активации]]. Поэтому правильный их подбор важен для предотвращения описываемых проблем.
==== Tanh ====
$\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$
Функция аналогична сигмоиде, но множество возможных значений: $[-1, 1]$. Градиенты при этом сосредоточены около $0$,. Однако, эта функция также насыщается в обоих направлениях, поэтому также может приводить к проблеме затухающего градиента.
==== ReLU ====
$h(x) = \max(0, x)$
Функция проста для вычисления и имеет производную, равную либо $1$, либо $0$. Также есть мнение, что именно эта функция используется в биологических нейронных сетях. При этом функция не насыщается на любых положительных значениях, что делает градиент более чувствительным к отдаленным слоям. Недостатком функции является отсутствие производной в нуле, что можно устранить доопределением производной в нуле слева или справа. Также эту проблему устраняет использование гладкой аппроксимации, Softplus.
Существуют модификации ReLU:
* Noisy ReLU: $h(x) = \max(0, x + \varepsilon), \varepsilon \sim N(0, \sigma(x))$;.* Parametric ReLU: $h(x) = \begin{cases} x & x > 0 \\ \beta x & \text{otherwise} \end{cases}$;.
* Leaky ReLU: Paramtetric ReLU со значением $\beta = 0.01$.
$h(x) = \ln(1 + e^x)$
Гладкий, везде дифференцируемый аналог функции ReLU, следовательно, наследует все ее преимущества. Однако, эта функция более сложна для вычисления. Эмпирически было выявлено, что по качеству не превосходит ReLU.
Графики всех функций активации приведены на рис. рисунок 2.
=== Изменение модели ===
В рекуррентных нейронных сетях можно воспользоваться техникой обрезания обратного распространения ошибки по времени, которая заключается в обновлении весов с определенной периодичностью.
=== Использование Residual blocks ===
[[Файл:Residual.png|upright=1.0|thumb|Рис. Рисунок 3: Устройство residual block<ref>[https://en.wikipedia.org/wiki/Residual_neural_network wikipedia.org {{---}} Residual neural network]</ref>]]В данной конструкции вывод нейрона подается как следующему нейрону, так и нейрону на расстоянии 2-3 слоев впереди, который суммирует его с выходом предшествующего нейрона, а функция активации в нем {{---}} ReLU (см. рис. рисунок 3). Такая связка называется shortcut. Это позволяет при обратном распространении ошибки влиять значениям градиента в слоях быть более чувствительным к градиенту на более далекие слои напрямуюв слоях, с которыми связаны с помощью shortcut, то есть расположенными несколько дальше следующего слоя.
=== Регуляризация весов ===
=== Обрезание градиента ===
Образание заключается в ограничении нормы градиента. То есть если норма градиента превышает заранее выбранную величину$T$, то следует сократить ее до данной величинымасштабировать его так, не изменив направлениечтобы его норма равнялась этой величине: $\nabla_{clipped} = \begin{cases} \nabla & || \nabla || \leq T \\ \frac{T}{|| \nabla ||} \cdot \nabla & \text{otherwise} \end{cases}.$
== См. также ==