튜토리얼 · 9
오토인코더
여기에 라벨은 없다. 망은 자기 입력을 숫자 둘 너비의 틈으로 통과시켜 다시 만들라는 요구를 받고, 그림들이 실제로 무엇으로 달라지는지를 찾아야만 해낼 수 있다. 그림은 자유도가 정확히 둘이 되게 만들었으니, 끝나고 나서 그것을 찾았는지 확인할 수 있다 — 이 튜토리얼의 대부분이 그 확인이다.
1 · 사실 둘이 든 그림 256 장
그림 하나는 16×16 판 위의 부드러운 점이고, 그림 사이에서 달라지는 것은 점의 자리뿐이다. 모든 이미지가 픽셀 256 개이고, 동시에 모든 이미지가 숫자 둘이다. 학습에서 그 사실을 망에 알려주는 것은 아무것도 없다.
2 · 틈
합성곱 둘로 코드 2 까지 내려갔다가, nn.ConvTranspose2d — 거꾸로 돌린
합성곱이고, 작아지는 대신 커지는 방법이다 — 로 16×16 까지 올라온다. 손실은 출력을
입력과 견주므로 라벨은 없고 필요하지도 않다.
3 · 그 숫자 둘이 무엇이 되었나
좌표에 대해 아무도 알려주지 않았다. 시험 그림을 인코딩해 각 코드를 그것을 그릴 때 쓴
(cx, cy) 와 견준다 — 눈이 아니라 상관계수로, 그리고 코드 둘을 좌표 둘
모두와. 망은 짝을 뒤바꾸거나 뒤집거나 돌려놓을 자유가 있고 그래도 맞은 것이기 때문이다.
대각선이 아닌 자리의 큰 값은 실패가 아니다. 망이 세상을 제 순서로 번호 매겼다는 뜻이다. 실패는 표 전체가 작은 값일 때이고, 어떤 잠재 공간이든 믿기 전에 읽을 줄 알아야 하는 구분이다.
4 · 어느 그림에서도 나오지 않은 코드
디코더는 숫자 둘을 받아 이미지를 돌려주고, 그 숫자가 어떤 그림도 낸 적 없는 값이면 안 된다고 막는 것은 없다. 실제 코드 하나에서 다른 하나로 걸어가면 그 사이의 장면들이 나오고, 코드들이 차지한 범위 바깥으로 한참 걸어가면 모델이 제대로 할 이유가 한 번도 없었던 것이 나온다.
두 코드 사이의 직선은 정당한 질문이고 답은 판 위를 미끄러지는 점이다. 멀리 있는 것들은 정당하지 않다 — 오토인코더는 압축기이지 생성기가 아니고, 본 적 없는 코드에 대해서는 아무 약속도 하지 않는다. 그 약속을 하는 모델(VAE, 확산 모델)은 그것을 위해 학습해서 사고, 값은 구조가 아니라 손실 함수에 치른다.
CODE 를 2 에서 1 로 바꾸면 오차가
네 배쯤 높은 자리에 앉는다 — 여기서 재니 0.009 대 0.002 였다. 숫자 하나는 사실 둘을
담지 못하기 때문이고, 틈의 너비가 데이터에 대한 주장이라는 가장 싼 증명이다. 그다음
8 로 올려 보라 — 복원은 또 또렷해지고(0.0002) 3 번 블록의 그림은 뜻을 잃는다. 튜토리얼 4 의 CIFAR 이미지로는,
잡음 낀 입력을 넣고 깨끗한 것을 요구하면 같은 망이 잡음 제거기가 된다.