Изменения

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

Batch-normalization

5239 байт добавлено, 23:18, 30 января 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). Здесь и далее, мини-пакеты будем также называть пакетом.
===Смещение ковариацииКовариантный сдвиг===
[[Файл:covariate-shift1.png|600px|thumb|Рисунок 1. Верхние две строки роз показывают первое подмножество данных, а нижние две строки показывают другое подмножество. Два подмножества имеют разные пропорции изображения роз. На графиках показано распределение двух классов в пространстве объектов с использованием красных и зеленых точек. Синяя линия показывает границу между двумя классами. Иллюстрация из [https://www.learnopencv.com/batch-normalization-in-deep-networks/ статьи].]]
Пакетная нормализация уменьшает величину, на которую смещаются значения узлов в скрытых слоях (т.н. '''смещение [[Ковариация случайных величин|ковариацииковариантный]]сдвиг''' (англ. covariance shift)).
Ковариантный сдвиг {{---}} это ситуация, когда распределения значений признаков в обучающей и тестовой выборке имеют разные параметры (математическое ожидание, дисперсия и т.д.). Ковариантность в данном случае относится к значениям признаков. Проиллюстрируем смещение ковариации ковариантный сдвиг примером.
Пусть есть [[Глубокое обучение|глубокая нейронная сеть]], которая обучена определять находится ли на изображении роза.
И нейронная сеть была обучена на изображениях только красных роз.
Это происходит из-за того, что обучающая и тестовая выборки содержат изображения красных роз и роз различных цветов в разных пропорциях.
Другими словами, если модель обучена отображению из множества <tex>X</tex> в множество <tex>Y</tex> и если пропорция элементов в <tex>X</tex> изменяется, то появляется необходимость обучить модель заново, чтобы "выровнять" пропорции элементов в <tex>X</tex> и <tex>Y</tex>.
Когда пакеты содержат изображения разных классов, распределенные в одинаковой пропорции на всем множестве, то смещение ковариации незначительноковариантный сдвиг незначителен. Однако, когда пакеты выбираются только из одного из или двух подмножеств (в данном случае, красные розы и розы различных цветов), то смещение ковариации ковариантный сдвиг возрастает.
Это довольно сильно замедляет процесс обучения модели. На Рисунке 1 изображена разница в пропорциях.
Простой способ решить проблему смещения ковариации ковариантного сдвига для входного слоя {{---}} это случайным образом перемешать данные перед созданием пакетов.
Но для скрытых слоев нейронной сети такой метод не подходит, так как распределение входных данных для каждого узла скрытых слоев изменяется каждый раз, когда происходит обновление параметров в предыдущем слое.
Эта проблема называется '''внутренним смещением ковариацииковариантным сдвигом''' (англ. internal covariate shift). Для решения данной проблемы часто приходится использовать маленький коэффициент скорости низкий [[Стохастический градиентный спуск|темп обучения ]] (англ. learning rate) и методы [[wikipedia:ru:Регуляризация_(математика)|регуляризации ]] при обучении модели. Другим способом устранения внутреннего смещения ковариации ковариантного сдвига является метод пакетной нормализации.
===Свойства пакетной нормализации===
* достигается более быстрая сходимость моделей, несмотря на выполнение дополнительных вычислений;
* пакетная нормализация позволяет каждому слою сети обучатся более независимо от других слоев;
* становится возможным использование более высокого коэффициента скорости темпа обучения, так как пакетная нормализация гарантирует, что выходы узлов нейронной сети не будут иметь слишком больших или малых значений;* пакетная нормализация в каком-то смысле также является механизмом [[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>
Для обучения нейронных сетей необходимо вычислять [[wikipedia:ru:Градиент|градиент]] [[wikipedia:en:Loss_function|функции потерь]] <tex>l</tex>. В случае использования метода пакетной нормализации градиент вычисляется следующим образом:
<tex>\displaystyle \frac{\partial l}{\partial \hat{x}_{i}} = \frac{\partial l}{\partial y_{i}} \cdot \gamma</tex> <tex> (1)</tex> <tex>\displaystyle \frac{\partial l}{\partial \sigma_{B}^{2}} = \sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot (x_{i} - \mu_{B}) \cdot \frac{-1}{2}(\sigma_{B}^{2} + \epsilon)^{-3/2}</tex> <tex> (2)</tex> <tex>\displaystyle \frac{\partial l}{\partial \mu_{B}} = \left(\sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{-1}{\sqrt{\sigma_{B}^{2} + \epsilon}}\right) + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{\sum_{i=1}^{m}-2(x_{i}-\mu_{B})}{m}</tex> <tex> (3)</tex> <tex>\displaystyle \frac{\partial l}{\partial x_{i}} = \frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{1}{\sqrt{\sigma_{B}^{2} + \epsilon}} + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{2(x_{i}-\mu_{B})}{m} + \frac{\partial l}{\partial \mu_{B}} \cdot \frac{1}{m}</tex> <tex> (4)</tex> <tex>\displaystyle \frac{\partial l}{\partial \gamma} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}} \cdot \hat{x}_{i}</tex> <tex> (5)</tex>
<tex>\displaystyle \frac{\partial l}{\partial \sigma_{B}^{2}beta} = \sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_y_{i}} \cdot </tex> <tex> (x_{i} - \mu_{B}6) \cdot \frac{-1}{2}(\sigma_{B}^{2} + \epsilon)^{-3/2}</tex>
<tex>\displaystyle \frac{\partial l}{\partial \mu_{B}} = \left(\sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{-1}{\sqrt{\sigma_{B}^{На Рисунке 2} + \epsilon}}\right) + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{\sum_{i=1}^{m}-2(x_{i}-\mu_{B})}{m}</tex>изображен [[Настройка_глубокой_сети#Граф вычислений|граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки.
В прямом направлении, как и описано в алгоритме метода, из входа <tex>x</tex> вычисляется среднее значение по каждой размерности признакового пространства. Затем полученный вектор средних значение вычитается из каждого элемента обучающей выборки. Далее вычисляется дисперсия, и с помощью нее вычисляется знаменатель для нормализации. Затем полученное значение инвертируется и умножается на разницу входа <tex>\displaystyle \frac{\partial l}{\partial x_{i}} = \frac{\partial l}{\partial \hat{x}_{i}} </tex> и средних значений. В конце применяются параметры <tex>\cdot \frac{1}{\sqrt{\sigma_{B}^{2} + \epsilon}} + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{2(x_{i}-\mu_{B})}{m} + \frac{\partial l}{\partial \mu_{B}} \cdot gamma</tex> и <tex>\frac{1}{m}beta</tex>.
В обратном направлении вычисляются производные необходимых функций. В следующей таблице подробнее изображены шаги вычисления градиента функции потерь (иллюстрации из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи], здесь <tex>\displaystyle \frac{\partial l}{\partial \gamma} N= \sum_{im</tex> и <tex>D=1}^{m}\frac{\partial l}{\partial y_{i}} \cdot \hat{x}_{i}d</tex>):
{| cellpadding = "20" class = "wikitable"! Шаг !! Изображение !! Описание|-| style = "text-align: center" | 1|[[Файл:step9.png|300px]]|Сначала вычисляется производная по параметру <tex>\displaystyle \frac{\partial l}{\partial \beta} </tex>, как в уравнении <tex>(6)</tex>, так как к нему применяется только операции суммирования. И значение градиента выхода передается без изменений.|-| style = "text-align: center" | 2|[[Файл:step8.png|300px]]|Далее, пользуясь правилом вычисления производной при умножении, как в уравнении <tex>(5)</tex>, вычисляется градиент по параметру <tex>\sum_{igamma</tex>. Градиент выхода умножается на данную константу, получая уравнение <tex>(1)</tex>, и передается в следующий узел.|-| style = "text-align: center" | 3|[[Файл:step7.png|300px]]|Данный шаг вычисляется аналогично предыдущему, применяя правило вычисления производной при умножении.|-| style = "text-align: center" | 4|[[Файл:step6.png|300px]]|Пользуясь производной обратной величины, вычисляем следующий узел графа.|-| style =1}^{m}"text-align: center" | 5|[[Файл:step5.png|300px]]|Вычисляем производную квадратного корня с добавлением <tex>\frac{\partial l}{\partial y_{i}}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>, складывая входящие производные.|}
==Пакетная нормализация в [[Сверточные нейронные сети | свёрточных сетях]]==
Размер пакета равен <tex>60</tex>.
Сравниваются две одинаковые модели, но в первой перед каждым скрытым слоем используется пакетная нормализация, а во второй {{---}} нет.
Коэффициент скорости Темп обучения равен <tex>0.01</tex>.
Веса инициализированы значениями с малой дисперсией.
Приведем пример<ref>[https://towardsdatascience.com/batch-normalization-theory-and-how-to-use-it-with-tensorflow-1892ca0173ad Batch normalization: theory and how to use it with Tensorflow]</ref> применения пакетной нормализации с использованием библиотеки TensorFlow на языке программирования Python <ref>[https://www.python.org/ Язык программирования Python]</ref>:
'''import ''' tensorflow '''as ''' tf <font color=green># ...</font>
is_train = tf.placeholder(tf.bool, name="is_train");
<font color=green># ...</font>
x_norm = tf.layers.batch_normalization(x, training=is_train)
<font color=green># ...</font>
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
'''with ''' tf.control_dependencies(update_ops):
train_op = optimizer.minimize(loss)
==Модификации==
Существует несколько модификаций и вариаций метода пакетной нормализации:
# Тим Койманс<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-обучении]] и использование в рекуррентных нейронных сетях.
77
правок

Навигация