13장 — 열 방정식과 확산
이 장의 물음
그래프 신경망에서 GCN(graph convolutional network, 그래프 합성곱 신경망) 층을 깊게 쌓으면 이상한 일이 생긴다. 가라테 동호회 회원 34명의 친구 관계 78개로 만든 그래프(자카리의 가라테 클럽)에서 회원마다 16차원 무작위 특징을 주고, 가중치와 비선형 함수는 뺀 채 GCN의 전파 단계, 곧 「자기 자신과 이웃들의 특징을 이웃 수로 나눠 평균 내기」만 되풀이해 보자. 서로 다른 두 회원의 특징 벡터가 이루는 코사인 유사도는 평균이 처음 0.01이었다가 2층 뒤 0.41, 8층 뒤 0.85, 32층 뒤 0.999가 된다. 층을 쌓을수록 회원들이 서로 구별되지 않을 만큼 닮아 가는 것이다. 리, 한, 우는 2018년 논문에서 이것을 「GCN의 그래프 합성곱은 사실 라플라시안 평활화의 특별한 형태이며, 이것이 GCN이 잘 작동하는 핵심 이유이지만 합성곱 층이 많으면 과평활화의 우려도 낳는다」고 적었다. 평활화(smoothing)는 값을 이웃과 비슷하게 고르는 것이고, 과평활화(over-smoothing)는 너무 고르게 되어 서로 구별되지 않게 되는 것이다.

생성 모델에서도 비슷한 일이 일어난다. 분산 폭발형 확산 모델은 학습 이미지에 정규분포 잡음을 더하는데, 잡음의 표준편차를 0.01에서 시작해 CIFAR-10에서는 50까지 키운다. 픽셀 값이 0과 1 사이인 이미지에 표준편차 50인 잡음을 더하면 원래 무엇이었는지 알아볼 수 없다. 송과 에르몬(2020)은 가장 큰 잡음을 「학습 데이터 두 점 사이 유클리드 거리의 최댓값만큼」 크게 잡으라고 권했다. 잡음이 커지는 동안 잡음 섞인 이미지들의 분포는 점점 넓고 밋밋해져서, 어떤 데이터에서 출발했든 거의 같은 모양이 된다. 두 경우 모두 무언가가 퍼지면서 차이가 지워진다. 무엇이 어떤 법칙으로 퍼지며, 지워진 차이는 되돌릴 수 있을까?
이 질문은 지금까지의 질문과 종류가 다르다. 볼츠만 분포, 자유에너지, 요동과 응답, 평균장 근사는 모두 계가 충분히 오래 지난 뒤 머무는 분포, 곧 평형에 대한 이야기였고, 그 식들에는 시간 t가 한 번도 나오지 않았다. 평형이 도착점이라면, 이 장부터는 계가 그 도착점까지 가는 길, 곧 시간에 따른 변화를 다룬다. 첫 대상은 가장 단순한 변화인 「고르지 않던 것이 고르게 되어 가는 과정」이고, 이 장은 다음 물음에 차례로 답한다.
- 이웃끼리 평균을 내는 일을 되풀이하면 값은 얼마나 멀리, 어떤 빠르기로 퍼질까?
- 칸을 한없이 잘게 나누고 평균을 한없이 자주 내면 이 규칙은 어떤 방정식이 될까?
- 처음 모양이 복잡하면 그 가운데 무엇이 먼저 지워질까?
- 퍼진 것을 거꾸로 돌려 처음 모양을 되찾을 수 있을까? 곧바로 되돌릴 수 없다면 다른 길은 있을까?
- 층을 깊게 쌓은 GCN과 잡음을 키워 가는 확산 모델에서는 각각 무엇이 어디에서 퍼지고 있을까?
이웃 평균: 퍼진 거리는 횟수의 제곱근
잉크 한 방울을 물에 떨어뜨리면 번져 나가고, 뜨거운 곳의 열은 차가운 쪽으로 번진다. 이렇게 고르지 않던 것이 고르게 되어 가는 과정은 이웃끼리 값을 나누는 일로 흉내 낼 수 있다. 이웃끼리 평균을 내는 일을 되풀이하면 값은 얼마나 멀리, 어떤 빠르기로 퍼질까?
가운데 칸에 둔 1
정사각 격자의 칸마다 수를 하나씩 적는다. 처음에는 가운데 한 칸에만 1을 두고 나머지는 모두 0이다. 한 번 갱신할 때 모든 칸을 동시에 위, 아래, 왼쪽, 오른쪽 이웃 넷의 평균으로 바꾼다.
몇 번 갱신해 보자. 한 번 뒤에는 가운데의 1이 이웃 네 칸에 1/4씩 나뉘고 가운데는 0이 된다. 두 번 뒤에는 가운데가 다시 1/4이 되고, 가운데에서 두 칸 떨어진 칸들에도 값이 생긴다. 얼마나 퍼졌는지는 칸의 값을 비중으로 삼아 잰다. 값의 합이 1이므로 칸마다 처음 자리에서 떨어진 거리의 제곱에 그 칸의 값을 곱해 모두 더하면 거리 제곱의 가중 평균이 되고, 그 제곱근을 퍼진 거리라 하자.
| 되풀이 횟수 n | 값의 합 | 퍼진 거리 | 퍼진 거리² ÷ n | 가운데 칸의 값 |
|---|---|---|---|---|
| 1 | 1 | 1.000 | 1 | 0 |
| 2 | 1 | 1.414 | 1 | 0.25 |
| 4 | 1 | 2.000 | 1 | 0.1406 |
| 25 | 1 | 5.000 | 1 | 0 |
| 100 | 1 | 10.000 | 1 | 0.00633 |
| 400 | 1 | 20.000 | 1 | 0.00159 |
세 가지가 눈에 띈다. 첫째, 값의 합은 몇 번을 되풀이해도 정확히 1이다. 평균 내기는 값을 옮길 뿐 만들거나 없애지 않는다. 둘째, 퍼진 거리는 어림이 아니라 정확히 횟수의 제곱근이다. 25번에 5칸, 100번에 10칸, 400번에 20칸이어서, 두 배 멀리 가려면 네 배 오래 되풀이해야 한다. 셋째, 되풀이 횟수가 홀수이면 가운데 칸이 0이다. 칸을 바둑판처럼 두 색으로 칠하면 값은 한 번 갱신할 때마다 한 색의 칸들에서 다른 색의 칸들로 통째로 건너가서, 짝수 번째에는 가운데와 같은 색의 칸에만, 홀수 번째에는 다른 색의 칸에만 값이 있다.

한 번 나눠 줄 때 늘어나는 것
퍼진 거리는 왜 정확히 횟수의 제곱근이며, 칸의 색이 번갈아 비는 것은 무엇을 뜻할까? 이웃 넷의 평균으로 바꾸는 규칙은 거꾸로 보면 모든 칸이 자기 값을 네 등분해 이웃 네 칸에 하나씩 나눠 주는 것과 같다. 위치 x인 칸의 값은 한 번 갱신한 뒤 x + s인 네 칸에 1/4씩 가 있고, 여기서 s는 (1, 0), (−1, 0), (0, 1), (0, −1) 가운데 하나인 한 칸 이동이다. 그러면 거리 제곱의 가중 평균은 다음과 같이 바뀐다.
가운데 항이 사라지는 것이 핵심이다. 네 이동이 좌우와 상하로 대칭이라 평균 이동이 0이므로, 값이 지금 어디에 있든 한 번 나눠 줄 때마다 거리 제곱의 가중 평균은 정확히 1씩 는다. 거리 자체는 가까워지는 쪽과 멀어지는 쪽이 섞여서 한 번에 얼마씩 는다고 말할 수 없지만, 거리의 제곱은 처음 모양과 상관없이 매번 같은 만큼 는다. 그래서 n번 뒤 거리 제곱의 평균은 n이고 퍼진 거리는 √n이다. 교차항이 0이라 제곱만 쌓이는 이 계산은 서로 직각인 두 변으로 빗변을 만들 때 제곱끼리 더해지는 피타고라스 정리와 같다. 한 축만 보면 네 이동 가운데 둘만 그 축으로 움직이므로, 가로 방향의 분산은 한 번에 1/2씩 는다.

종 모양과 게으른 평균
퍼지는 모양도 곧 정해진다. 값을 한 번 나눠 줄 때마다 값의 조각은 네 방향 가운데 하나로 한 칸 옮겨 가고, 이번에 어느 쪽으로 가는지는 지난번에 어느 쪽으로 갔는지와 상관이 없다. 서로 상관없는 작은 이동을 많이 더하면 처음 모양과 상관없이 종 모양, 곧 가우시안이 된다. 동전을 많이 던져 앞면 수를 세면 종 모양 분포가 나오는 것도 던질 때마다 서로 상관없는 0이나 1이 하나씩 더해지기 때문이다. 100번 뒤 가운데 칸의 값 0.00633은, 가로와 세로 분산이 각각 50인 2차원 가우시안에서 칸 하나에 해당하는 값 1/(100π) = 0.00318의 두 배와 거의 같다. 두 배인 까닭은 값이 가운데와 같은 색의 칸, 곧 절반의 칸에만 모여 있기 때문이다. 가운데에서 10칸 떨어진 칸도 0.00235 대 0.00234로 맞는다.
칸의 색이 번갈아 비는 것은 모든 칸이 동시에, 자기 값을 하나도 남기지 않고 이웃에게만 나눠 주기 때문이다. 절반은 제자리에 남기고 절반만 이웃에게 나눠 주는 게으른 평균, 곧 u ← (u + 이웃 넷의 평균)/2로 바꾸면 이런 일이 없다. 한 번에 늘어나는 거리의 제곱이 1/2로 줄어 100번 뒤 퍼진 거리는 √50 = 7.07이고, 가운데 칸의 값 0.006367은 가로와 세로 분산이 각각 25인 가우시안의 값 1/(50π) = 0.006366과 맞는다.
정리하면, 이웃끼리 평균을 내는 규칙은 값의 합을 지키면서, 평균 이동이 0인 한 처음 모양과 상관없이 거리의 제곱을 매번 같은 양만큼 늘린다. 그래서 퍼진 거리는 되풀이 횟수의 제곱근을 따르고, 퍼진 모양은 가우시안이 된다.
ML에서: 블러와 GCN의 전파
이 규칙은 여러 곳에 나온다. 이미지에서 픽셀마다 이웃 픽셀의 평균을 내면 블러가 되고, 그래프에서 노드마다 이웃의 특징을 평균 내면 GCN의 전파가 된다. 2차원 격자의 이징 모형에 평균장(mean field: 이웃들이 주는 영향을 그 평균 하나로 바꿔 놓은 것) 근사를 쓰면 스핀마다 평균 방향이 m ← tanh(βJ × 이웃 넷의 m의 합)으로 갱신되는데, kT = 4J에서 m이 0 근처이면 tanh(x) ≈ x이므로 이 갱신도 정확히 이웃 넷의 평균이 된다.
문제 1. 갈톤 보드의 구슬
과학관에서 흔히 보는 갈톤 보드는 핀을 엇갈려 박은 세로 판이다. 맨 위 가운데로 떨어뜨린 구슬은 핀 한 줄을 지날 때마다 핀에 부딪혀 왼쪽이나 오른쪽으로 핀 간격의 절반만큼, 반반의 확률로 비켜 간다. 판 바닥에는 핀 간격만 한 칸들이 늘어서 구슬을 받는다. (가) 핀 16줄을 지난 구슬은 가운데에서 표준편차로 핀 간격 몇 개만큼 퍼지는가? (나) 판을 64줄로 늘리면 퍼진 폭과 바닥 한가운데 칸에 떨어지는 구슬의 몫은 각각 몇 배가 되는가?

이웃 평균 격자에서 퍼진 거리가 √n이었으니까 16줄이면 √16 = 4, 핀 간격 4개만큼 퍼지겠네요.

격자에서는 한 번 갱신할 때 값이 몇 칸씩, 어느 방향으로 옮겨 갔죠? 이 판에서는요?

격자는 위아래 왼쪽 오른쪽으로 한 칸씩이었고… 이 판은 왼쪽이나 오른쪽으로만, 그것도 반 칸씩이네요. 그럼 한 줄마다 늘어나는 거리 제곱은 1이 아니라 (1/2)² = 1/4이고, 16줄이면 분산 4, 표준편차 2예요.

핀 한 줄이 이웃 둘의 평균이네. 바닥 칸 하나에 올 몫은 바로 위 줄에서 그 칸 양옆 자리의 몫을 평균한 거니까.

그럼 줄을 네 배로 늘리면 가운데 칸의 몫은 어떻게 될까요? 서연 학생은 어떻게 짐작해요?

격자에서는 가운데 칸의 값이 1/(πn) 꼴로 되풀이 횟수에 반비례했잖아요. 줄이 네 배면 폭은 √4 = 2배, 가운데 몫은 1/4배요.

세어 볼게. 16줄이면 가운데 칸이 C(16, 8)/2¹⁶ = 0.196, 64줄이면 C(64, 32)/2⁶⁴ = 0.099야. 1/4이 아니라 거의 1/2인데?

격자에서는 값이 몇 방향으로 퍼졌죠?

아, 격자는 가로와 세로 두 방향으로 퍼져서 값이 퍼진 넓이가 폭의 제곱으로 늘었어요. 이 판은 한 줄로만 퍼지니까 가운데 몫이 폭에만 반비례해서, 폭이 2배면 1/2배예요. 1/(πn)은 2차원 격자에서만 맞는 식이었네요.

확률 시간에 본 정규분포랑 같다. 1차원 정규분포의 꼭대기는 표준편차에 반비례하고, 2차원은 표준편차의 제곱에 반비례하잖아.

바닥에 쌓인 구슬이 종 모양인 것도 격자에서 가우시안이 나온 거랑 같은 이유고요. 판 하나로 이 장 첫 절을 다 본 셈이네요.
문제 2. 나눠 주는 몫을 바꾸면
가운데 칸에만 1을 두고, 매번 모든 칸이 동시에 자기 값의 비율 α만큼을 네 등분해 이웃 네 칸에 나눠 주고 나머지 1 − α는 제자리에 남긴다. α = 1이면 이웃 넷의 평균이고 α = 1/2이면 게으른 평균이다. (가) α = 1/4과 3/4에서 100번 뒤 퍼진 거리는? (나) 가운데와 다른 색의 칸에 든 값의 합은 한 번, 두 번, 세 번 뒤 각각 얼마인가? (다) 홀수 번째와 짝수 번째 사이에 값이 출렁이지 않으려면 α가 어느 범위여야 하는가?

한 번에 거리 제곱이 α씩 느니까, α = 1/4이면 100번 뒤 25칸이요.

α = 1, 곧 이웃 넷의 평균이면 100번 뒤 몇 칸이었죠?

10칸이요. 어, 나눠 주는 몫이 4분의 1밖에 안 되는데 더 멀리 갈 리가 없죠. 25는 거리 제곱이고 거리는 5칸이에요. α = 3/4이면 √75 = 8.66칸이고요.

(나)는 자기 몫을 조금이라도 남기면 게으른 평균처럼 출렁임이 없을 것 같은데.

돌려 보면 α = 1/4은 다른 색 칸의 합이 0.25, 0.375, 0.4375이고, α = 3/4은 0.75, 0.375, 0.5625예요.

3/4은 1/2을 넘었다가 모자랐다가 하면서 1/2로 가네. 1/4은 아래에서 차근차근 올라가고. 남기는 몫이 있다고 다 같은 게 아니구나.

가운데와 같은 색 칸의 합을 E, 다른 색 칸의 합을 O라고 해 봐요. 한 번 갱신하면 다른 색으로 건너가는 값은 얼마예요?

칸마다 자기 값의 α가 몽땅 이웃, 곧 다른 색 칸으로 가니까 E는 (1 − α)E + αO, O는 (1 − α)O + αE가 돼요. 빼면 둘의 차이가 한 번에 1 − 2α배예요.

1/4이면 0.5배, 3/4이면 −0.5배, 1이면 −1배네요. 부호가 바뀌는 게 출렁임이고, −1이면 영원히 안 줄어드는 거고요. α = 1/2면 한 번에 0이라 게으른 평균에서 빈칸이 바로 사라진 거였어요.

그래요. 그러니 출렁이지 않을 조건은요?

1 − 2α ≥ 0, 곧 α ≤ 1/2이에요. 많이 나눠 줄수록 빨리 퍼지지만, 반을 넘게 나눠 주면 줄 때마다 지나치게 건너가서 출렁여요.

조별 과제에서 서로 상대 의견을 너무 많이 받아들이면, 다음 회의 때 둘 다 반대편 의견으로 넘어가 있는 거랑 같네요.