Markdown Preview
PixelRNN & PixelCNN
Frontmatter
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의 핵심은 이미지의 결합 확률 분포를 조건부 확률의 곱으로 분해하는 것입니다.
이미지를 구성하는 픽셀에 대해, 전체 이미지의 확률을 다음과 같이 표현합니다:
각 픽셀 는 이전에 생성된 모든 픽셀 에 의존하여 생성됩니다. 이 순차적 접근 방식은 이미지의 자연스러운 구조와 연관성을 잘 포착할 수 있게 합니다.
왜 discrete distribution인가?
기존 모델들이 픽셀 값을 연속 값(continuous)으로 모델링한 것과 달리, PixelRNN은 각 채널(R, G, B)을 0~255의 256개 카테고리로 이산화(discretize)하여 softmax로 모델링합니다. 이 접근 방식이 표현력과 학습 안정성 모두에서 이점을 제공한다는 것이 논문의 핵심 발견 중 하나입니다.
PixelRNN
PixelRNN은 이름 그대로 RNN(Recurrent Neural Network) 구조를 활용합니다.
시계열 데이터나 순차 데이터를 처리하는 데 적합한 신경망 구조로, 픽셀 간의 장기 종속성(long-range dependency)을 잘 학습할 수 있습니다.
구조
논문에서는 두 가지 LSTM 기반 아키텍처를 제안합니다.
Row LSTM
가로 방향으로 픽셀을 생성하는 구조로, 이미지의 각 행을 순차적으로 처리합니다.
- 첫 번째 행의 모든 픽셀을 먼저 생성한 후, 두 번째 행으로 넘어가고, 이 과정을 반복하여 마지막 행까지 처리
- 각 픽셀은 이전 행의 모든 픽셀과 같은 행의 이전 픽셀에 의존
- 입력-상태(input-to-state) 연산을 컨볼루션으로 처리하여, 한 행의 모든 픽셀에 대한 연산을 병렬로 수행 가능
- 장점: 가로 방향의 구조적 종속성을 효율적으로 포착
- 단점: 삼각형 모양의 receptive field로 인해 일부 컨텍스트를 놓칠 수 있음
Diagonal BiLSTM
대각선 방향으로 픽셀을 생성하는 구조로, 보다 복잡한 패턴을 학습할 수 있습니다.
- 입력 맵에 skewing 연산을 적용하여 대각선 방향의 종속성을 구현
- 양방향 LSTM 구조를 사용하여, 각 픽셀이 대각선 방향으로 앞뒤의 종속성을 모두 학습
- 이전의 모든 픽셀을 receptive field에 포함할 수 있어 가장 넓은 컨텍스트를 활용
- 장점: 가장 큰 receptive field → 가장 높은 성능
- 단점: 순차적 연산으로 인해 학습 속도가 가장 느림
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의 구조적 특성상 순차적 계산이 필요하기 때문에 속도 면에서 효율적이지 않습니다.
항목 | Row LSTM | Diagonal BiLSTM |
Receptive Field | 삼각형 (제한적) | 전체 이전 픽셀 (최대) |
학습 속도 | 보통 | 느림 |
성능 (NLL) | 3.02 bits/dim (CIFAR-10) | 3.00 bits/dim (CIFAR-10) |
병렬화 | 행 단위 부분 병렬화 | 대각선 단위 부분 병렬화 |
이러한 학습 속도의 한계를 극복하기 위해 병렬 처리가 가능한 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)이 제안한 모델이 Gated PixelCNN입니다. 핵심 개선점은 크게 두 가지입니다.
1. Vertical & Horizontal Stack
Blind spot을 제거하기 위해 컨볼루션을 두 개의 스택으로 분리합니다.
- Vertical Stack: 현재 행 위의 모든 행에 대한 정보를 처리. 크기의 마스크된 필터를 사용하되, 현재 행은 포함하지 않습니다.
- Horizontal Stack: 현재 행의 이전 픽셀들에 대한 정보를 처리. 크기의 마스크된 필터를 사용합니다.
[Vertical Stack] [Horizontal Stack]
■ ■ ■ ■ ■ · · · · ·
■ ■ ■ ■ ■ + ■ ■ ✖ · ·
· · · · · · · · · ·
→ 위쪽 전체 참조 → 왼쪽 참조
Vertical Stack의 출력이 Horizontal Stack으로 흘러가면서
모든 이전 픽셀을 빠짐없이 참조할 수 있게 됩니다.Vertical Stack의 출력이 컨볼루션을 통해 Horizontal Stack에 전달되면서, 두 스택의 정보가 결합됩니다. 이를 통해 blind spot 없이 모든 이전 픽셀을 참조할 수 있게 됩니다.
2. Gated Activation
기존 PixelCNN의 ReLU 활성화 함수를 게이트 메커니즘으로 대체합니다.
- : 정보의 내용(content)을 결정
- (sigmoid): 정보의 흐름(gate)을 제어
- : element-wise 곱
이 게이트 구조는 LSTM의 게이트와 유사한 역할을 하며, 단순한 ReLU보다 더 복잡한 픽셀 간 상호작용을 모델링할 수 있습니다.
Gated PixelCNN의 성과
Gated PixelCNN은 PixelCNN 대비 0.11 bits/dim 향상을 달성했으며, 이는 생성 이미지의 시각적 품질에 상당한 영향을 미칩니다. 또한 PixelRNN과 유사한 성능을 절반 이하의 학습 시간으로 달성하여, 속도와 성능 모두에서 좋은 균형을 보여줍니다.
Conditional Generation
Gated PixelCNN은 조건부 이미지 생성도 지원합니다. 클래스 레이블 를 조건으로 주어 특정 카테고리의 이미지를 생성할 수 있습니다.
ImageNet 클래스 레이블을 조건으로 사용하면 해당 클래스에 맞는 이미지를 생성할 수 있으며, 사람 얼굴 이미지의 임베딩을 조건으로 사용하면 비슷한 스타일의 초상화를 생성할 수도 있습니다.
전체 비교
특성 | PixelRNN (Diagonal BiLSTM) | PixelCNN | Gated PixelCNN |
기반 구조 | LSTM (Recurrent) | Masked Convolution | Vertical/Horizontal Stack + Gate |
Receptive Field | 전체 이전 픽셀 ✅ | Blind Spot 존재 ❌ | 전체 이전 픽셀 ✅ |
활성화 함수 | LSTM Gate | ReLU | Gated (tanh × sigmoid) |
학습 속도 | 느림 🐌 | 빠름 🚀 | 빠름 🚀 |
성능 (CIFAR-10) | 3.00 bits/dim | 3.14 bits/dim | 3.03 bits/dim |
Conditional 지원 | ❌ | ❌ | ✅ |
병렬 학습 | 제한적 | 완전 병렬 | 완전 병렬 |
정리
이 글에서는 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 수준의 성능을 절반 이하의 학습 시간으로 달성