Изменения

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

PixelRNN и PixelCNN

3615 байт добавлено, 20:41, 3 января 2021
Сравнение подходов
[[File:pixel-1.png|450px|thumb|Рисунок 1. Пример использования PixelRNN/PixelCNN сетей]]
'''''PixelRNN''''' и '''''PixelCNN''''' {{- --}} алгоритмы машинного обучения, входящие в семейство авторегрессивных моделей. Используются и использующиеся для генерации и дополнения изображений. Алгоритмы были представлены в 2016 году компанией ''DeepMind''<ref name=PixelNet>[https://arxiv.org/abs/1601.06759 Pixel Recurrent Neural Networks]</ref> и являются предшественниками алгоритма ''WaveNet''<ref name=WaveNet>[https://deepmind.com/blog/article/wavenet-generative-model-raw-audio WaveNet: A generative model for raw audio]</ref>, который используется в голосовом помощнике ''Google''.
Основным преимуществом ''PixelRNN'' и ''PixelCNN'' является уменьшение времени обучения, по сравнению с наивными способами попиксельной генерации изображений.
== Постановка задачи ==
Пусть дано черно-белое изображение <tex>X</tex> размером <tex>N\times N</tex>. Построчно преобразуем картинку в вектор <tex>V_X = \{x_1, x_2, \dots, x_{N^2} \}</tex>, соединяя конец текущей строки с началом следующей. В При таком представлении изображения можно предположить, что значение любого пикселя <tex>x_i\in V_X</tex> может зависеть от значений предыдущих пикселей <tex>x_j, j = 1,2,\dots i-1</tex>.
Тогда значение пикселя <tex>x_i\in V_X</tex> можно выразить через условную вероятность <tex>p(x_i|x_1, x_2, \dots x_{i-1})</tex>, и, используя цепное правило для вероятностей<ref name=ChainRule>[https://en.wikipedia.org/wiki/Chain_rule_(probability) Chain rule (probability)]</ref>, оценка . Оценка совместного распределения всех пикселей будет записываться в следующем виде: <tex>p(X)=\prod_{i=1}^{N^2}p(x_i|x_1, x_2, \dots x_{i-1})</tex>.
Задача алгоритма {{- --}} восстановить данное распределение. Учитывая тот факт, что любой пиксель принимает значение <tex>0<=x_i<=255</tex>, необходимо восстановить лишь дискретное распределение.
== Идея ==
Т.к. Так как утверждается, что значение текущего пикселя зависит от значений значения предыдущего, то уместно использовать [[:Рекуррентные_нейронные_сети|''рекуррентные нейронные сети (RNN)'']], а точнее [[Долгая краткосрочная память|''долгую краткосрочную память (LSTM)'']]. В ранних работах<ref name=SpatialLSTM>[https://arxiv.org/abs/1506.03478 Generative Image Modeling Using Spatial LSTMs]</ref> уже использовался данный подход, и вычисление скрытого состояния происходило следующим образом: <tex>h_{i,j}=f(h_{i-1,j}, h_{i,j-1}, x_{i,j})</tex>, т.е. для того, чтобы вычислить текущее скрытое состояние, нужно было подсчитать все предыдущие, что занимает достаточно много времени.
Авторы У алгоритма модернизировали [[Долгая краткосрочная память|''LSTM'']] в существует две модификации: '''''RowLSTM''''' и '''''Diagonal BiLSTM''''' таким образом, чтобы стало возможным распараллеливание вычислений. Основным преимуществом модификаций является возможность проводить вычисления параллельно, что в итоге положительно сказывается на времени ускоряет общее время обучения модели.
=== RowLSTM ===
[[File:pixel-2.png|350px|thumb|Рисунок 2. Визуализация работы модификаций ''LSTM''. Снизу кружками обозначены пиксели, сверху {{- --}} состояния на каждом пикселе. Синим обозначено то, что влияет на текущее скрытое состояние. Пустые кружки не принимают участие в вычислениях для данного скрытого состояния]]В данной модификации [[Долгая краткосрочная память|''LSTM'']] предлагается рассчитывать скрытое состояние следующим образомсчитается по формуле: <tex>h_{i,j}=f(h_{i-1,j-1}, h_{i-1,j}, h_{i-1,j+1}, x_{i,j})</tex>.
Как видно из формулы и Рисунка 2, значение текущего скрытого состояния не зависит от предыдущего слева, а зависит только от предыдущих сверху, которые можно считаются параллельно рассчитать.
Из плюсов данного Таким образом, главным преимуществом алгоритма можно отметить его быстродействие - модель обучается быстрее, нежели наивный перед наивным [[Долгая краткосрочная память|''LSTM'']]. Из минусов - относительно плохое является более быстрое обучение модели, однако качество получаемых изображенийухудшается. Это связанно как минимум с тем, что мы используем контекст пикселей с предыдущей строки, но никак не используем контекст соседнего слева пикселя, которые является достаточно важным, т.к. является ближайшим с точки зрения построчной генерации изображения.  Отсюда напрашивается идея каким-то образом найти Значит надо научиться находить скрытое состояние пикселя слева, но при этом не потерять в производительностиделать это эффективно.
=== Diagonal BiLSTM ===
[[File:pixel-3.png|350px|thumb|Рисунок 3. Операция сдвига в ''Diagonal BiLSTM''. Параллелизация происходит по диагоналям.]]
В данной версии скрытое состояние считается таким же образом, как и в наивном подходе: <tex>h_{i,j}=f(h_{i-1,j}, h_{i,j-1}, x_{i,j})</tex>, но при этом есть использует следующую хитрость в самом вычислении. Построчно {{---}} построчно сдвинем строки вправо на один пиксель относительно предыдущей, а затем вычислим скрытые состояния в каждом столбце, как показано на Рисунке 3. Данная версия позволяет учитывать Как следствие, контекст учитывается более качественно, но при этом занимает больше временичто повышает качество изображения, чем однако такая модификация замедляет модель по сравнению с подходом ''RowLSTM''.
=== PixelCNN ===
Идея в том, что обычно соседние пиксели наиболее важные данные для пикселя содержатся в соседних пикселях (в рамках ядра 9x9) хранят самый важный контекст для пикселя. Поэтому , поэтому предлагается просто использовать известные пиксели для вычисления нового, как показано на рисунке 2.
== Архитектура ==
В алгоритмах ''PixelRNN'' и ''PixelCNN'' используются несколько архитектурных трюков, позволяющих производить вычисления быстрыми быстро и надежныминадежно[[File:0_UbiGmm8uyZ-GKhv5_.jpg|350px|thumb|Рисунок 4. MaskA и MaskB.]]
=== Маскированные сверточные слои ===
В описаниях алгоритмов фигурируют два типа маскированных сверточных слоя {{- --}} '''''MaskA''''', '''''MaskB'''''. Они необходимы для сокрытия от алгоритма лишней информации и учета контекста {{- --}} чтобы не обрабатывать изображение ускорить обработку изображения после каждого подсчета, удаляя предлагается вместо удаления значения пикселей, можно применить применять маску к изображению, что является более быстрой операцией.
Для каждого пикселя в цветном изображении в порядке очереди существуют 3 три контекста: красный канал, зеленый и синий. В данном алгоритме очередь важна, т.е. если сейчас обрабатывается красный канал, то контекст только от предыдущих значений красного канала, если зеленый {{- --}} то от всех значений на красном канале и предыдущих значениях на зеленом и т.д.
'''''MaskA''''' используется для того, чтобы учитывать контекст предыдущих каналов, но при этом не учитывать контекст от предыдущих значений текущего канала и следующих каналов.
=== Уменьшение размерности ===
[[File:pixel-4.png|350px320px|thumb|Рисунок 45. Блоки уменьшения размерности. Слева {{--- }} блок для ''PixelCNN'', справа {{- --}} ''PixelRNN''. ]]На вход в любой их указанных выше алгоритмов (''PixelCNN'', ''RowLSTM'', ''Diagonal BiLSTM'') подается большое количество объектов. Поэтому , поэтому внутри каждого из них сначала происходит уменьшение их количества в 2 два раза, а затем обратное увеличение в 2 разадо исходного размера. Структура алгоритма с учетом уменьшения размерности показана на рисунке 4. [[File:pixel-5.png|320px|thumb|Рисунок 6. Простой LSTM-блок с тремя вентилями: входным, выходным и забывания.]]
=== Внутреннее устройство LSTM ===
<tex>
[o_i, f_i, i_i, g_i] = \sigma (K_{ss}\circledast h_{i-1} + K_{is}\circledast x_{i}) , \\c_i=f_i\odot c_{i-1} + i_i\odot g_i,\\h_i = o_i\odot tanh(c_i),
</tex>
где <tex>\sigma</tex> {{- --}} функция активации,  <tex>\circledast</tex> {{--- }} операция свертки,  <tex>\odot</tex> {{--- }} поэлементное умножение,  <tex>f_i</tex> {{---}} вектор вентиля забывания, вес запоминания старой информации,  <tex>i_i</tex> {{---}} вектор входного вентиля, вес получения новой информации,  <tex>o_i</tex> {{---}} вектор выходного вентиля, кандидат на выход,  <tex>g_i</tex> {{---}} вектор вентиля данных,  <tex>x_i</tex> {{---}} строка <tex>i</tex> входных данных,  <tex>h_i</tex> {{---}} вектор краткосрочной памяти,  <tex>c_i</tex> {{---}} вектор долгосрочной памяти,  <tex>K_{is}</tex> и <tex>K_{ss}</tex> {{---}} ядерные веса компонент ''input-to-state'' и ''state-to-state'' соответственно.
=== Архитектура PixelRNN ===
# ''MaskA'' размером <tex>7\times 7</tex> .# Блоки уменьшения размеренности с ''RowLSTM'' блоком, в котором <tex>K_{is}</tex> имеет размер <tex>3\times 1</tex>, <tex>K_{ss}</tex> {{- --}} <tex>3\times 2</tex>. Для ''Diagonal BiLSTM'' <tex>K_{is}</tex> имеет размер .<tex>1\times 1</tex>, <tex>K_{ss}</tex> {{--- }} <tex>1\times 2</tex>. Количество блоков варьируется. # ''ReLU'' активация . # Сверточный слой размером <tex>1\times 1</tex> .# ''Softmax'' слой.
 
[[File:exampleCNN.png|450px|thumb|Рисунок 7. Лица, сгенерированные с помощью PixelCNN сетей <ref name=NaturalModeling>[https://arxiv.org/pdf/1612.08185v4.pdf#page=8 Natural Modeling]</ref>]]
=== Архитектура PixelCNN ===
# ''MaskA'' размером <tex>7\times 7</tex> .
# Блоки уменьшения размеренности для ''PixelCNN''.
# ''ReLU'' активация .# Сверточный слой размером <tex>1\times 1</tex> . # ''Softmax'' слой.
== Сравнение подходов ==
[[File:exampleGAN.png|450px|thumb|Рисунок 8. Лица, сгенерированные с помощью GAN <ref name=ForwardScience>[https://towardsdatascience.com/how-to-train-stylegan-to-generate-realistic-faces-d4afca48e705 Towards data science]</ref>]]
 
Если сравнивать [[Generative Adversarial Nets (GAN) | GAN]] с PixelCNN/PixelRNN, то можно отметить более хорошее качество получаемых изображений у генеративно-состязательного метода. Однако у метода GAN время обучения медленнее, чем у PixelCNN и PixelRNN. Для реализации GAN требуется найти равновесие Нэша, но в настоящее время нет алгоритма делающего это. Поэтому обучение GAN более нестабильное, если сравнивать с другими методами<ref name=Reg>[https://towardsdatascience.com/auto-regressive-generative-models-pixelrnn-pixelcnn-32d192911173 Auto-Regressive Generative Models]</ref>. В настоящее время многие мировые компании используют GAN для генерации изображений, например: [https://neurohive.io/ru/papers/pggan-progressivnaja-generativnaja-nejroset-ot-nvidia/ PGGAN] от ''Nvidia'', [https://bdol.github.io/exemplar_gans/ Exemplar GAN] от ''Facebook'' и другие.
 
{| class="wikitable"
! style="font-weight:bold;" | Критерий\название
! style="font-weight:bold;" | PixelRNN(Row LSTM)
! style="font-weight:bold;" | PixelRNN(Diagonal BiLSTM)
! style="font-weight:bold;" | GAN
|-
| Время обучения
| Быстрый
| Средний
| Медленный
| Медленный
|-
| Средне-низкое
| Средне-высокое
| Высокое
|}
* [https://github.com/ardapekis/pixel-rnn PixelRNN на Pytorch]
* [https://github.com/shirgur/PixelRNN PixelRNN на Keras]
 
==См. также==
* [[Рекуррентные нейронные сети]]
* [[Долгая краткосрочная память]]
* [[Нейронные сети, перцептрон]]
* [[Генерация объектов]]
==Примечания==
* [https://github.com/tensorflow/magenta/blob/master/magenta/reviews/pixelrnn.md Pixel Recurrent Neural Networks]
* [http://bjlkeng.github.io/posts/pixelcnn/ PixelCNN]
* [https://arxiv.org/pdf/1612.08185v4.pdf#page=8 Natural Modeling]
* [https://towardsdatascience.com/how-to-train-stylegan-to-generate-realistic-faces-d4afca48e705 Towards data science]
[[Категория: Машинное обучение]]
[[Категория: Генерация объектов]]
101
правка

Навигация