자주 하는 실수와 요약
자주 하는 실수
| 실수 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| 정답이 여럿인 문제에서 제곱 오차가 가장 작은 답이 실제로 나오는 답이라고 봄 | 1 | 제곱 오차를 가장 작게 하는 답은 정답들의 평균(조건부 평균)이고, 평균은 한 번도 일어나지 않는 답일 수 있다 |
| 손실을 절댓값 오차로 바꾸면 평균 그림 문제가 풀린다고 봄 | 2 | 중앙값도 칸마다 따로 고른 값이다. 칸들이 함께 정하는 장치가 없으면 획이 끊긴 그림이 나온다 |
| 분류기도 그림 MLP처럼 정답들의 평균을 낸다고 봄 | 3 | 분류기는 정답 여럿을 확률 분포로 담고, 거기서 뽑으면 실제 정답 하나가 나온다 |
| 줄인 번호 사이의 값을 넣으면 이웃 번호의 사이쯤이 나온다고 봄 | 4 | 학습한 잠재 변수 밖에서 디코더가 무엇을 내놓을지는 학습이 정하지 않았다 |
| 오토인코더의 잠재 변수 좌표에 뜻이 있다고 봄 | 5 | 잠재 변수를 늘이거나 돌려도 디코더가 맞춰 주면 손실이 같다. 잠재 변수가 놓일 자리는 학습이 정하지 않는다 |
| 분류기의 확신 비율만 보고 생성이 잘된다고 봄 | 6 | 무슨 숫자가 나오는지의 비율도 본다. 상자에서 뽑은 잠재 변수는 확신은 높아도 0과 1로 쏠렸다 |
| 잠재 변수를 N(0, I) 안으로 모으면 그 둘레도 디코더가 배웠다고 봄 | 7 | 디코더는 학습 그림이 놓인 바로 그 자리만 본다. 0.1만 옮겨도 그림이 평균 두 배쯤 빨리 바뀌었다 |
| 구름을 넓히면 뽑은 그림 한 장 한 장이 흐려진다고 봄 | 8 | 한 장은 여전히 또렷하다(회색 칸 20% 안팎). 흐려지는 것은 여러 그림을 겹친 평균이다 |
| 구름의 크기를 모든 그림에 같게 정하면 된다고 봄 | 9 | 이웃 숫자가 가까운 그림은 좁게, 여유 있는 그림은 넓게 잡아야 한다. 그래서 인코더가 그림마다 σ 를 내놓는다 |
| KL 발산은 두 분포의 자리를 바꿔도 같다고 봄 | 10 | 어느 분포로 평균 내느냐에 따라 값이 다르다 (0.0589 대 0.0566) |
| 사후분포는 시간상 나중의 분포, 사전분포는 데이터에서 구한 분포, 인코더 구름은 곧 사후분포라고 봄 | 11 | 사전·사후는 관측을 보기 전과 본 뒤다. VAE 의 사전분포는 정해 둔 약속이고, 인코더 구름은 사후분포의 근사다 |
| 재구성만 보면 구름을 점으로 줄이는 것이 가장 좋다고 봄 | 12 | 점으로 줄면 이웃을 배우지 못하고 지도도 흩어진다. KL 이 구름을 점이 되지 않게 붙잡고 N(0, I) 안으로 모은다 |
| KL 항이 작을수록 좋은 VAE라고 봄 | 13 | KL이 0이면 잠재 변수가 그림에 대해 아무것도 알려 주지 않아 디코더가 평균 그림을 그린다 |
| 무작위로 뽑는 단계가 있으면 역전파가 지나가지 못한다고 봄 | 14 | 잡음을 먼저 뽑아 고정하고 z = μ + σε 로 쓰면 μ, σ 로 미분된다 |
| 평균이 맞는 기울기 어림이면 어느 것이나 같다고 봄 | 15 | 흔들림이 다르다. 재매개변수화의 분산 8 대 로그 미분의 분산 74 |
| 재매개변수화는 어떤 잠재 변수에나 통한다고 봄 | 16 | 잠재 변수가 매개변수에 대해 매끄럽게 움직여야 한다. 동전처럼 0과 1만 갖는 잠재 변수는 기울기가 0이다 |
| ELBO가 올랐으니 모델이 좋아졌다고 봄 | 17 | ELBO는 로그우도가 오르거나 틈이 줄어도 오른다. 숫자 하나로는 둘을 가르지 못한다 |
| 사후분포를 q 로 쓰면 된다고 봄 | 18 | 사후분포를 구하려면 로그우도를 먼저 알아야 한다 |
| 표본을 많이 쓰면 바닥이 곧 로그우도가 된다고 봄 | 19 | 표본을 인코더 구름에서 뽑으므로, 구름이 사후분포를 비껴 짚으면 한계가 남는다 |
| 칸마다 동전을 던지면 흐린 그림이 또렷해진다고 봄 | 20 | 칸마다 따로 던지면 외톨이 점이 생긴다. 칸들이 함께 움직이는 분포가 필요하다 |
| 조건을 받은 ELBO 를 조건 없는 ELBO 와 그대로 견주거나, 조건을 한없이 주면 된다고 봄 | 21 | 조건을 고르는 값 log p(c) 를 더해야 공정하다. 조건을 잘게 나눌수록 그 값이 비싸지고 조건마다 데이터가 줄며 다양성도 사라진다 |
| 두 무리의 평균 차를 그대로 한 속성의 효과로 봄 | 22 | 두 무리의 다른 구성(성별 비율)이 차에 함께 들어간다. 같은 성별 안에서 견준다 |
| 속성 벡터를 더하면 그 속성만 바뀐다고 보거나, 섞인 성분을 빼면 깨끗한 속성이 남는다고 봄 | 23 | 함께 붙어 다니는 속성의 차가 섞인다(수염과 남성의 코사인 0.935). 같은 무리 안에서 견주거나 성분을 빼는 것은 그 무리 안에 두 경우가 다 있을 때만 통한다(수염 있는 여성 사진 117장) |
| 조건부 VAE 에 조건을 주면 그 속성이 반드시 그려진다고 봄 | 24 | 잠재 변수가 같은 정보를 이미 가지면 디코더는 조건을 덜 쓴다(안경 판정 0.0 → 0.5%) |
요약
MLP는 정답이 하나일 때 잘 맞힌다. 입력 하나에 정답이 여럿이면 제곱 오차로 배운 MLP는 정답들의 평균, 곧 조건부 평균을 내놓고, 그림에서는 그것이 흐린 평균 그림이다. 그림 자신을 정답으로 삼아 좁은 가운데 칸(잠재 변수)을 거쳐 되살리게 하면(오토인코더) 학습은 되지만, 잠재 변수가 어디에 놓일지 정하지 않아 새 그림을 뽑을 곳을 모른다. 잠재 변수를 N(0, I) 안으로 모으기만 해도 뽑을 곳은 생기지만, 디코더는 학습 그림이 놓인 점 바로 그 자리만 배워서 조금만 옮겨도 그림이 빨리 무너진다. 그래서 점을 점 둘레의 작은 구름 N(μ, σ²)으로 넓힌다. σ = 0 인 구름이 점(디랙 델타)이고, 인코더가 내놓는 μ 와 σ 한 쌍이 그 그림의 잠재 표현이다. 학습 때 구름에서 뽑아 넣으면 디코더가 구름 전체를 그 그림으로 배워 조각면들이 지도를 덮는다. VAE는 그 구름들을 사전분포 N(0, I) 쪽으로 KL 발산만큼 당겨, 구름이 점으로 줄거나 흩어지지 않고 한데 모이게 한다. 그러면 N(0, I)에서 아무 점이나 뽑아도 숫자가 나온다. 구름에서 뽑는 단계는 z = μ + σε 로 바꿔 써서(재매개변수화) 역전파가 지나가게 한다. VAE의 손실은 로그우도 log pθ(x)의 바닥인 ELBO = 재구성 항 − KL(q ‖ p(z))에 마이너스를 붙인 것이고, 바닥과 천장의 틈은 인코더 구름과 참 사후분포 사이의 KL이다(변분 추론). 뽑은 그림은 흐리다. 조건을 더 주면(조건부 VAE) 조건 안에 남은 흩어짐이 줄어 덜 흐려지지만, 조건을 정하는 값을 따로 치러야 하고 칸마다 따로 던지는 디코더의 흐림은 남는다. 조건을 모델에 넣지 않고, 다 배운 잠재 공간에서 라벨 있는 그림과 없는 그림의 잠재 변수 평균의 차(속성 벡터)를 더해 속성을 바꿀 수도 있다. 라벨은 학습이 끝난 뒤에 적게 있으면 되지만, 데이터에서 함께 붙어 다니는 속성까지 끌려온다.
flowchart LR A["MLP<br/>정답이 하나면 잘 맞힌다"] --> B["정답이 여럿이면<br/>제곱 오차는 평균을 낸다"] B --> C["오토인코더<br/>그림 자신을 정답으로"] C --> D["잠재 변수가 놓일 자리를<br/>아무도 정하지 않았다"] D --> D2["점만 모으면<br/>이웃이 비어 있다"] D2 --> D3["점을 구름으로<br/>μ 와 σ 한 쌍"] D3 --> E["VAE<br/>구름을 N(0, I) 안으로 모은다"] E --> F["재매개변수화<br/>z = μ + σε"] E --> G["ELBO<br/>로그우도 아래의 바닥"] G --> H["조건을 세밀하게 주어도<br/>그림은 아직 흐릿하다"] E --> I["속성 벡터<br/>다 배운 잠재 공간의 방향"]
막힌 곳
이제 데이터를 보지 않고 새 손글씨 숫자를 뽑는 모델이 생겼다. 잠재 변수를 N(0, I)에서 뽑아 디코더에 넣으면 되고, 그 모델을 학습시키는 손실은 로그우도의 바닥인 ELBO다.
그런데 뽑은 그림은 흐릿하다. 얼굴 사진에서도 되살린 그림에는 가는 무늬가 14.5%만 남았다. 잠재 변수가 다 정하지 못한 불확실함을 디코더가 칸마다 따로 던지는 동전으로만 나타낼 수 있기 때문이다. 조건을 더 세밀하게 주면 조금 나아지지만, 그 조건은 사람이 그림에서 재서 정해 주었고, 조건을 정하는 값은 따로 치러야 했다. 게다가 이 모델은 인코더와 디코더를 함께 배워야 했고, 인코더가 엉뚱한 곳을 짚으면 바닥이 천장에서 크게 떨어졌다. 한 번에 784칸을 통째로 그려야 하는 디코더 하나에 너무 많은 일을 맡긴 것은 아닐까? 인코더를 배우는 대신 아주 단순한 것으로 고정해 두고, 앞 단계의 결과를 다음 단계의 조건으로 삼아 그림을 여러 번에 나눠 그리게 할 수는 없을까? 그리고 둥근 정도를 재려고 손으로 골랐던 필터처럼, 그림을 읽는 데 쓸모 있는 필터를 사람이 정하지 않고 데이터에서 저절로 찾게 할 수는 없을까? 얼굴 사진을 학습할 때 속을 열지 않고 빌려 쓴 그림용 부품은 무엇을 하고 있었을까?