---
title: "PixelRNN & PixelCNN"
description: "PixelRNN과 PixelCNN은 autoregressive 방식으로 픽셀을 순차 예측해 이미지를 생성하는 모델이며, PixelRNN은 LSTM 기반으로 높은 성능을 제공하지만 학습이 느리고, PixelCNN은 마스크된 컨볼루션으로 병렬 학습이 가능하지만 오른쪽 위 블라인드 스팟 문제가 있다. 이를 해결하기 위해 Vertical/Horizontal 스택과 게이트 활성화를 도입한 Gated PixelCNN이 제안되어 블라인드 스팟을 제거하고 학습 속도는 유지하면서 성능을 향상시킨다."
date: "2024-10-17"
last_modified: "2026-05-15T08:36:00.000Z"
type: "Paper"
tags:
  - "deep learning"
  - "Computer Vision"
categories:
  - "📄 Research Paper"
series:
  - "AI 논문 리뷰"
canonical_url: "https://blog.pieroot.xyz/pixelrnn-pixelcnn"
markdown_url: "https://blog.pieroot.xyz/pixelrnn-pixelcnn.md"
---

# PixelRNN & PixelCNN

PixelRNN과 PixelCNN은 autoregressive 방식으로 픽셀을 순차 예측해 이미지를 생성하는 모델이며, PixelRNN은 LSTM 기반으로 높은 성능을 제공하지만 학습이 느리고, PixelCNN은 마스크된 컨볼루션으로 병렬 학습이 가능하지만 오른쪽 위 블라인드 스팟 문제가 있다. 이를 해결하기 위해 Vertical/Horizontal 스택과 게이트 활성화를 도입한 Gated PixelCNN이 제안되어 블라인드 스팟을 제거하고 학습 속도는 유지하면서 성능을 향상시킨다.

## PixelRNN & PixelCNN

---

PixelRNN과 PixelCNN은 이미지 생성(Generative Model) 분야에서 **autoregressive 방식**으로 픽셀을 순차적으로 예측하여 이미지를 생성하는 모델입니다.

2016년 Google DeepMind에서 발표한 논문 *"Pixel Recurrent Neural Networks"* 에서 소개되었으며, 이후 GAN, VAE와 함께 생성 모델의 핵심 축을 이루고 있습니다.

> **한 줄 요약**
> 
> 이미지의 각 픽셀을 **이전 픽셀들의 조건부 확률**로 모델링하여, 한 픽셀씩 순차적으로 생성하는 autoregressive 생성 모델입니다. PixelRNN은 LSTM 기반으로 높은 성능을, PixelCNN은 CNN 기반으로 빠른 학습 속도를 제공합니다.

### 핵심 아이디어: Autoregressive Image Generation

---

PixelRNN/PixelCNN의 핵심은 이미지의 **결합 확률 분포**를 조건부 확률의 곱으로 분해하는 것입니다.

이미지를 구성하는 $n \times n$ 픽셀에 대해, 전체 이미지의 확률을 다음과 같이 표현합니다:

$$
p(x) = \prod_{i=1}^{n^2} p(x_i | x_1, x_2, ..., x_{i-1})
$$

각 픽셀 $x_i$ 는 이전에 생성된 모든 픽셀 $x_1, ..., x_{i-1}$ 에 의존하여 생성됩니다. 이 순차적 접근 방식은 이미지의 자연스러운 구조와 연관성을 잘 포착할 수 있게 합니다.

> **왜 discrete distribution인가?**
> 
> 기존 모델들이 픽셀 값을 연속 값(continuous)으로 모델링한 것과 달리, PixelRNN은 각 채널(R, G, B)을 **0~255의 256개 카테고리**로 이산화(discretize)하여 softmax로 모델링합니다. 이 접근 방식이 표현력과 학습 안정성 모두에서 이점을 제공한다는 것이 논문의 핵심 발견 중 하나입니다.

---

## PixelRNN

---

PixelRNN은 이름 그대로 **RNN(Recurrent Neural Network) 구조**를 활용합니다.

시계열 데이터나 순차 데이터를 처리하는 데 적합한 신경망 구조로, 픽셀 간의 장기 종속성(long-range dependency)을 잘 학습할 수 있습니다.

![image](https://blog.pieroot.xyz/api/image-proxy?id=b923d904-9dc6-4f63-b446-a69c07f822db&kind=s3&pageId=2ff067c0-15d0-80ca-aa82-f2c4da035920&source=block&blockId=2ff067c0-15d0-805f-86ea-d1acf239fa15)

### 구조

---

논문에서는 두 가지 LSTM 기반 아키텍처를 제안합니다.

#### Row LSTM

가로 방향으로 픽셀을 생성하는 구조로, 이미지의 각 행을 순차적으로 처리합니다.

- 첫 번째 행의 모든 픽셀을 먼저 생성한 후, 두 번째 행으로 넘어가고, 이 과정을 반복하여 마지막 행까지 처리

- 각 픽셀은 **이전 행의 모든 픽셀**과 **같은 행의 이전 픽셀**에 의존

- 입력-상태(input-to-state) 연산을 $k \times 1$ 컨볼루션으로 처리하여, 한 행의 모든 픽셀에 대한 연산을 **병렬로 수행** 가능

- 장점: 가로 방향의 구조적 종속성을 효율적으로 포착

- 단점: 삼각형 모양의 receptive field로 인해 **일부 컨텍스트를 놓칠 수 있음**

#### Diagonal BiLSTM

대각선 방향으로 픽셀을 생성하는 구조로, 보다 복잡한 패턴을 학습할 수 있습니다.

- 입력 맵에 **skewing 연산**을 적용하여 대각선 방향의 종속성을 구현

- 양방향 LSTM 구조를 사용하여, 각 픽셀이 대각선 방향으로 앞뒤의 종속성을 모두 학습

- 이전의 **모든 픽셀**을 receptive field에 포함할 수 있어 가장 넓은 컨텍스트를 활용

- 장점: **가장 큰 receptive field** → 가장 높은 성능

- 단점: 순차적 연산으로 인해 **학습 속도가 가장 느림**

![image](https://blog.pieroot.xyz/api/image-proxy?id=57f95ceb-081c-4038-b7f8-f2f766e22fbb&kind=s3&pageId=2ff067c0-15d0-80ca-aa82-f2c4da035920&source=block&blockId=2ff067c0-15d0-8006-b588-cff559d6e470)

> **Receptive Field 크기와 성능의 상관관계**
> 
> 논문의 실험 결과, CIFAR-10에서 **Diagonal BiLSTM \> Row LSTM \> PixelCNN** 순서로 성능이 좋았습니다. 이는 receptive field의 크기 순서와 정확히 일치하며, **더 넓은 컨텍스트를 활용할수록 더 좋은 생성 품질**을 얻을 수 있다는 것을 보여줍니다.

### Residual Connection

---

PixelRNN은 깊은 네트워크 학습을 위해 **Residual Connection**을 활용합니다.

최대 12개의 LSTM 레이어를 쌓을 때 발생하는 gradient vanishing 문제를 해결하기 위해, 각 레이어의 입력을 출력에 직접 더해주는 skip connection을 적용합니다.

```
입력 → [LSTM Layer] → (+) → 출력
  └─────────────────────┘
       (Residual)
```

### PixelRNN의 한계

---

PixelRNN의 구조적 특성상 **순차적 계산**이 필요하기 때문에 속도 면에서 효율적이지 않습니다.

이러한 학습 속도의 한계를 극복하기 위해 **병렬 처리가 가능한 PixelCNN**이 개발되었습니다.

---

## PixelCNN

---

PixelCNN은 이미지를 구성하는 각 픽셀을 순차적으로 예측하지만, 이를 **컨볼루션 연산**을 통해 병렬로 처리할 수 있습니다. RNN 대신 CNN을 사용함으로써 학습 속도를 크게 향상시킨 것이 핵심입니다.

### Masked Convolution

---

PixelCNN의 핵심 메커니즘은 **마스크된 컨볼루션(Masked Convolution)**입니다.

일반 컨볼루션은 현재 픽셀 주변의 모든 픽셀 정보를 사용하지만, autoregressive 모델에서는 **현재 픽셀 이후의 정보를 사용하면 안 됩니다.** 이를 위해 컨볼루션 필터의 일부를 0으로 마스킹하여 미래 정보가 유입되지 않도록 합니다.

```
[일반 3×3 컨볼루션 필터]     [Mask A (첫 번째 레이어)]     [Mask B (이후 레이어)]
  1 1 1                       1 1 1                        1 1 1
  1 1 1          →            1 0 0            →           1 1 0
  1 1 1                       0 0 0                        0 0 0
```

마스크는 두 종류로 나뉩니다:

- **Mask A**: 첫 번째 레이어에 적용. 현재 픽셀 자체도 마스킹하여, 자기 자신의 값이 예측에 영향을 주지 않도록 합니다.

- **Mask B**: 이후 레이어에 적용. 현재 픽셀 위치를 포함하여 이전 레이어에서 계산된 feature를 활용할 수 있도록 합니다.

### 병렬 처리의 장점

---

컨볼루션 연산은 본질적으로 병렬 처리가 가능하기 때문에, PixelCNN은 PixelRNN에 비해 **학습 속도가 훨씬 빠릅니다.** 각 층의 필터가 이미지 전체에 병렬로 적용되므로, 대규모 이미지 데이터셋에서도 효율적인 학습이 가능합니다.

> **PixelRNN vs PixelCNN 학습 속도**
> 
> 같은 하드웨어 환경에서 PixelCNN은 PixelRNN 대비 **수 배 빠른 학습**이 가능합니다. 다만 성능(NLL) 면에서는 PixelRNN이 우위에 있습니다. 속도와 성능 사이의 trade-off인 셈입니다.

---

## PixelCNN의 Blind Spot 문제

---

PixelCNN에는 치명적인 단점이 하나 있습니다. 바로 **Blind Spot** 문제입니다.

마스크된 컨볼루션을 여러 층 쌓더라도, receptive field가 성장하는 패턴을 보면 **현재 픽셀의 오른쪽 위 영역**을 전혀 참조하지 못하는 구역이 생깁니다. 3×3 필터 기준으로 **전체 receptive field의 최대 1/4까지** blind spot이 발생할 수 있습니다.

```
[Masked Convolution의 Receptive Field 성장]

Layer 1:        Layer 2:        Layer 3:
  ■ ■ ■          ■ ■ ■ · ·      ■ ■ ■ ■ · · ·
  ■ ✖ ·    →    ■ ■ ■ · ·  →   ■ ■ ■ ■ · · ·
  · · ·          ■ ■ ✖ · ·      ■ ■ ■ ■ · · ·
                 · · · · ·      ■ ■ ■ ✖ · · ·
                                · · · · · · ·

  ■ = 참조 가능 영역
  · = Blind Spot (참조 불가)
  ✖ = 현재 픽셀
```

이 blind spot은 이미지의 오른쪽 위 영역에서 오는 중요한 컨텍스트 정보를 놓치게 만들어, 생성 품질에 직접적인 악영향을 줍니다.

---

## Gated PixelCNN

---

Blind Spot 문제와 성능 한계를 해결하기 위해 [van den Oord et al. (2016)](https://arxiv.org/abs/1606.05328)이 제안한 모델이 **Gated PixelCNN**입니다. 핵심 개선점은 크게 두 가지입니다.

### 1. Vertical & Horizontal Stack

---

Blind spot을 제거하기 위해 컨볼루션을 **두 개의 스택**으로 분리합니다.

- **Vertical Stack**: 현재 행 **위의 모든 행**에 대한 정보를 처리. $n \times n$ 크기의 마스크된 필터를 사용하되, 현재 행은 포함하지 않습니다.

- **Horizontal Stack**: **현재 행의 이전 픽셀들**에 대한 정보를 처리. $1 \times n$ 크기의 마스크된 필터를 사용합니다.

```
[Vertical Stack]              [Horizontal Stack]
  ■ ■ ■ ■ ■                    · · · · ·
  ■ ■ ■ ■ ■       +           ■ ■ ✖ · ·
  · · · · ·                    · · · · ·
  
  → 위쪽 전체 참조              → 왼쪽 참조

Vertical Stack의 출력이 Horizontal Stack으로 흘러가면서
모든 이전 픽셀을 빠짐없이 참조할 수 있게 됩니다.
```

Vertical Stack의 출력이 $1 \times 1$ 컨볼루션을 통해 Horizontal Stack에 전달되면서, 두 스택의 정보가 결합됩니다. 이를 통해 **blind spot 없이 모든 이전 픽셀을 참조**할 수 있게 됩니다.

### 2. Gated Activation

---

기존 PixelCNN의 ReLU 활성화 함수를 **게이트 메커니즘**으로 대체합니다.

$$
y = \tanh(W_{k,f} * x) \odot \sigma(W_{k,g} * x)
$$

- $tanh$: 정보의 **내용(content)**을 결정

- $\sigma$ (sigmoid): 정보의 **흐름(gate)**을 제어

- $odot$: element-wise 곱

이 게이트 구조는 LSTM의 게이트와 유사한 역할을 하며, 단순한 ReLU보다 **더 복잡한 픽셀 간 상호작용**을 모델링할 수 있습니다.

> **Gated PixelCNN의 성과**
> 
> Gated PixelCNN은 PixelCNN 대비 **0.11 bits/dim 향상**을 달성했으며, 이는 생성 이미지의 시각적 품질에 상당한 영향을 미칩니다. 또한 PixelRNN과 유사한 성능을 **절반 이하의 학습 시간**으로 달성하여, 속도와 성능 모두에서 좋은 균형을 보여줍니다.

### Conditional Generation

---

Gated PixelCNN은 **조건부 이미지 생성**도 지원합니다. 클래스 레이블 $h$를 조건으로 주어 특정 카테고리의 이미지를 생성할 수 있습니다.

$$
y = \tanh(W_{k,f} * x + V_{k,f}^T h) \odot \sigma(W_{k,g} * x + V_{k,g}^T h)
$$

ImageNet 클래스 레이블을 조건으로 사용하면 해당 클래스에 맞는 이미지를 생성할 수 있으며, 사람 얼굴 이미지의 임베딩을 조건으로 사용하면 비슷한 스타일의 초상화를 생성할 수도 있습니다.

---

### 전체 비교

---

---

### 정리

이 글에서는 autoregressive 이미지 생성 모델의 시초인 PixelRNN부터, 병렬 처리를 가능하게 한 PixelCNN, 그리고 Blind Spot 문제를 해결한 Gated PixelCNN까지의 흐름을 살펴보았습니다.

#### 핵심 정리

✅ **Autoregressive Model**: 이미지의 결합 확률을 조건부 확률의 곱으로 분해하여 픽셀을 순차 생성

✅ **PixelRNN**: LSTM 기반으로 장기 종속성을 잘 학습하지만, 순차 연산으로 학습 속도가 느림

✅ **Row LSTM vs Diagonal BiLSTM**: receptive field가 넓을수록 성능이 좋음 (BiLSTM이 최고 성능)

✅ **PixelCNN**: Masked Convolution으로 병렬 학습 가능하지만, Blind Spot 문제 존재

✅ **Gated PixelCNN**: Vertical/Horizontal Stack으로 Blind Spot 제거 + Gated Activation으로 성능 향상

✅ **결론**: Gated PixelCNN이 PixelRNN 수준의 성능을 **절반 이하의 학습 시간**으로 달성

---

### 참고 링크

> - [Pixel Recurrent Neural Networks (arXiv, 2016)](https://arxiv.org/abs/1601.06759)
> 
> - [Conditional Image Generation with PixelCNN Decoders (arXiv, 2016)](https://arxiv.org/abs/1606.05328)
> 
> - [PixelCNN++ (arXiv, 2017)](https://arxiv.org/abs/1701.05517)
> 
> - [PixelCNN's Blind Spot - Towards Data Science](https://towardsdatascience.com/pixelcnns-blind-spot-84e19a3797b9/)
> 
> - [Autoregressive Models Lecture - Stanford](https://deep-generative-models.github.io/files/ppt/2021/Lecture%206%20Autoregressive%20Models.pdf)
