우도 모델 학습의 팁

Eric Jang의 튜토리얼을 번역한 게시물입니다.

이 튜토리얼에서는 오토리그레시브 모델이나 정규화 플로우처럼 우도를 직접 최적화하는 생성 모델을 학습시킬 때 많이 사용하는 기법들을 다루겠습니다. 딥러닝을 이용한 생성 모델은 빠르게 성장 중인 분야죠, 그래서 여러 리서치 논문이 공통적으로 사용하는 평가(evaluation)에 대한 기본적인 용어를 초보자도 알기 쉽도록 소개하고자 합니다. 특히 RGB 이미지와 같이 복잡한 분포를 모델링하는 사례에 대해서요. ICML에서 정규화 플로우에 대한 튜토리얼 강의를 했었는데, 이 포스트는 그 강의의 심화 버전이라고 보시면 됩니다.

이 튜토리얼에서는 생성 모델 중 수학적으로 가장 직관적인 모델(추적 가능한 밀도 추정 모델)을 논의하고, 이러한 모델을 디자인하여 이미지 픽셀을 모델링할 때 고려해야 될 부분들을 다루겠습니다. 포스트를 완독한 독자는 구조적으로 상이한, 혹은 픽셀을 모델링하는 방식이 전혀 다른 두 우도 모델을 정량적으로 비교할 수 있게 됩니다.

발산 최소화: 생성 모델링의 일반적인 프레임워크

생성 모델링의 목표는 (사실 모든 통계적 머신러닝의 목표이기도 하죠) 임의의 확률 분포 p(x)에서 샘플링된 데이터를 가지고 p(x)를 근사하는 pθ(x) 모델을 만드는 것입니다. 모델링을 통해서 주어진 그대로의 데이터 너머의 직관을 탐색할 수 있죠. 다음처럼 생성 모델로 여러가지 다양한 것들을 해볼 수 있습니다:

  • p(x)에서 새로운 샘플을 뽑습니다.
  • 관찰된 x를 설명하는 계층적 잠재 변수 z를 학습합니다.
  • 잠재 변수에 개입해서 중재 분포 pθ(x|do(z))를 조사할 수 있습니다. 이 기술은 조건 분포가 올바른 인과 관계 zx를 모델링할 때만 유효하고, 무시가능성을 가정합니다.
  • 모델 분포에 대해서 새로운 데이터 포인트 x‘의 우도를 평가하여 이상(anomaly)을 탐지합니다.

조건 분포에 대한 모델링은 훨씬 다양한 분야에서 활용이 가능합니다, 분류와 회귀 문제를 생성 모델을 학습하는 것으로 해석할 수 있으니까요:

  • 기계 번역 p(번역된 영어 문장|프랑스어 문장)
  • 캡셔닝 p(캡션|이미지)
  • MSE 최소화 min (1/2)(xμ)2와 같은 회귀 목적함수는 수학적으로 대각 공분산을 가지는 가우시안에 대해서 로그 우도 추정을 최대화하는 것, 즉 max -(1/2)(xμ)2와 동일합니다.

p(x)에 매칭되는 pθ(x)를 구하기 위해서는 우선 두 분포 사이의 거리라는 개념이 필요합니다. 통계에서는 발산 측도라는 “거리”를 약화시킨 개념을 보다 널리 사용합니다. 이는 계랑 거리(metric distance)와는 다르게 대칭적이지 않죠 (D(p, q) ≠ D(q, p)). 일단 분포 사이의 정형 발산 측도를 수립하면, 최적화를 통해 그 발산 측도를 최소화할 수 있습니다.

공식으로 나타낼 수 있는 매우 많은 종류의 발산 D(pθ||p)가 있는데요, 이들은 생성 모델링 알고리듬에도 자주 사용됩니다. 몇 가지 예를 볼까요:

  • 최대 평균 불일치 (Maximum  Mean Discrepancy, MMD)
  • 옌센-섀넌 발산 (Jensen-Shannon Divergence, JSD)
  • 쿨백-라이블러 발산 (Kullback-Leibler Divergence, KLD)
  • 역 쿨백-라이블러 발산
  • 커널화 스타인 불일치 (Kernelized Stein Discrepancy, KSD)
  • 브레그만 발산 (Bregman Divergence)
  • 휘배리넨 점수 (Hyvärinen score)
  • 카이 제곱 발산 (Chi-Squared Divergence)
  • 알파 발산 (Alpha Divergence)

두 분포간 발산은 계량과는 다르게 대칭일 필요가 없습니다. 데이터와 계산량이 무한하다면 이 모든 발산은 동일한 정답에 도달하게 됩니다, 바로 D(pθ||p) = 0 iff pθ = p 라는 것이죠. 이러한 발산은 인셉션 점수나 Fréchet Inception Distance와 같은 인지적 평가 계량과는 다르다는 점을 염두에 두세요, 인지적 평가 계량은 데이터의 극한에서 동일한 결과에 대한 수렴을 보장하지는 않으니까요 (그래도 이 또한 유용한 계량입니다, 이미지의 시각적 품질을 생각한다면요).

그렇지만 대부분의 실험에서는 데이터와 계산량이 한정되어 있습니다. 따라서 어떤 계량 방식을 고르는지가 중요하고, 어떠한 생성 분포 pθ(x)가 배워지는지 그 패턴 자체를 변화시킬 수도 있죠. 예를 들어, 타겟 밀도 p가 멀티 모달인데 모델 분포 q의 표현력이 충분히 강하지 않은 상황에서 정방향 DKL(p||q)를 최소화 하면 모드 커버링 현상이, 반대 방향의 DKL(q||p)를 최소화하면 모드-드롭핑 현상이 발생하게 됩니다. 왜 그런지는 이 블로그 포스트를 참조하세요.

생성 모델링을 발산 최소화의 프레임워크로 해석하는 것은 매우 유용하죠,  우리가 고른 발산 목적 함수에 생성 모델로부터 우리가 원하는 특성을 정제된 방식으로 매핑할 수 있기 때문입니다.  샘플링 은 추적가능하지만 로그 확률을 구할 수 없는 (GAN과 같은) 암시적 밀도 모델일 수도 있고, 혹은 샘플링할 수는 없지만 (비정규화된) 로그 확률은 추적할 수 있는 에너지 기반의 모델일 수도 있습니다.

이 블로그 포스트는 가장 직관적인 계량인 쿨백-라이블러 발산을 사용해서 학습하고 평가할 수 있는 모델들을 다룰 것입니다. 오토리그레시브 모델, 정규화 플로우, 그리고 (대략) VAE가 여기에 포함되죠. KLD를 최적화하는 것은 로그 확률을 최적화하는 것과 동일한데, 다음 섹션에서 왜 그러한지 유도해봅시다!

평균 로그 확률과 압축

확률론적 처리과정을 통해서 데이터를 생성하는 확률 분포 p(x)를 모델링하는 것이 목표입니다. 보통은 충분히 큰 데이터셋에서 샘플링하면 실제 데이터 생성 프로세스에서 샘플링하는 것과 대략적으로 같다고 생각하죠. 예를 들어서 MNIST 데이터셋에서 이미지를 샘플링하는 것은 MNIST 데이터셋을 만든 참된 손글씨 프로세스에서 샘플을 뽑는 것과 동일하다고 말입니다.

p(x)에서 i.i.d로 샘플된 이미지 테스트셋 x1, …, xN과 파라미터 θ를 갖는 우도 모델 pθ가 주어졌을 때, 다음 목적함수를 최대화해야 합니다:

Screenshot from 2020-06-02 21-17-43

평균 로그 확률은 참된 우도 p와 모델 우도 pθ 사이의 음수 크로스 엔트로피에 대한 몬테카를로 추정자입니다. 모든 xi에 대해서 실제로 계산을 수행할 수는 없으니까요. 쉽게 말하면, “데이터의 평균 우도를 최대화한다”고 할 수 있고, 혹은 “실제 분포와 모델 분포 사이의 음수 크로스-엔트로피를 최소화한다”고도 할 수 있습니다.

대수학을 조금 쓰면, 음수 크로스-엔트로피는 (상대적 엔트로피인) KL 발산과 p의 절대 엔트로피로 재정리할 수 있습니다:

H(p, pθ) = –KL(p, pθ) – H(p)

샤넌의 소스 코드 이론(1948)에 따르면 엔트로피 H(p)는, p(x)로부터의 샘플을 손실없이 전달하기 위한 평균 코드 길이의 하한입니다. 높은 엔트로피는 보다 심한 “불확정성”을 의미하고, 이 “불확정성”은 압축이 불가능하죠. 특히나 자연 로그 loge를 사용해서 엔트로피를 구할 때, “정보의 자연적 단위,” 즉 nats를 입력으로 받습니다. log2를 사용해서 엔트로피를 구할 경우 그 결과는 익히 알고있는 “비트”가 되겠죠. H(p) 항은 θ에 대해서 독립적이므로, L(θ)를 최대화하는 것은 KL(p, pθ)를 최소화하는 것과 동일합니다. 이것이 우도 최대화가 KL 발산 최소화로도 불리우는 이유이지요.

KL 발산 KL(p, pθ), 즉 상대적 엔트로피는 pθ(x)에 기반한 엔트로피 코딩 스킴을 사용해서 p(x)로부터의 데이터를 인코딩하기 위해서 필요한 “추가적 nat”의 갯수입니다. 따라서, 음수 크로스 엔트로피의 몬테 카를로 추정자 L(θ) 역시 nats로 표현되게 되는 것이죠.

이 둘을 합쳐서 이야기하자면, 크로스 엔트로피는 pθ에 기반한 코드북을 사용해서 p로부터의 샘플을 소통하기 위해 필요한 평균 코드  길이와 같습니다. 어떠한 경우에도 “기본 요금”인 H(p) nats가 필요하고 (최적 코드), 그에 더해 추가로 pθp로부터 달라진만큼 KL(p, pθ) nats라는 벌금을 내는 것이지요.

상당히 해석 가능한 방식으로 두 다른 모델의 크로스 엔트로피를 비교할 수 있는데요: 모델 θ1이 평균 우도 L(θ1)을 가진다고 할 때, 모델 θ1이 평균 우도 L(θ2)를 가진다고 합시다. L(θ1) – L(θ2)를 차감하면 엔트로피항 H(p)가 상쇄되어서 결과적으로 KL(p,pθ1)  – KL(p,pθ2) 이 됩니다. 이 값은 “코드pθ1에서 코드pθ2로 옮길 때 지불해야하는 페널티 nats의 감소”라고 볼 수 있는 것이죠.

표현력, 최적화, 일반화는 좋은 생성 모델의 세 가지 주요한 특성입니다. 그리고 우도는 해석 가능한 측량을 제공하기 때문에, 이를 이용해서 모델의 세 가지 특성을 디버깅할 수도 있죠. 만약 생성 모델이 학습셋을 기억하지 못한다면, 이는 (로컬 미니마에서 빠져나오지 못하는) 최적화의 문제이거나 , 혹은 표현력의 문제(언더피팅)일 것입니다.

CIFAR10 이미지 데이터셋은 50000개의 학습 샘플을 가집니다. 따라서 모델이 데이터 전체를 완벽하게 기억해버리면 학습 데이터셋의 각 이미지에 대해서 1/50000의 확률 질량을 부여한다는 것을 알 수 있죠. 그리하여 음수 크로스 엔트로피는 log2(1/50000), 즉 이미지당 15.6 비트가 됩니다 (이는 이미지당 얼마나 많은 픽셀이 있는지와는 무관합니다!). 당연히 생성 모델이 이렇게 극단적으로 오버피팅되는 것을 원하는 것은 아니겠지만, 생성 모델을 디버깅할 때는 이러한 상한을 염두에 두고 정밀 테스팅하는게 유용하겠죠.

학습과 테스트 우도 사이의 차이를 비교하면 네트워크가 단순히 학습셋을 기억하는 것인지, 아니면 테스트셋에도 일반화되는 무언가를 배우는 것인지 알 수 있습니다. 또한 데이터에 의미가 있는 mode가 존재한다면 모델이 이를 잘 캐치하는지도 파악할 수 있죠.

이미지 픽셀 모델링엔 어떤 분포를 사용할까?

이미지를 매개변수화하는 방법은 굉장히 다양합니다. 예를 들어서 이미지를 2D에 투영된 (렌더링된) 3D 신으로 이미지를 나타낼 수도 있고, 혹은 이미지를 스케치의 벡터 표상이나 라플라시안 피라미드로 매개변수화 할 수도 있습니다. 심지어 그림을 그리는 로봇 팔의 모터 회전으로 나타내는 것도 가능하죠. 하지만 보통 연구자들은 보다 간단하게 RGB 픽셀에 대한 결합 분포로 이미지 우도를 모델링 합니다. 자연적 데이터를 눈에 보이는 전자기적 스펙트럼으로 나타내는데 RGB 픽셀이라는 범용 디지털 형식이 매우 효과적인 것이 검증되었으니까요.

각 RGB 픽셀은 256개의 값을 가질 수 있는 uint8 정수로 인코딩됩니다. 따라서 3072개의 픽셀로 이루어진 이미지는 픽섹 당 256개의 값이 가능하므로 가능한 표현값은 2563072개가 됩니다. 가능한 이미지의 수가 한정적이기 때문에 이론적으로는 이미지를 2563072개의 면을 가진 주사위 하나로 표상할 수도 있겠죠. 하지만 이는 메모리상에 나타내기에 너무나도 큰 숫자입니다! 3개의 uint8 인코딩 형식의 픽셀을 결합 모델링하여 카테고리 결과로 모델링하는 것만도 2563 = 16777216개의 카테고리를 요하는데, 이는 현대 컴퓨터로도 무리입니다. 계산적으로 추적 가능토록 하려면 전체 이미지에 대한 우도를 조건적으로 독립적인 픽셀별 분포의 조합으로 “분해해야” 합니다. 쉬운 분해방식 중 하나는 각 픽셀의 우도를 서로 독립적으로 유지하는 것입니다:

p(x1, …, xN) = p(x1)p(x2) … p(xN)

이는 평균 필드 디코더로도 알려져 있습니다 (“평균 필드”라는 이름이 어디서 유래했는지는 이 댓글을 참조하세요). 각 픽셀 분포는 고유의 추적 가능한 밀도 혹은 질량 함수를 가집니다.

픽셀 우도를 오토리그레시브하게 만드는 것도 방법인데요, 이 경우 각 조건 분포가 고유의 추적 가능한 밀도 혹은 질량 함수를 가집니다.

p(x1, …, xN) = p(x1)p(x2|x1) … p(xN|x1, …, xN-1)

그래도 여전히 각 조건 분포를 어떻게 모델링할 지에 대한 문제가 남아있죠. 다음은 몇 가지 자주 쓰이는 선택지입니다, 실제로 이를 사용한 논문 예시도 함께 적었어요:

  1. 각 채널에 대한 베르누이 확률 (DRAW)
  2. 각 채널에 대한 256개 카테고리 분포 (PixelRNN, Image Transformer)
  3. 역양자화된 데이터에 대한 연속 밀도 (Real-NVP)
  4. 이산화된 로지스틱 혼합 (PixelCNN++, Image Transformer)

베르누이 방출 확률로 나타낸 픽셀 값

우도 모델을 디버깅하려면 MNIST, FashionMNIST, NotMNIST 데이터셋으로 시작하는 것이 좋겠죠:

  • 이 데이터셋 전체를 컴퓨터 램에 전부 저장할 수 있고요,
  • 구조적인 튜닝을 많이 할 필요도 없으며 (그래서 알고리듬적인 면에 집중할 수 있습니다)
  • 이들 데이터셋에 대한 작은 생성 모델 정도는 요새 나온 GPU가 없는 랩탑정도의 하드웨어로도 학습할 수 있으니까요.

베르누이 확률 변수로 조건 픽셀 우도 p(xi)를 모델링하는 것은 드문 일이 아닙니다. 픽셀 값이 0이나 1을 갖는 이진화된 데이터에 대해서 이는 괜찮은 선택이죠.

pasted image 0

하지만 MNIST와 그와 비슷한 데이터셋은 [0, 1] 범위의 float 값으로 인코딩 되어있고,  이 경계선 사이에 256개의 정규화된 정수가 위치하게 됩니다. 여기서 표현력 문제가 발생하는데요, 베르누이 변수는 0과 1사이 값을 샘플할 수 없기 때문이죠!

이진화되지 않은 MNIST를 학습한 논문에서는 인코딩된 값을 해당 베르누이 변수에 대한 분출 확률로 해석해야 합니다. 다시 말해서, 픽셀값 0.9는 사실 샘플 값 자체가 아니라 픽셀이 1일 베르누이 우도를 나타내는 것이죠. 이런 경우 목적 함수의 최적화는 (스칼라 분출 확률로 변수화된) 예측된 확률 분포와 데이터에 내포된 분출 확률 사이의 크로스 엔트로피를 최소화시키는 것이 됩니다. 분출 확률 p(1)과 pθ(1)의 두 베르누이 분포 사이의 크로스 엔트로피는 다음과 같습니다:

H(p, pθ) = – [(1 – p(1))log(1 – pθ(1)) + p(1)logpθ(1)]

이 포스트의 이전 섹션에서 크로스 엔트로피의 최소화가 우도를 최대화하는 것과 동일한 목적 함수라고 했었는데요, 이러한 토이 이미지 데이터셋의 평균 로그 우도(상대적 엔트로피)는 보통 nats 단위로 표현됩니다.

DRAW 논문(Gregor et al. 2015)은 이러한 아이디어를 각 채널 색깔을 모델링하는 기법으로 확장시키는데요, 하지만 색깔 픽셀 데이터를 분출 확률로 모델링하는 것에는 매우 심각한 단점이 존재합니다. 생성 모델에서 샘플링을 수행하면, 자연스럽고 일관된 이미지 대신 굉장히 잡음이 많고 얼룩덜룩한 이미지를 얻게 되는 것이죠. 다음은 그런 문제를 감소시키는 파이썬 코드입니다:

import tensorflow_datasets as tfds
import numpy as np
import matplotlib.pyplot as plt
builder = tfds.builder("cifar10")
builder.download_and_prepare()
datasets = builder.as_dataset()
np_datasets = tfds.as_numpy(datasets)
img = next(np_datasets['train'])['image']
sample = np.random.binomial(1,p=img.astype(np.float32)/256)
fig, arr = plt.subplots(1, 2)

arr[0].imshow(img)
arr[1].imshow((sample*255).astype(np.uint8))

pasted image 0 (1)

픽셀값을 ‘분출 확률’로 해석하면 현실적이지 못한 샘플이 생성됩니다 – 손글씨 숫자나, 보다 큰 스케일의 자연 이미지에 대해서는 잘 작동하지 않죠. 베르누이 디코더를 실제로 사용하는 논문은 실제 샘플대신 분출 확률(예. 재건 과제나 결측값 대체 과제에서의 분출 확률)을 보여주는 경우가 많습니다.

카테고리 분포로 나타낸 픽셀값

보다 사이즈가 큰 색깔 데이터셋(SVHN, CIFAR10, CelebA, ImageNet)은 8-bit RGB로 인코딩되어 있습니다 (각 채널이 0에서 255까지의 uint8 정수라는 뜻입니다).

픽셀 값을 베르누이 분출 확률로 해석하는 대신, 이미지에 인코딩된 실제 uint8 픽셀 값에 대한 분포를 모델링할 수도 있습니다. 가장 간단한 방법은 256가지 카테고리 분포겠죠.

pasted image 0 (2)

색깔 이미지의 경우 각 픽셀의 크로스 엔트로피를 베이스 e 로그대신 베이스 2 로그를 널리 사용합니다. 이미지당 3072 픽셀의 테스트셋이 -H(p, q)의 평균 우도(nats)를 갖는다고 하면, “픽셀 당 bits”는 –H(p, q) ÷ log(2) ÷ 3072가 됩니다.

이 측량법은 앞서 이야기했듯 평균 우도를 압축으로 해석하는 관점에서 시작되었는데요: 보통 픽셀이 8 bit를 사용해서 인코딩 되므로, 생성 모델 pθ를 이용해서 각 픽셀 당 평균 비트 길이 3으로 전체 데이터셋을 손실없이 압축하는 엔트로피 코딩 스킴을 만들 수 있습니다.

이 글을 쓰는 시점에서 CIFAR10에 대한 최고의 생성 모델은 Sparse Transformer로, 테스트 우도가 픽셀당 2.80 bits에 달합니다. 비교를 하자면 가장 널리쓰이는 비손실 이미지 압축 알고리듬인 PNG와 Web는 CIFAR10 이미지에 대해서 각각 5.87과 4.61 bits 정도죠 (헤더와 CRC 체크섬과 같은 추가 바이트를 고려하지 않는다면 PNG의 경우 5.72 bpp이 됩니다).

이는 상당히 흥분되는 사실인데요, 머신러닝을 사용해서 기존의 압축 스킴을 뛰어넘는 컨텐츠 기반 엔트로피 인코딩 스킴을 만들 수 있다는 이야기입니다. 효율적인 비손실 압축은 해싱 알고리듬을 발전시키고, 다운로드를 가속하며, Zoom 통화를 개선할 수 있는데 이러한 모든 기술이 현재 상당부분 실행 가능한 상태입니다.

연속 밀도 모델에 대한 확률론적 역양자화

이산 데이터에 대한 로그 우도를 최대화하여 (가우시안 혼합과 같은) 연속적인 밀도 모델을 최적화하려고 한다면, 모델이 각 이산 값 {0, …, 255}에 대해서 동일한 밀도 스파이크를 부여하는 상황이 벌어질 수 있습니다. 무한대로 큰 데이터셋이라 할지라도, 밀도 스파이크를 점점 더 좁게 쥐어짜서 모델이 임의의 높은 우도를 가질 수 있게 됩니다.

이러한 문제를 해결하기 위해서, 정수 픽셀 값에 소음을 더해서 데이터를 역양자화하는 방법이 널리 사용되고 있습니다. 그러한 변환 중 하나가 y = x + u 인데요, u는 연속 균등 분포 U(0, 1)로부터의 샘플입니다. 밀도 모델링을 위해서 이렇듯 확률론적 역양자화를 사용한 첫 번째 논문은 제가 아는 한 Uria et al., 2013입니다. 이러한 기법은 그 이후로 Dinh et al., 2014, Salimans et al., 2017, 그리고 이 두 논문을 기반으로 한 다른 연구에서도 널리 사용되었죠.

stochastic+dequantization+-+part+1

이산 모델은 인터벌에 대해서 확률 질량을 부여하고 연속적 모델은 밀도 함수를 부여합니다. P(x)와 p(x)는 참된 데이터 분포에 대해서, Pθ(x)와 pθ(x)는 모델 밀도에 대해서 이산 확률 질량과 연속 밀도를 표상한다고 합시다. 왜 연속 우도 모델을 역양자화된 데이터 y 결과를 최적화하는 것이 실제 이산 확률 모델 의 하한을 최적화하는 결과로 이어지는지 유도해 봅시다:

밀도를 단위 인터벌에 대해서 적분하면 밀도 함수가 암시하는 총 질량을 얻을 수 있습니다:

1

모델 우도 목적 함수는 참된 데이터 분포로부터 샘플링된 역양자화된 데이터에 대해서 학습됩니다:

2

기대값의 정의에 따라 이는 다음처럼 풀이됩니다:

3

적분을 연장하면 다음처럼 되죠:

4

(균등 변수 u에 대한) 젠센 부등식에 의해 다음이 성립합니다:

5

6

최근 논문 Flow++는 학습된 역양자화 확률 변수로 변분 한도의 엄정함을 개선할 것을 제안합니다. 여기서의 교훈은 q(u|x)로부터 단일 중요도-샘플링된 소음 변수가, 연속 균등 분포 u(0, 1)에서의 단일 샘플보다 적분 ∫10pθ(x+u)du에 대해서 낮은 분산 추정을 가진다는 것입니다. 역양자화 소음이 다르기 때문에, 각기 다른 구조의 밀도 모델과 각기 다른 양자화 방법론을 컨트롤된 방식으로 비교할 수 없습니다.

Flow++와 고르게 역양자화된 생성 모델을 공정하게 비교할 수 있는 방법 하나는 연구자들이 학습시에는 변분 한도를 자유롭게 골라서 사용할 수 있게 하되, 우도 평가때는 복수 샘플 한도로. 여기서의 교훈은 보다 많은 샘플에 대해서 적분하면, 해당 이산 모델 Pθ(x)의 참된 로그 우도를 보다 정확한 근사할 수 있다는 것입니다.

예를 들어서, 고정된 연속 균등 분포  U(0, 1) 역양자화 분포에 대해서 복수 샘플의 한도를 알 수 있는데, 이는 IWAE 복수 샘플 한도를 사용하는 VAE 연구에서 널리 쓰이는 방식입니다. VAE와 IWAE 한도에 대한 논의는 이 튜토리얼의 범위 밖이니 다음에 다루도록 하겠습니다.

사이드 노트: 정규화 플로우를 위한 데이터 전처리

정규화 플로우는 기저 확률 분포를 보다 복잡한 확률 분포로 “변형”시키는 생성 모델 족입니다.

forward

정규화 플로우는 추적가능한 역변환과 자코비안 행렬식을 갖는 변환을 학습합니다. 이 두 값을 효율적으로 계산할 수 있다면 변수 변환 법칙을 통해서 변환된 분포의 로그 밀도를 구할 수 있습니다:

log p(y) = log p(x) – log|det J(f(x))|

정규화 플로우의 대부분은 연속적 밀도 함수에 대해서 동작합니다 (그래서 부피를 추적하는 자코비안 행렬식 항을 필요로 하는 것이죠), 하지만 최근에는 밀도가 아닌 확률 질량 함수를 변환하는 “이산 플로우”에 대한 연구도 있죠 (Tran et al. 2019, Hoogeboom et al. 2019). 이 블로그 포스트에서 이런 이산 플로우를 다루진 않을겁니다; 이산 기저 분포를 전단사 이산 변환하여 동작한다고만 알아두죠.

실질적으로는 데이터를 [0, 256]의 범위에서 단위 범위인 [0, 1]로 재조정하는 것은

이러한 재조정과 로지스틱 변환을 모델 도입부의 “전처리” 플로우로 볼 수도 있습니다. 여기서도 다른 전단사자(bijector)의 경우와 같이, 변환으로 발생하는 부피의 변화를 고려해야 합니다.

여기서 중요한 점은 평가를 위해서는 픽셀 밀도가 항상 연속된 인터벌[0, 256]에서 계산되어야 한다는 것입니다.

다음은 RGB 이미지에 대한 보통의 정규화 플로우를 나타낸 다이아그램입니다. 원래의 이산 데이터가 왼쪽에, 기저 분포가 오른쪽에 있습니다 (기저 분포는 가우시안일 수도, 로지스틱일 수도, 아니면 원하는 어떤 추적 가능한 밀도가 될 수도 있죠).

flow-data

생성 모델 우도는 보통 비정량화된 (초록색) 공간에서 나타냅니다. Dinh et al. 2016에서 시작하여 많은 플로우 기반 모델은 픽셀을 [λ, 1-λ]로 스케일링하고 로지스틱 함수(시그모이드의 역)를 적용하여 양극단 조건에서 수치적 안정성을 높이죠.

이산 로지스틱 혼합 우도

픽셀을 카테고리 분포로 모델링했을 때 하나의 단점은 크로스  엔트포피 손실함수가 127값이 0보다 128에 가깝다는 것을 표현할 수 없다는 것입니다. 관찰된 픽셀 값 P에 대해서, 픽셀 강도에 대한 카테고리 크로스 엔트로피의 경사도는 상수입니다 (이는 손실 함수가 카테고리를 비-순서적으로 취급하기 때문이죠). 크로스 엔트로피 경사도가 0이 아닐지라도 매우 “희소”하다고 할 수 있는데, 이는 크로스 엔트로피 경사도가 타겟 분포에 예측값이 (픽셀 강도로 따져서) 얼마나 가까운지에 대해서 별다른 정보를 주지 않기 때문입니다. 이상적으로는 예측된 강도가 관측된 값과 차이가 많이나면 경사도의 크기가 크고, 예측이 괜찮다면 작은 것이 좋겠죠.

픽셀을 카테고리 분포로 모델링하는 더 치명적인 문제는 256보다 더 많은 수의 카테고리를 사용하기가 어렵다는 점입니다. 예를 들어서 R, G, B 픽셀을 합쳐서 256 * 3의 카테고리로 모델링하거나 HDR 이미지에 대해서 uint8 보다 높은 정밀도로 픽셀 인코딩한다고 생각해보세요. 그렇게 많은 카테고리에 대해서 신경망 활성값을 로짓으로 매핑하는 프로젝션 행렬을 저장하려면 메모리가 심히 부족할겁니다.

최근 두 논문 PixelCNN++Inverse Autoregressive Flow는 RGB 픽셀을 순서형 데이터로 모델링해서 이러한 문제를 해결하는데요, 픽셀에 대한 크로스 엔트로피 손실함수로부터 받은 경사도 정보를 사용해서 픽셀을 올바른 방향으로 움직이면서도 이산 확률 모델을 유지할 수 있습니다.

연속적인 픽셀 확률 밀도는 연속적 분포인 로지스틱 혼합으로 모델링할 수 있습니다. 이산 픽셀값에 대해서 확률 질량을 수복하려면, 로지스틱 분포의 CDF가 시그모이드 함수라는 편리한 특성을 이용하면 됩니다. 두 시그모이드를 차감해서 CDF(x + 0.5) – CDF(x – 0.5), 두 정수 픽셀 값 사이에 존재하는 총 확률 질량을 수복할 수 있습니다.

pasted image 0 (3)

예를 들어, 픽셀의 값이 127일 확률은 로지스틱 분포의 연속적인 혼합에서 126.5와 127.5 사이 위치하는 확률 질량으로 모델링합니다. 양 극단의 케이스도 잘 고려해서 CDF(0-0.5)는 0, CDF(255+0.5)는 1이 되도록, 다시 말해 확률 분포의 조건을 만족시키도록 해야죠.

이렇게 픽셀을 표상하면 훨씬 많은 수의 카테고리를 다룰 수 있기에, PixelCNN++는 R, G, B 픽셀 채널을 한꺼번에 모델링할 수 있습니다. 하나 주의점은 혼합 성분의 수를 적절히 조정해야 한다는 것입니다 (CIFAR10에 대해서는 5 정도면 충분해 보입니다).

Tran et al. 2019에서 카테고리 분포에 대해 동작하는 이산 플로우를 구현하는 것처럼, Hoogeboom et al. 2019에서는 위와 같이 이산화된 로지스틱 혼합 우도를 기저 분포로 사용해서 순서형 데이터에 대한 이산 플로우를 구현합니다. 이는 두 접근법의 장점을 모두 갖는데요: 정규화 플로우로 추적가능한 역을 갖고 샘플링이 가능토록 하면서도, (우도에 대한 변분 하한 페널티를 발생시킬 수 있는) 비정량화된 우도 손실 함수를 풀어야하는 수고를 피할 수 있는 것이죠 . 둘 다 매우 멋진 논문으로, 이에 대해서는 나중에 보다 깊게 다루고 싶네요!

복잡도

로그 우도는 자연어 모델링 분야에서 생성 모델을 평가하는데 널리 쓰이는 계량법입니다. 알파벳은 이산적이고 순서 개념이 없어서 카테고리 분포로 밀도를 모델링하는 것이 가장 자연스럽죠.

자연어 처리 분야의 특수성 중 하나는 언어 모델의 우도를 2H(p, q), 즉 복잡도라는 단위를 통해 나타내는 일이 잦다는 것입니다. 복잡도의 역인 log22-H(p, q)는 사실 평균 로그 우도 -H(p, q)와 다름없습니다. 복잡도는 상당히 직관적인데, 이는 확률의 역이 확률 변수의 “branching factor”, 혹은 확률 변수가 갖는 선택지의 수의 가중 평균이기 때문입니다. 복잡도와 로그 우도 사이의 관계는 너무나 명확해서 몇몇 논문에서는 (Image Transformer) 사실상 “복잡도”와 로그 우도를 같은 의미로 섞어서 사용합니다.

마치며

이번 블로그 포스트에서 평균 로그 우도 최대화와 압축 사이의 관계를 유도했습니다. 또한 개별적 픽셀에 대해서 연속적 우도 모델과 이산 우도 모델 사이 여러가지 모델링 방법도 살펴봤지요.

보다 근본적으로 우도가 분포를 평가하고 최적화하는 데에 적절한 선택인지에 의문을 제기할 수 있습니다.  NIPS 2016(이제는 NeurIPS 학회이지만)의 생성 모델링 워크숍에서 사람들이 추적 가능한 우도를 최적화하는 것이 괜찮은 아이디어인지에 대해 아주 활발히 논쟁하던 것이 기억나네요.

그런데 우도를 사용해서 최적화하고 평가하는 것이 돌아보면 괜찮은 생각이었다는 것이 드러나고 있습니다, 이후로도 연구자들이 계산적으로 추적 가능하면서도 보다 유연한 우도 모델을 만들고 스케일-업 하는 방법을 알아냈으니까요. 우도를 사용해 학습하는 Glow, GPT-2, WaveNet, 그리고 Image Transformer와 같은 모델은 놀라운 품질의 이미지, 오디오, 텍스트 샘플을 만들어내죠. 그에 반해, 생성 모델이란 결국 분류 정확도와 같은 실질적인 과제와 연결되었을 때 의미가 있다고 주장하는 사람도 있습니다. 모델이 라벨 데이터셋에 대해서 파인튜닝되어야 한다는 의미죠. 저의 동료인 Niki Parmer는 이미지와 텍스트 우도 모델을 다음과 같이 비교합니다:

텍스트의 경우 일반적으로 우도가 더 높았을 때 GLUE와 같은 다운스트림 과제에 대해서 더 나은 성능으로 이어집니다. 하지만 이미지의 경우, 동료들에게 듣기로는, 픽셀 예측이 이미지 분류와 같은 다운스트림 과제에 대한 효과적인 준비학습(pre-training)으로 이어지지는 않는다고 합니다. 이는 픽셀이 텍스트의 단어나 내부 단어와는 다르게 큰 의미를 표상하지 않기 때문입니다. 아직은 열린 문제이긴 하지만 이미지의 표상 학습이 텍스트와는 매우 다르고, 수립과 측정에 있어 상당한 어려움이 있는 점이 흥미롭습니다.

차후 블로그 포스트에서는 이 튜토리얼에 이어서, 로그-우도의 변분 하한을 최적화하는 생성 모델(예. VAE, 중요도 가중 오토인코더)의 평가에 대해서 다루겠습니다.

추가 자료

  • 많이 사용되는 로그 우도와 IWAE 상/하한에 대한 대체를 논의하는 트위터 쓰레드
  • 보통 사용되는 비손실 이미지 압축 알고리듬의 압축율이 궁금하다면 이 코드논문을 읽어보세요.
  • 카테고리 분류가 연속 밀도 모델링에 대해서 어떤 상대적 이점이 있는지 더 자세히 알아보고 싶다면 PixelRNN 논문과 이 레딧 쓰레드를 한 번 보세요.
  • Proper Local Scoring Rules – 이 논문을 저에게 권해준 Ferenc Huszár, 고맙습니다.
  • A Note on the Evaluation of Generative Models – Theis et al.의 정말 멋진 논문이죠, 생성 모델링 분야를 시작하는 모든 이의 필독논문.
  • On the Quantitative Analysis of Decoder-based Generative Models
  • Tutorial and Derivation of Perplexity, 그리고 Stack Exchange question on Perplexity. 제가 NLP를 잘 몰랐었는데, 이 글들이 정말 큰 도움이 됐네요.
  • 생성 모델링 커뮤니티에서는 MNIST를 nat으로 칼라 이미지는 차원별 비트로 나타내는 것이 일반적입니다만, 몇몇 논문에서는 MNIST 우도를 차원별 비트로 나타내는데 반해, CIFAR10을 nat으로 리포트하는 연구도 있죠.
  • Ranganath et al.의 논문은 보통의 KL 발산 목적함수에 국한되지 않고 변분 추론을 다룰 수 있는 일반적인 프레임워크를 제시합니다. 일단 발산 측량에 대해서 원하는 특성을 정하고 (예. 샘플링, 모드 붕괴 방지), 그러한 특성을 지닌 발산에 대해서 변분 목적함수를 수복하도록 제안합니다.  이 연구를 소개해준 Dustin Tran에게 감사합니다.

감사의 말

이 블로그 포스트를 리뷰해준 Dustin Tran, Niki Parmer, 그리고 Vincent Vanhoucke에게 감사의 말을 전합니다. 그리고 항상 그렇듯 여기까지 읽어준 독자분들께 감사합니다!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s