PixelRNN и PixelCNN
PixelRNN и PixelCNN — алгоритмы машинного обучения, входящие в семейство авторегрессивных моделей и использующиеся для генерации и дополнения изображений. Алгоритмы были представлены в 2016 году компанией DeepMind[1] и являются предшественниками алгоритма WaveNet[2], который используется в голосовом помощнике Google.
Основным преимуществом PixelRNN и PixelCNN является уменьшение времени обучения, по сравнению с наивными способами попиксельной генерации изображений.
Постановка задачи
Пусть дано черно-белое изображение
размером . Построчно преобразуем картинку в вектор , соединяя конец текущей строки с началом следующей. В таком представлении изображения можно предположить, что значение любого пикселя может зависеть от значений предыдущих пикселей .Тогда значение пикселя [3], оценка совместного распределения всех пикселей будет записываться в следующем виде: .
можно выразить через условную вероятность , и, используя цепное правило для вероятностейЗадача алгоритма — восстановить данное распределение. Учитывая тот факт, что любой пиксель принимает значение
, необходимо восстановить лишь дискретное распределение.Идея
Так как утверждается, что значение текущего пикселя зависит от значений предыдущего, то уместно использовать рекуррентные нейронные сети, RNN, а точнее долгую краткосрочную память, LSTM. В ранних работах[4] уже использовался данный подход, и вычисление скрытого состояния происходило следующим образом: , т.е. для того, чтобы вычислить текущее скрытое состояние, нужно было подсчитать все предыдущие, что занимает достаточно много времени.
Авторы алгоритма модернизировали LSTM в RowLSTM и Diagonal BiLSTM для получения возможности проводить вычисления параллельно, что ускоряет общее время обучения модели.
RowLSTM
В данной модификации LSTM скрытое состояние считается по формуле: .
Как видно из формулы и Рисунка 2, значение текущего скрытого состояния не зависит от предыдущего слева, а зависит только от предыдущих сверху, которые считаются параллельно.
Таким образом, главным преимуществом алгоритма перед наивным LSTM является более быстрое обучение модели, однако качество получаемых изображений ухудшается. Основной проблемой подхода является то, что модель не использует пиксели только с предыдущей строки, но не соседнего пикселя слева, который на самом деле достаточно важен, т.к. является ближайшим в построчной генерации изображения. Значит надо научиться находить скрытое состояние слева, но делать это эффективно.
Diagonal BiLSTM
В данной версии скрытое состояние считается таким же образом, как и в наивном подходе:
, но использует следующую хитрость в самом вычислении — построчно сдвинем строки вправо на один пиксель относительно предыдущей, а затем вычислим скрытые состояния в каждом столбце, как показано на Рисунке 3. Как следствие, контекст учитывается более качественно, что повышает качество изображения, однако такая модификация замедляет модель по сравнению с подходом RowLSTM.PixelCNN
Идея в том, что обычно соседние пиксели (в рамках ядра 9x9) хранят самый важный контекст для пикселя, поэтому предлагается просто использовать известные пиксели для вычисления нового, как показано на рисунке 2.
Архитектура
В алгоритмах PixelRNN и PixelCNN используются несколько архитектурных трюков, позволяющих производить вычисления быстро и надежно.
Маскированные сверточные слои
В описаниях алгоритмов фигурируют два типа маскированных сверточных слоя — MaskA, MaskB. Они необходимы для сокрытия от алгоритма лишней информации и учета контекста — чтобы ускорить обработку изображения после каждого подсчета, предлагается вместо удаления значения пикселей применять маску к изображению, что является более быстрой операцией.
Для каждого пикселя в цветном изображении в порядке очереди существуют три контекста: красный канал, зеленый и синий. В данном алгоритме очередь важна, т.е. если сейчас обрабатывается красный канал, то контекст только от предыдущих значений красного канала, если зеленый — то от всех значений на красном канале и предыдущих значениях на зеленом и т.д.
MaskA используется для того, чтобы учитывать контекст предыдущих каналов, но при этом не учитывать контекст от предыдущих значений текущего канала и следующих каналов. MaskB выполняет ту же функцию, что и MaskA, но при этом учитывает контекст от предыдущих значений текущего канала.
Уменьшение размерности
На вход в любой их указанных выше алгоритмов (PixelCNN, RowLSTM, Diagonal BiLSTM) подается большое количество объектов, поэтому внутри каждого из них сначала происходит уменьшение их количества в два раза, а затем обратное увеличение до исходного размера. Структура алгоритма с учетом уменьшения размерности показана на рисунке 4.
Внутреннее устройство LSTM
Внутреннее устройство RowLSTM и Diagonal BiLSTM блоков одинаково, за исключением того, что во втором случае добавляется операция сдвига в начале и возврат к исходной структуре изображения в конце.
Структура LSTM блока:
- MaskB слой input-to-state учитывает контекст из входа.
- Сверточный слой input-to-state учитывает контекст из предыдущих скрытых слоев.
Используя эти два сверточных слоя формально вычисление LSTM блока можно записать следующим образом:
где
— функция активации,— операция свертки,
— поэлементное умножение,
— вектор вентиля забывания, вес запоминания старой информации,
— вектор входного вентиля, вес получения новой информации,
— вектор выходного вентиля, кандидат на выход,
— вектор вентиля данных,
— строка входных данных,
— вектор краткосрочной памяти,
— вектор долгосрочной памяти,
и — ядерные веса компонент input-to-state и input-to-state соответственно.
Архитектура PixelRNN
- MaskA размером .
- Блоки уменьшения размеренности с RowLSTM блоком, в котором имеет размер , — . Для Diagonal BiLSTM имеет размер. , — . Количество блоков варьируется.
- ReLU активация.
- Сверточный слой размером .
- Softmax слой.
Архитектура PixelCNN
- MaskA размером .
- Блоки уменьшения размеренности для PixelCNN.
- ReLU активация.
- Сверточный слой размером .
- Softmax слой.
Сравнение подходов
Критерий\название | PixelCNN | PixelRNN(Row LSTM) | PixelRNN(Diagonal BiLSTM) |
---|---|---|---|
Время обучения | Быстрый | Средний | Медленный |
Качество генерируемых изображений | Наихудшее | Средне-низкое | Средне-высокое |