Изменения

Перейти к: навигация, поиск

Проблемы нейронных сетей

11 517 байт добавлено, 19:18, 18 января 2021
Новая страница: «= Проблема взрывающегося (исчезающего) градиента в нейронных сетях = == Постановка пробле…»
= Проблема взрывающегося (исчезающего) градиента в нейронных сетях =

== Постановка проблемы ==

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

В процессе [[Обратное распространение ошибки | обратного распространения ошибки]] при прохождении через слои нейронной сети в элементах градиента могут накапливаться большие значения, что будет приводить к сильным изменениям весов. Это свою очередь может сделать нестабильным алгоритм обучения нейронной сети. В таком случае элементы градиента могут переполнить тип данных, в котором они хранятся. Такое явление называется взрывающимся градиентом ''(англ. 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}}$

Посчитаем производную по слоям $u_d, u_{d-1}, \dots$, где $L$ {{---}} функция потерь ''(англ. loss function)'', $w$ {{---}} вес, $a$ {{---}} выход по производной. Оценка для производной видна из рис. 1.

$\frac{\partial(L(w))}{\partial(u_d)} = \frac{\partial(L(w))}{\partial(a)} \cdot \frac{\partial(a)}{\partial(u_d)} = (y - a) \cdot \sigma'(w_d u_d) w_d \leq 2 \cdot \frac{1}{4} w_d$

$\frac{\partial(L(w))}{\partial(u_{d - 1})} = \frac{\partial(L(w))}{\partial(u_d)} \cdot \frac{\partial(u_d)}{\partial(u_{d - 1})} \leq 2 \cdot (\frac{1}{4})^2 w_d w_{d-1}$

$\ldots$

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

== Способы определения ==

=== Взрывающийся градиент ===

Возникновение проблемы взрывающегося градиента можно определить по следующим признакам:
* Модель плохо обучается на данных, что отражается в высоком значении функции потерь;
* Модель нестабильна, что отражается в значительных скачках значения функции потерь;
* Значение функции потерь принимает значение <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$.

==== Softplus ====

$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). Это позволяет при обратном распространении ошибки влиять градиенту на более далекие слои напрямую.

=== Регуляризация весов ===

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

=== Обрезание градиента ===

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

== См. также ==

* [[:Обратное распространение ошибки]]
* [[:Регуляризация]]
* [[:Глубокое обучение]]
* [[:Сверточные нейронные сети]]

== Примечания ==
<references/>

== Источники ==

* Курс Machine Learning, ИТМО, 2020;
* [https://towardsdatascience.com/the-vanishing-exploding-gradient-problem-in-deep-neural-networks-191358470c11 towardsdatascience.com {{---}} The vanishing exploding gradient problem in deep neural networks];
* [https://machinelearningmastery.com/exploding-gradients-in-neural-networks/ machinelearningmastery.com {{---}} Exploding gradients in neural networks].
13
правок

Навигация