Изменения

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

Batch-normalization

2552 байта добавлено, 19:19, 4 сентября 2022
м
rollbackEdits.php mass rollback
===Ковариантный сдвиг===
[[Файл:covariate-shift1.png|600px|thumb|Рисунок <tex>1</tex>. Верхние две строки роз показывают первое подмножество данных, а нижние две строки показывают другое подмножество. Два подмножества имеют разные пропорции изображения роз. На графиках показано распределение двух классов в пространстве объектов с использованием красных и зеленых точек. Синяя линия показывает границу между двумя классами. Иллюстрация из [https://www.learnopencv.com/batch-normalization-in-deep-networks/ статьи].]]
Пакетная нормализация уменьшает величину, на которую смещаются значения узлов в скрытых слоях (т.н. '''[[Ковариация случайных величин|ковариантный]] сдвиг''' (англ. covariance shift)).
Когда пакеты содержат изображения разных классов, распределенные в одинаковой пропорции на всем множестве, то ковариантный сдвиг незначителен.
Однако, когда пакеты выбираются только из одного или двух подмножеств (в данном случае, красные розы и розы различных цветов), то ковариантный сдвиг возрастает.
Это довольно сильно замедляет процесс обучения модели. На Рисунке <tex>1 </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:ru:Градиент|градиент]] [[wikipedia:en:Loss_function|функции потерь]] <tex>l</tex>. В случае использования метода пакетной нормализации градиент вычисляется следующим образом:
<tex>\displaystyle \frac{\partial l}{\partial \beta} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}}</tex> <tex> (6)</tex>
На Рисунке <tex>2 </tex> изображен [[Настройка_глубокой_сети#Граф вычислений|граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки.
В прямом направлении, как и описано в алгоритме метода, из входа <tex>x</tex> вычисляется среднее значение по каждой размерности признакового пространства. Затем полученный вектор средних значение вычитается из каждого элемента обучающей выборки. Далее вычисляется дисперсия, и с помощью нее вычисляется знаменатель для нормализации. Затем полученное значение инвертируется и умножается на разницу входа <tex>x</tex> и средних значений. В конце применяются параметры <tex>\gamma</tex> и <tex>\beta</tex>.
==Индивидуальная нормализация==
[[file:types-of-normalization.png|300px|thumb|Рисунок <tex>3</tex>. Типы нормализации. Ось N
— по объектам в пакете, ось C — по картам признаков (channels), оставшаяся ось —
по пространственным измерениям объектов, например, ширине и высоте картинки.
каждому отдельному объекту, а не по всему пакету. Для примера, усреднение
происходит по пикселям картины, но не по всем картинам в пакете, как видно на
Рисунке <tex>3</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>.
Зачем нужно делать параметры нормализации зависимостью? На практике было
===Описание метода===
Самой важной частью Самая важная часть метода является {{---}} ''выбрать'' для входа <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>\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>. К примеру, в работе <ref name="[https://arxiv.org/pdf/1707.00683v3.pdf Modulating earlyvisual 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> различных сетей. Однако лишь небольшое количество параметров этих сетей отвечает за индивидуальные особенности стиля. Хотелось бы уметь переиспользовать остальные параметры.
====Добавление условности====
В <ref name="статье [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|Рисунок <tex>5</tex>. Точность распознавания в зависимости от итерации обучения. Оранжевая кривая изображает результаты для модели с использованием пакетной нормализации, синяя кривая {{---}} без. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]][[File:bn_exp_2.png|300px|thumb|Рисунок <tex>6</tex>. Точность распознавания в зависимости от итерации обучения c использованием сигмоиды в качетсве функции активации. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]]
Приведем пример демонстрирующий работу пакетной нормализации.
Веса инициализированы значениями с малой дисперсией.
На Рисунке <tex>5 </tex> изображены два графика, показывающие разницу между моделями.
Как видно, обе модели достигли высокой точности, но модель с использованием пакетной нормализации достигла точности более <tex>90\%</tex> быстрее, почти сразу, и достигла максимума, примерно, уже на <tex>10000</tex> итераций. Однако, модель без пакетной нормализации достигла скорости обучения примерно <tex>510</tex> пакетов в секунду, а модель с использованием пакетной нормализации {{---}} <tex>270</tex>.
Однако, как можно видеть, пакетная нормализация позволяет выполнить меньшее количество итераций и, в итоге, сойтись за меньшее время.
На Рисунке <tex>6 </tex> изображен график, сравнивающий точно такие же модели, но с использованием сигмоиды в качестве функции активации.
Такая конфигурация моделей требует большего времени, чтобы начать обучение.
В итоге, модель обучается, но на это потребовалось более <tex>45000</tex> итераций, чтобы получить точность более <tex>80\%</tex>.
1632
правки

Навигация