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

Материал из Викиконспекты
Перейти к: навигация, поиск
(small fixes)
м
 
(не показано 11 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
==Аугментация данных==
 
==Аугментация данных==
При глубоком обучении иногда можно столкнуться с ситуацией, когда датасет имеет ограниченный размер. Но чтобы получить лучшее обобщение модели, необходимо иметь больше данных, в том числе и различные их вариации. То есть необходимо увеличить размер датасета искусственным образом, и это можно сделать с помощью аугментации данных.
+
При глубоком обучении иногда можно столкнуться с ситуацией, когда набор данных имеет ограниченный размер. Но чтобы получить лучшие результаты обобщение модели, необходимо иметь больше данных, в том числе и различные их вариации. То есть необходимо увеличить размер исходного набора искусственным образом, и это можно сделать с помощью аугментации данных.
 
{{Определение
 
{{Определение
 
|definition= '''Аугментация данных''' (англ. ''data augmentation'') {{---}} это методика создания дополнительных данных из имеющихся данных.}}
 
|definition= '''Аугментация данных''' (англ. ''data augmentation'') {{---}} это методика создания дополнительных данных из имеющихся данных.}}
Чаще всего, проблема ограниченного датасета возникает при решении задач, связанных с обработкой изображений. Следующие способы аугментации изображений являются самыми популярными:
+
Чаще всего, проблема ограниченного набора данных возникает при решении задач, связанных с обработкой изображений. Следующие способы аугментации изображений являются самыми популярными:
[[Файл:BasicAugmentation.png|500px|thumb|right|Рис 1. Пример аугментации изображения]]
+
[[Файл:Augmentation.png|400px|thumb|right|Рис 1. a) Исходное изображение. b) Отображение по горизонтали. c) Вращение. d) Отступ. <br> e) Увеличение яркости и контрастности.  f) Вырезание. <br> g) Добавление шума. h) Изменение RGB каналов.]]
*Отображение по вертикали или горизонтали (''flipping'').
+
*Отображение по вертикали или горизонтали (англ. ''flipping'').
*Поворот изображения на определенный угол (''rotation'').
+
*Поворот изображения на определенный угол (англ. ''rotation'').
*Создание отступа (''padding'').
+
*Создание отступа (англ. ''padding'').
*Вырезание части изображения (''cropping'').
+
*Вырезание части изображения (англ. ''cropping'').
*Добавление шума (''adding noise'').
+
*Добавление шума (англ. ''adding noise'').
*Манипуляции с цветом (''color jittering'').
+
*Манипуляции с цветом (англ. ''color jittering'').
 
Также, можно применять различные комбинации, к примеру, вырезать часть изображения, повернуть его и изменить цвет фона.
 
Также, можно применять различные комбинации, к примеру, вырезать часть изображения, повернуть его и изменить цвет фона.
  
Продвинутыми способами аугментации данных является семейство [[Generative Adversarial Nets (GAN) |GANs]].
+
Продвинутыми способами аугментации данных является семейство [[Generative Adversarial Nets (GAN) | порождающих состязательных сетей]].
  
 
==Дропаут==
 
==Дропаут==
Одной из проблем глубокого обучения нейронных сетей является [[Переобучение | переобучение]]. И дропаут значится как один из самых популярных способов устранения этой проблемы, благодаря своей простоте и хорошим практическим результатам.  
+
Одной из проблем глубокого обучения нейронных сетей является [[Переобучение | переобучение]]. И метод дропаут {{---}} популярный способ решения этой проблемы, благодаря простому алгоритму и хорошим практическим результатам.  
 
{{Определение
 
{{Определение
 
|definition= '''Дропаут''' (англ. ''dropout'') {{---}} метод регуляризации нейронной сети для предотвращения переобучения.}}
 
|definition= '''Дропаут''' (англ. ''dropout'') {{---}} метод регуляризации нейронной сети для предотвращения переобучения.}}
 
В обычной нейронной сети явление переобучения появляется из-за так называемой совместной адаптации (англ. ''co-adaptation''), то есть при обновлении весов нейрона, во время обучения [[Обратное распространение ошибки | методом обратного распространения ошибки]], учитывается деятельность остальных нейронов с целью минимизировать функцию потерь. Поэтому веса нейронов могут меняться, исправляя при этом ошибки других нейронов. Метод дропаута как раз предотвращает эту адаптацию.
 
В обычной нейронной сети явление переобучения появляется из-за так называемой совместной адаптации (англ. ''co-adaptation''), то есть при обновлении весов нейрона, во время обучения [[Обратное распространение ошибки | методом обратного распространения ошибки]], учитывается деятельность остальных нейронов с целью минимизировать функцию потерь. Поэтому веса нейронов могут меняться, исправляя при этом ошибки других нейронов. Метод дропаута как раз предотвращает эту адаптацию.
  
[[Файл:DropoutExample.jpeg|400px|thumb|right|Рис 2. Пример применения метода дропаут]]
+
[[Файл:NewDropoutExample.jpeg|400px|thumb|right|Рис 2. a) Стандартная нейронная сеть. <br> b) Нейронная сеть после применения дропаута.]]
===Как работает дропаут===
+
===Алгоритм дропаут===
 
Рассмотрим слой нейронной сети состоящий из <tex>H</tex> нейронов. Метод дропаут выключает нейрон с вероятностью <tex>p</tex>, соответственно, оставляет включенным с вероятностью <tex>q = 1 - p</tex>, причем вероятность выключения любого нейрона сети одинакова.
 
Рассмотрим слой нейронной сети состоящий из <tex>H</tex> нейронов. Метод дропаут выключает нейрон с вероятностью <tex>p</tex>, соответственно, оставляет включенным с вероятностью <tex>q = 1 - p</tex>, причем вероятность выключения любого нейрона сети одинакова.
  
Строка 42: Строка 42:
 
{{Определение
 
{{Определение
 
|definition= '''Функция активации''' (англ. ''activation function'') <tex>a(x)</tex> определяет выходное значение нейрона в зависимости от результата взвешенной суммы входов и порогового значения.}}
 
|definition= '''Функция активации''' (англ. ''activation function'') <tex>a(x)</tex> определяет выходное значение нейрона в зависимости от результата взвешенной суммы входов и порогового значения.}}
Рассмотрим нейрон, у которого взвешенная сумма входов: <tex>z = \sum\limits_{i} w_{i}x_{i} + bias</tex>, где <tex>w_{i}</tex> и <tex>x_{i}</tex> {{---}} вес и входное значение <tex>i</tex>-ого входа, а <tex>bias</tex> {{---}} смещение. Полученный результат передается в функцию активации, которая решает рассматривать этот нейрон как активированный, или его можно игнорировать.
+
Рассмотрим нейрон, у которого взвешенная сумма входов: <tex>z = \sum\limits_{i} w_{i}x_{i} + b</tex>, где <tex>w_{i}</tex> и <tex>x_{i}</tex> {{---}} вес и входное значение <tex>i</tex>-ого входа, а <tex>b</tex> {{---}} смещение. Полученный результат передается в функцию активации, которая решает рассматривать этот нейрон как активированный, или его можно игнорировать.
  
[[Файл:BinaryStepFunction.jpg|300px|thumb|right|Рис 3. Ступенчатая функция]]
+
[[Файл:BinaryStepFunction.jpg|200px|thumb|right|Рис 3. Ступенчатая функция]]
 
===Ступенчатая функция===
 
===Ступенчатая функция===
 
Ступенчатая функция (англ. ''binary step function'') является пороговой функцией активации.  
 
Ступенчатая функция (англ. ''binary step function'') является пороговой функцией активации.  
Строка 50: Строка 50:
 
Но она не работает, когда для классификации требуется большее число нейронов и количество возможных классов больше двух.
 
Но она не работает, когда для классификации требуется большее число нейронов и количество возможных классов больше двух.
  
[[Файл:LinearFunction.jpg|300px|thumb|right|Рис 4. Линейная функция]]
+
[[Файл:LinearFunction.jpg|200px|thumb|right|Рис 4. Линейная функция]]
 
===Линейная функция===
 
===Линейная функция===
 
Линейная функция (англ. ''linear function'') представляет собой прямую линию, то есть <tex>a(x) = \sum\limits_{i} c_{i}x_{i}</tex>, а это значит, что результат этой функции активации пропорционален переданному аргументу. В отличии от предыдущей функции, она позволяет получить диапазон значений на выходе, а не только бинарные 0 и 1, что решает проблему классификации с большим количеством классов. Но у линейной функции есть две основных проблемы:
 
Линейная функция (англ. ''linear function'') представляет собой прямую линию, то есть <tex>a(x) = \sum\limits_{i} c_{i}x_{i}</tex>, а это значит, что результат этой функции активации пропорционален переданному аргументу. В отличии от предыдущей функции, она позволяет получить диапазон значений на выходе, а не только бинарные 0 и 1, что решает проблему классификации с большим количеством классов. Но у линейной функции есть две основных проблемы:
Строка 56: Строка 56:
 
# Рассмотрим нейронную сеть с несколькими слоями с данной функцией активации. Так как для каждого слоя выходное значение линейно, то они образуют линейную комбинацию, результатом которой является линейная функция. То есть финальная функция активации на последнем слое зависит только от входных значений на первом слое. А это значит, что любое количество слоев может быть заменено всего одним слоем, и, следовательно, нет смысла создавать многослойную сеть.
 
# Рассмотрим нейронную сеть с несколькими слоями с данной функцией активации. Так как для каждого слоя выходное значение линейно, то они образуют линейную комбинацию, результатом которой является линейная функция. То есть финальная функция активации на последнем слое зависит только от входных значений на первом слое. А это значит, что любое количество слоев может быть заменено всего одним слоем, и, следовательно, нет смысла создавать многослойную сеть.
  
[[Файл:SigmoidFunction.jpg|300px|thumb|right|Рис 5. Сигмоидная функция]]
+
Главное отличие линейной функции от остальных в том, что ее область определения не ограничена: <tex>(-\infty; +\infty)</tex>. Следовательно, ее нужно использовать, когда выходное значение нейрона должно <tex>\in \mathbb R</tex>, а не ограниченному интервалу.
 +
 
 +
[[Файл:SigmoidFunction.jpg|200px|thumb|right|Рис 5. Сигмоидная функция]]
 
===Сигмоидная функция===
 
===Сигмоидная функция===
 
Сигмоидная функция (англ. ''sigmoid function''), которую также называет логистической (англ. ''logistic function''), является гладкой монотонно возрастающей нелинейной функцией: <tex>\sigma(z) = \dfrac1{1+e^{-z}}</tex>. И так как эта функция нелинейна, то ее можно использовать в нейронных сетях с множеством слоев, а также обучать эти сети методом обратного распространения ошибки. Сигмоида ограничена двумя горизонтальными асимптотами <tex>y = 1</tex> и <tex>y = 0</tex>, что дает нормализацию выходного значения каждого нейрона. Кроме того, для сигмоидной функции характерен гладкий градиент, который предотвращает "прыжки" при подсчете выходного значения. Помимо всего этого, у этой функции есть еще одно преимущество, для значений <tex>x > 2</tex> и <tex>x < -2</tex>, <tex>y</tex> "прижимается" к одной из асимптот, что позволяет делать четкие предсказания классов.
 
Сигмоидная функция (англ. ''sigmoid function''), которую также называет логистической (англ. ''logistic function''), является гладкой монотонно возрастающей нелинейной функцией: <tex>\sigma(z) = \dfrac1{1+e^{-z}}</tex>. И так как эта функция нелинейна, то ее можно использовать в нейронных сетях с множеством слоев, а также обучать эти сети методом обратного распространения ошибки. Сигмоида ограничена двумя горизонтальными асимптотами <tex>y = 1</tex> и <tex>y = 0</tex>, что дает нормализацию выходного значения каждого нейрона. Кроме того, для сигмоидной функции характерен гладкий градиент, который предотвращает "прыжки" при подсчете выходного значения. Помимо всего этого, у этой функции есть еще одно преимущество, для значений <tex>x > 2</tex> и <tex>x < -2</tex>, <tex>y</tex> "прижимается" к одной из асимптот, что позволяет делать четкие предсказания классов.
Строка 62: Строка 64:
 
Несмотря на множество сильных сторон сигмоидной функции, у нее есть значительный недостаток. Производная такой функции крайне мала во всех точках, кроме сравнительно небольшого промежутка. Это сильно усложняет процесс улучшения весов с помощью градиентного спуска. Более того, эта проблема усугубляется в случае, если модель содержит много слоев. Данная проблема называется проблемой исчезающего градиента.<ref>[https://en.wikipedia.org/wiki/Vanishing_gradient_problem Vanishing gradient problem, Wikipedia]</ref>
 
Несмотря на множество сильных сторон сигмоидной функции, у нее есть значительный недостаток. Производная такой функции крайне мала во всех точках, кроме сравнительно небольшого промежутка. Это сильно усложняет процесс улучшения весов с помощью градиентного спуска. Более того, эта проблема усугубляется в случае, если модель содержит много слоев. Данная проблема называется проблемой исчезающего градиента.<ref>[https://en.wikipedia.org/wiki/Vanishing_gradient_problem Vanishing gradient problem, Wikipedia]</ref>
  
[[Файл:TanhFunction.jpg|300px|thumb|right|Рис 6. Функция гиперболического тангенса]]
+
Что касается использования сигмоидной функции, то ее преимущество над другими {{---}} в нормализации выходного значения. Иногда, это бывает крайне необходимо. К примеру, когда итоговое значение слоя должно представлять вероятность случайной величины. Кроме того, эту функцию удобно применять при решении задачи классификации, благодаря свойству "прижимания" к асимптотам.
 +
 
 +
[[Файл:TanhFunction.jpg|200px|thumb|right|Рис 6. Функция гиперболического тангенса]]
 
===Функция гиперболического тангенса===
 
===Функция гиперболического тангенса===
Функция гиперболического тангенса (англ. ''hyperbolic tangent'') имеет вид: <tex>tanh(z) = \dfrac2{1+e^{-2z}} - 1</tex>. Эта функция является скорректированной сигмоидной функцей <tex>tanh(z) = 2 \cdot sigma(2z) - 1</tex>, то есть она сохраняет те же преимущества и недостатки, но уже для диапазона значений <tex>(-1; 1)</tex>. Основное отличие тангенциальной функции от сигмоиды состоит в том, что производная гиперболического тангенса значительно выше вблизи нуля, что дает большую амплитуду градиентному спуску.
+
Функция гиперболического тангенса (англ. ''hyperbolic tangent'') имеет вид: <tex>tanh(z) = \dfrac2{1+e^{-2z}} - 1</tex>. Эта функция является скорректированной сигмоидной функцей <tex>tanh(z) = 2 \cdot sigma(2z) - 1</tex>, то есть она сохраняет те же преимущества и недостатки, но уже для диапазона значений <tex>(-1; 1)</tex>.  
 +
 
 +
Обычно, <tex>tanh</tex> является предпочтительнее сигмоиды в случаях, когда нет необходимости в нормализации. Это происходит из-за того, что область определения данной функции активации центрирована относительно нуля, что снимает ограничение при подсчете градиента для перемещения в определенном направлении. Кроме того, производная гиперболического тангенса значительно выше вблизи нуля, давая большую амплитуду градиентному спуску, а следовательно и более быструю сходимость.
  
[[Файл:ReLuFunction.jpg|300px|thumb|right|Рис 7. Функция ReLU]]
+
[[Файл:ReLuFunction.jpg|200px|thumb|right|Рис 7. Функция ReLU]]
 
===Функция ReLU===
 
===Функция ReLU===
Rectified Linear Unit {{---}} это наиболее часто используемая активационная функция при глубоком обучении. Данная функция возвращает 0, если принимает отрицательный аргумент, в случае же положительного аргумента, функция возвращает само число. То есть она может быть записана как <tex>f(z)=max(0, z)</tex>. На первый взгляд может показаться, что она линейна и имеет те же проблемы что и линейная функция, но это не так и ее можно использовать в нейронных сетях с множеством слоев.
+
Rectified Linear Unit {{---}} это наиболее часто используемая функция активации при глубоком обучении. Данная функция возвращает 0, если принимает отрицательный аргумент, в случае же положительного аргумента, функция возвращает само число. То есть она может быть записана как <tex>f(z)=max(0, z)</tex>. На первый взгляд может показаться, что она линейна и имеет те же проблемы что и линейная функция, но это не так и ее можно использовать в нейронных сетях с множеством слоев.
 
Функция ReLU обладает несколькими преимущества перед сигмоидой и гиперболическим тангенсом:
 
Функция ReLU обладает несколькими преимущества перед сигмоидой и гиперболическим тангенсом:
 
# Очень быстро и просто считается производная. Для отрицательных значений {{---}} 0, для положительных {{---}} 1.
 
# Очень быстро и просто считается производная. Для отрицательных значений {{---}} 0, для положительных {{---}} 1.
 
# Разреженность активации. В сетях с очень большим количеством нейронов использование сигмоидной функции или гиперболического тангенса в качестве активационный функции влечет активацию почти всех нейронов, что может сказаться на производительности обучения модели. Если же использовать ReLU, то количество включаемых нейронов станет меньше, в силу характеристик функции, и сама сеть станет легче.
 
# Разреженность активации. В сетях с очень большим количеством нейронов использование сигмоидной функции или гиперболического тангенса в качестве активационный функции влечет активацию почти всех нейронов, что может сказаться на производительности обучения модели. Если же использовать ReLU, то количество включаемых нейронов станет меньше, в силу характеристик функции, и сама сеть станет легче.
 +
 
У данной функции есть один недостаток, называющийся проблемой умирающего ReLU<ref>[https://en.wikipedia.org/wiki/Rectifier_(neural_networks)#Potential_problems Dying ReLU problem, Wikipedia]</ref>. Так как часть производной функции равна нулю, то и градиент для нее будет нулевым, а то это значит, что веса не будут изменяться во время спуска и нейронная сеть перестанет обучаться.
 
У данной функции есть один недостаток, называющийся проблемой умирающего ReLU<ref>[https://en.wikipedia.org/wiki/Rectifier_(neural_networks)#Potential_problems Dying ReLU problem, Wikipedia]</ref>. Так как часть производной функции равна нулю, то и градиент для нее будет нулевым, а то это значит, что веса не будут изменяться во время спуска и нейронная сеть перестанет обучаться.
 +
 +
Функцию активации ReLU следует использовать, если нет особых требований для выходного значения нейрона, вроде неограниченной области определения. Но если после обучения модели результаты получились не оптимальные, то стоит перейти к другим функциям, которые могут дать лучший результат.
  
 
==См. также==
 
==См. также==
 +
* [[Нейронные сети, перцептрон]]
 +
* [[Глубокое обучение]]
 +
* [[Настройка глубокой сети]]
  
 
==Примечания==
 
==Примечания==
Строка 80: Строка 92:
  
 
==Источники информации==
 
==Источники информации==
 +
* [https://www.geeksforgeeks.org/python-data-augmentation/ Аугментация данных]
 +
* [https://towardsdatascience.com/data-augmentation-for-deep-learning-4fe21d1a4eb9 Аугментация данных с помощью Imgaug package]
 +
* G. E. Hinton, N. Srivastava {{---}} [https://arxiv.org/pdf/1207.0580.pdf Improving neural networks by preventing co-adaptation of feature detectors]
 +
* [https://en.wikipedia.org/wiki/Activation_function Wikipedia {{---}} Функция активации]
 +
 +
 +
[[Категория: Машинное обучение]]
 +
[[Категория: Глубокое обучение]]

Текущая версия на 23:47, 5 марта 2020

Аугментация данных[править]

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

Определение:
Аугментация данных (англ. data augmentation) — это методика создания дополнительных данных из имеющихся данных.

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

Рис 1. a) Исходное изображение. b) Отображение по горизонтали. c) Вращение. d) Отступ.
e) Увеличение яркости и контрастности. f) Вырезание.
g) Добавление шума. h) Изменение RGB каналов.
  • Отображение по вертикали или горизонтали (англ. flipping).
  • Поворот изображения на определенный угол (англ. rotation).
  • Создание отступа (англ. padding).
  • Вырезание части изображения (англ. cropping).
  • Добавление шума (англ. adding noise).
  • Манипуляции с цветом (англ. color jittering).

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

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

Дропаут[править]

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

Определение:
Дропаут (англ. dropout) — метод регуляризации нейронной сети для предотвращения переобучения.

В обычной нейронной сети явление переобучения появляется из-за так называемой совместной адаптации (англ. co-adaptation), то есть при обновлении весов нейрона, во время обучения методом обратного распространения ошибки, учитывается деятельность остальных нейронов с целью минимизировать функцию потерь. Поэтому веса нейронов могут меняться, исправляя при этом ошибки других нейронов. Метод дропаута как раз предотвращает эту адаптацию.

Рис 2. a) Стандартная нейронная сеть.
b) Нейронная сеть после применения дропаута.

Алгоритм дропаут[править]

Рассмотрим слой нейронной сети состоящий из [math]H[/math] нейронов. Метод дропаут выключает нейрон с вероятностью [math]p[/math], соответственно, оставляет включенным с вероятностью [math]q = 1 - p[/math], причем вероятность выключения любого нейрона сети одинакова.

Пусть [math]a(x)[/math] — функция активации, тогда применение дропаута для [math]i[/math]-ого нейрона выглядит так: [math]U_{i} = \Theta_{i}a(\sum\limits^{H}_{k=1} w_{k}x_{k} + b)[/math],

где вероятность [math]P(\Theta_{i}[/math][math]=[/math][math]0)[/math] [math]= p[/math].

Данная формула применяется на этапе обучения модели. Но так как на этом этапе нейрон остается в сети с вероятностью [math]q[/math], на этапе тестирования необходимо эмулировать поведение нейронной сети, использованного при обучении. Для этого результат выходного значения функции активации умножается на коэффициент [math]q[/math], то есть на этапе тестирования: [math]U_{i} = qa(\sum\limits^{H}_{k=1} w_{k}x_{k} + b)[/math].

Обратный дропаут[править]

Обратный дропаут (англ. inverted dropout) отличается от обычного тем, что умножение на коэффициент происходит на этапе обучения, причем этот коэффициент равен обратной вероятности того, что нейрон останется в сети: [math]\dfrac1{q}[/math]. А на этапе тестирования выходное значение нейрона остается таким же, как и в методе обратного распространения ошибки.

Таким образом, выходное значение [math]i[/math]-ого нейрона на этапе обучения: [math]U_{i} = \dfrac1{q}\Theta_{i}a(\sum\limits^{H}_{k=1} w_{k}x_{k} + b)[/math], на этапе тестирования: [math]U_{i} = a(\sum\limits^{H}_{k=1} w_{k}x_{k} + b)[/math].

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

Функции активации[править]

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

Определение:
Функция активации (англ. activation function) [math]a(x)[/math] определяет выходное значение нейрона в зависимости от результата взвешенной суммы входов и порогового значения.

Рассмотрим нейрон, у которого взвешенная сумма входов: [math]z = \sum\limits_{i} w_{i}x_{i} + b[/math], где [math]w_{i}[/math] и [math]x_{i}[/math] — вес и входное значение [math]i[/math]-ого входа, а [math]b[/math] — смещение. Полученный результат передается в функцию активации, которая решает рассматривать этот нейрон как активированный, или его можно игнорировать.

Рис 3. Ступенчатая функция

Ступенчатая функция[править]

Ступенчатая функция (англ. binary step function) является пороговой функцией активации. То есть если [math]z[/math] больше или меньше некоторого значения, то нейрон становится активированным. Такая функция отлично работает для бинарной классификации. Но она не работает, когда для классификации требуется большее число нейронов и количество возможных классов больше двух.

Рис 4. Линейная функция

Линейная функция[править]

Линейная функция (англ. linear function) представляет собой прямую линию, то есть [math]a(x) = \sum\limits_{i} c_{i}x_{i}[/math], а это значит, что результат этой функции активации пропорционален переданному аргументу. В отличии от предыдущей функции, она позволяет получить диапазон значений на выходе, а не только бинарные 0 и 1, что решает проблему классификации с большим количеством классов. Но у линейной функции есть две основных проблемы:

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

Главное отличие линейной функции от остальных в том, что ее область определения не ограничена: [math](-\infty; +\infty)[/math]. Следовательно, ее нужно использовать, когда выходное значение нейрона должно [math]\in \mathbb R[/math], а не ограниченному интервалу.

Рис 5. Сигмоидная функция

Сигмоидная функция[править]

Сигмоидная функция (англ. sigmoid function), которую также называет логистической (англ. logistic function), является гладкой монотонно возрастающей нелинейной функцией: [math]\sigma(z) = \dfrac1{1+e^{-z}}[/math]. И так как эта функция нелинейна, то ее можно использовать в нейронных сетях с множеством слоев, а также обучать эти сети методом обратного распространения ошибки. Сигмоида ограничена двумя горизонтальными асимптотами [math]y = 1[/math] и [math]y = 0[/math], что дает нормализацию выходного значения каждого нейрона. Кроме того, для сигмоидной функции характерен гладкий градиент, который предотвращает "прыжки" при подсчете выходного значения. Помимо всего этого, у этой функции есть еще одно преимущество, для значений [math]x \gt 2[/math] и [math]x \lt -2[/math], [math]y[/math] "прижимается" к одной из асимптот, что позволяет делать четкие предсказания классов.

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

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

Рис 6. Функция гиперболического тангенса

Функция гиперболического тангенса[править]

Функция гиперболического тангенса (англ. hyperbolic tangent) имеет вид: [math]tanh(z) = \dfrac2{1+e^{-2z}} - 1[/math]. Эта функция является скорректированной сигмоидной функцей [math]tanh(z) = 2 \cdot sigma(2z) - 1[/math], то есть она сохраняет те же преимущества и недостатки, но уже для диапазона значений [math](-1; 1)[/math].

Обычно, [math]tanh[/math] является предпочтительнее сигмоиды в случаях, когда нет необходимости в нормализации. Это происходит из-за того, что область определения данной функции активации центрирована относительно нуля, что снимает ограничение при подсчете градиента для перемещения в определенном направлении. Кроме того, производная гиперболического тангенса значительно выше вблизи нуля, давая большую амплитуду градиентному спуску, а следовательно и более быструю сходимость.

Рис 7. Функция ReLU

Функция ReLU[править]

Rectified Linear Unit — это наиболее часто используемая функция активации при глубоком обучении. Данная функция возвращает 0, если принимает отрицательный аргумент, в случае же положительного аргумента, функция возвращает само число. То есть она может быть записана как [math]f(z)=max(0, z)[/math]. На первый взгляд может показаться, что она линейна и имеет те же проблемы что и линейная функция, но это не так и ее можно использовать в нейронных сетях с множеством слоев. Функция ReLU обладает несколькими преимущества перед сигмоидой и гиперболическим тангенсом:

  1. Очень быстро и просто считается производная. Для отрицательных значений — 0, для положительных — 1.
  2. Разреженность активации. В сетях с очень большим количеством нейронов использование сигмоидной функции или гиперболического тангенса в качестве активационный функции влечет активацию почти всех нейронов, что может сказаться на производительности обучения модели. Если же использовать ReLU, то количество включаемых нейронов станет меньше, в силу характеристик функции, и сама сеть станет легче.

У данной функции есть один недостаток, называющийся проблемой умирающего ReLU[2]. Так как часть производной функции равна нулю, то и градиент для нее будет нулевым, а то это значит, что веса не будут изменяться во время спуска и нейронная сеть перестанет обучаться.

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

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

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

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