17장 — 스핀 글래스와 레플리카 방법

TAP 방정식: 되돌아온 제 영향을 뺀다

레플리카 방법은 결합에 대해 평균한 양을 준다. 그런데 손에 든 것이 합금 시료 하나, 데이터 하나라면 그 계에서 스핀마다의 평균 방향 mᵢ가 궁금하다. 스핀이 수천, 수만 개인 추론 문제에서는 배치를 모두 셀 수 없으니 평균 방향 mᵢ를 어림으로 구해야 한다. 가장 쉬운 어림은 스핀 i가 나머지 스핀들의 평균 방향만 보고 반응한다고 두는 것인데, 결합이 무작위이면 스핀이 많아져도 사라지지 않는 오차가 남는다. 이 오차는 어디서 올까?

역사: 레플리카를 피한 길

셰링턴과 커크패트릭 논문의 심사를 맡았던 사울리스는 그 풀이가 낮은 온도에서 음의 엔트로피를 준다는 것을 일찍 알았다. 그는 복제본의 대칭을 깨는 계산을 직접 파고드는 대신, 레플리카 방법을 아예 피하는 길에 힘을 쏟았다. 1976년 초부터 커크패트릭, 앤더슨, 예전 제자인 파머, 리브와 편지를 주고받았고, 그해 여름 애스펀 학회를 거쳐 사울리스, 앤더슨, 파머 세 사람의 이름으로 논문을 냈다(1977). 제목 「『풀 수 있는 스핀 글래스 모델』의 풀이」는 셰링턴과 커크패트릭의 논문 제목을 받은 것이다. 결합 하나가 주어진 계에서 곧바로 출발하므로, 복제본의 수를 0으로 보내는 극한이 필요 없었다.

데이비드 사울리스(1934–2019). 1995년 워싱턴 대학교에서 메리 레빈 촬영. 출처: Wikimedia Commons, CC BY-SA 4.0 (저작자 Mary Levin/University of Washington)
데이비드 사울리스(1934–2019). 1995년 워싱턴 대학교에서 메리 레빈 촬영. 출처: Wikimedia Commons, CC BY-SA 4.0 (저작자 Mary Levin/University of Washington)

되돌아온 자기 영향

스핀 i가 이웃들의 평균 방향만 보고 반응한다고 두면 mᵢ = tanh(β(bᵢ + Σⱼ Jᵢⱼmⱼ))를 얻는다. 양쪽에 평균 방향이 들어 있어, 아무 값에서 출발해 오른쪽을 계산하고 그 값을 다시 넣기를 양쪽이 같아질 때까지 되풀이해 푸는 식, 곧 자기 일관 방정식이다. 이 순진한 평균장(mean field) 근사는 결합이 모두 같은 부호의 작은 값이면 스핀이 많을수록 정확해진다. 그런데 결합이 무작위이면 결합 하나의 크기가 1/√N이라, 무작위 결합을 준 스핀 16개에서 정확히 센 평균 방향과 비교하면 오차가 생각보다 크다.

오차의 원인은 이렇다. 스핀 i가 평균적으로 +쪽을 향하면 결합 Jᵢⱼ를 통해 이웃 j도 그만큼 +Jᵢⱼ 쪽으로 조금 기운다. 순진한 평균장은 이웃 j의 평균 방향 mⱼ에 이 기울어짐까지 담아 그대로 i에게 돌려보내므로, 스핀 i는 제가 이웃에게 준 영향을 이웃의 독립된 의견으로 착각해 다시 듣게 된다. 이웃 하나가 돌려보내는 자기 영향은 Jᵢⱼ의 제곱에 비례해 작지만 이웃이 N개이므로 모두 더하면 크기가 1쯤 된다. 되돌아온 자기 영향을 빼 준 것이 사울리스, 앤더슨, 파머의 방정식이다.

반작용 항이 생기는 길. 스핀 i가 결합 Jᵢⱼ를 통해 이웃 j를 조금 기울이고(①), 기울어진 이웃의 평균 방향이 같은 결합을 타고 i에게 돌아온다(②). 순진한 평균장은 ②까지 이웃의 의견으로 세고, TAP 방정식은 ②로 돌아온 영향을 뺀다. 이웃 하나가 돌려보내는 영향은 Jᵢⱼ²에 비례해 작지만 이웃이 N개라 모두 더하면 크기가 1쯤 된다.
반작용 항이 생기는 길. 스핀 i가 결합 Jᵢⱼ를 통해 이웃 j를 조금 기울이고(①), 기울어진 이웃의 평균 방향이 같은 결합을 타고 i에게 돌아온다(②). 순진한 평균장은 ②까지 이웃의 의견으로 세고, TAP 방정식은 ②로 돌아온 영향을 뺀다. 이웃 하나가 돌려보내는 영향은 Jᵢⱼ²에 비례해 작지만 이웃이 N개라 모두 더하면 크기가 1쯤 된다.
mi=tanh⁡(β(bi+∑jJijmj−β mi∑jJij2(1−mj2)))\textcolor{#dd6677}{m_i} = \tanh\Big( \textcolor{#8c564b}{\beta} \big( \textcolor{#b8860b}{b_i} + \sum_j \textcolor{#b8860b}{J_{ij}} \textcolor{#dd6677}{m_j} - \textcolor{#8c564b}{\beta}\, \textcolor{#dd6677}{m_i} \sum_j \textcolor{#b8860b}{J_{ij}}^2 (1 - \textcolor{#dd6677}{m_j}^2) \big) \Big)
mi결합이 주어진 계에서 스핀 i 의 평균 방향bi, Jij스핀 i 의 편향, 스핀 i,j 사이의 결합β(1−mj2)스핀 j 가 자기 입력의 변화에 반응하는 정도 (스핀 하나의 응답)β mi∑jJij2(1−mj2)반작용 항: 스핀 i 가 이웃을 움직여 되돌아온 자기 영향\begin{array}{ll} \textcolor{#dd6677}{m_i} & \text{결합이 주어진 계에서 스핀 } i \text{ 의 평균 방향} \\ \textcolor{#b8860b}{b_i},\ \textcolor{#b8860b}{J_{ij}} & \text{스핀 } i \text{ 의 편향, 스핀 } i, j \text{ 사이의 결합} \\ \textcolor{#8c564b}{\beta}(1 - \textcolor{#dd6677}{m_j}^2) & \text{스핀 } j \text{ 가 자기 입력의 변화에 반응하는 정도 (스핀 하나의 응답)} \\ \textcolor{#8c564b}{\beta}\, \textcolor{#dd6677}{m_i} \sum_j \textcolor{#b8860b}{J_{ij}}^2 (1 - \textcolor{#dd6677}{m_j}^2) & \text{반작용 항: 스핀 } i \text{ 가 이웃을 움직여 되돌아온 자기 영향} \end{array}

반작용 항을 뺀 위의 자기 일관 방정식을 TAP 방정식 (평균장에서 되돌아온 자기 영향을 뺀 자기 일관 방정식, Thouless–Anderson–Palmer equation)이라 하고, 빼 준 항 β mᵢ Σⱼ Jᵢⱼ²(1 − mⱼ²)를 흔히 온사거 반작용 항(Onsager reaction term)이라 부른다. 사울리스, 앤더슨, 파머는 1977년 논문에서 이 항을 「스핀 0의 평균 방향에 대한 이웃 j의 응답이며, 스핀 0의 평균 방향을 계산할 때 mⱼ에서 빼야 한다」고 설명했다.

반작용 항은 결과를 크게 바꾼다. 스핀 16개에 무작위 결합과 표준편차 0.5인 무작위 편향을 주고 정확히 센 평균 방향과 비교하면, 오차(제곱평균제곱근)가 β = 0.5에서 순진한 평균장 0.108 대 TAP 0.009, β = 1에서 0.347 대 0.082다. 임계 온도도 달라진다. 편향이 없을 때 순진한 평균장을 m = 0 근처에서 펼치면 m = βJm이 되어, 결합 행렬의 가장 큰 고윳값이 1/β에 닿는 곳에서 m = 0이 불안정해진다. 스핀이 많으면 그 고윳값이 2에 다가가므로 순진한 평균장은 kT = 2에서 상전이가 일어난다고 예측한다. 사울리스, 앤더슨, 파머도 논문에서 순진한 방정식이 「임계 온도 2J를 뜻하게 된다」고 적었다. TAP 방정식을 같은 방법으로 펼치면 Σⱼ Jᵢⱼ²가 1에 가까우므로 (β + 1/β)m = Jm이 되고, β + 1/β는 가장 작은 값이 2라서 불안정은 kT = 1에서 처음 생긴다. 레플리카 방법이 준 임계 온도와 같다.

무작위 결합과 무작위 편향이 주어진 스핀 16개에서 스핀마다의 평균 방향을 정확히 세고, 순진한 평균장과 반작용 항을 뺀 TAP 방정식의 해와 비교한다.

import numpy as np
from scipy.special import logsumexp
rng = np.random.default_rng(0)

N = 16
S = 1.0 - 2 * ((np.arange(2**N)[:, None] >> np.arange(N)) & 1)
def sample_J(N):
    J = np.triu(rng.normal(0, 1 / np.sqrt(N), (N, N)), 1)
    return J + J.T

def exact_m(J, b, beta):                       # 배치 65536개를 모두 더한 정확한 평균 방향
    logp = beta * (0.5 * ((S @ J) * S).sum(1) + S @ b)
    return np.exp(logp - logsumexp(logp)) @ S

def mean_field(J, b, beta, tap, iters=3000):
    m, J2 = np.zeros(len(b)), J**2
    for _ in range(iters):
        h = b + J @ m                          # 순진한 평균장: 이웃의 평균 방향이 보내는 입력
        if tap:
            h -= beta * m * (J2 @ (1 - m**2))  # 반작용 항: 내가 이웃을 움직여 나에게 되돌아온 영향을 뺀다
        m = 0.5 * m + 0.5 * np.tanh(beta * h)
    return m

for beta in (0.5, 0.8, 1.0):
    err = np.zeros(2)
    for _ in range(50):
        J, b = sample_J(N), rng.normal(0, 0.5, N)
        me = exact_m(J, b, beta)
        err += [np.sqrt(np.mean((mean_field(J, b, beta, t) - me)**2)) for t in (False, True)]
    print(f"β = {beta}: 평균 방향 오차(제곱평균제곱근) 순진한 평균장 {err[0] / 50:.3f}, TAP {err[1] / 50:.3f}")

J = sample_J(2000)                             # 스핀이 많으면 결합 행렬의 가장 큰 고윳값이 2에 다가간다
lam = np.linalg.eigvalsh(J)[-1]
print(f"스핀 2000개 결합 행렬의 가장 큰 고윳값 {lam:.3f}: 순진한 평균장은 kT ≈ {lam:.2f}에서 m = 0이 불안정해진다고 예측")
# β = 0.5: 평균 방향 오차(제곱평균제곱근) 순진한 평균장 0.108, TAP 0.009
# β = 0.8: 평균 방향 오차(제곱평균제곱근) 순진한 평균장 0.294, TAP 0.040
# β = 1.0: 평균 방향 오차(제곱평균제곱근) 순진한 평균장 0.347, TAP 0.082
# 스핀 2000개 결합 행렬의 가장 큰 고윳값 1.988: 순진한 평균장은 kT ≈ 1.99에서 m = 0이 불안정해진다고 예측

반작용 항 하나로 오차가 4~12배 줄어든다. 결합 행렬의 가장 큰 고윳값이 2에 가까우므로 순진한 평균장은 kT ≈ 2에서 상전이를 예측하는데, 이것은 실제 임계 온도 1의 두 배다.

직접 움직여 보기순진한 평균장 대 TAP새 창에서 열기 ↗

ML에서: 근사 메시지 전달

도노호, 말레키, 몬타나리(2009)는 압축 센싱(값 대부분이 0인 신호를 신호 길이보다 적은 수의 측정으로 되살리는 문제)을 위해 근사 메시지 전달(approximate message passing, 머리글자를 따 AMP라 쓴다)을 만들었다. AMP는 반복 문턱값 처리(iterative thresholding: 작은 값을 0으로 자르기를 되풀이하는) 알고리즘에 항 하나를 더해 성능을 크게 끌어올렸는데, 논문은 그 항을 두고 「통계물리학자라면 이것을 온사거 반작용 항이라 부를 것」이라 쓰고 TAP 논문을 인용했다. AMP가 더한 그 항은 반복할 때마다 내 추정이 이웃을 거쳐 되돌아온 자기 영향을 빼는 항이다.

문제 10. 단톡방에서 돌아온 내 말

민준이 새 노트북이 좋다고(+1) 학과 단톡방 친구 100명에게 말했다. 친구들은 저마다 자기 생각에 민준의 말을 0.02만큼 섞어 답한다(친구의 답 = 자기 생각 + 0.02 × 민준의 말). 며칠 뒤 민준이 친구 100명의 답을 모두 더해 보니 +3이었다. (가) 민준의 말을 빼면 친구들 자기 생각의 합은 얼마인가? (나) 친구가 1000명이고 저마다 0.002씩만 섞는다면, 민준에게 되돌아온 민준 자신의 말의 합은 얼마인가?

김민준 M11
김민준

친구들 답이 +3이니까 다들 좋다는 거죠. 섞인 제 말 0.02를 빼도 3 − 0.02 = 2.98이에요.

이서연 S01
이서연

0.02는 한 사람이 섞은 양이잖아. 100명이 모두 섞었으니까 100 × 0.02 = 2를 빼야지. 친구들 자기 생각은 합해서 +1뿐이야.

김민준 M05
김민준

제가 들은 +3 가운데 2가 제 목소리였다고요?

선생님 T02
선생님

(나)는요? 한 사람이 섞는 비율이 10배 작아졌어요.

김민준 M09
김민준

1000 × 0.002 = 2. 그대로예요. 한 사람이 섞는 비율이 작아져도 사람이 그만큼 늘면 합은 줄지 않네요.

이서연 S09
이서연

결합 하나가 1/√N이라 이웃 하나가 돌려보내는 자기 영향은 1/N인데, 이웃이 N개라 합이 1쯤 남는 것과 같은 모양이네. 그래서 스핀이 많아져도 반작용 항이 사라지지 않는구나.

문제 11. 제 목소리를 다시 듣는 평균장

(가) 스핀 16개에 무작위 결합과 표준편차 0.5인 무작위 편향을 주고 β = 0.6에서 스핀마다의 평균 방향을 순진한 평균장으로 구하라. 결합과 편향을 50번 뽑아 정확한 값과의 오차를 평균하라(위젯 2의 「문제 11 불러오기」로 확인할 수 있다). (나) 뉴런 5개를 오래 기록했더니 저마다 18%의 시간 동안 발화했고(발화하면 s = +1, 아니면 −1), 어느 두 뉴런이든 ⟨sᵢsⱼ⟩가 0.512였다. 모든 쌍을 같은 결합으로 묶은 볼츠만 머신으로 보고, 공분산 행렬의 역행렬로 결합을 추정하라. 같은 데이터에 최대우도로 맞춘 정확한 값은 0.167이다.

김민준 M04
김민준

mᵢ = tanh(β(bᵢ + Σⱼ Jᵢⱼmⱼ))를 반복해서 결합 50개의 오차를 평균했더니 0.191이에요. 0.2나 틀리면 거의 못 쓰는 거죠.

이서연 S03
이서연

결합이 무작위면 스핀 i가 이웃 j를 Jᵢⱼ만큼 기울이고, 기울어진 mⱼ가 다시 Jᵢⱼ를 타고 i에게 돌아오잖아. 순진한 평균장은 그렇게 자기한테 돌아온 영향까지 이웃이 준 영향으로 세는 거고.

선생님 T12
선생님

자기한테 돌아온 그 영향을 빼려면 어떤 항을 빼야 할까요? TAP 방정식을 떠올려 봐요.

이서연 S07
이서연

반작용 항 β mᵢ Σⱼ Jᵢⱼ²(1 − mⱼ²)요. 이걸 빼면 오차가 0.018이에요.

김민준 M08
김민준

10배 넘게 줄었네요. 문제 10의 단톡방에서 제 말이 돌아온 것처럼, 발표 연습 때 마이크에 대고 말하면 제 목소리가 스피커로 나와 다시 마이크로 들어가서 하울링이 나잖아요. 제 소리를 남의 소리로 착각한 거예요.

선생님 T13
선생님

좋은 비유예요. 위젯 2에서 「문제 11 불러오기」를 눌러 결합 50개의 평균 오차와 맞는지 보세요. (나)는요?

김민준 M03
김민준

공분산 행렬의 역행렬에서 대각 밖 원소에 마이너스를 붙이면 0.210이에요. 정확한 값 0.167보다 꽤 크네요.

이서연 S11
이서연

그건 순진한 평균장의 선형 응답이지. TAP 방정식을 편향으로 미분하면… 역행렬의 대각 밖 원소가 −Jᵢⱼ − 2Jᵢⱼ²mᵢmⱼ가 돼.

선생님 T12
선생님

평균 방향은 데이터에서 얼마죠?

김민준 M01
김민준

18% 발화하니까 m = 2 × 0.18 − 1 = −0.64요.

이서연 S07
이서연

그걸 넣으면 J에 대한 2차 방정식이 되니까… 풀면 0.183이에요.

선생님 T14
선생님

0.210에서 0.183으로, 정확한 0.167에 절반 넘게 다가갔어요. 뉴런이 다섯 개뿐이라 한 차수 보정으로도 다 메우지는 못하지만, 뉴런이 많고 결합 하나하나가 약할수록 이 보정이 정확해져요.