1632
правки
Изменения
м
===Перенос стиля===[[file:styleСамая важная часть метода {{--transfer-example.png|300px|thumb|Рисунок 3. Перенесения стиля с картины Клода Моне "Рыбацкие лодки" (слева) на изображение человека (справа). Иллюстрация из }} ''выбрать'' для входа <reftex>[https:x</tex> параметры<tex>\beta_c</arxiv.org/pdf/1610.07629.pdf A Learned Representation for Artistic Style]tex> и <tex>\gamma_c</reftex>.Возможные способы сделать это описаныниже. Единожды параметры выбраны, формула не отличается от приведённой впараграфе c [[Batch-normalization#Описание метода | описанием метода пакетной нормализации]]:
Популярной задачей является отрисовка данного изображения в стиле какой-то заданной картины, как на Рисунке 3. Одно из популярных и достаточно быстрых решений этой задачи использует простые нейронные сети [[Нейронные сети, перцептрон#Сети прямого распространения | прямого распространения]]. Однако это решение имеет недостаток: каждая сеть может переносить лишь один стиль. Если мы хотим научиться переносить <tex>Ny = \gamma_c \cdot \hat{x} + \beta_c \;\; (1)</tex> стилей, то надо обучать <tex>N</tex> различных сетей. Однако лишь небольшое количество параметров этих сетей отвечает за индивидуальные особенности стиля. Хотелось бы уметь переиспользовать остальные параметры.
При пакетной нормализации происходит усреднение параметров по всему пакетуЕсть несколько способов выбрать параметры. Однако в случае переноса стилей картинСамой простой из них — разделитьпредметную область на <tex>C</tex> частей. Для каждого слоя надо добавитьсоответствующие параметры <tex>\beta_c, \gamma_c \; , это вносит много шумаc \in 1.. При усреднении теряются индивидуальные характеристики картинC</tex> инастраивать их вместе с остальными параметрами модели. Поэтому используется более тонкая нормализация — индивидуальная нормализацияКогда мы тренируем наданных из <tex>i</tex>-ой части, или instance normalization. Разница заключается в томмы явно указываем, что нормализация происходит по каждому отдельному объекту, а не по всему пакетув формуле <tex>(1)</tex><tex>c = i</tex>. То естьКогда мы хотим осуществить предсказание, усреднение происходит по пикселям картины, но не по всем картинам мы снова явно указываемжелаемый <tex>c</tex> и в пакете, как видно на Рисунке 6вычислениях используются соответствующие параметры.
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>.
В случае свёрточных сетей, дополнительно необходима нормализация, чтобы удовлетворить свойство свёрточных сетей, что различные элементы в разных местах одной карты признаков (образ операции свёртки, англ. 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 статьи].]]
При пакетной нормализации происходит усреднение параметров по всему пакету.
Например, в случае задачи переноса стилей картин, это вносит много шума. При
усреднении теряются индивидуальные характеристики объектов. Поэтому используется
более тонкая нормализация — индивидуальная нормализация (англ. instance
normalization). Разница заключается в том, что нормализация происходит по
каждому отдельному объекту, а не по всему пакету. Для примера, усреднение
происходит по пикселям картины, но не по всем картинам в пакете, как видно на
Рисунке <tex>3</tex>.
==Условная пакетная нормализация==
сети, например метки класса. Впервые данный метод был представлен для
индивидуальной нормализации в
''A Learned Representation for Artistic Style''<refname="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''<refname="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"/>, что иногданейронные сети, натренированные решать разные задачи из одного класса, имеютсхожие веса и достаточно лишь слегка поменять параметры сжатия и сдвига послекаждого слоя. Таким образом, добавив условную нормализацию, мы научимся решатьсразу несколько задач используя одну сеть. ===Описание метода===
===Индивидуальная нормализацияВыбор параметров нормализации===[[file:types-of-normalization.png|300px|thumb|Рисунок 4. Типы нормализации. Ось N — по объектам в пакете, ось C — по картам признаков (channels), оставшаяся ось — по пространственным измерениям объектов, например, ширине и высоте картинки. Иллюстрация из [https://medium.com/syncedreview/facebook-ai-proposes-group-normalization-alternative-to-batch-normalization-fb0699bffae7 статьи].]]
Есть другой способ: можно вместе с настройкой сети обучать алгоритм выборапараметров <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> различных сетей. Однако лишь небольшое количество параметров этих сетей отвечает за индивидуальные особенности стиля. Хотелось бы уметь переиспользовать остальные параметры. ====Добавление условности====В <ref>статье [https://arxiv.org/pdf/1610.07629.pdf A Learned Representation for Artistic Style]</ref> был получен удивительный результат: для моделирования какого-то стиля, достаточно специализировать параметры сжатия и сдвига нормализации для каждого конкретного стиля. Таким образом, давайте для каждого изображения стиля <tex>s</tex> будем учитывать свои <tex>\gamma_sgamma_c</tex> и <tex>\beta_sbeta_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>.