Изменения

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

Практики реализации нейронных сетей

19 337 байт добавлено, 18:39, 3 января 2021
Функция Leaky ReLU
== Аугментация данных ==При глубоком обучении иногда можно столкнуться с ситуацией, когда набор данных имеет ограниченный размер. Но чтобы получить лучшие результаты обобщение модели, необходимо иметь больше данных, в том числе и различные их вариации. То есть необходимо увеличить размер исходного набора искусственным образом, и это можно сделать с помощью аугментации данных.{{Определение|definition= '''Аугментация данных''' (англ. ''data augmentation'') {{---}} это методика создания дополнительных данных из имеющихся данных.}}Чаще всего, проблема ограниченного набора данных возникает при решении задач, связанных с обработкой изображений. Следующие способы аугментации изображений являются самыми популярными:[[Файл:Augmentation.png|400px|thumb|right|Рис 1. a) Исходное изображение. b) Отображение по горизонтали. c) Вращение. d) Отступ. <br> e) Увеличение яркости и контрастности. f) Вырезание. <br> g) Добавление шума. h) Изменение RGB каналов.]]*Отображение по вертикали или горизонтали (англ. ''flipping'').*Поворот изображения на определенный угол (англ. ''rotation'').*Создание отступа (англ. ''padding'').*Вырезание части изображения (англ. ''cropping'').*Добавление шума (англ. ''adding noise'').*Манипуляции с цветом (англ. ''color jittering'').Также, можно применять различные комбинации, к примеру, вырезать часть изображения, повернуть его и изменить цвет фона. Продвинутыми способами аугментации данных является семейство [[Generative Adversarial Nets (GAN) | порождающих состязательных сетей]]. == Дропаут ==Одной из проблем глубокого обучения нейронных сетей является [[Переобучение | переобучение]]. И метод дропаут {{---}} популярный способ решения этой проблемы, благодаря простому алгоритму и хорошим практическим результатам. {{Определение|definition= '''Дропаут''' (англ. ''dropout'') {{---}} метод регуляризации нейронной сети для предотвращения переобучения.}}В обычной нейронной сети явление переобучения появляется из-за так называемой совместной адаптации (англ. ''co-adaptation''), то есть при обновлении весов нейрона, во время обучения [[Обратное распространение ошибки | методом обратного распространения ошибки]], учитывается деятельность остальных нейронов с целью минимизировать функцию потерь. Поэтому веса нейронов могут меняться, исправляя при этом ошибки других нейронов. Метод дропаута как раз предотвращает эту адаптацию. [[Файл:NewDropoutExample.jpeg|400px|thumb|right|Рис 2. a) Стандартная нейронная сеть. <br> b) Нейронная сеть после применения дропаута.]]===Алгоритм дропаут===Рассмотрим слой нейронной сети состоящий из <tex>H</tex> нейронов. Метод дропаут выключает нейрон с вероятностью <tex>p</tex>, соответственно, оставляет включенным с вероятностью <tex>q = 1 - p</tex>, причем вероятность выключения любого нейрона сети одинакова. Пусть <tex>a(x)</tex> {{---}} функция активации, тогда применение дропаута для <tex>i</tex>-ого нейрона выглядит так: <tex>U_{i} = \Theta_{i}a(\sum\limits^{H}_{k=1} w_{k}x_{k} + b)</tex>, где вероятность <tex>P(\Theta_{i}</tex><tex>=</tex><tex>0)</tex> <tex>= p</tex>. Данная формула применяется на этапе обучения модели. Но так как на этом этапе нейрон остается в сети с вероятностью <tex>q</tex>, на этапе тестирования необходимо эмулировать поведение нейронной сети, использованного при обучении. Для этого результат выходного значения функции активации умножается на коэффициент <tex>q</tex>, то есть на этапе тестирования: <tex>U_{i} = qa(\sum\limits^{H}_{k=1} w_{k}x_{k} + b)</tex>.===Обратный дропаут===Обратный дропаут (англ. ''inverted dropout'') отличается от обычного тем, что умножение на коэффициент происходит на этапе обучения, причем этот коэффициент равен обратной вероятности того, что нейрон останется в сети: <tex>\dfrac1{q}</tex>. А на этапе тестирования выходное значение нейрона остается таким же, как и в методе обратного распространения ошибки.  Таким образом, выходное значение <tex>i</tex>-ого нейрона на этапе обучения: <tex>U_{i} = \dfrac1{q}\Theta_{i}a(\sum\limits^{H}_{k=1} w_{k}x_{k} + b)</tex>, на этапе тестирования: <tex>U_{i} = a(\sum\limits^{H}_{k=1} w_{k}x_{k} + b)</tex>. Обратная модификация дропаута на практике используется чаще обычной, потому что в ней не нужно менять каждый раз модель для проведения этапа тестирования. == Функции активации ==
Одним из важнейших аспектов глубокой нейронной сети являются функции активации.
{{Определение
|definition= '''Функция активации''' (англ. ''activation function'') <tex>a(x)</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|200px|thumb|right|Рис 3. Ступенчатая функция]]===Ступенчатая функция===Ступенчатая функция (англ. ''binary step function'') является пороговой функцией активации. То есть если <tex>z</tex> больше или меньше некоторого значения, то нейрон становится активированным. Такая функция отлично работает для бинарной классификации. Но она не работает, когда для классификации требуется большее число нейронов и количество возможных классов больше двух.
[[Файл:LinearFunction.jpg|200px|thumb|right|Рис 4. Линейная функция]]=== Sigmoid function Линейная функция===У ступенчатых функций есть определенное количество ограничений, связанных с ее линейностьюЛинейная функция (англ. Если функция активации является линейной''linear function'') представляет собой прямую линию, то независимо от количества складываемых скрытых слоев в нейронной сетиесть <tex>a(x) = \sum\limits_{i} c_{i}x_{i}</tex>, а это значит, конечный что результат по-прежнему будет являться линейной комбинацией исходных входных данныхэтой функции активации пропорционален переданному аргументу. Эта линейность означаетВ отличии от предыдущей функции, что она позволяет получить диапазон значений на выходе, а не может реально охватить сложность нелинейных задачтолько бинарные 0 и 1, таких что решает проблему классификации с большим количеством классов. Но у линейной функции есть две основных проблемы:# Невозможность использования метода обратного распространения ошибки. Так как оператор XOR или различные паттерныв основе этого метода обучения лежит [[Стохастический градиентный спуск | градиентный спуск]], а для того чтобы его найти, нужно взять производную, разделенные кривыми которая для данной функции активации {{---}} константа и не зависит от входных значений. То есть при обновлении весов нельзя сказать улучшается ли эмпирический риск на текущем шаге или кругаминет. Другой проблемой является то, что перцептрон # Рассмотрим нейронную сеть с несколькими слоями с ступенчатой ​​функцией не очень «стабилен»данной функцией активации. Так как для каждого слоя выходное значение линейно, то они образуют линейную комбинацию, результатом которой является линейная функция. То есть финальная функция активации на последнем слое зависит только от входных значений на первом слое. А это значит, что любое количество слоев может перейти из состояния 0 в 1 быть заменено всего одним слоем, и из 0 в 1 при небольших изменениях в любом из весов входного слоя, следовательно, нет смысла создавать многослойную сеть.
Для тогоГлавное отличие линейной функции от остальных в том, чтобы избежать данных проблемчто ее область определения не ограничена: <tex>(-\infty; +\infty)</tex>. Следовательно, в нейронных сетях используется sigmoid функция в качестве активационнойее нужно использовать, когда выходное значение нейрона должно <tex>\in \mathbb R</tex>, а не ограниченному интервалу.
[[Файл:sigmoid_functionSigmoidFunction.pngjpg|border|500px200px|thumb|centerright|Рис 15. Sigmoid FunctionСигмоидная функция]]===Сигмоидная функция===Сигмоидная функция (англ. ''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Несмотря на множество сильных сторон сигмоидной функции, в отличие от ступенчатой ​​функции, вводит нелинейность в выбранную модель нейронной сетиу нее есть значительный недостаток. Нелинейность означает, что выход, получаемый из нейрона произведением некоторых входов <math>x (x_1, x_2Производная такой функции крайне мала во всех точках, кроме сравнительно небольшого промежутка.Это сильно усложняет процесс улучшения весов с помощью градиентного спуска..Более того, x_m)</math> и весов <math>w (w_1, w_2эта проблема усугубляется в случае, если модель содержит много слоев.Данная проблема называется проблемой исчезающего градиента.., w_m)<ref>[https:/math> плюс смещение, преобразованный sigmoid функцией, не может быть представлен ​​линейной комбинацией входов <math>x (x_1, x_2, ./en.wikipedia.org/wiki/Vanishing_gradient_problem Vanishing gradient problem, x_m)Wikipedia]</mathref>.
=== Rectified Linear Units (ReLU) ===Несмотря на множество сильных сторон sigmoid Что касается использования сигмоидной функции, у нее есть значительные недостаткито ее преимущество над другими {{---}} в нормализации выходного значения. Производная такой функции Иногда, это бывает крайне мала во всех точкахнеобходимо. К примеру, кроме сравнительно небольшого промежуткакогда итоговое значение слоя должно представлять вероятность случайной величины. Это сильно усложняет процесс улучшения весов с помощью градиентного спуска. Эта проблема усугубляется в случаеКроме того, эту функцию удобно применять при решении задачи классификации, если модель содержит больше слоевблагодаря свойству "прижимания" к асимптотам. Данная проблема называется проблемой исчезающего градиента.<ref>[https://en.wikipedia.org/wiki/Vanishing_gradient_problem Vanishing gradient problem, Wikipedia]</ref>
[[Файл:TanhFunction.jpg|200px|thumb|right|Рис 6. Функция ReLU гиперболического тангенса]]===Функция гиперболического тангенса===Функция гиперболического тангенса (англ. ''hyperbolic tangent'') имеет производную равную 0 для всех отрицательных значениях и вид: <tex>tanh(z) = \dfrac2{1+e^{-2z}} - 1 для положительных</tex>. Таким образомЭта функция является скорректированной сигмоидной функцей <tex>tanh(z) = 2 \cdot sigma(2z) - 1</tex>, когда обучение происходит на датасетах разумного размера, обычно находятся точки данныхто есть она сохраняет те же преимущества и недостатки, дающие положительные значения но уже для любого выбранного узла. Таким образом, средняя производная редко бывает близка к 0, что позволяет продолжать градиентный спускдиапазона значений <tex>(-1; 1)</tex>.
''Rectified Linear Unit'' {{Обычно, <tex>tanh</tex> является предпочтительнее сигмоиды в случаях, когда нет необходимости в нормализации. Это происходит из---}} это наиболее часто используемая активационная функция за того, что область определения данной функции активации центрирована относительно нуля, что снимает ограничение при глубоком обученииподсчете градиента для перемещения в определенном направлении. Данная функция возвращает 0Кроме того, если принимает отрицательный входпроизводная гиперболического тангенса значительно выше вблизи нуля, в случае же положительного входадавая большую амплитуду градиентному спуску, функция возвращает само число. Таким образом функция может быть записана как <math>f(x)=max(0,x)</math>а следовательно и более быструю сходимость.
[[Файл:ReluReLuFunction.pngjpg|500px200px|thumb|centerright|Рис 27. Функция ReLU]]===Функция ReLU===Rectified Linear Units]]Unit {{---}} это наиболее часто используемая функция активации при глубоком обучении. Данная функция возвращает 0, если принимает отрицательный аргумент, в случае же положительного аргумента, функция возвращает само число. То есть она может быть записана как <tex>f(z)=max(0, z)</tex>. На первый взгляд может показаться, что она линейна и имеет те же проблемы что и линейная функция, но это не так и ее можно использовать в нейронных сетях с множеством слоев.Функция ReLU обладает несколькими преимущества перед сигмоидой и гиперболическим тангенсом:# Очень быстро и просто считается производная. Для отрицательных значений {{---}} 0, для положительных {{---}} 1.# Разреженность активации. В сетях с очень большим количеством нейронов использование сигмоидной функции или гиперболического тангенса в качестве активационный функции влечет активацию почти всех нейронов, что может сказаться на производительности обучения модели. Если же использовать ReLU, то количество включаемых нейронов станет меньше, в силу характеристик функции, и сама сеть станет легче.
Функция У данной функции есть один недостаток, называющийся проблемой умирающего ReLU<ref>[https://en.wikipedia.org/wiki/Rectifier_(neural_networks)#Potential_problems Dying ReLU отлично работает в большинстве приложенийproblem, в результате чего она получила широкое распространениеWikipedia]</ref>. Данная функция позволяет правильно учитывать нелинейности Так как часть производной функции равна нулю, то и градиент для нее будет нулевым, а то это значит, что веса не будут изменяться во время спуска и взаимодействиянейронная сеть перестанет обучаться.
=== Tanh function ===Функцию активации ReLU следует использовать, если нет особых требований для выходного значения нейрона, вроде неограниченной области определения. Но если после обучения модели результаты получились не оптимальные, то стоит перейти к другим функциям, которые могут дать лучший результат.
[[Файл:LReLuFunction.jpg|200px|thumb|right|Рис 8. Функция Leaky ReLU]]===Функция Leaky ReLU===Одной из проблем стандартного ReLU является затухающий, а именно нулевой, градиент при отрицательных значениях. При использовании обычного ReLU некоторые нейроны умирают, а отследить умирание нейронов не просто. Чтобы решить эту проблему иногда используется подход ReLU с «утечкой» (leak) {{---}} график функции активации на отрицательных значениях образует не горизонтальную прямую, а наклонную, с маленьким угловым коэффициентом (порядка 0,01). То есть она может быть записана как <tex>\begin{equation}f(x) = См\begin{cases}0. 01x, & \text{if}\ x < 0 \\x, & \text{otherwise} \\\end{cases}\end{equation}</tex>. Такое небольшое отрицательное значение помогает добиться ненулевого градиента при отрицательных значениях. Однако, функция Leaky ReLU имеет некоторые недостатки:# Сложнее считать производную, по сравнению со стандартным подходом (так как значения уже не равны нулю), что замедляет работу каждой эпохи.# Угловой коэффициент прямой также==является гиперпараметром, который надо настраивать.# На практике, результат не всегда сильно улучшается относительно ReLU.Стоит отметить, что помимо проблемы умирающих нейронов, у ReLU есть и другая {{---}} проблема [[Затухающий градиент | затухающего градиента]]<sup>[на 03.01.20 не создан]</sup>. При слишком большом количестве слоев градиент будет принимать очень маленькое значение, постепенно уменьшаясь до нуля. Из-за этого нейронная сеть работает нестабильно и неправильно. Leaky ReLU (LReLU) решает первую проблему, но в по-настоящему глубоких сетях проблема затухания градиента все еще встречается и при использовании этого подхода.
На практике LReLU используется не так часто. Практический результат использования LReLU вместо ReLU отличается не слишком сильно. Однако в случае использования Leaky требуется дополнительно настраивать гиперпараметр (уровень наклона при отрицательных значениях), что требует определенных усилий. Еще одной проблемой является то, что результат LReLU не всегда лучше чем при использовании обычного ReLU, поэтому чаще всего такой подход используют как альтернатива. Довольно часто на практике используется PReLU (Parametric ReLU), который позволяет добиться более значительных улучшений по сравнению с ReLU и LReLU. Также, в случае параметрической модификации ReLU, угол наклона не является гиперпараметром и настраивается нейросетью. ==См. также==* [[Нейронные сети, перцептрон]]* [[Глубокое обучение]]* [[Настройка глубокой сети]] == Примечания ==
<references />
== Источники информации ==* [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 {{---}} Функция активации]  [[Категория: Машинное обучение]][[Категория: Глубокое обучение]]
101
правка

Навигация