Изменения

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

Batch-normalization

185 байт добавлено, 20:04, 21 ноября 2019
ться
'''Пакетная нормализация''' (англ. batch-normalization) {{---}} это метод, который позволяет повысить производительность и стабилизировать работу [[Нейронные сети, перцептрон | искусственных нейронных сетей]]. Суть данного метода заключается в том, что некоторым слоям нейронной сети на вход подаются данные, предварительно обработанные и имеющие нулевое [[Математическое ожидание случайной величины|математическое ожидание]] и единичную [[Дисперсия случайной величины|дисперсию]]. Впервые данный метод был представлен в <ref>[https://arxiv.org/pdf/1502.03167.pdf Ioffe S., Szegedy C. {{---}} Batch normalization: Accelerating deep network training by reducing internal covariate shift, 2016]</ref>.
==Идея==
===Пакет===
Предварительно, напомним, что такое '''пакет''' (англ. batch). Возможны два подхода к реализации алгоритма градиентного спуска для обучения нейросетевых моделей: стохастический и пакетный<ref>[http://www.machinelearning.ru/wiki/index.php?title=Метод_стохастического_градиента Метод стохастического градиента]</ref>.
* [[Стохастический градиентный спуск|Стохастический градиентный спуск]]<sup>[на 10.01.18 не создано]</sup> (англ. stochastic gradient descent) {{---}} реализация, в которой на каждой итерации алгоритма из обучающей выборки каким-то (случайным) образом выбирается только один объект. ;
* Пакетный (батч) (англ. batch gradient descent) {{---}} реализация градиентного спуска, когда на каждой итерации обучающая выборка просматривается целиком, и только после этого изменяются веса модели.
Также существует "золотая середина" между стохастическим градиентном градиентным спуском и пакетным градиентном градиентным спуском {{---}} когда просматривается только некоторое подмножество обучающей выборки фиксированного размера (англ. batch-size). В таком случае такие подмножества принято называть мини-пакетом (англ. mini-batch). Здесь и далее, мини-пакеты будем также называть пакетом.
===Ковариантный сдвиг===
Другими словами, если модель обучена отображению из множества <tex>X</tex> в множество <tex>Y</tex> и если пропорция элементов в <tex>X</tex> изменяется, то появляется необходимость обучить модель заново, чтобы "выровнять" пропорции элементов в <tex>X</tex> и <tex>Y</tex>.
Когда пакеты содержат изображения разных классов, распределенные в одинаковой пропорции на всем множестве, то ковариантный сдвиг незначителен.
Однако, когда пакеты выбираются только из одного из или двух подмножеств (в данном случае, красные розы и розы различных цветов), то ковариантный сдвиг возрастает.
Это довольно сильно замедляет процесс обучения модели. На Рисунке 1 изображена разница в пропорциях.
Но для скрытых слоев нейронной сети такой метод не подходит, так как распределение входных данных для каждого узла скрытых слоев изменяется каждый раз, когда происходит обновление параметров в предыдущем слое.
Эта проблема называется '''внутренним ковариантным сдвигом''' (англ. internal covariate shift).
Для решения данной проблемы часто приходится использовать низкий [[Стохастический градиентный спуск|темп обучения]]<sup>[на 10.01.18 не создано]</sup> (англ. learning rate) и методы [[wikipedia:ru:Регуляризация_(математика)|регуляризации]] при обучении модели.
Другим способом устранения внутреннего ковариантного сдвига является метод пакетной нормализации.
Кроме того, использование пакетной нормализации обладает еще несколькими дополнительными полезными свойствами:
* достигается более быстрая сходимость моделей, несмотря на выполнение дополнительных вычислений;
* пакетная нормализация позволяет каждому слою сети обучатся обучаться более независимо от других слоев;
* становится возможным использование более высокого темпа обучения, так как пакетная нормализация гарантирует, что выходы узлов нейронной сети не будут иметь слишком больших или малых значений;
* пакетная нормализация в каком-то смысле также является механизмом регуляризации: данный метод привносит в выходы узлов скрытых слоев некоторый шум, аналогично методу [[Практики реализации нейронных сетей#Dropout|dropout]];
<tex>\hat{x}^{(k)} = \displaystyle \frac{x^{(k)} - E(x^{(k)})}{\sqrt{D(x^{(k)})}}</tex>,
где математическое ожидание и дисперсия считаются по всей обучающей выборке. Такая нормализация входа слоя нейронной сети может изменить представление данных в слое. Чтобы избежать данной проблемы, вводятся два параметра сжатия и сдвига нормализованной величины для каждого <tex>x_x^{(k)}</tex>: <tex>\gamma_gamma^{(k)}</tex>, <tex>\beta_beta^{(k)}</tex> {{---}} которые действуют следующим образом:
<tex>y^{(k)} = \gamma^{(k)} \hat{x}^{(k)} + \beta^{(k)}</tex>.
Данные параметры настраиваются в процессе обучения вместе с остальными [[Модель_алгоритма_и_ее_выбор|параметрами модели]].
Пусть обучение модели производится с помощью пакетов <tex>B</tex> размера <tex>m</tex>: <tex>B = \{x_{1},\ldots, x_{m}\}</tex>. Здесь нормализация применяется к каждой компоненте каждому элементу входа с номером <tex>k</tex> отдельно, поэтому в <tex>x^{(k)}</tex> индекс опускается для ясности изложения. Пусть были получены нормализованные значения пакета <tex>\hat{x}_{1},\ldots, \hat{x}_{m}</tex>. После применения операций сжатия и сдвига были получены <tex>y_{1},\ldots, y_{m}</tex>. Обозначим данную функцию пакетной нормализации следующим образом:
<tex>BN_{\gamma, \beta}: \{x_{1},\ldots, x_{m}\} \rightarrow \{y_{1},\ldots, y_{m}\}</tex>
! Шаг !! Изображение !! Описание
|-
| style = "text-align: center" |1
|[[Файл:step9.png|300px]]
|Сначала вычисляется производная по параметру <tex>\beta</tex>, как в уравнении <tex>(6)</tex>, так как к нему применяется только операции суммирования. И значение градиента выхода передается без изменений.
|-
| style = "text-align: center" |2
|[[Файл:step8.png|300px]]
|Далее, пользуясь правилом вычисления производной при умножении, как в уравнении <tex>(5)</tex>, вычисляется градиент по параметру <tex>\gamma</tex>. Градиент выхода умножается на данную константу, получая уравнение <tex>(1)</tex>, и передается в следующий узел.
|-
| style = "text-align: center" |3
|[[Файл:step7.png|300px]]
|Данный шаг вычисляется аналогично предыдущему, применяя правило вычисления производной при умножении.
|-
| style = "text-align: center" |4
|[[Файл:step6.png|300px]]
|Пользуясь производной обратной величины, вычисляем следующий узел графа.
|-
| style = "text-align: center" |5
|[[Файл:step5.png|300px]]
|Вычисляем производную квадратного корня с добавлением <tex>\epsilon</tex>.
|-
| style = "text-align: center" |6
|[[Файл:step4.png|300px]]
|Вычисляем производную суммы по всем компонентам входного вектора, получая матрицу.
|-
| style = "text-align: center" |7
|[[Файл:step3.png|300px]]
|Получаем производную квадрата входящей функции.
|-
| style = "text-align: center" |8
|[[Файл:step2.png|300px]]
|На данном шаге в одном узле сходятся ветки, поэтому полученные производные просто складываются, получая уравнение <tex>(2)</tex> для производной по дисперсии.
|-
| style = "text-align: center" |9
|[[Файл:step1.png|300px]]
|Аналогично шагу 6 вычисляем матрицу по сумме для производной по математическому ожиданию, получая формулу <tex>(3)</tex>.
|-
| style = "text-align: center" |10
|[[Файл:step0.png|300px]]
|В начальной вершине получаем уравнение <tex>(4)</tex>, складывая входящие производные.
==Модификации==
Существует несколько модификаций и вариаций метода пакетной нормализации:
# Тим Койманс<ref>[https://arxiv.org/pdf/1603.09025.pdf Cooijmans T. {{---}} Recurrent batch normalization, 2016]</ref> в 2016 г. предложил способ применения пакетной нормализации к [[Рекуррентные нейронные сети|рекуррентным нейронным сетям]]<sup>[на 10.01.18 не создан]</sup>.;# Расширение метода пакетной нормализации было предложено Ликси Хуангом<ref>[https://arxiv.org/pdf/1804.08450.pdf Huang L. {{---}} Decorrelated Batch Normalization, 2018]</ref> в 2018 г. Метод получил название декоррелированная пакетная нормализация (англ. Decorrelated Batch Normalization). В данном методе кроме операций масштабирования и сдвига была предложено использование специальной функции затирания данных. ; # Джимми Лей Ба<ref>[https://arxiv.org/pdf/1607.06450.pdf Ba J. L., Kiros J. R., Hinton G. E. {{---}} Layer normalization, 2016]</ref> в 2016 г. предложил метод нормализации слоев (англ. Layer Normalization), который решает проблему выбора размера пакета.;# В работе Сергея Иоффе<ref>[https://arxiv.org/pdf/1702.03275.pdf Ioffe S. {{---}} Batch renormalization: Towards reducing minibatch dependence in batch-normalized models, 2017]</ref> в 2017 г. было представлено расширение метода пакетной нормализации: пакетная ренормализация (англ. Batch Renormalization). Данный метод улучшает пакетную нормализацию, когда размер пакетов мал и не состоит из независимых данных.;
# Метод потоковой нормализации (англ. Streaming Normalization) был предложен Кифэном Ляо<ref>[https://arxiv.org/pdf/1610.06160.pdf Liao Q., Kawaguchi K., Poggio T. {{---}} Streaming normalization: Towards simpler and more biologically-plausible normalizations for online and recurrent learning, 2016]</ref> в 2016 г. Данный метод убирает два ограничения пакетной нормализации: использование при [[wikipedia:ru:Онлайновое_обучение_машин|online-обучении]] и использование в рекуррентных нейронных сетях.
Анонимный участник

Навигация