Изменения

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

Batch-normalization

19 567 байт добавлено, 19:19, 4 сентября 2022
м
rollbackEdits.php mass rollback
'''Нормализация батчейПакетная нормализация''' (англ. batch-normalization) {{---}} это метод, который позволяет повысить производительность и стабилизировать работу [[Нейронные сети, перцептрон | искусственных нейронных сетей]]<sup>[на 10.01.18 не создан]</sup>. Суть данного метода заключается в том, что некоторым слоям нейронной сети на вход подаются данные, предварительно обработанные и имеющие нулевое [[Математическое ожидание случайной величины|математическое ожидание]] и единичную [[Дисперсия случайной величины|дисперсию]]. Впервые данный метод был представлен в <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>.
==Идея==
[[Файл:covariate-shift1.png|600px|thumb|Рисунок 1. Верхние две строки роз показывают первое подмножество данных, а нижние две строки показывают другое подмножество данных. Данные подмножества имеют довольно различные распределения. На графиках показано распределение двух классов в пространстве объектов с использованием красных и зеленых точек. Синяя линия показывает границу между двумя классами.]]Нормализация входного слоя нейронной сети обычно выполняется путем масштабирования данных, подаваемых в функции активации. Например, когда есть признаки со значениями от <tex>0</tex> до <tex>1</tex> и некоторые признаки со значениями от <tex>1</tex> до <tex>1000</tex>, то их необходимо нормализовать, чтобы ускорить обучение. То же самое Нормализацию данных можно сделать выполнить и для в скрытых слоев слоях нейронных сетей, что и делает нормализация батчейметод пакетной нормализации.===Пакет===Предварительно, напомним, что такое '''пакет''' (англ. batch). Возможны два подхода к реализации алгоритма градиентного спуска для обучения нейросетевых моделей: стохастический и пакетный<ref>[http://www.machinelearning.ru/wiki/index.php?title=Метод_стохастического_градиента Метод стохастического градиента]</ref>.* [[Стохастический градиентный спуск|Стохастический градиентный спуск]] (англ. stochastic gradient descent) {{---}} реализация, в которой на каждой итерации алгоритма из обучающей выборки каким-то (случайным) образом выбирается только один объект;* Пакетный (батч) (англ. batch gradient descent) {{---}} реализация градиентного спуска, когда на каждой итерации обучающая выборка просматривается целиком, и только после этого изменяются веса модели.
Предварительно, напомним, что такое батч (англ. batch). Пакетный (батч) [[Стохастический градиентный спуск|градиентный спуск]]<sup>[на 10.01.18 не создано]</sup> {{---}} реализация градиентного спуска, когда на каждой итерации обучающая выборка просматривается целиком, и только после этого изменяются веса модели. Также существует "золотая середина" между стохастическим градиентном градиентным спуском и пакетным градиентном градиентным спуском {{---}} когда просматривается только некоторое подмножество обучающей выборки фиксированного размера (англ. batch-size). В таком случае такие подмножества принято называть мини-батчем пакетом (англ. mini-batch). Здесь и далее, мини-батчи пакеты будем также называть батчемпакетом.
Нормализация батчей ===Ковариантный сдвиг===[[Файл:covariate-shift1.png|600px|thumb|Рисунок <tex>1</tex>. Верхние две строки роз показывают первое подмножество данных, а нижние две строки показывают другое подмножество. Два подмножества имеют разные пропорции изображения роз. На графиках показано распределение двух классов в пространстве объектов с использованием красных и зеленых точек. Синяя линия показывает границу между двумя классами. Иллюстрация из [https://www.learnopencv.com/batch-normalization-in-deep-networks/ статьи].]]Пакетная нормализация уменьшает величину, на которую смещаются значения узлов в скрытых слоях (т.н. '''смещение [[Ковариация случайных величин|ковариацииковариантный]]сдвиг''' (англ. covariance shift)). Проиллюстрируем смещение ковариации примером. Пусть, есть [[Глубокое обучение|глубокая нейронная сеть]], которая обучена определять находится ли на изображении роза. И нейронная сеть была обучена на изображении только красных роз. Теперь, если попытаться использовать обученную модель для обнаружения цветных роз, то, очевидно, результат будет неудовлетворительный. Обучающая и тестовая выборки содержат изображения роз, но немного отличаются. Другими словами, если модель обучена отображению из множества <tex>X</tex> в множество <tex>Y</tex> и если [[wikipedia:ru:Распределение_вероятностей|распределение]] элементов в <tex>X</tex> изменяется, то появляется необходимость обучить модель заново, чтобы "выровнять" распределение элементов в <tex>X</tex> и <tex>Y</tex>. Когда батчи содержат изображения, равномерно-распределенные на всем множестве, то смещение ковариации незначительно. Однако, когда батчи выбираются только из одного из двух подмножеств (в данном случае, красные розы и цветные розы), то смещение ковариации возрастает. Это довольно сильно замедляет процесс обучения модели. На Рисунке 1 изображена разница в распределениях.
Простой способ решить проблему смещения ковариации для входного слоя Ковариантный сдвиг {{---}} это случайным образом перемешать данные перед созданием батчей. Но для скрытых слоев нейронной сети данный метод не подходит, так как распределение входных данных для каждого узла скрытых слоев изменяется каждый разситуация, когда происходит обновление параметров распределения значений признаков в предыдущем слоеобучающей и тестовой выборке имеют разные параметры (математическое ожидание, дисперсия и т. Данная проблема называется '''внутренним смещением ковариации''' (англд. internal covariate shift). Для решения этой проблемы необходимо использовать маленький коэффициент скорости обучения и методы регуляризации. Но, для решения данной проблемы как раз и был придуман метод нормализация батчейКовариантность в данном случае относится к значениям признаков.
Проиллюстрируем ковариантный сдвиг примером.Пусть есть [[Глубокое обучение|глубокая нейронная сеть]], которая обучена определять находится ли на изображении роза.И нейронная сеть была обучена на изображениях только красных роз.Теперь, если попытаться использовать обученную модель для обнаружения роз различных цветов, то, очевидно, точность работы модели будет неудовлетворительной.Это происходит из-за того, что обучающая и тестовая выборки содержат изображения красных роз и роз различных цветов в разных пропорциях.Другими словами, если модель обучена отображению из множества <tex>X</tex> в множество <tex>Y</tex> и если пропорция элементов в <tex>X</tex> изменяется, то появляется необходимость обучить модель заново, чтобы "выровнять" пропорции элементов в <tex>X</tex> и <tex>Y</tex>.Когда пакеты содержат изображения разных классов, распределенные в одинаковой пропорции на всем множестве, то ковариантный сдвиг незначителен.Однако, когда пакеты выбираются только из одного или двух подмножеств (в данном случае, красные розы и розы различных цветов), то ковариантный сдвиг возрастает.Это довольно сильно замедляет процесс обучения модели. На Рисунке <tex>1</tex> изображена разница в пропорциях. Простой способ решить проблему ковариантного сдвига для входного слоя {{---}} это случайным образом перемешать данные перед созданием пакетов.Но для скрытых слоев нейронной сети такой метод не подходит, так как распределение входных данных для каждого узла скрытых слоев изменяется каждый раз, когда происходит обновление параметров в предыдущем слое.Эта проблема называется '''внутренним ковариантным сдвигом''' (англ. internal covariate shift).Для решения данной проблемы часто приходится использовать низкий [[Стохастический градиентный спуск|темп обучения]] (англ. learning rate) и методы [[wikipedia:ru:Регуляризация_(математика)|регуляризации]] при обучении модели.Другим способом устранения внутреннего ковариантного сдвига является метод пакетной нормализации. ===Свойства пакетной нормализации===Кроме того, использование пакетной нормализации батчей обладает еще несколькими дополнительными полезными свойствами:
* достигается более быстрая сходимость моделей, несмотря на выполнение дополнительных вычислений;
* пакетная нормализация батчей позволяет каждому слою сети обучатся обучаться более независимо от других слоев;* становится возможным использование более высокого коэффициента скорости темпа обучения, так как пакетная нормализация батчей гарантирует, что выходы узлов нейронной сети не будут иметь слишком больших или малых значений;* пакетная нормализация батчей в каком-то смысле также является механизмом регуляризации: данный метод привносит в выходы узлов скрытых слоев некоторый шум, аналогично методу [[Практики реализации нейронных сетей#Dropout|dropout]];
* модели становятся менее чувствительны к начальной инициализации весов.
==Описание метода==
Опишем устройство метода пакетной нормализации батчей. Пусть, на вход некоторому слою нейронной сети поступает вектор размерности <tex>d</tex>: <tex>x = (x^{(1)}, \ldots, x^{(d)})</tex>. Нормализуем данный вектор по каждой размерности <tex>k</tex>:
<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>.
Данные параметры настраиваются в процессе обучения вместе с остальными [[Настройка гиперпараметровМодель_алгоритма_и_ее_выбор|гиперпараметрамипараметрами модели]]<sup>[на 10.01.18 не создан]</sup> модели.
Пусть, обучение модели производится с помощью батчей пакетов <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>
Тогда, алгоритм пакетной нормализации батчей можно представить так:
'''Вход''': значения <tex>x</tex> из батча пакета <tex>B = \{x_{1},\ldots, x_{m}\}</tex>; настраиваемые параметры <tex>\gamma, \beta</tex>; константа <tex>\epsilon</tex> для вычислительной устойчивости.
'''Выход''': <tex>\{y_{i} = BN_{\gamma, \beta}(x_{i})\}</tex>
<tex>\mu_{B} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} x_{i}</tex> <font color="green">// математическое ожидание батчапакета</font> <tex>\sigma_{B}^{2} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} (x_{i} - \mu_{B})^{2}</tex> <font color="green">// дисперсия батчапакета</font>
<tex>\hat{x}_{i} = \displaystyle \frac{x_{i} - \mu_{B}}{\sqrt{\sigma_{B}^{2} + \epsilon}}</tex> <font color="green">// нормализация</font>
<tex>y_{i} = \gamma \hat{x}_{i} + \beta \equiv BN_{\gamma, \beta}(x_{i}) </tex> <font color="green">// сжатие и сдвиг</font>
Заметим, что если <tex>\beta=\mu_{B}</tex> и <tex>\gamma=\sqrt{\sigma_{B}^{2} + \epsilon}</tex>, то <tex>y_{i}</tex> равен <tex>x_{i}</tex>, то есть <tex>BN_{\gamma, \beta}(\cdot)</tex> является тождественным отображением.
Таким образом, использование пакетной нормализации батчей не может привести к снижению точности, поскольку оптимизатор просто может использовать нормализацию как тождественное отображение. ==Обучение нейронных сетей с пакетной нормализацией==[[Файл:BNcircuit.png|700px|thumb|Рисунок <tex>2</tex>. [[Настройка_глубокой_сети#Граф вычислений|Граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки. Слева-направо черными стрелками показана работа алгоритма в прямом направлении. А справа-налево красными стрелками {{---}} в обратном направлении, где вычисляется градиент функции потерь. Здесь <tex>N=m</tex> и <tex>D=d</tex>. Иллюстрация из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи].]]
==Обучение Для обучения нейронных сетей с нормализацией батчей==необходимо вычислять [[Файлwikipedia:BNcircuit.pngru:Градиент|800pxградиент]] [[wikipedia:en:Loss_function|thumb|Рисунок 2. Схема обработки слоя нормализации батчей алгоритмом обратного распространения ошибки. Слева-направо черными стрелками показана работа алгоритма в прямом направлении. А справа-налево красными стрелками {{---}} в обратном направлении, где вычисляется градиент функции потерь. Здесь ]] <tex>N=ml</tex> и <tex>D=d</tex>]]. В случае использования метода пакетной нормализации градиент вычисляется следующим образом:
Для обучения нейронных сетей необходимо вычислять [[wikipedia:ru:Градиент|градиент]] функции потерь <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 \hatsigma_{B}^{x2}}_= \sum_{i=1}^{m} = \frac{\partial l}{\partial y_\hat{x}_{i}} \cdot (x_{i}- \mu_{B} ) \cdot \gammafrac{-1}{2}(\sigma_{B}^{2} + \epsilon)^{-3/2}</tex> <tex> (2)</tex>
<tex>\displaystyle \frac{\partial l}{\partial \sigma_mu_{B}^{2}} = \left(\sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot (x_\frac{i-1} - {\sqrt{\mu_sigma_{B}^{2} + \epsilon}}\right) \cdot + \frac{-1\partial l}{2}(\partial \sigma_{B}^{2} + } \cdot \frac{\epsilon)sum_{i=1}^{m}-3/2(x_{i}-\mu_{B})}{m}</tex> <tex> (3)</tex>
<tex>\displaystyle \frac{\partial l}{\partial \mu_x_{Bi}} = \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{2(x_{i}-\sum_mu_{i=1B})}^{m}-2(x_+ \frac{i\partial l}-{\partial \mu_{B})} \cdot \frac{1}{m}</tex> <tex> (4)</tex>
<tex>\displaystyle \frac{\partial l}{\partial x_{i}\gamma} = \frac{\partial l}{\partial \hat{x}_sum_{i}} \cdot \frac{=1}{\sqrt{\sigma_{B}^{2} + \epsilonm}} + \frac{\partial l}{\partial \sigma_y_{B}^{2i}} \cdot \frachat{2(x_x}_{i}-\mu_{B}</tex> <tex> (5)}{m} + \frac{\partial l}{\partial \mu_{B}} \cdot \frac{1}{m}</tex>
<tex>\displaystyle \frac{\partial l}{\partial \gammabeta} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}} \cdot \hat{x}_{i}</tex> <tex> (6)</tex>
На Рисунке <tex>\displaystyle \frac{\partial l}{\partial \beta} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}}2</tex>изображен [[Настройка_глубокой_сети#Граф вычислений|граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки.
В прямом направлении, как и описано в алгоритме метода, из входа <tex>x</tex> вычисляется среднее значение по каждой размерности признакового пространства. Затем полученный вектор средних значение вычитается из каждого элемента обучающей выборки. Далее вычисляется дисперсия, и с помощью нее вычисляется знаменатель для нормализации. Затем полученное значение инвертируется и умножается на разницу входа <tex>x</tex> и средних значений. В конце применяются параметры <tex>\gamma</tex> и <tex>\beta</tex>. В обратном направлении вычисляются производные необходимых функций. В следующей таблице подробнее изображены шаги вычисления градиента функции потерь (иллюстрации из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи], здесь <tex>N=m</tex> и <tex>D=d</tex>): {| cellpadding = "20" class = "wikitable"! Шаг !! Изображение !! Описание|-| 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>, складывая входящие производные.|} ==Нормализация батчей Пакетная нормализация в [[Сверточные нейронные сети | свёрточных сетях]]==Нормализация батчей Пакетная нормализация может быть применена к любой функции активации. Рассмотрим подробнее случай аффинного преобразования с некоторой нелинейной функцией:
<tex>z = g(Wu + b)</tex>,
где <tex>W</tex> и <tex>b</tex> {{---}} настраиваемые параметры модели, а <tex>g(\cdot)</tex> {{---}} некоторая нелинейная функция, например [[Практики реализации нейронных сетей#Sigmoid function|cигмоида]] или [[Практики реализации нейронных сетей#Rectified Linear Units (ReLU)|ReLU]]. Данной функцией можно описать как обычные, так и сверточные слои нейронных сетей. Так, Пакетная нормализация батчей применяется сразу перед нелинейной функцией <tex>g(\cdot)</tex> к <tex>x = Wu + b</tex>. Параметр <tex>b</tex> может быть проигнорирован последующим вычитание математического ожидания (затем опущен, так как в дальнейших вычислениях его роль этого параметра будет играть параметр <tex>\beta</tex>). Поэтому <tex>z = g(Wu + b)</tex> может быть записано так:
<tex>z = g(BN(Wu))</tex>,
где <tex>BN</tex> применяется отдельно к каждой размерности <tex>x=Wu</tex> с отдельной парой параметров <tex>\gamma^{(k)}</tex> и <tex>\beta^{(k)}</tex> для каждой размерности.
В случае свёрточных сетей, дополнительно необходима нормализация, чтобы удовлетворить свойство свёрточных сетей, что различные элементы в разных местах одной карты признаков (образ операции свёртки, англ. feature map) должны быть нормализованны нормализованы одинаково. Чтобы этого добиться, нормализация выполняется совместно над всеми значениями в батчепакете. Пусть, <tex>B</tex> {{---}} множество всех значений в карте признаков по всему батчу пакету и всем точкам в карте признаков. Тогда для батча пакета размера <tex>m</tex> и карты признаков размера <tex>p \times q</tex> размер <tex>B</tex> равен <tex>m'=|B|=m \cdot pq</tex>. Тогда, параметры <tex>\gamma^{(k)}</tex> и <tex>\beta^{(k)}</tex> настраиваются для каждой карты признаков отдельно. ==Индивидуальная нормализация==[[file:types-of-normalization.png|300px|thumb|Рисунок <tex>3</tex>. Типы нормализации. Ось N— по объектам в пакете, ось C — по картам признаков (channels), оставшаяся ось —по пространственным измерениям объектов, например, ширине и высоте картинки.Иллюстрация из[https://medium.com/syncedreview/facebook-ai-proposes-group-normalization-alternative-to-batch-normalization-fb0699bffae7 статьи].]] При пакетной нормализации происходит усреднение параметров по всему пакету.Например, в случае задачи переноса стилей картин, это вносит много шума. Приусреднении теряются индивидуальные характеристики объектов. Поэтому используетсяболее тонкая нормализация — индивидуальная нормализация (англ. instancenormalization). Разница заключается в том, что нормализация происходит покаждому отдельному объекту, а не по всему пакету. Для примера, усреднениепроисходит по пикселям картины, но не по всем картинам в пакете, как видно наРисунке <tex>3</tex>. ==Условная пакетная нормализация== '''Условная пакетная нормализация''' (англ. conditional batch normalization,CBN) {{---}} метод, который позволяет "выбирать" параметры пакетной нормализации(<tex>\beta</tex> и <tex>\gamma</tex>) в зависимости от какого-то состояниясети, например метки класса. Впервые данный метод был представлен дляиндивидуальной нормализации в''A Learned Representation for Artistic Style''<ref name="A Learned Representation for Artistic Style">[https://arxiv.org/pdf/1610.07629.pdf A Learned Representation for Artistic Style]</ref>.Позднее он был использован для пакетной нормализации в''Modulating early visual processing by language''<ref name="Modulating early visual processing by language">[https://arxiv.org/pdf/1707.00683v3.pdf Modulating early visual processing by language]</ref>. Зачем нужно делать параметры нормализации зависимостью? На практике быловыяснено <ref name="A Learned Representation for Artistic Style"/>, что иногданейронные сети, натренированные решать разные задачи из одного класса, имеютсхожие веса и достаточно лишь слегка поменять параметры сжатия и сдвига послекаждого слоя. Таким образом, добавив условную нормализацию, мы научимся решатьсразу несколько задач используя одну сеть. ===Описание метода=== Самая важная часть метода {{---}} ''выбрать'' для входа <tex>x</tex> параметры<tex>\beta_c</tex> и <tex>\gamma_c</tex>. Возможные способы сделать это описаныниже. Единожды параметры выбраны, формула не отличается от приведённой впараграфе c [[Batch-normalization#Описание метода | описанием метода пакетной нормализации]]: <tex>y = \gamma_c \cdot \hat{x} + \beta_c \;\; (1)</tex>. ===Выбор параметров нормализации=== Есть несколько способов выбрать параметры. Самой простой из них — разделитьпредметную область на <tex>C</tex> частей. Для каждого слоя надо добавитьсоответствующие параметры <tex>\beta_c, \gamma_c \; , c \in 1..C</tex> инастраивать их вместе с остальными параметрами модели. Когда мы тренируем наданных из <tex>i</tex>-ой части, мы явно указываем, что в формуле <tex>(1)</tex><tex>c = i</tex>. Когда мы хотим осуществить предсказание, мы снова явно указываемжелаемый <tex>c</tex> и в вычислениях используются соответствующие параметры. Есть другой способ: можно вместе с настройкой сети обучать алгоритм выборапараметров <tex>PARAMS</tex> сжатия и сдвига по заданному входу: <tex>(\beta_c,\gamma_c) = PARAMS(x)</tex>. К примеру, в работе [https://arxiv.org/pdf/1707.00683v3.pdf Modulating early visual processing by language]в качестве <tex>PARAMS</tex> используется[[Нейронные_сети, перцептрон#Классификация перцептронов | многослойный перцептрон по Румельхарту с одним скрытым слоем]].Таким образом, характеристики <tex>x</tex> могут изменить выход целого слоя. Этобывает полезно, если верна гипотеза, что структура входных векторов связана сжелаемым результатом работы. ===В применении к переносу стиля===[[file:style-transfer-example.png|300px|thumb|Рисунок <tex>4</tex>. Перенесения стиля с картины Клода Моне "Рыбацкие лодки" (слева) на изображение человека (справа) <ref name="A Learned Representation for Artistic Style"/>.]] Популярной задачей является отрисовка данного изображения в стиле какой-то заданной картины, как на Рисунке <tex>4</tex>. Эта задача называется [[Neural Style Transfer | "''перенос стиля''"]]. Одно из популярных и достаточно быстрых решений этой задачи использует простые нейронные сети [[Нейронные сети, перцептрон#Сети прямого распространения | прямого распространения]]. Это решение имеет недостаток: каждая сеть может переносить лишь один стиль. Если мы хотим научиться переносить <tex>N</tex> стилей, то надо обучать <tex>N</tex> различных сетей. Однако лишь небольшое количество параметров этих сетей отвечает за индивидуальные особенности стиля. Хотелось бы уметь переиспользовать остальные параметры. ====Добавление условности====В статье [https://arxiv.org/pdf/1610.07629.pdf A Learned Representation for Artistic Style] был получен удивительный результат: для моделирования какого-то стиля, достаточно специализировать параметры сжатия и сдвига нормализации для каждого конкретного стиля. Таким образом, давайте для каждого изображения стиля <tex>s</tex> будем учитывать свои <tex>\gamma_c</tex> и <tex>\beta_c</tex>. Получается, у нас будет лишь два вектора параметров, специфичных для каждого стиля, а все остальные — общие. Такой подход имеет много преимуществ по сравнению с наивным: * Это быстрее.* Это требует меньше памяти.* Легче добавить новый стиль: достаточно взять текущие веса, добавить новые параметры сжатия и сдвига и дообучить. Веса, скорее всего, уже были близки к оптимальным и дообучение не будет долгим.* Можно комбинировать новые стили за счёт [https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D1%8F#%D0%90%D1%84%D1%84%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F,_%D0%BA%D0%BE%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8_%D0%B2%D1%8B%D0%BF%D1%83%D0%BA%D0%BB%D0%B0%D1%8F_%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%B8 выпуклой комбинации] существующих коэффициентов сжатия и сдвига. ===Когда использовать условную нормализацию?=== Во-первых, на условную нормализацию стоит обратить внимание, если вынастраиваете много сетей, решающих похожие задачи. Возможно, в этом случае выможете использовать одну сеть с условными параметрами нормализации, зависящимиот конкретной задачи. Например, при переносе стилей вместо <tex>S</tex> сетей вынастраиваете одну сеть с <tex>S</tex> наборами параметров нормализации. Во-вторых, если вы подозреваете, что информация о структуре входных векторовимеет значение для выхода. Например, имеет смысл "слить" лингвистическуюинформацию и характеристики изображения для задачи ''ответа на визуальные вопросы''(англ. Visual Question Answering, VQA). Однако во всех случаях надо помнить, что полученные алгоритмы для разных задачбудут различаться лишь параметрами свёртки и сжатия. Иначе говоря, если вашизадачи нельзя выразить[https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D1%8F#%D0%90%D1%84%D1%84%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F,%20%D0%BA%D0%BE%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D0%B8%20%D0%B2%D1%8B%D0%BF%D1%83%D0%BA%D0%BB%D0%B0%D1%8F%20%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%B8 аффинной комбинацией]параметров сети после нормализации, условная нормализация не поможет.
==Пример==
[[File:bn_exp_1.png|300px|thumb|Рисунок 3<tex>5</tex>. Точность распознавания в зависимости от итерации обучения. Оранжевая кривая изображает результаты для модели с использованием пакетной нормализации батчей, синяя кривая {{---}} без. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]][[File:bn_exp_2.png|300px|thumb|Рисунок 4<tex>6</tex>. Точность распознавания в зависимости от итерации обучения c использованием сигмоиды в качетсве функции активации. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]]
Приведем пример демонстрирующий работу пакетной нормализации батчей. Рассмотрим задачу распознавания рукописных цифр на известном датасете MNIST <ref>[http://yann.lecun.com/exdb/mnist/ Датасет MNIST]</ref>. Для решения задачи будет использоваться обычная нейронная сеть с <tex>3</tex> скрытыми полносвязными слоями по <tex>100</tex> узлов в каждом. Функция активации {{---}} ReLU. Выходной слой содержит <tex>10</tex> узлов. Размер батча пакета равен <tex>60</tex>. Сравнивается Сравниваются две одинаковые модели, но в первой перед каждым скрытым слоем используется пакетная нормализация батчей, а во второй {{---}} нет. Коэффициент скорости Темп обучения равен <tex>0.01</tex>. Веса инициализированы значениями с малой дисперсией.
На Рисунке 3 <tex>5</tex> изображены два графика, показывающий показывающие разницу между моделями. Как видно, обе модели достигли высокой точности, но модель с использованием пакетной нормализации батчей достигла точности более <tex>90\%</tex> быстрее, почти сразу, и достигла максимума, примерно, уже на <tex>10000</tex> итераций. Однако, модель без пакетной нормализации батчей достигла скорости обучения примерно <tex>510</tex> батчей пакетов в секундасекунду, а модель с использованием пакетной нормализации батчей {{---}} <tex>270</tex>. Однако, как можно видеть, пакетная нормализация батчей позволяет выполнить меньшее количество итераций и, в итоге, сойтись за меньшее время.
На Рисунке 4 <tex>6</tex> изображен график, сравнивающий точно такие же модели, но с использованием сигмоиды в качестве функции активации. Использование сигмоиды в качестве функции активации Такая конфигурация моделей требует большего времени, чтобы начать обучение модели. В итоге, модель обучается, но на это потребовалось более <tex>45000</tex> итераций, чтобы получить точность более <tex>80\%</tex>. При использовании пакетной нормализации батчей получилось достичь точность более <tex>90\%</tex> примерно за <tex>1000</tex> итераций.
==Реализации==
Механизм пакетной нормализации батчей реализован практически во всех современных инструментариях для машинного обучения, таких как: TensorFlow <ref>[https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization TensorFlow]</ref>, Keras <ref>[https://keras.io/layers/normalization/ Keras]</ref>, CNTK <ref>[https://docs.microsoft.com/en-us/cognitive-toolkit/BatchNormalization CNTK]</ref>, Theano <ref>[http://deeplearning.net/software/theano/library/tensor/nnet/bn.html Theano]</ref>, PyTorch <ref>[https://pytorch.org/docs/stable/_modules/torch/nn/modules/batchnorm.html PyTorch]</ref> и т.д.
Приведем пример <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-обучении ]] и использование в рекуррентных нейронных сетях.
==См. также==
*[[:Глубокое обучение|Глубокое обучение]]
*[[:Практики реализации нейронных сетей|Практики реализации нейронных сетей]]
*[[:Настройка глубокой сети|Настройка глубокой сети]]<sup>[на 10.01.18 не создан]</sup>
== Примечания ==
* [https://medium.com/@SeoJaeDuk/deeper-understanding-of-batch-normalization-with-interactive-code-in-tensorflow-manual-back-1d50d6903d35 Deeper Understanding of Batch Normalization with Interactive Code in Tensorflow]
* [https://www.learnopencv.com/batch-normalization-in-deep-networks/ Batch Normalization in Deep Networks]
* [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb Batch Normalization {{---}} Lesson]
* [https://arxiv.org/pdf/1610.07629.pdf A Learned Representation for Artistic Style]
[[Категория: Машинное обучение]]
[[Категория: Глубокое обучение]]
[[Категория: Нейронные сети]]
1632
правки

Навигация