Изменения

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

PixelRNN и PixelCNN

10 860 байт добавлено, 19:13, 4 сентября 2022
м
rollbackEdits.php mass rollback
[[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'''''. Они необходимы для сокрытия от алгоритма лишней информации и учета контекста {{---}} чтобы ускорить обработку изображения после каждого подсчета, предлагается вместо удаления значения пикселей применять маску к изображению, что является более быстрой операцией.  Для каждого пикселя слевав цветном изображении в порядке очереди существуют три контекста: красный канал, зеленый и синий. В данном алгоритме очередь важна, т.е. если сейчас обрабатывается красный канал, то контекст только от предыдущих значений красного канала, если зеленый {{---}} то от всех значений на красном канале и предыдущих значениях на зеленом и т.д. '''''MaskA''''' используется для того, чтобы учитывать контекст предыдущих каналов, но при этом не потерять учитывать контекст от предыдущих значений текущего канала и следующих каналов. '''''MaskB''''' выполняет ту же функцию, что и '''''MaskA''''', но при этом учитывает контекст от предыдущих значений текущего канала. === Уменьшение размерности === [[File:pixel-4.png|320px|thumb|Рисунок 5. Блоки уменьшения размерности. Слева {{---}} блок для ''PixelCNN'', справа {{---}} ''PixelRNN''. ]]На вход в производительностилюбой их указанных выше алгоритмов (''PixelCNN'', ''RowLSTM'', ''Diagonal BiLSTM'') подается большое количество объектов, поэтому внутри каждого из них сначала происходит уменьшение их количества в два раза, а затем обратное увеличение до исходного размера. Структура алгоритма с учетом уменьшения размерности показана на рисунке 4[[File:pixel-5.png|320px|thumb|Рисунок 6. Простой LSTM-блок с тремя вентилями: входным, выходным и забывания.]] === Внутреннее устройство LSTM === Внутреннее устройство ''RowLSTM'' и ''Diagonal BiLSTM'' блоков одинаково, за исключением того, что во втором случае добавляется операция сдвига в начале и возврат к исходной структуре изображения в конце.  Структура ''LSTM'' блока: # ''MaskB'' слой ''input-to-state'' <tex>K_{is}</tex> учитывает контекст из входа. # Сверточный слой ''state-to-state'' <tex>K_{ss}</tex> учитывает контекст из предыдущих скрытых слоев.  Используя эти два сверточных слоя формально вычисление ''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'' соответственно. === Diagonal BiLSTM Архитектура 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:pixel-3exampleCNN.png|350px450px|thumb|Рисунок 37. Лица, сгенерированные с помощью PixelCNN сетей <ref name=NaturalModeling>[https://arxiv. Операция сдвига в Diagonal BiLSTMorg/pdf/1612. Параллелизация происходит по диагоналям08185v4.pdf#page=8 Natural Modeling]</ref>]]В данной версии скрытое состояние считается таким же образом, как и в наивном подходе: === Архитектура PixelCNN ===# ''MaskA'' размером <tex>7\times 7</tex>.# Блоки уменьшения размеренности для ''PixelCNN''. # ''ReLU'' активация.# Сверточный слой размером <tex>h_{i,j}=f(h_{i-1,j}, h_{i,j-\times 1}, x_{i,j})</tex>, но при этом есть хитрость в самом вычислении. Построчно сдвинем строки вправо на один пиксель относительно предыдущей# ''Softmax'' слой. == Сравнение подходов ==[[File:exampleGAN.png|450px|thumb|Рисунок 8. Лица, а затем вычислим скрытые состояния в каждом столбце, как показано на рисунке 3сгенерированные с помощью 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 более нестабильное, чем RowLSTMесли сравнивать с другими методами<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= Сравнение с GAN "font-weight:bold;" | Критерий\название! style="font-weight:bold;" | PixelCNN! style="font-weight:bold;" | PixelRNN(Row LSTM)! style="font-weight:bold;" | PixelRNN(Diagonal BiLSTM)! style="font-weight:bold;" | GAN|-| Время обучения| Быстрый| Средний| Медленный| Медленный|-| Качество генерируемых изображений| Наихудшее| Средне-низкое| Средне-высокое| Высокое|}
== Примеры реализации ==
* [https://github.com/singh-hrituraj/PixelCNN-Pytorch PixelCNN на Pytorch]
* [https://github.com/ardapekis/pixel-rnn PixelRNN на Pytorch]
* [https://github.com/shirgur/PixelRNN PixelRNN на Keras]
 
==См. также==
* [[Рекуррентные нейронные сети]]
* [[Долгая краткосрочная память]]
* [[Нейронные сети, перцептрон]]
* [[Генерация объектов]]
 
==Примечания==
<references/>
== Источники информации ==
* [https://towardsdatascience.com/auto-regressive-generative-models-pixelrnn-pixelcnn-32d192911173 Auto-Regressive Generative Models]
* [http://slazebni.cs.illinois.edu/spring17/lec13_advanced.pdf Advanced Generation Methods]
* [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]
[[Категория: Машинное обучение]]
[[Категория: Генерация объектов]]
1632
правки

Навигация