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

Материал из Викиконспекты
Перейти к: навигация, поиск
(augmentation part 1)
(augmentation part 2)
Строка 4: Строка 4:
 
|definition= '''Аугментация данных''' (англ. ''data augmentation'') {{---}} это методика создания дополнительных данных из имеющихся данных.}}
 
|definition= '''Аугментация данных''' (англ. ''data augmentation'') {{---}} это методика создания дополнительных данных из имеющихся данных.}}
 
Чаще всего, проблема ограниченного датасета возникает при решении задач, связанных с обработкой изображений. Следующие способы аугментации изображений являются самыми популярными:
 
Чаще всего, проблема ограниченного датасета возникает при решении задач, связанных с обработкой изображений. Следующие способы аугментации изображений являются самыми популярными:
*Отображение (''flipping'') по вертикали или горизонтали.
+
[[Файл:BasicAugmentation.png|500px|thumb|right|Рис 1. Data augmentation example]]
*Поворот(''rotation'') изображения на определенный угол.
+
*Отображение по вертикали или горизонтали (''flipping'').
*Создание (''padding'')отступа
+
*Поворот изображения на определенный угол (''rotation'').
* (''cropping'') подрезка изображения
+
*Создание отступа (''padding'').
*Добавление шума
+
*Вырезание части изображения (''cropping'').
*Манипуляции с цветом (''color jettiring'')
+
*Добавление шума (''adding noise'').
Также, можно применять различные комбинации, к примеру, вырезать часть изображения и повернуть его.
+
*Манипуляции с цветом (''color jittering'').
 +
Также, можно применять различные комбинации, к примеру, вырезать часть изображения, повернуть его и изменить цвет фона.
 +
 
 +
Продвинутыми способами аугментации данных является семейство [[Generative Adversarial Nets (GAN) |GANs]].
  
 
==Дропаут==
 
==Дропаут==
Строка 19: Строка 22:
 
Рассмотрим нейрон Z с выходным значением <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> {{---}} смещение. Полученный результат передается в функцию активации, которая решает рассматривать этот нейрон как активированный, или его можно игнорировать.
 
Рассмотрим нейрон Z с выходным значением <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> {{---}} смещение. Полученный результат передается в функцию активации, которая решает рассматривать этот нейрон как активированный, или его можно игнорировать.
  
[[Файл:BinaryStepFunction.jpg|300px|thumb|right|Рис 1. Binary step function]]
+
[[Файл:BinaryStepFunction.jpg|300px|thumb|right|Рис 2. Binary step function]]
 
===Ступенчатая функция===
 
===Ступенчатая функция===
 
Ступенчатая функция (англ. ''binary step function'') является пороговой функцией активации.  
 
Ступенчатая функция (англ. ''binary step function'') является пороговой функцией активации.  
Строка 25: Строка 28:
 
Но она не работает, когда для классификации требуется большее число нейронов и количество возможных классов больше двух.
 
Но она не работает, когда для классификации требуется большее число нейронов и количество возможных классов больше двух.
  
[[Файл:LinearFunction.jpg|300px|thumb|right|Рис 2. Linear function]]
+
[[Файл:LinearFunction.jpg|300px|thumb|right|Рис 3. Linear function]]
 
===Линейная функция===
 
===Линейная функция===
 
Линейная функция (англ. ''linear function'') представляет собой прямую линию, то есть <tex>Z = \sum\limits_{i} w_{i}x_{i}</tex>, а это значит, что выходное значение этой функции активации пропорционально входному. В отличии от предыдущей функции, она позволяет получить диапазон значений на выходе, а не только бинарные 0 и 1, что решает проблему классификации с большим количеством классов. Но у линейной функции есть две основных проблемы:
 
Линейная функция (англ. ''linear function'') представляет собой прямую линию, то есть <tex>Z = \sum\limits_{i} w_{i}x_{i}</tex>, а это значит, что выходное значение этой функции активации пропорционально входному. В отличии от предыдущей функции, она позволяет получить диапазон значений на выходе, а не только бинарные 0 и 1, что решает проблему классификации с большим количеством классов. Но у линейной функции есть две основных проблемы:
Строка 31: Строка 34:
 
# Рассмотрим нейронную сеть с несколькими слоями с данной функцией активации. Так как для каждого слоя выходное значение линейно, то они образуют линейную комбинацию, результат которой является линейной функцией. То есть финальная функция активации на последнем слое зависит только от входных значений на первом слое. Это значит, что любое количество слоев может быть заменено всего одним слоем.
 
# Рассмотрим нейронную сеть с несколькими слоями с данной функцией активации. Так как для каждого слоя выходное значение линейно, то они образуют линейную комбинацию, результат которой является линейной функцией. То есть финальная функция активации на последнем слое зависит только от входных значений на первом слое. Это значит, что любое количество слоев может быть заменено всего одним слоем.
  
[[Файл:SigmoidFunction.jpg|300px|thumb|right|Рис 3. Sigmoid function]]
+
[[Файл:SigmoidFunction.jpg|300px|thumb|right|Рис 4. Sigmoid function]]
 
===Сигмоидная функция===
 
===Сигмоидная функция===
 
Сигмоидная функция (англ. ''sigmoid function''), которую также называет логистической функцией (англ. ''logistic function''), является гладкой монотонно возрастающей нелинейной функцией {{---}} <tex>\sigma(z) = \frac1{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) = \frac1{1+e^{-z}}</tex>. И так как эта функция нелинейна, то ее можно использовать в нейронных сетях с множеством слоев, а также обучать эти сети методом обратного распространения ошибки. Сигмоида ограничена двумя горизонтальными асимптотами <tex>y = 1</tex> и <tex>y = 0</tex>, что дает нормализацию выходного значения каждого нейрона. Кроме того, для сигмоидной функции характерен гладкий градиент, который предотвращает "прыжки" при подсчете выходного значения. У этой функции есть еще одно преимущество, для значений <tex>x > 2</tex> и <tex>x < -2</tex>, <tex>y</tex> "прижимается" к одной из асимптот, что позволяет делать четкие предсказания классов.
Строка 37: Строка 40:
 
Несмотря на множество сильных сторон сигмоидной функции, у нее есть значительные недостатки. Производная такой функции крайне мала во всех точках, кроме сравнительно небольшого промежутка. Это сильно усложняет процесс улучшения весов с помощью градиентного спуска. Более того, эта проблема усугубляется в случае, если модель содержит много слоев. Данная проблема называется проблемой исчезающего градиента.<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|Рис 4. Tanh function]]
+
[[Файл:TanhFunction.jpg|300px|thumb|right|Рис 5. Tanh function]]
 
===Функция гиперболического тангенса===
 
===Функция гиперболического тангенса===
 
Функция гиперболического тангенса (англ. ''hyperbolic tangent'') имеет вид {{---}} <tex>tanh(z) = \frac2{1+e^{-2z}} - 1</tex>. Эта функция является скорректированной сигмоидной функцей <tex>tanh(z) = 2 \cdot sigma(2z) - 1</tex>, то есть она сохраняет те же преимущества и недостатки, но уже для диапазона значений <tex>(-1; 1)</tex>.
 
Функция гиперболического тангенса (англ. ''hyperbolic tangent'') имеет вид {{---}} <tex>tanh(z) = \frac2{1+e^{-2z}} - 1</tex>. Эта функция является скорректированной сигмоидной функцей <tex>tanh(z) = 2 \cdot sigma(2z) - 1</tex>, то есть она сохраняет те же преимущества и недостатки, но уже для диапазона значений <tex>(-1; 1)</tex>.
  
[[Файл:ReLuFunction.jpg|300px|thumb|right|Рис 5. ReLU]]
+
[[Файл:ReLuFunction.jpg|300px|thumb|right|Рис 6. 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>. На первый взгляд может показаться, что она линейна и имеет те же проблемы что и линейная функция, но это не так и ее можно использовать в нейронных сетях с множеством слоев.

Версия 01:39, 1 марта 2020

Аугментация данных

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

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

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

Рис 1. Data augmentation example
  • Отображение по вертикали или горизонтали (flipping).
  • Поворот изображения на определенный угол (rotation).
  • Создание отступа (padding).
  • Вырезание части изображения (cropping).
  • Добавление шума (adding noise).
  • Манипуляции с цветом (color jittering).

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

Продвинутыми способами аугментации данных является семейство GANs.

Дропаут

Функции активации

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

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

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

Рис 2. Binary step function

Ступенчатая функция

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

Рис 3. Linear function

Линейная функция

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

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

Сигмоидная функция

Сигмоидная функция (англ. sigmoid function), которую также называет логистической функцией (англ. logistic function), является гладкой монотонно возрастающей нелинейной функцией — [math]\sigma(z) = \frac1{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]

Рис 5. Tanh function

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

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

Рис 6. ReLU

ReLU

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

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

У данной функции есть один недостаток, называющийся "Проблемой умирающего ReLU" (Dying ReLu problem). Так как часть производной функции равна нулю, то и градиент для нее будет нулевым, а то это значит, что веса не будут изменяться во время спуска и нейронная сеть перестанет обучаться.

См. также

Примечания

Источники информации