PixelRNN и PixelCNN — различия между версиями
Tklochkov (обсуждение | вклад) (→Уменьшение размерности) |
Tklochkov (обсуждение | вклад) (→Архитектура) |
||
Строка 38: | Строка 38: | ||
== Архитектура == | == Архитектура == | ||
− | В PixelRNN/PixelCNN используются | + | В PixelRNN/PixelCNN используются множество архитектурных трюков, позволяющих сделать вычисления быстрыми и надежными. |
=== Маскированные сверточные слои === | === Маскированные сверточные слои === | ||
Строка 51: | Строка 51: | ||
[[File:pixel-4.png|350px|thumb|Рисунок 4. Блоки уменьшения размерности. Слева - блок для PixelCNN, справа - PixelRNN. ]] | [[File:pixel-4.png|350px|thumb|Рисунок 4. Блоки уменьшения размерности. Слева - блок для PixelCNN, справа - PixelRNN. ]] | ||
На вход в любой их указанных выше алгоритмов (PixelCNN, Row LSTM, Diagonal BiLSTM) подается большое количество объектов. Поэтому внутри каждого из них сначала происходит уменьшение их количества в 2 раза, а затем обратное увеличение в 2 раза. Структура алгоритма с учетом уменьшения размерности показана на рисунке 4. | На вход в любой их указанных выше алгоритмов (PixelCNN, Row LSTM, Diagonal BiLSTM) подается большое количество объектов. Поэтому внутри каждого из них сначала происходит уменьшение их количества в 2 раза, а затем обратное увеличение в 2 раза. Структура алгоритма с учетом уменьшения размерности показана на рисунке 4. | ||
+ | |||
+ | === Внутреннее устройства LSTM === | ||
+ | Модификация Row LSTM, Diagonal BiLSTM одинакова с архитектурной точки зрения. Отличия Diagonal BiLSTM только в том, что добавляется операция сдвига в начале и возврат к исходной структуре изображения в конце. | ||
+ | |||
+ | Структура LSTM блока: | ||
+ | 1. MaskB слой input-to-state <tex>K_{is}</tex> учитывает контекст из входа. | ||
+ | 2. Сверточный слой 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> - поэлементное умножение. | ||
+ | |||
+ | === Архитектура PixelRNN === | ||
+ | # MaskA размером <tex>7x7</tex> | ||
+ | # Блоки уменьшения размеренности с Row LSTM блоком, в котором <tex>K_{is}</tex> имеет размер <tex>3x1</tex>, <tex>K_{ss}</tex> - <tex>3x2</tex>. Для Diagonal BiLSTM <tex>K_{is}</tex> имеет размер <tex>1x1</tex>, <tex>K_{ss}</tex> - <tex>1x2</tex>. Количество блоков варьируется. | ||
+ | # ReLU активация | ||
+ | # Сверточный слой размером <tex>1x1</tex> | ||
+ | # Softmax слой | ||
+ | |||
+ | === Архитектура PixelCNN === | ||
+ | # MaskA размером <tex>7x7</tex> | ||
+ | # Блоки уменьшения размеренности для PixelCNN. | ||
+ | # ReLU активация | ||
+ | # Сверточный слой размером <tex>1x1</tex> | ||
+ | # Softmax слой | ||
== Сравнение с GAN == | == Сравнение с GAN == | ||
== Примеры реализации == | == Примеры реализации == |
Версия 00:02, 23 марта 2020
PixelRNN/PixelCNN - алгоритмы машинного обучения, входящие в семейство авторегрессивных моделей. Используются для генерации и дополнения изображений. Алгоритмы были представлены в 2016 году компанией DeepMind и являются предшественниками алгоритма WaveNet, который используется в голосовом помощнике Google.
Основным преимуществом PixelRNN/PixelCNN является уменьшение времени обучения, по сравнению с наивными способами попиксельной генерации изображений.
Содержание
Постановка задачи
Пусть дано черно-белое изображение
размером . Построчно преобразуем картинку в вектор , соединяя конец текущей строки с началом следующей. В таком представлении изображения можно предположить, что значение любого пикселя может зависеть от значений предыдущих пикселей .Тогда значение пикселя
можно выразить через условную вероятность , и, используя цепное правило для вероятностей, оценка совместного распределения всех пикселей будет записываться в следующем виде: .Задача алгоритма - восстановить данное распределение. Учитывая тот факт, что любой пиксель принимает значение
, необходимо восстановить лишь дискретное распределение.Идея
Т.к. утверждается, что значение текущего пикселя зависит от значений предыдущего, то уместно использовать RNN, а точнее LSTM. В ранних работах уже использовался данный подход, и вычисление скрытого состояния происходило следующим образом: , т.е. для того, чтобы вычислить текущее скрытое состояние, нужно было подсчитать все предыдущие, что занимает достаточно много времени.
Авторы алгоритма модернизировали LSTM в RowLSTM и Diagonal BiLSTM таким образом, чтобы стало возможным распараллеливание вычислений, что в итоге положительно сказывается на времени обучения модели.
RowLSTM
В данной модификации LSTM предлагается рассчитывать скрытое состояние следующим образом: .
Как видно из формулы и Рисунка 2, значение текущего скрытого состояния не зависит от предыдущего слева, а зависит от предыдущих сверху, которые можно параллельно рассчитать.
Из плюсов данного алгоритма можно отметить его быстродействие - модель обучается быстрее, нежели наивный LSTM. Из минусов - относительно плохое качество получаемых изображений. Это связанно как минимум с тем, что мы используем контекст пикселей с предыдущей строки, но никак не используем контекст соседнего слева пикселя, которые является достаточно важным, т.к. является ближайшим с точки зрения построчной генерации изображения.
Отсюда напрашивается идея каким-то образом найти скрытое состояние пикселя слева, но при этом не потерять в производительности.
Diagonal BiLSTM
В данной версии скрытое состояние считается таким же образом, как и в наивном подходе:
, но при этом есть хитрость в самом вычислении. Построчно сдвинем строки вправо на один пиксель относительно предыдущей, а затем вычислим скрытые состояния в каждом столбце, как показано на рисунке 3.Данная версия позволяет учитывать контекст более качественно, но при этом занимает больше времени, чем RowLSTM.
PixelCNN
Идея в том, что обычно соседние пиксели (в рамках ядра 9x9) хранят самый важный контекст для пикселя. Поэтому предлагается просто использовать известные пиксели для вычисления нового, как показано на рисунке 2.
Архитектура
В PixelRNN/PixelCNN используются множество архитектурных трюков, позволяющих сделать вычисления быстрыми и надежными.
Маскированные сверточные слои
В описаниях алгоритмов фигурируют два типа маскированных сверточных слоя - MaskA, MaskB. Они необходимы для сокрытия от алгоритма лишней информации и учета контекста - чтобы не обрабатывать изображение после каждого подсчета, удаляя значения пикселей, можно применить маску к изображению, что является более быстрой операцией.
Для каждого пикселя в цветном изображении в порядке очереди существуют 3 контекста: красный канал, зеленый и синий. В данном алгоритме очередь важна, т.е. если сейчас обрабатывается красный канал, то контекст только от предыдущих значений красного канала, если зеленый - то от всех значений на красном канале и предыдущих значениях на зеленом и т.д.
MaskA используется для того, чтобы учитывать контекст предыдущих каналов, но при этом не учитывать контекст от предыдущих значений текущего канала и следующих каналов. MaskB выполняет ту же функцию, что и MaskA, но при этом учитывает контекст от предыдущих значений текущего канала.
Уменьшение размерности
На вход в любой их указанных выше алгоритмов (PixelCNN, Row LSTM, Diagonal BiLSTM) подается большое количество объектов. Поэтому внутри каждого из них сначала происходит уменьшение их количества в 2 раза, а затем обратное увеличение в 2 раза. Структура алгоритма с учетом уменьшения размерности показана на рисунке 4.
Внутреннее устройства LSTM
Модификация Row LSTM, Diagonal BiLSTM одинакова с архитектурной точки зрения. Отличия Diagonal BiLSTM только в том, что добавляется операция сдвига в начале и возврат к исходной структуре изображения в конце.
Структура LSTM блока: 1. MaskB слой input-to-state
учитывает контекст из входа. 2. Сверточный слой state-to-state учитывает контекст из предыдущих скрытых слоев.Используя эти два сверточных слоя формально вычисление LSTM блока можно записать следующим образом:
где
- функция активации, - операция свертки, - поэлементное умножение.Архитектура PixelRNN
- MaskA размером
- Блоки уменьшения размеренности с Row LSTM блоком, в котором имеет размер , - . Для Diagonal BiLSTM имеет размер , - . Количество блоков варьируется.
- ReLU активация
- Сверточный слой размером
- Softmax слой
Архитектура PixelCNN
- MaskA размером
- Блоки уменьшения размеренности для PixelCNN.
- ReLU активация
- Сверточный слой размером
- Softmax слой