쌍대 퍼텐셜 F*: θ와 η를 잇는 르장드르 짝
θ에서 η로 가는 길은 기울기 하나, η = ∇F(θ) 였다. 그렇다면 η에서 θ로 돌아오는 길도 어떤 함수의 기울기일까? 그리고 그 함수는 분포에 대해 무엇을 말해 줄까?
르장드르 변환 — 기울기를 새 좌표로
볼록함수 F가 있으면 기울기 η = ∇F(θ) 를 새 좌표로 삼고, 새 함수 F*(η) = θ·η − F(θ) 를 만들 수 있다. 이것을 르장드르 변환이라 부르고, F*를 F의 쌍대, 또는 쌍대 퍼텐셜이라고 한다. 퍼텐셜은 F처럼 기울기를 내놓는 바탕 함수를 부르는 말이다. 역학에서 속도 v에서 운동량 p = ∂L/∂v (여기서 p는 확률이 아니라 운동량이고, L은 운동 에너지에서 위치 에너지를 뺀 라그랑지안이다) 로 넘어갈 때 쓰는 것도 같은 변환이다. 기울기가 새 좌표가 된다. F가 볼록이라는 것은 앞 절에서 보았으니, 이 변환을 지수족에 그대로 쓸 수 있다.
F*는 음의 엔트로피다
η = ∇F(θ) 인 맞물린 짝에서 F*(η) = θ·η − F(θ) 이다. 이 값에 이름이 있다. θ·η = E[θ·t(x)] 이므로, 기댓값 안에 골격을 다시 모으면 이렇다.
캐리어가 0인 가족(베르누이, 가우시안)에서는 F*가 정확히 음의 엔트로피다. 베르누이: F*(η) = η log η + (1−η) log(1−η). 가우시안: F*(η) = −½ log(2πe(η₂ − η₁²)), 곧 −½ log(2πeσ²). 푸아송은 캐리어 −log x! 때문에 E[log x!] 만큼 다르다. F*(η) = η log η − η 이다. F(θ) = eᶿ 를 손으로 르장드르 변환해도 같은 함수가 나온다.
르장드르 짝에는 펜셸–영 부등식 F(θ) + F*(η) ≥ θ·η 가 따라온다. 여기서는 그것이 등호로 쓰인다. θ와 η가 같은 분포의 두 주소이면 언제나 η = ∇F(θ) 이므로, F(θ) + F*(η) = θ·η. θ와 η를 서로 다른 분포에서 가져오면 부등식이 되고, 그 틈이 다음 절의 주인공이다. 그리고 르장드르 짝에서는 기울기의 역함수가 쌍대의 기울기다, (F′)⁻¹ = (F*)′. 여기서는 그것이 θ = ∇F*(η) 가 된다. η에서 θ로 돌아가는 길도 기울기 하나다.
그림은 앞면 확률 0.731인 동전 하나를 두 함수 위에 찍은 것이다. 위 곡선에서 θ = 1 의 기울기를 읽으면 η = 0.731 이 나오고, 아래 곡선에서 η = 0.731 의 기울기를 읽으면 θ = 1 로 돌아온다. 두 높이를 더하면 F(1) + F*(0.731) = 1.313 − 0.582 = 0.731 = θ·η 다.
파이썬
import numpy as np
from math import lgamma
# 가우시안 μ=1, σ=2
mu, s = 1.0, 2.0
th = np.array([mu / s**2, -1 / (2 * s**2)])
eta = np.array([mu, mu**2 + s**2])
F = -th[0]**2 / (4 * th[1]) + 0.5 * np.log(-np.pi / th[1])
Fs = -0.5 * np.log(2 * np.pi * np.e * (eta[1] - eta[0]**2))
print(f"가우시안 F = {F:.4f} F* = {Fs:.4f} F+F* = {F + Fs:.4f} θ·η = {th @ eta:.4f}")
# 푸아송 λ=3: F*(η) = η log η − η vs −H − E[k]
lam = 3.0
xs = np.arange(0, 80)
k = -np.array([lgamma(x + 1) for x in xs])
logp = xs * np.log(lam) - lam + k
p = np.exp(logp)
H = -(p * logp).sum()
print(f"푸아송 η log η − η = {lam * np.log(lam) - lam:.4f} −H − E[k] = {-H - (p * k).sum():.4f} −H 만 = {-H:.4f}")
# 가우시안 F = 1.7371 F* = -2.1121 F+F* = -0.3750 θ·η = -0.3750
# 푸아송 η log η − η = 0.2958 −H − E[k] = 0.2958 −H 만 = -1.9315
수확
“추상적 볼록함수가 지수족에서 구체적 의미를 얻었다. F는 로그정규화자, 그 기울기는 기대모수, 그 쌍대는 음의 엔트로피(캐리어가 없을 때). 역학에서 속도와 운동량을 잇던 르장드르 변환이 여기서는 분포의 두 주소를 잇는다.”
문제 12. 기대모수에서 출발한 가우시안의 네 좌표
기대모수가 η = (2, 5)인 가우시안이 있다. (가) (μ, σ)를 거치지 말고 F*(η) = −½ log(2πe(η₂ − η₁²))의 기울기로 θ를 구하라. (나) F(θ)와 F*(η)를 구해 F(θ) + F*(η) = θ·η 를 검산하라. 자연모수 공간은 어디인가?
함께 풀기

F*를 η₁로 미분하면 η₁/(η₂ − η₁²) = 2, η₂로 미분하면 −½/(η₂ − η₁²) = −0.5. θ = (2, −0.5) 요. θ·η = 4 − 2.5 = 1.5. F = −θ₁²/(4θ₂) + ½ log(−1/θ₂) = 2 + 0.3466 = 2.3466. F* = −½ log(2πe · 1) = −1.4189. 더하면 0.928 이에요. 1.5 랑 안 맞아요.

F를 어디서 가져왔어요?

정규화 상수 1/√(2πσ²) 에서 로그를 씌웠는데… ½ log(2πσ²) = ½ log(−π/θ₂) 예요. 2σ² = −1/θ₂ 라서 π가 남아요. 제가 ½ log π = 0.572 를 빼먹었어요. 넣으면 F = 2.9189, F + F* = 1.5. 맞아요.

대칭성도 보려고 θ = (2, +0.5) 로도 해 봤는데 log(−π/θ₂) 가 정의가 안 돼.

θ₂ > 0 이면 분포가 어떻게 생겼어요?

exp(2x + 0.5x²) 요. x가 커지면 한없이 커져서 적분이 무한대예요. 정규화가 안 되니까 분포가 아니에요. 자연모수 공간은 θ₁ 은 아무 실수, θ₂ < 0 인 반평면이에요. θ₂ 가 −1/(2σ²) 에서 왔으니 당연했는데, 기호만 보고 아무 실수나 되는 줄 알았어요.

좌표가 어디까지 살아 있는지부터 적어 두는 습관이 좋아요. 로그정규화자가 유한한 곳이 곧 그 좌표의 땅이에요.

함수를 정의할 때 정의역을 먼저 쓰라는 게 이래서였어요.
문제 13. 확률만 알려 주는 모델의 온도 바꾸기
어떤 서비스가 다음 단어 후보 셋의 확률 p = (0.7, 0.2, 0.1)만 알려 주고 로짓은 알려 주지 않는다. 온도를 바꿔 뽑는다는 것은 로짓을 온도로 나눈 뒤 소프트맥스를 씌우는 것이다. (가) 이 확률을 내놓은 로짓을 되살려라. 하나로 정해지는가? (나) 온도 2로 뽑을 때의 확률을 구하라.
함께 풀기

로짓을 모르니까 확률을 2로 나눠 쓰면… (0.35, 0.1, 0.05), 합이 1이 되게 다시 나누면 (0.7, 0.2, 0.1). 그대로예요. 온도를 바꿨는데 아무 일도 안 일어났어요.

온도로 나누는 건 무엇이었죠?

로짓이요. 확률을 나누면 다시 나눌 때 약분돼서 없어져요. 로짓부터 알아야 하네요.

로짓이 이 가족의 θ이고 확률이 η니까, η에서 θ로 가는 길은 F*의 기울기야. 이 가족은 캐리어가 0이라 F*(η) = Σ ηᵢ log ηᵢ, 미분하면 log ηᵢ + 1. 그러니 로짓은 log p = (−0.357, −1.609, −2.303)에 어떤 수를 세 칸에 똑같이 더한 것이야.

그 더한 수는 모르는 채로 남는데, 괜찮아요?

괜찮아요. 로짓 셋에 같은 수를 더해도 분포가 그대로였으니까, 그 수는 처음부터 정해질 수가 없어요. 온도로 나누면 그 수도 함께 나뉘지만 여전히 세 칸에 똑같이 붙은 수라서 소프트맥스에서 지워져요.

그럼 (나)는 log p 를 2로 나눠 소프트맥스를 씌우면 (0.523, 0.279, 0.198). 확률에 제곱근을 씌워 다시 나눈 것과 같네요. 확률로 곧장 하려면 나누기가 아니라 ½제곱이었어요.

그래요. 확률에서 로짓으로 돌아가는 길이 log, 곧 쌍대 퍼텐셜의 기울기예요. 온도는 그 돌아간 좌표에서 하는 일이고요.