Проблемы нейронных сетей — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «= Проблема взрывающегося (исчезающего) градиента в нейронных сетях = == Постановка пробле…»)
 
(Внесение второго набора правок)
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
= Проблема взрывающегося (исчезающего) градиента в нейронных сетях =
+
[[Нейронные сети, перцептрон | Нейронные сети]] считаются универсальными моделями в машинном обучении, поскольку позволяют решать широкий класс задач. Однако, при их использовании могут возникать различные проблемы.
  
== Постановка проблемы ==
+
= Взрывающийся и затухающий градиент =
 +
 
 +
== Определение ==
  
 
Напомним, что градиентом в [[Нейронные сети, перцептрон | нейронных сетях]] называется вектор частных производных функции потерь по весам нейронной сети. Таким образом, он указывает на направление наибольшего роста этой функции для всех весов по совокупности. Градиент считается в процессе тренировки нейронной сети и используется в оптимизаторе весов для улучшения качества модели.
 
Напомним, что градиентом в [[Нейронные сети, перцептрон | нейронных сетях]] называется вектор частных производных функции потерь по весам нейронной сети. Таким образом, он указывает на направление наибольшего роста этой функции для всех весов по совокупности. Градиент считается в процессе тренировки нейронной сети и используется в оптимизаторе весов для улучшения качества модели.
  
В процессе [[Обратное распространение ошибки | обратного распространения ошибки]] при прохождении через слои нейронной сети в элементах градиента могут накапливаться большие значения, что будет приводить к сильным изменениям весов. Это свою очередь может сделать нестабильным алгоритм обучения нейронной сети. В таком случае элементы градиента могут переполнить тип данных, в котором они хранятся. Такое явление называется взрывающимся градиентом ''(англ. exploding gradient)''.
+
В процессе [[Обратное распространение ошибки | обратного распространения ошибки]] при прохождении через слои нейронной сети в элементах градиента могут накапливаться большие значения, что будет приводить к сильным изменениям весов. Это в свою очередь может сделать нестабильным алгоритм обучения нейронной сети. В таком случае элементы градиента могут переполнить тип данных, в котором они хранятся. Такое явление называется взрывающимся градиентом ''(англ. exploding gradient)''.
  
Существует аналогичная обратная проблема, когда в процессе обучения при обратном распространении ошибки через слои нейронной сети градиент становится все меньше. Это приводит к тому, что веса при обновлении изменяются на слишком малые значения, и обучение проходит неэффективно или останавливается, то есть алгоритм обучения не сходится. Это явление называется исчезающим градиентом ''(англ. vanishing gradient)''.
+
Существует аналогичная обратная проблема, когда в процессе обучения при обратном распространении ошибки через слои нейронной сети градиент становится все меньше. Это приводит к тому, что веса при обновлении изменяются на слишком малые значения, и обучение проходит неэффективно или останавливается, то есть алгоритм обучения не сходится. Это явление называется затухающим градиентом ''(англ. vanishing gradient)''.
  
 
Таким образом, увеличение числа слоев нейронной сети с одной стороны увеличивает ее способности к обучению и расширяет ее возможности, но с другой стороны может порождать данную проблему. Поэтому для решения сложных задач с помощью нейронных сетей необходимо уметь определять и устранять ее.
 
Таким образом, увеличение числа слоев нейронной сети с одной стороны увеличивает ее способности к обучению и расширяет ее возможности, но с другой стороны может порождать данную проблему. Поэтому для решения сложных задач с помощью нейронных сетей необходимо уметь определять и устранять ее.
Строка 13: Строка 15:
 
== Причины ==
 
== Причины ==
  
[[Файл: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>]]
+
[[Файл: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)'':
+
Такая проблема может возникнуть при использовании нейронных сетях классической [[Практики реализации нейронных сетей#Функции активации | функцией активации]] ''(англ. activation function)'' сигмоиды ''(англ. sigmoid)'':
 +
 
 +
$\sigma(x) = \frac{1}{1 + e^{-x}}.$
  
$\sigma(x) = \frac{1}{1 + e^{-x}}$
+
Эта функция часто используется, поскольку множество ее возможных значений {{---}} отрезок $[0, 1]$ {{---}} совпадает с возможными значениями вероятностной меры, что делает более удобным ее предсказание. Также график сигмоиды соответствует многим естественным процессам, показывающим рост с малых значений, который ускоряется с течением времени, и достигающим своего предела<ref>[https://en.wikipedia.org/wiki/Sigmoid_function#Applications wikipedia.org {{---}} Sigmoid function, Applications]</ref> (например, рост популяции).
  
Посчитаем производную по слоям $u_d, u_{d-1}, \dots$, где $L$ {{---}} функция потерь ''(англ. loss function)'', $w$ {{---}} вес, $a$ {{---}} выход по производной. Оценка для производной видна из рис. 1.
+
Пусть сеть состоит из подряд идущих нейронов с функцией активации $\sigma(x)$; функция потерть ''(англ. loss function)'' $L(y) = MSE(y, \hat{y}) = (y - \hat{y})^2$ ''(англ. MSE {{---}} [[ Оценка качества в задачах классификации и регрессии#Средняя квадратичная ошибка (англ. Mean Squared Error, MSE) | Mean Square Error]])''; $u_d$ {{---}} значение, поступающее на вход нейрону на слое $d$; $w_d$ {{---}} вес нейрона на слое $d$; $y$ {{---}} выход из последнего слоя. Оценим частные производные по весам такой нейронной сети на каждом слое. Оценка для производной сигмоиды видна из рисунка 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(y))}{\partial(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(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}$
+
$\frac{\partial(L(y))}{\partial(w_{d - 1})} = \frac{\partial(L(y))}{\partial(w_d)} \cdot \frac{\partial(w_d)}{\partial(w_{d - 1})} \leq 2 (y - \hat{y}) \cdot (\frac{1}{4})^2 u_d u_{d-1}$
  
 
$\ldots$
 
$\ldots$
  
Откуда видно, что оценка градиента растет экспоненциально при увеличении числа слоев. Это в свою очередь может приводить либо к экспоненциальному росту градиента от слоя к слою, либо к затуханию.
+
Откуда видно, что оценка элементов градиента растет экспоненциально при рассмотрении частных производных по весам слоев в направлении входа в нейронную сеть (уменьшения номера слоя). Это в свою очередь может приводить либо к экспоненциальному росту градиента от слоя к слою, когда входные значения нейронов {{---}} числа, по модулю большие $1$, либо к затуханию, когда эти значения {{---}} числа, по модулю меньшие $1$.
 +
 
 +
Однако, входные значения скрытых слоев есть выходные значения функций активаций предшествующих им слоев. В частности, сигмоида насыщается ''(англ. saturates)'' при стремлении аргумента к $+\infty$ или $-\infty$, то есть имеет там конечный предел. Это приводит к тому, что более отдаленные слои обучаются медленнее, так как увеличение или уменьшение аргумента насыщенной функции вносит малые изменения, и градиент становится все меньше. Это и есть проблема затухающего градиента.
  
 
== Способы определения ==
 
== Способы определения ==
Строка 33: Строка 39:
  
 
Возникновение проблемы взрывающегося градиента можно определить по следующим признакам:
 
Возникновение проблемы взрывающегося градиента можно определить по следующим признакам:
* Модель плохо обучается на данных, что отражается в высоком значении функции потерь;
+
* Модель плохо обучается на данных, что отражается в высоком значении функции потерь.
* Модель нестабильна, что отражается в значительных скачках значения функции потерь;
+
* Модель нестабильна, что отражается в значительных скачках значения функции потерь.
 
* Значение функции потерь принимает значение <code>NaN</code>.
 
* Значение функции потерь принимает значение <code>NaN</code>.
  
 
Более непрозрачные признаки, которые могут подтвердить возникновение проблемы:
 
Более непрозрачные признаки, которые могут подтвердить возникновение проблемы:
* Веса модели растут экспоненциально;
+
* Веса модели растут экспоненциально.
 
* Веса модели принимают значение <code>NaN</code>.
 
* Веса модели принимают значение <code>NaN</code>.
  
Строка 44: Строка 50:
  
 
Признаки проблемы затухающего градиента:
 
Признаки проблемы затухающего градиента:
* Модель медленно улучшает свою точность, при этом возможно раннее срабатывание критерия останова, так как алгоритм может решить, что дальнейшее обучение не окажет существенного влияния на качество модели;
+
* Точность модели растет медленно, при этом возможно раннее срабатывание критерия останова, так как алгоритм может решить, что дальнейшее обучение не будет оказывать существенного влияния.
* Градиент ближе к концу показывает более сильные изменения, в то время как градиент ближе к началу почти не показывает никакие изменения;
+
* Градиент ближе к концу показывает более сильные изменения, в то время как градиент ближе к началу почти не показывает никакие изменения.
* Веса модели уменьшаются экспоненциально во время обучения;
+
* Веса модели уменьшаются экспоненциально во время обучения.
 
* Веса модели стремятся к $0$ во время обучения.
 
* Веса модели стремятся к $0$ во время обучения.
  
Строка 52: Строка 58:
  
 
=== Использование другой функции активации ===
 
=== Использование другой функции активации ===
[[Файл:SigmoidTanhReLUSoftplus.png|upright=1.0|thumb|Рис. 2: Графики функций активации: sigmoid, tanh, ReLU, softplus]]
+
[[Файл:SigmoidTanhReLUSoftplus.png|upright=1.0|thumb|Рисунок 2. Графики функций активации: sigmoid, tanh, ReLU, softplus]]
 +
 
 +
Как уже упоминалось выше, подверженность нейронной сети проблемам взрывающегося или затухающего градиента во многом зависит от свойств используемых [[Практики реализации нейронных сетей#Функции активации | функций активации]]. Поэтому правильный их подбор важен для предотвращения описываемых проблем.
  
 
==== Tanh ====
 
==== Tanh ====
Строка 58: Строка 66:
 
$\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$
 
$\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$
  
Функция аналогична сигмоиде, но множество возможных значений: $[-1, 1]$. Градиенты при этом сосредоточены около $0$.
+
Функция аналогична сигмоиде, но множество возможных значений: $[-1, 1]$. Градиенты при этом сосредоточены около $0$,. Однако, эта функция также насыщается в обоих направлениях, поэтому также может приводить к проблеме затухающего градиента.
  
 
==== ReLU ====
 
==== ReLU ====
Строка 64: Строка 72:
 
$h(x) = \max(0, x)$
 
$h(x) = \max(0, x)$
  
Функция проста для вычисления и имеет производную, равную либо $1$, либо $0$. Также есть мнение, что именно эта функция используется в биологических нейронных сетях. Недостатком функции является отсутствие производной в нуле, что можно устранить доопределением производной в нуле слева или справа. Также эту проблему устраняет использование гладкой аппроксимации, Softplus.
+
Функция проста для вычисления и имеет производную, равную либо $1$, либо $0$. Также есть мнение, что именно эта функция используется в биологических нейронных сетях. При этом функция не насыщается на любых положительных значениях, что делает градиент более чувствительным к отдаленным слоям.
 +
 
 +
Недостатком функции является отсутствие производной в нуле, что можно устранить доопределением производной в нуле слева или справа. Также эту проблему устраняет использование гладкой аппроксимации, Softplus.
  
 
Существуют модификации ReLU:
 
Существуют модификации ReLU:
* Noisy ReLU: $h(x) = \max(0, x + \varepsilon), \varepsilon \sim N(0, \sigma(x))$;
+
* 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}$;
+
* Parametric ReLU: $h(x) = \begin{cases} x & x > 0 \\ \beta x & \text{otherwise} \end{cases}$.
 
* Leaky ReLU: Paramtetric ReLU со значением $\beta = 0.01$.
 
* Leaky ReLU: Paramtetric ReLU со значением $\beta = 0.01$.
  
Строка 75: Строка 85:
 
$h(x) = \ln(1 + e^x)$
 
$h(x) = \ln(1 + e^x)$
  
Гладкий, везде дифференцируемый аналог ReLU. Однако, эта функция более сложна для вычисления. Эмпирически было выявлено, что по качеству не превосходит ReLU.
+
Гладкий, везде дифференцируемый аналог функции ReLU, следовательно, наследует все ее преимущества. Однако, эта функция более сложна для вычисления. Эмпирически было выявлено, что по качеству не превосходит ReLU.
  
Графики всех функций активации приведены на рис. 2.
+
Графики всех функций активации приведены на рисунок 2.
  
 
=== Изменение модели ===
 
=== Изменение модели ===
  
В глубоких нейронных сетях для решения проблемы может оказаться достаточным сокращение числа слоев. Также может помочь уменьшение размера батчей.
+
Для решения проблемы может оказаться достаточным сокращение числа слоев. Это связано с тем, что частные производные по весам растут экспоненциально в зависимости от глубины слоя.
  
 
В рекуррентных нейронных сетях можно воспользоваться техникой обрезания обратного распространения ошибки по времени, которая заключается в обновлении весов с определенной периодичностью.
 
В рекуррентных нейронных сетях можно воспользоваться техникой обрезания обратного распространения ошибки по времени, которая заключается в обновлении весов с определенной периодичностью.
Строка 87: Строка 97:
 
=== Использование Residual blocks ===
 
=== Использование 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>]]
+
[[Файл: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). Это позволяет при обратном распространении ошибки влиять градиенту на более далекие слои напрямую.
+
В данной конструкции вывод нейрона подается как следующему нейрону, так и нейрону на расстоянии 2-3 слоев впереди, который суммирует его с выходом предшествующего нейрона, а функция активации в нем {{---}} ReLU (см. рисунок 3). Такая связка называется shortcut. Это позволяет при обратном распространении ошибки значениям градиента в слоях быть более чувствительным к градиенту в слоях, с которыми связаны с помощью shortcut, то есть расположенными несколько дальше следующего слоя.
  
 
=== Регуляризация весов ===
 
=== Регуляризация весов ===
  
Регуляризация заключается в том, что слишком большие значения весов будут увеличивать функцию потерь, таким образом штрафуя за этой нейронную сеть.
+
[[Регуляризация | Регуляризация]] заключается в том, что слишком большие значения весов будут увеличивать функцию потерь. Таким образом, в процессе обучения нейронная сеть помимо оптимизации ответа будет также минимизировать веса, не позволяя им становиться слишком большими.
  
 
=== Обрезание градиента ===
 
=== Обрезание градиента ===
  
Образание заключается в ограничении нормы градиента. То есть если норма градиента превышает заранее выбранную величину, то следует сократить ее до данной величины, не изменив направление.
+
Образание заключается в ограничении нормы градиента. То есть если норма градиента превышает заранее выбранную величину $T$, то следует масштабировать его так, чтобы его норма равнялась этой величине:
  
== См. также ==
+
$\nabla_{clipped} = \begin{cases} \nabla & || \nabla || \leq T \\ \frac{T}{|| \nabla ||} \cdot \nabla & \text{otherwise} \end{cases}.$
  
 +
= См. также =
 +
 +
* [[:Нейронные сети, перцептрон]]
 
* [[:Обратное распространение ошибки]]
 
* [[:Обратное распространение ошибки]]
 
* [[:Регуляризация]]
 
* [[:Регуляризация]]
Строка 105: Строка 118:
 
* [[:Сверточные нейронные сети]]
 
* [[:Сверточные нейронные сети]]
  
== Примечания ==
+
= Примечания =
 
<references/>
 
<references/>
  
== Источники ==
+
= Источники =
  
 
* Курс Machine Learning, ИТМО, 2020;
 
* Курс 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://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].
 
* [https://machinelearningmastery.com/exploding-gradients-in-neural-networks/ machinelearningmastery.com {{---}} Exploding gradients in neural networks].
 +
 +
[[Категория: Машинное обучение]]
 +
[[Категория: Нейронные сети]]

Текущая версия на 00:41, 23 января 2021

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

Взрывающийся и затухающий градиент[править]

Определение[править]

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

В процессе обратного распространения ошибки при прохождении через слои нейронной сети в элементах градиента могут накапливаться большие значения, что будет приводить к сильным изменениям весов. Это в свою очередь может сделать нестабильным алгоритм обучения нейронной сети. В таком случае элементы градиента могут переполнить тип данных, в котором они хранятся. Такое явление называется взрывающимся градиентом (англ. exploding gradient).

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

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

Причины[править]

Рисунок 1. График сигмоиды и ее производной[1]

Такая проблема может возникнуть при использовании нейронных сетях классической функцией активации (англ. activation function) сигмоиды (англ. sigmoid):

$\sigma(x) = \frac{1}{1 + e^{-x}}.$

Эта функция часто используется, поскольку множество ее возможных значений — отрезок $[0, 1]$ — совпадает с возможными значениями вероятностной меры, что делает более удобным ее предсказание. Также график сигмоиды соответствует многим естественным процессам, показывающим рост с малых значений, который ускоряется с течением времени, и достигающим своего предела[2] (например, рост популяции).

Пусть сеть состоит из подряд идущих нейронов с функцией активации $\sigma(x)$; функция потерть (англ. loss function) $L(y) = MSE(y, \hat{y}) = (y - \hat{y})^2$ (англ. MSE — Mean Square Error); $u_d$ — значение, поступающее на вход нейрону на слое $d$; $w_d$ — вес нейрона на слое $d$; $y$ — выход из последнего слоя. Оценим частные производные по весам такой нейронной сети на каждом слое. Оценка для производной сигмоиды видна из рисунка 1.

$\frac{\partial(L(y))}{\partial(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(y))}{\partial(w_d)} \cdot \frac{\partial(w_d)}{\partial(w_{d - 1})} \leq 2 (y - \hat{y}) \cdot (\frac{1}{4})^2 u_d u_{d-1}$

$\ldots$

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

Однако, входные значения скрытых слоев есть выходные значения функций активаций предшествующих им слоев. В частности, сигмоида насыщается (англ. saturates) при стремлении аргумента к $+\infty$ или $-\infty$, то есть имеет там конечный предел. Это приводит к тому, что более отдаленные слои обучаются медленнее, так как увеличение или уменьшение аргумента насыщенной функции вносит малые изменения, и градиент становится все меньше. Это и есть проблема затухающего градиента.

Способы определения[править]

Взрывающийся градиент[править]

Возникновение проблемы взрывающегося градиента можно определить по следующим признакам:

  • Модель плохо обучается на данных, что отражается в высоком значении функции потерь.
  • Модель нестабильна, что отражается в значительных скачках значения функции потерь.
  • Значение функции потерь принимает значение NaN.

Более непрозрачные признаки, которые могут подтвердить возникновение проблемы:

  • Веса модели растут экспоненциально.
  • Веса модели принимают значение NaN.

Затухающий градиент[править]

Признаки проблемы затухающего градиента:

  • Точность модели растет медленно, при этом возможно раннее срабатывание критерия останова, так как алгоритм может решить, что дальнейшее обучение не будет оказывать существенного влияния.
  • Градиент ближе к концу показывает более сильные изменения, в то время как градиент ближе к началу почти не показывает никакие изменения.
  • Веса модели уменьшаются экспоненциально во время обучения.
  • Веса модели стремятся к $0$ во время обучения.

Способы устранения[править]

Использование другой функции активации[править]

Рисунок 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[править]

Рисунок 3. Устройство residual block[3]

В данной конструкции вывод нейрона подается как следующему нейрону, так и нейрону на расстоянии 2-3 слоев впереди, который суммирует его с выходом предшествующего нейрона, а функция активации в нем — ReLU (см. рисунок 3). Такая связка называется shortcut. Это позволяет при обратном распространении ошибки значениям градиента в слоях быть более чувствительным к градиенту в слоях, с которыми связаны с помощью shortcut, то есть расположенными несколько дальше следующего слоя.

Регуляризация весов[править]

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

Обрезание градиента[править]

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

$\nabla_{clipped} = \begin{cases} \nabla & || \nabla || \leq T \\ \frac{T}{|| \nabla ||} \cdot \nabla & \text{otherwise} \end{cases}.$

См. также[править]

Примечания[править]

Источники[править]