Изменения

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

PixelRNN и PixelCNN

2358 байт добавлено, 3 январь
Сравнение подходов
Основным преимуществом ''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 ===
Как видно из формулы и Рисунка 2, значение текущего скрытого состояния не зависит от предыдущего слева, а зависит только от предыдущих сверху, которые считаются параллельно.
Таким образом, главным преимуществом алгоритма перед наивным [[Долгая краткосрочная память|''LSTM'']] является более быстрое обучение модели, однако качество получаемых изображений ухудшается. Основной проблемой подхода является тоЭто связанно как минимум с тем, что модель не использует пиксели только мы используем контекст пикселей с предыдущей строки, но никак не используем контекст соседнего слева пикселя слева, который на самом деле которые является достаточно важенважным, т.к. является ближайшим в с точки зрения построчной генерации изображения. Значит надо научиться находить скрытое состояние слева, но делать это эффективно.
=== Diagonal BiLSTM ===
=== PixelCNN ===
Идея в том, что обычно соседние пиксели наиболее важные данные для пикселя содержатся в соседних пикселях (в рамках ядра 9x9) хранят самый важный контекст для пикселя, поэтому предлагается просто использовать известные пиксели для вычисления нового, как показано на рисунке 2.
== Архитектура ==
В алгоритмах ''PixelRNN'' и ''PixelCNN'' используются несколько архитектурных трюков, позволяющих производить вычисления быстрыми быстро и надежныминадежно[[File:0_UbiGmm8uyZ-GKhv5_.jpg|350px|thumb|Рисунок 4. MaskA и MaskB.]]
=== Маскированные сверточные слои ===
=== Уменьшение размерности ===
[[File:pixel-4.png|350px320px|thumb|Рисунок 45. Блоки уменьшения размерности. Слева {{---}} блок для ''PixelCNN'', справа {{---}} ''PixelRNN''. ]]
На вход в любой их указанных выше алгоритмов (''PixelCNN'', ''RowLSTM'', ''Diagonal BiLSTM'') подается большое количество объектов, поэтому внутри каждого из них сначала происходит уменьшение их количества в два раза, а затем обратное увеличение до исходного размера. Структура алгоритма с учетом уменьшения размерности показана на рисунке 4.
 
[[File:pixel-5.png|320px|thumb|Рисунок 6. Простой LSTM-блок с тремя вентилями: входным, выходным и забывания.]]
=== Внутреннее устройство LSTM ===
Структура ''LSTM'' блока:
# ''MaskB'' слой ''input-to-state'' <tex>K_{is}</tex> учитывает контекст из входа.
# Сверточный слой ''inputstate-to-state'' <tex>K_{ss}</tex> учитывает контекст из предыдущих скрытых слоев.
Используя эти два сверточных слоя формально вычисление ''LSTM'' блока можно записать следующим образом:
</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'' и ''inputstate-to-state'' соответственно.
=== Архитектура PixelRNN ===
# ''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>.
== Сравнение подходов ==
[[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/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
правка

Навигация