자주 하는 실수와 요약
자주 하는 실수
| 실수 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| 줄인 번호 사이의 값을 넣으면 이웃 번호의 사이쯤이 나온다고 봄 | 1 | 학습한 잠재 변수 밖에서 디코더가 무엇을 내놓을지는 학습이 정하지 않았다 |
| 오토인코더의 잠재 변수 좌표에 뜻이 있다고 봄 | 2 | 잠재 변수를 늘이거나 돌려도 디코더가 맞춰 주면 손실이 같다. 잠재 변수가 놓일 자리는 학습이 정하지 않는다 |
| 분류기의 확신 비율만 보고 생성이 잘된다고 봄 | 3 | 무슨 숫자가 나오는지의 비율도 본다. 상자에서 뽑은 잠재 변수는 확신은 높아도 0과 1로 쏠렸다 |
| 잠재 변수를 N(0, I) 안으로 모으면 그 둘레도 디코더가 배웠다고 봄 | 4 | 디코더는 학습 그림이 놓인 바로 그 자리만 본다. 0.1만 옮겨도 그림이 평균 두 배쯤 빨리 바뀌었다 |
| 구름을 넓히면 뽑은 그림 한 장 한 장이 흐려진다고 봄 | 5 | 한 장은 여전히 또렷하다(회색 칸 20% 안팎). 흐려지는 것은 여러 그림을 겹친 평균이다 |
| 구름의 크기를 모든 그림에 같게 정하면 된다고 봄 | 6 | 이웃 숫자가 가까운 그림은 좁게, 여유 있는 그림은 넓게 잡아야 한다. 그래서 인코더가 그림마다 σ 를 내놓는다 |
| KL 발산은 두 분포의 자리를 바꿔도 같다고 봄 | 7 | 어느 분포로 평균 내느냐에 따라 값이 다르다 (0.0589 대 0.0566) |
| 사전분포는 데이터에서 구한 분포, 인코더 구름은 곧 사후분포라고 봄 | 8 | VAE 의 사전분포는 정해 둔 약속이고, 인코더 구름은 사후분포의 근사다 |
| 재구성만 보면 구름을 점으로 줄이는 것이 가장 좋다고 봄 | 9 | 점으로 줄면 이웃을 배우지 못하고 지도도 흩어진다. KL 이 구름을 점이 되지 않게 붙잡고 N(0, I) 안으로 모은다 |
| KL 항이 작을수록 좋은 VAE라고 봄 | 10 | KL이 0이면 잠재 변수가 그림에 대해 아무것도 알려 주지 않아 디코더가 평균 그림을 그린다 |
| 무작위로 뽑는 단계가 있으면 역전파가 지나가지 못한다고 봄 | 11 | 잡음을 먼저 뽑아 고정하고 z = μ + σε 로 쓰면 μ, σ 로 미분된다 |
| 평균이 맞는 기울기 어림이면 어느 것이나 같다고 봄 | 12 | 흔들림이 다르다. 재매개변수화의 분산 8 대 로그 미분의 분산 74 |
| 재매개변수화는 어떤 잠재 변수에나 통한다고 봄 | 13 | 잠재 변수가 매개변수에 대해 매끄럽게 움직여야 한다. 동전처럼 0과 1만 갖는 잠재 변수는 기울기가 0이다 |
| ELBO가 올랐으니 모델이 좋아졌다고 봄 | 14 | ELBO는 로그우도가 오르거나 틈이 줄어도 오른다. 숫자 하나로는 둘을 가르지 못한다 |
| 사후분포를 q 로 쓰면 된다고 봄 | 15 | 사후분포를 구하려면 로그우도를 먼저 알아야 한다 |
| 표본을 많이 쓰면 바닥이 곧 로그우도가 된다고 봄 | 16 | 표본을 인코더 구름에서 뽑으므로, 구름이 사후분포를 비껴 짚으면 한계가 남는다 |
요약
라벨이 정하지 못한 생김새의 값을 사람 대신 그림 자신에게서 얻으려고, 그림 자신을 정답으로 삼아 좁은 가운데 칸(잠재 변수)을 거쳐 되살리게 했다(오토인코더). 값은 얻었지만, 그 값으로 새 그림을 뽑기에는 한계가 둘 있었다. ① 학습한 잠재 변수들 사이(데이터의 중간 영역)에서 무엇을 그릴지 학습이 정하지 않았고, ② 잠재 변수가 어디에 놓일지 정하지 않아 무작위로 뽑을 곳을 몰랐다. 잠재 변수를 N(0, I) 안으로 모으는 벌점은 ②만 풀었다. 디코더는 학습 그림이 놓인 점 바로 그 자리만 배워서 조금만 옮겨도 그림이 빨리 무너졌다. ①은 점을 점 둘레의 작은 구름 N(μ, σ²)으로 넓혀 푼다. σ = 0 인 구름이 점(디랙 델타)이고, 인코더가 내놓는 μ 와 σ 한 쌍이 그 그림의 잠재 표현이다. 학습 때 구름에서 뽑아 넣으면 디코더가 구름 전체를 그 그림으로 배워 조각면들이 지도를 덮는다. VAE는 그 구름들을 사전분포 N(0, I) 쪽으로 KL 발산만큼 당겨, 구름이 점으로 줄거나 흩어지지 않고 한데 모이게 해 ①과 ②를 함께 붙든다. 그러면 N(0, I)에서 아무 점이나 뽑아도 숫자가 나온다. 학습 안의 뽑기는 z = μ + σε 로 바꿔 써서(재매개변수화) 무작위를 ε 하나에 몰면 역전파가 지나간다. VAE의 손실은 로그우도 log pθ(x)의 바닥인 ELBO = 재구성 항 − KL(q ‖ p(z))에 마이너스를 붙인 것이고, 바닥과 천장의 틈은 인코더 구름과 참 사후분포 사이의 KL이다(변분 추론).
flowchart LR A["라벨이 정하지 못한 몫<br/>그 값을 어디서 얻나"] --> C["오토인코더<br/>그림 자신을 정답으로"] C --> L1["한계 ①<br/>학습한 점들 사이가 비어 있다"] C --> L2["한계 ②<br/>뽑을 곳이 정해지지 않았다"] L2 --> D2["점만 모으기<br/>②만 풀린다"] L1 --> D3["점을 구름으로<br/>μ 와 σ 한 쌍"] D2 --> E["VAE<br/>구름을 N(0, I) 안으로 모은다<br/>①②를 함께"] D3 --> E E --> F["재매개변수화<br/>z = μ + σε"] E --> G["ELBO<br/>로그우도 아래의 바닥"]
막힌 곳
이제 데이터를 보지 않고 새 손글씨 숫자를 뽑는 모델이 생겼다. 잠재 변수를 N(0, I)에서 뽑아 디코더에 넣으면 되고, 그 모델을 학습시키는 손실은 로그우도의 바닥인 ELBO다.
그런데 여기까지 오며 붙인 장치를 세어 보자. 새 그림에는 맞힐 정답이 없어서 오토인코더는 그림 자신을 정답으로 삼았다. 그것만으로는 사이가 비고 뽑을 곳이 없어서 구름을 들이고, 구름을 사전분포 안으로 모으는 벌점을 달았다. 구름에서 뽑는 단계를 지나 미분하려고 잡음을 바깥으로 빼냈다. 인코더 구름은 참 사후분포를 흉내 낼 뿐이라 바닥은 천장보다 평균 5.9 nat 아래에 남았다. 그러고도 디코더는 잠재 변수 두 칸을 받아 784칸을 한 번에 그려야 하고, 두 칸이 다 정하지 못한 것은 칸마다 잉크 확률로 번져 획 가장자리가 회색으로 남는다.
장치가 이렇게 늘어난 까닭은 처음부터 하나였다. 「3을 하나 그려 봐」에는 정답이 하나로 정해져 있지 않다. 그렇다면 정답이 하나로 분명한 일만 가르쳐서, 그 솜씨로 새 그림을 만들게 할 수는 없을까? 정답이 분명하면서도 그림을 만드는 일과 가장 가까운 일은 무엇일까?