라벨이 조건인 그림의 분포: 생성이 배워야 할 것
사진첩 표는 칸이 넷이라 세어서 채울 수 있었다. 이제 표의 한 축에 「찍은 곳」 대신 사진 그 자체를 놓아 보자. 가로세로 32픽셀짜리 작은 컬러 사진 한 장도 32 × 32 × 3 = 3,072개의 밝기로 적힌다. 칸마다 밝기를 바꿔 만들 수 있는 사진의 가짓수는 셀 엄두가 나지 않을 만큼 많다. 사진을 축으로 놓은 표는 적을 수도 셀 수도 없다. 그래도 세로 막대는 그대로 쓸 수 있다. 막대 왼쪽에 사진을 놓느냐 오른쪽에 놓느냐에 따라 일이 얼마나 달라지는지가 이 절의 물음이다.
왜 특징 두 개짜리 평면인가
사진 한 장은 3,072차원 공간의 점이라 그릴 수 없다. 그래서 사진마다 숫자 두 개만 남겨 평면에 찍어 보자. 가로축은 귀 끝이 얼마나 뾰족한지, 세로축은 주둥이가 얼마나 긴지다. 고양이 사진은 귀가 뾰족하고 주둥이가 짧아 왼쪽 아래에, 강아지 사진은 오른쪽 위에 몰린다. 아래 위젯의 두 구름은 설명을 위해 정한 정규분포다(고양이 가운데 (−0.8, −0.6)·폭 0.55, 강아지 가운데 (0.9, 0.7)·폭 0.75). 실제 사진에서 잰 값은 아니지만, 점이 두 숫자짜리라 두 방향의 조건부 분포를 한 화면에 모두 그릴 수 있는 가장 작은 무대다.
같은 평면, 두 방향
평면의 한 점, 곧 사진 하나를 고르면 그 사진이 고양이일지 강아지일지의 분포가 정해진다. 이것이 p(y ∣ x)이고, 값은 두 개뿐이다. 고양이 구름 가운데 (−0.8, −0.6)에서는 (0.991, 0.009), 두 구름 사이 (0, 0)에서는 (0.531, 0.469)다. 어느 점에서든 막대 두 개를 그리면 끝난다.
거꾸로 라벨 y = 고양이를 고르면 묻는 쪽은 사진이다. p(x ∣ y = 고양이)는 평면 전체에 퍼진 구름 하나이고, 평면의 모든 점에 값이 하나씩 있다. 구름에서 점을 하나 뽑으면 고양이 사진 하나가 나오고, 다시 뽑으면 다른 고양이 사진이 나온다. 막대 두 개로는 적을 수 없다. 이 구름을 「안다」는 것은 구름의 모양을 알고, 그 모양대로 점을 뽑을 수 있다는 뜻이다.
두 방향은 베이즈 정리로 이어져 있다. 아래 위젯의 p(y ∣ x)는 두 구름의 높이와 고양이 비율로 계산한 값이다.
거꾸로는 되지 않는다. p(y ∣ x)를 모든 점에서 알아도, 고양이 사진이 평면 어디에 얼마나 몰려 있는지는 나오지 않는다. 분류기는 두 구름의 경계 근처만 잘 알면 되지만, 구름에서 점을 뽑으려면 구름 전체를 알아야 한다.
위젯에서 고양이 비율을 0.5에서 0.1로 내리면 바탕의 경계가 고양이 쪽으로 밀리지만 두 구름은 그대로다. 라벨 비율은 p(y ∣ x)를 바꾸고 p(x ∣ y)는 건드리지 않는다.
라벨이 주어졌을 때 그 라벨의 그림을 하나 뽑아 내는 일을 조건부 생성 (조건에 맞는 그림 하나 뽑기 / conditional generation)이라 한다. 이 책이 지을 모델은 모두 이 일을 한다. 조건이 라벨일 때도, 글 한 줄일 때도, 참조 그림일 때도 막대 오른쪽에 놓이는 것이 바뀔 뿐이다.
ML에서: 같은 막대, 반대 자리
분류 모델 논문은 p(y ∣ x)를 적고, 그림 생성 모델 논문은 p(x ∣ y) 또는 글 조건 c 를 써서 p(x ∣ c)를 적는다. 내놓는 것부터 다르다. 분류 모델은 라벨마다 확률 하나씩, 짧은 막대 하나를 내면 할 일이 끝난다. 생성 모델은 그림 한 장의 밝기를 모두 내놓아야 하고, 그것도 매번 같은 그림이 아니라 구름에서 뽑은 그림 하나를 내놓아야 한다.
문제 7. 출석부 서명
30명이 듣는 수업에서 조교가 출석부의 서명만 보고 누구의 서명인지 맞힌다. 반대로 학생 한 명의 이름을 듣고 그 학생의 서명을 흉내 내어 그리기도 한다. 서명은 가로세로 10칸 모눈에 칸마다 칠하거나 비우는 그림이라고 하자. (가) 「서명 → 이름」의 답이 될 수 있는 것은 몇 가지인가? (나) 「이름 → 서명」의 답이 될 수 있는 그림은 몇 가지인가? (다) 같은 학생이 매주 하는 서명은 매번 똑같은가?

(가)는 30가지요. (나)는 칸 100개가 칠하거나 비우거나 둘 중 하나니까 2¹⁰⁰, 1.27 × 10³⁰가지예요.

그럼 조교가 「이름 → 서명」을 잘한다는 건 그 10³⁰ 가지 가운데 무엇을 안다는 뜻일까요?

그 학생 서명이 어떤 모양인지… 하나만 알면 되지 않아요? 그걸 그리면 되잖아요.

(다)를 보면 그게 아니야. 같은 사람도 매주 서명이 조금씩 달라. 10³⁰ 가지 가운데 그 학생이 할 법한 서명들이 한 무리로 있고, 조교는 그 무리 안에서 그럴듯한 하나를 그리는 거지.

그 무리를 막대 꼴로 적으면요?

p(서명 ∣ 이름)이요. 이름 하나에 서명들의 분포가 하나 있어요. (가)의 p(이름 ∣ 서명)은 30칸짜리 막대고.

같은 막대인데 왼쪽이 이름이면 30칸, 서명이면 10³⁰ 칸이네요. 그래서 맞히기는 쉽고 그리기는 어렵구나.

보고서 표지에 이름 쓰는 칸은 하나인데, 본문은 사람마다 매번 다르게 써 오는 거랑 같네요.
문제 8. 확률이 0.02 인데 왜 작지 않나
위젯의 두 구름을 쓴다. (가) 점 (0.3, 0.2)에서 p(x ∣ 고양이) = 0.0247, p(x ∣ 강아지) = 0.1645다. 두 값을 더해도 1이 안 된다. 계산이 틀렸는가? (나) 점 (−2.5, 2.0)에서 p(y = 강아지 ∣ x)는 0.972다. 이 점의 사진은 강아지 사진이라고 믿어도 되는가?
위젯의 「문제 8 불러오기」로 두 점의 값을 볼 수 있다.

(가)는 고양이일 확률이 2%, 강아지일 확률이 16%라는 거죠? 나머지 82%는 뭔지 모르겠지만요.

그 두 값은 세로 막대 왼쪽에 무엇을 놓고 잰 값이에요?

사진 x요. 아, 라벨의 확률이 아니라 사진의 값이네요. 고양이 구름에서 이 점이 얼마나 높은지요.

그러면 더해서 1이 될 이유가 없어. 서로 다른 구름의 높이니까. 1이 되는 건 한 구름 전체를 평면에 대해 모두 더했을 때야.

평면의 점은 셀 수 없이 많은데, 그 「모두 더하기」는 어떻게 해요?

넓이로 해야겠네요. 높이 × 넓이가 확률이니까 0.0247은 확률이 아니라 밀도예요. 0.1 × 0.1 네모 하나에 고양이 구름의 점이 떨어질 확률이 0.0247 × 0.01, 0.00025쯤이고요.

(나)는요?

0.972면 거의 확실하게 강아지죠.

그런데 이 점은 두 구름 어디서도 멀어. 강아지 구름의 높이가 꼭대기의 10만 분의 1도 안 되고, 고양이 구름은 그보다 더 낮아. 0.972는 「이상한 사진인데, 둘 중 고르라면 강아지 쪽」이라는 뜻일 뿐이야.

p(y ∣ x)는 두 칸 합이 늘 1이니까, 사진이 얼마나 이상한지는 거기 안 나오는 거네요. 그건 p(x ∣ y) 쪽에만 있고요.

그래요. 분류기에 고양이도 강아지도 아닌 사진을 넣어도 둘 중 하나를 높은 확률로 고르는 까닭이에요.

객관식에 정답이 없어도 보기 중 하나는 꼭 골라야 하는 시험지 같네요.
문제 9. 사진 생성기는 표를 내놓을 수 없다
(가) 이미지넷 분류기는 사진 한 장에 숫자 몇 개를 내놓는가? (나) 가로세로 64픽셀 컬러, 칸마다 256단계 밝기인 사진의 가짓수는 몇 자리 수인가? (다) 「고양이」를 받아 p(x ∣ 고양이)를 통째로, 곧 모든 사진에 확률 하나씩을 적은 표로 내놓는 생성기를 만들 수 있는가? 없다면 생성기는 무엇을 내놓아야 하는가?

(가)는 라벨 1,000개에 하나씩, 1,000개요. (나)는 칸이 64 × 64 × 3 = 12,288개고 칸마다 256가지니까 256^12,288. 자릿수는 12,288 × log₁₀ 256 에 1을 더하면 29,593자리예요.

우주의 원자 수가 80자리쯤이에요. (다)는요?

표는 절대 못 내놓죠. 그럼 생성기는… 확률이 가장 높은 사진 하나를 내놓으면 되지 않아요?

문제 7의 서명처럼 같은 이름에도 서명이 여럿이었잖아. 가장 그럴듯한 하나만 내놓으면 그건 분포가 아니라 점 하나야.

표도 못 내놓고 점 하나도 모자라면, 남는 길은 뭘까요?

분포 자체는 속에 두고, 부를 때마다 그 분포에서 사진을 하나씩 뽑아 내놓는 거요. 여러 번 부르면 뽑힌 사진들이 구름 모양을 그려 주고요.

위젯에서 「구름에서 24개 뽑기」를 누를 때마다 점이 다르게 찍힌 게 그거였네요. 생성기는 표가 아니라 뽑는 기계구나.

학식 메뉴판이 한 달 치 식단표를 다 주는 대신, 오늘 메뉴 하나만 알려 주는데 한 달 지나면 식단 전체가 보이는 거랑 같네요.