θ에서 η로 가는 변환은 그래디언트 하나, η = ∇F(θ) 였는데, 그렇다면 η에서 θ로 돌아오는 변환도 어떤 함수의 그래디언트일까? 그리고 그 함수는 분포에 대해 무엇을 말해 줄까?
르장드르 변환: 그래디언트를 새 좌표로
볼록함수 F가 있으면 그래디언트 η = ∇F(θ) 를 새 좌표로 삼고, 새 함수 F*(η) = θ·η − F(θ) 를 만들 수 있다. 이 변환을 르장드르 변환이라 부르고, F*를 F의 쌍대, 또는 쌍대 퍼텐셜이라고 한다. 퍼텐셜은 F처럼 그래디언트를 내놓는 바탕 함수를 부르는 말이다. 역학에서 속도 v에서 운동량 p = ∂L/∂v (여기서 p는 확률이 아니라 운동량이고, L은 운동 에너지에서 위치 에너지를 뺀 라그랑지안이다) 로 넘어갈 때 쓰는 것도 같은 변환으로, 거기서도 그래디언트가 새 좌표가 된다. F가 볼록이라는 것은 앞 절에서 보았으니, 이 변환을 지수족에 그대로 쓸 수 있다.
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′)⁻¹ = (F*)′. 여기서는 그 관계가 θ = ∇F*(η) 가 되어, η에서 θ로 돌아가는 변환도 그래디언트 하나다.
베르누이의 두 볼록함수. 위: F(θ) = log(1 + eᶿ), 점 θ = 1 에서 접선의 기울기가 η = 0.731. 아래: F*(η) = η log η + (1 − η) log(1 − η), 점 η = 0.731 에서 접선의 기울기가 θ = 1. 같은 분포의 두 주소가 서로의 접선 기울기로 맞물린다
그림은 앞면 확률 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*(η) = θ·η 를 검산하라. 자연 파라미터 공간은 어디인가?
기댓값 파라미터 η = (E[x], E[x²])의 평면. 분산 η₂ − η₁² 가 양수인 곳(색칠한 곳)에만 정규분포가 있고, 주어진 점 η = (2, 5)(sources/07-지수족/problems_figs.py)
θ₁ 은 아무 실수, θ₂ < 0 인 반평면이요. θ₂ 가 −1/(2σ²) 에서 왔으니 당연했는데, 기호만 보고 아무 실수나 되는 줄 알았어요.
선생님
좌표가 어디까지 살아 있는지부터 적어 두는 습관이 좋아요. 로그정규화자가 유한한 곳이 곧 그 좌표가 쓰이는 범위예요.
이서연
함수를 정의할 때 정의역을 먼저 쓰라는 게 이래서였어요.
문제 13. 확률만 알려 주는 모델의 온도 바꾸기
어떤 서비스가 다음 단어 후보 셋의 확률 p = (0.7, 0.2, 0.1)만 알려 주고 로짓은 알려 주지 않는데, 온도를 바꿔 뽑는다는 것은 로짓을 온도로 나눈 뒤 소프트맥스를 씌우는 것이다. (가) 이 확률을 내놓은 로짓을 되살려라. 하나로 정해지는가? (나) 온도 2로 뽑을 때의 확률을 구하라.
서비스가 알려 주는 확률 (0.7, 0.2, 0.1)과 알려 주지 않는 로짓(sources/07-지수족/problems_figs.py)
함께 풀기
김민준
로짓을 모르니까 확률을 2로 나눠 쓰면… (0.35, 0.1, 0.05), 합이 1이 되게 다시 나누면 (0.7, 0.2, 0.1). 그대로예요. 온도를 바꿨는데 아무 일도 안 일어났어요.
선생님
온도로 나누는 건 무엇이었죠?
김민준
로짓이요. 확률을 나누면 다시 나눌 때 약분돼서 없어져요. 로짓부터 알아야 하네요.
이서연
로짓이 이 가족의 θ이고 확률이 η니까, η에서 θ로 가는 변환은 F*의 그래디언트야.
김민준
여기서 F*는 뭔데?
이서연
이 가족은 캐리어가 0이라 F*(η) = Σ ηᵢ log ηᵢ, 미분하면 log ηᵢ + 1. 그러니 로짓은 log p = (−0.357, −1.609, −2.303)에 어떤 수를 세 칸에 똑같이 더한 것이야.
선생님
그 더한 수는 모르는 채로 남는데, 괜찮아요?
이서연
괜찮아요. 로짓 셋에 같은 수를 더해도 분포가 그대로였으니까, 세 칸에 똑같이 더한 수는 처음부터 정해질 수가 없어요. 온도로 나누면 더한 수도 함께 나뉘지만 여전히 세 칸에 똑같이 붙은 수라서 소프트맥스에서 지워져요.
김민준
그럼 (나)는 log p 를 2로 나눠 소프트맥스를 씌우면 (0.523, 0.279, 0.198). 확률에 제곱근을 씌워 다시 나눈 것과 같네요. 확률로 곧장 하려면 나누기가 아니라 ½제곱이었어요.
선생님
그래요. 확률에서 로짓으로 돌아가는 변환이 log 이고, log 는 쌍대 퍼텐셜의 그래디언트예요. 온도는 그 돌아간 좌표에서 하는 일이고요.