7장 — 랑주뱅과 역방향 미분방정식: 샘플을 뽑는 길

담금질 랑주뱅: 안개를 걷으며 걷기

봉우리가 −1.5와 +1.5에 있어 골짜기가 얕을 때는, 점들이 이쪽저쪽을 오가며 봉우리 비중을 맞췄다. 그림의 분포는 그렇게 너그럽지 않다. 고양이 그림과 자동차 그림 사이에는 어느 쪽으로도 그럴듯하지 않은 그림들이 넓게 깔려 있다. 봉우리가 멀리 떨어지면 랑주뱅 샘플링은 어떻게 될까?

역사: 스코어만으로 그림을 뽑으려다 만난 두 벽

송(Yang Song)과 에르몬(Stefano Ermon)은 2019년 논문 「데이터 분포의 기울기를 어림해 만드는 생성 모델」에서 스코어만 배워 랑주뱅 샘플링으로 그림을 뽑는 길을 시도했다. 그들은 두 벽을 적었다. 첫째는 데이터가 높은 차원 공간의 얇은 면 근처에만 모여 있다는 점이었다. 데이터가 없는 넓은 곳에서는 스코어를 배울 근거가 거의 없어서, 2차원 장난감에서도 배운 스코어는 봉우리 바로 둘레에서만 믿을 만했다. 둘째는 랑주뱅 샘플링이 「섞이는 데 느리다」는 것이었다. 비중이 1/5과 4/5인 두 가우시안을 멀리 떨어뜨린 혼합에서 정확한 스코어로 랑주뱅 샘플링을 돌려도 두 봉우리의 비율이 맞지 않았다.

두 사람이 찾은 길은 둘을 한꺼번에 푸는 것이었다. 데이터에 여러 크기의 잡음을 섞어 잡음 크기마다 스코어를 배운다. 잡음을 크게 섞으면 데이터가 넓게 퍼져 빈 곳이 줄고, 봉우리 사이 골짜기도 메워진다. 그림을 뽑을 때는 가장 짙은 잡음의 분포에서 랑주뱅 걸음을 몇 번 걷고, 잡음을 한 단계 줄인 분포에서 다시 몇 번 걷는 일을 되풀이한다. 그림 실험에서는 잡음의 표준편차를 1에서 0.01까지 등비로 줄어드는 열 단계로 두고 단계마다 100걸음을 걸었으며, 걸음 크기는 그 단계 잡음 분산에 비례하게 잡았다. 논문은 이 방법이 금속을 천천히 식히는 담금질 기법(시뮬레이티드 어닐링)과 담금질 중요도 표집에서 착안했다고 적었다.

멀리 떨어진 두 봉우리

봉우리를 −5(비중 0.2)와 +5(비중 0.8)로 떼어 놓자(폭 1). 앞과 같이 −8과 8 사이에 고르게 뿌린 점 2만 개를 걸음 크기 0.05로 걷게 하면, 오르기만 하면 오른쪽 비율이 0.511이고, 랑주뱅 샘플링으로 3,000걸음을 걸어도 0.514다. 걸음을 열 배인 3만 걸음으로 늘려도 0.518이다. 봉우리 안의 모양(표준편차 1.005)은 맞는데 비율은 처음 뿌린 그대로다. 골짜기 한가운데의 −log p는 왼쪽 꼭대기보다 10.89, 오른쪽 꼭대기보다 12.28 높다. 골짜기에 설 확률이 꼭대기의 수만분의 일이라, 걷는 점이 그 사이를 건너는 일은 거의 일어나지 않는다. 처음에 어느 쪽에 떨어졌는지가 끝까지 남는다.

이제 안개를 끼운다. 지형에 잡음 크기 σ(시그마)를 섞으면 봉우리마다 분산이 1 + σ²로 넓어진다. σ를 10에서 0.1까지 등비로 줄이는 열 단계를 두고, 단계마다 그 지형의 바늘로 랑주뱅 걸음을 100번 걷는다. 걸음 크기는 0.05 × (1 + σ²)로, 봉우리가 넓어진 만큼 크게 걷는다.

x←x+ησ ∇xlog⁡pσ(x)+2ησ  ε,ησ∝1+σ2,σ=10→0.1\textcolor{#1b9e77}{x} \leftarrow \textcolor{#1b9e77}{x} + \textcolor{#006600}{\eta}_{\textcolor{#4c5d80}{\sigma}}\,\nabla_{\textcolor{#1b9e77}{x}} \log \textcolor{#c2408a}{p}_{\textcolor{#4c5d80}{\sigma}}(\textcolor{#1b9e77}{x}) + \sqrt{2\textcolor{#006600}{\eta}_{\textcolor{#4c5d80}{\sigma}}}\;\textcolor{#1f6066}{\varepsilon}, \qquad \textcolor{#006600}{\eta}_{\textcolor{#4c5d80}{\sigma}} \propto 1 + \textcolor{#4c5d80}{\sigma}^2, \qquad \textcolor{#4c5d80}{\sigma} = 10 \to 0.1
pσ데이터 분포에 크기 σ 인 잡음을 섞은 분포 (안개 낀 지형)σ안개의 짙기: 섞은 잡음의 표준편차. 단계마다 줄인다ησ그 단계의 걸음 크기x, ε걷는 점, 걸음마다 새로 뽑는 표준정규 잡음\begin{array}{ll} \textcolor{#c2408a}{p}_{\textcolor{#4c5d80}{\sigma}} & \text{데이터 분포에 크기 } \sigma \text{ 인 잡음을 섞은 분포 (안개 낀 지형)} \\ \textcolor{#4c5d80}{\sigma} & \text{안개의 짙기: 섞은 잡음의 표준편차. 단계마다 줄인다} \\ \textcolor{#006600}{\eta}_{\textcolor{#4c5d80}{\sigma}} & \text{그 단계의 걸음 크기} \\ \textcolor{#1b9e77}{x},\ \textcolor{#1f6066}{\varepsilon} & \text{걷는 점, 걸음마다 새로 뽑는 표준정규 잡음} \end{array}

모두 1,000걸음 걸은 뒤 오른쪽 비율은 0.779로 참값 0.8에 다가가고, 봉우리 안 표준편차도 1.008로 맞는다. 짙은 안개 속에서는 두 봉우리가 큰 언덕 하나로 합쳐져 있어서 점들이 그 언덕의 모양대로, 곧 비중대로 먼저 나뉘고, 그다음에 안개가 걷히며 각 봉우리로 내려앉는다. 이렇게 잡음을 섞은 지형에서 시작해 잡음을 단계마다 줄여 가며 그 단계의 바늘로 랑주뱅 걸음을 걷는 방법을 담금질 랑주뱅 (안개를 걷어 가며 걷는 랑주뱅 / annealed Langevin dynamics)이라 한다. 「담금질」은 영어 annealing(달군 금속을 천천히 식히기)을 옮긴 말이라, 뜨거운 쇠를 물에 넣어 급히 식히는 대장간의 담금질과는 뜻이 반대다.

봉우리가 −5(비중 0.2)와 +5(비중 0.8), 폭 1인 분포(분홍) 위에서 −8~8에 고르게 뿌린 점 2만 개를 세 방법으로 걷게 한 결과. 위: 오르기만 하면 두 꼭대기에 선다. 가운데: 같은 지형의 랑주뱅 샘플링 3,000걸음은 봉우리 안 모양은 맞지만 오른쪽 비율이 처음 뿌린 대로 0.51이다. 아래: 안개를 10에서 0.1까지 열 단계로 걷으며 단계마다 100걸음 걸으면 오른쪽 비율이 0.78로 참값 0.8에 다가간다. 『정보기하학』의 디퓨전 장에 있던 같은 실험을 이 책의 색으로 다시 돌려 그렸다.
봉우리가 −5(비중 0.2)와 +5(비중 0.8), 폭 1인 분포(분홍) 위에서 −8~8에 고르게 뿌린 점 2만 개를 세 방법으로 걷게 한 결과. 위: 오르기만 하면 두 꼭대기에 선다. 가운데: 같은 지형의 랑주뱅 샘플링 3,000걸음은 봉우리 안 모양은 맞지만 오른쪽 비율이 처음 뿌린 대로 0.51이다. 아래: 안개를 10에서 0.1까지 열 단계로 걷으며 단계마다 100걸음 걸으면 오른쪽 비율이 0.78로 참값 0.8에 다가간다. 『정보기하학』의 디퓨전 장에 있던 같은 실험을 이 책의 색으로 다시 돌려 그렸다.
직접 움직여 보기담금질 랑주뱅새 창에서 열기 ↗

ML에서: 잡음 수준마다의 바늘을 쓰는 첫 샘플러

담금질 랑주뱅에는 잡음 수준마다의 바늘이 필요하다. 잡음을 섞어 본 기록으로 바늘을 배우는 방법이 바로 그것을 준다. 송과 에르몬의 신경망은 그림과 잡음 크기 σ를 함께 받아 그 수준의 스코어를 내놓았고, 그림 한 장을 뽑을 때 열 단계 × 100걸음, 곧 신경망을 1,000번 불렀다. 같은 잡음 크기에서 100걸음씩 머무는 것은 그 단계의 분포에 점들이 자리 잡을 때까지 기다리는 일이다. 잡음 수준이 계속 줄어드는데 매번 한자리에서 기다려야 할까? 그 물음이 다음 걸음법을 부른다.

문제 4. 비중을 모르는 바늘

데이터는 −5와 +5에 봉우리를 둔 두 가우시안의 혼합(폭 1)이다. 비중이 0.2와 0.8일 때와 반반일 때, 두 분포의 스코어를 견준다. (가) x = 4와 x = −4에서 두 스코어는 각각 얼마인가? (나) x = 0에서는? (다) 안개 σ = 3을 섞은 두 분포(봉우리 분산 10)의 스코어를 x = 0과 4에서 견주면?

∇xlog⁡(π1p1(x)+π2p2(x))\nabla_{\textcolor{#1b9e77}{x}} \log\big(\textcolor{#87965a}{\pi}_1 \textcolor{#c2408a}{p}_1(\textcolor{#1b9e77}{x}) + \textcolor{#87965a}{\pi}_2 \textcolor{#c2408a}{p}_2(\textcolor{#1b9e77}{x})\big)
π1, π2두 봉우리의 비중 (합이 1)p1, p2봉우리 하나씩의 분포 (−5, +5 에 놓인 폭 1 가우시안)x바늘을 읽는 자리\begin{array}{ll} \textcolor{#87965a}{\pi}_1,\ \textcolor{#87965a}{\pi}_2 & \text{두 봉우리의 비중 (합이 1)} \\ \textcolor{#c2408a}{p}_1,\ \textcolor{#c2408a}{p}_2 & \text{봉우리 하나씩의 분포 (−5, +5 에 놓인 폭 1 가우시안)} \\ \textcolor{#1b9e77}{x} & \text{바늘을 읽는 자리} \end{array}
김민준 M01
김민준

비중이 다르면 바늘도 다르겠죠. 0.8짜리 봉우리 쪽이 더 세게 끌 테니까요.

선생님 T01
선생님

x = 4에서 계산해 봐요.

김민준 M06
김민준

0.2/0.8일 때 1.000000, 반반일 때도 1.000000이에요. 소수 여섯째 자리까지 같아요. x = −4에서도 둘 다 −1.000000이고요.

이서연 S01
이서연

+5 봉우리 바로 옆에서는 −5 봉우리 몫이 e^(−40)쯤이라 사실상 0이야. 그러면 log(π₂p₂) = log π₂ + log p₂인데, log π₂는 상수라 미분하면 사라져. 바늘에는 봉우리 하나의 기울기만 남아.

선생님 T02
선생님

그럼 비중은 바늘 어디에 들어 있어요?

이서연 S08
이서연

(나)를 보면 x = 0에서 0.2/0.8은 3.0, 반반은 0이에요. 두 봉우리 몫이 비슷한 골짜기에서만 비중이 바늘을 기울여요. 그런데 걷는 점은 거의 그 골짜기에 가지 않으니, 비중을 알려 주는 바늘을 읽을 일이 없어요.

김민준 M01
김민준

(다)는 안개를 끼우면 x = 0에서 0.3과 0이고, x = 4에서도 0.0954와 0.0820으로 달라요. 안개 속에서는 봉우리가 넓어져서 점들이 서는 곳 어디서나 바늘이 비중을 느끼는구나.

이서연 S09
이서연

짙은 안개에서 비중대로 먼저 나뉘고, 그다음에 걷히는 거니까 비율이 맞는 거야. 안개가 정보를 감추는 게 아니라 오히려 먼 곳의 정보를 가까이 실어 오네.

김민준 M08
김민준

지도 앱에서 확대한 채로는 옆 동네가 얼마나 큰지 모르다가, 축소해 보면 어느 동네가 큰지 보이는 거랑 같네요.

문제 5. 단계마다 몇 걸음

문제 4의 0.2/0.8 지형에서, 안개를 10에서 0.1까지 열 단계로 걷되 단계마다 걷는 걸음 수를 줄여 본다(점 2만 개, 걸음 크기 0.05 × (1 + σ²)). 본문의 100걸음일 때 오른쪽 비율은 0.779였다. (가) 단계마다 10걸음, 3걸음, 1걸음이면 오른쪽 비율과 오른쪽 봉우리 안 표준편차는 어떻게 되는가? (나) 모두 걷는 걸음 수를 100이나 300으로 정해 둔다면, 단계 수와 단계마다 걸음 수를 어떻게 나누는 편이 나은가? (풀어 본 뒤 위젯 1의 「문제 5 불러오기」로 확인해 보자.)

김민준 M01
김민준

담금질만 하면 비율이 맞으니까, 걸음 수는 줄여도 비슷하지 않을까요? 단계마다 1걸음이면 신경망을 열 번만 부르면 되잖아요.

선생님 T01
선생님

돌려 봐요.

김민준 M05
김민준

10걸음이면 0.650, 3걸음이면 0.580, 1걸음이면 0.541이에요. 표준편차도 1.037, 1.753, 2.478로 커져요. 1걸음이면 비율도 모양도 다 틀려요.

이서연 S01
이서연

각 단계에서 점들이 그 단계의 분포에 자리 잡기 전에 안개가 걷혀 버린 거야. 짙은 안개에서 퍼져 있던 모양이 그대로 남아서 표준편차가 큰 거고.

선생님 T02
선생님

(나)는요? 모두 100걸음이면 10단계 × 10걸음과 100단계 × 1걸음이 있어요.

김민준 M09
김민준

100단계 × 1걸음이 0.658로 10단계 × 10걸음의 0.650보다 조금 나아요. 300걸음이면 30단계 × 10걸음이 0.746이고요.

이서연 S08
이서연

같은 걸음 수라면 한 단계에서 오래 머무르는 것보다 안개를 잘게 나눠 조금씩 걷는 쪽이 낫구나. 단계 사이 분포 차이가 작으면 점들이 따라가기 쉬우니까. 그러면 단계를 끝없이 잘게 나누고 단계마다 한 걸음씩만 걸으면 어떻게 될까?

선생님 T13
선생님

좋은 물음이에요. 안개를 연속으로 걷으면서 걸음마다 한 번씩만 바늘을 읽는 길, 그 길에서 잡음을 얼마나 넣어야 하는지가 다음 이야기예요.

김민준 M01
김민준

시험 전날 밤새는 것보다 매일 조금씩 공부하는 게 낫다는 말이 숫자로 나왔네요.