1 개요
수치 부등식이 적률 사이의 크기 관계를 다루었다면, 함수 부등식(Functional Inequalities)은 함수의 볼록성/오목성을 활용하여 기대값을 바운딩한다 (Casella & Berger, 2002, Ch.4 Section 4.7.2).
함수 부등식의 핵심 아이디어: 수치 부등식이 “숫자들의 노름을 비교”한다면, 함수 부등식은 “함수의 곡률을 이용”한다. 볼록 함수는 극단값을 증폭시키므로, 기댓값을 먼저 구한 뒤 함수를 적용한 것보다 함수를 먼저 적용한 뒤 기댓값을 구한 것이 더 크다.
핵심 도구는 젠센 부등식(Jensen’s Inequality)이다. 이 하나의 부등식에서 다음이 모두 따라 나온다:
- 분산의 비음수성: \(\text{Var}(X) \geq 0\)
- KL 발산의 비음수성: \(D_{KL}(p \| q) \geq 0\)
- AM-GM-HM 부등식: \(a_H \leq a_G \leq a_A\)
- EM 알고리즘의 ELBO 하한
젠센 부등식은 통계학과 머신러닝에서 수많은 핵심 결과를 한 줄로 증명하는 “만능 도구”이다.
2 볼록 함수와 오목 함수
함수 \(g(x)\) 가 볼록(convex)이란, 모든 \(x_1, x_2\) 와 \(0 \leq \lambda \leq 1\) 에 대해:
\[ g(\lambda x_1 + (1-\lambda) x_2) \leq \lambda g(x_1) + (1-\lambda) g(x_2) \]
\(g(x)\) 가 오목(concave)이란, 위 부등호가 반전되는 것이다.
일상적 비유: 두 산봉우리 \(x_1\) , \(x_2\) 사이에 밧줄을 팽팽하게 당겨 매단다고 상상하자. - 볼록 함수(그릇 모양): 밧줄이 함수 그래프 위에 놓인다. 그래프가 “아래로 휘어” 두 점을 잇는 직선보다 낮다. - 오목 함수(언덕 모양): 밧줄이 함수 그래프 아래에 놓인다. 그래프가 “위로 볼록” 두 점을 잇는 직선보다 높다.
기하학적 직관: 볼록 함수의 그래프는 임의의 두 점을 잇는 선분 아래에 놓인다. 오목 함수는 선분 위에 놓인다.
두 번 미분 가능한 함수에 대해: \(g''(x) \geq 0\) 이면 볼록 (아래로 오목), \(g''(x) \leq 0\) 이면 오목 (위로 볼록).
2.1 대표적인 볼록/오목 함수
| 함수 | 볼록/오목 | 근거 | 응용 |
|---|---|---|---|
| \(x^2\) | 볼록 | \(g''(x) = 2 > 0\) | 분산의 비음수성 |
| \(|x|\) | 볼록 | – | 절대값의 기대값 바운드 |
| \(e^x\) | 볼록 | \(g''(x) = e^x > 0\) | MGF 바운드 |
| \(-\log x\) (\(x > 0\)) | 볼록 | \(g''(x) = 1/x^2 > 0\) | KL 발산 |
| \(\log x\) (\(x > 0\)) | 오목 | \(g''(x) = -1/x^2 < 0\) | AM-GM 부등식 |
| \(1/x\) (\(x > 0\)) | 볼록 | \(g''(x) = 2/x^3 > 0\) | 조화평균 부등식 |
3 젠센 부등식 (Jensen’s Inequality)
\(g(x)\) 가 볼록 함수이면:
\[ E[g(X)] \geq g(E[X]) \]
\(g(x)\) 가 오목 함수이면 부등호가 반전된다: \(E[g(X)] \leq g(E[X])\)
등호 조건: \(P(g(X) = a + bX) = 1\) , 즉 \(g\) 가 사실상 선형인 경우.
3.1 증명
볼록 함수의 그래프는 모든 접선 위에 놓인다. \(x = E[X]\) 에서의 접선을 \(l(x) = a + bx\) 라 하면:
\[ g(x) \geq l(x) = a + bx \quad \text{모든 } x \]
기대값을 취하면:
\[ E[g(X)] \geq E[a + bX] = a + bE[X] = l(E[X]) = g(E[X]) \]
마지막 등호는 접선이 접점에서 함수값과 같기 때문이다. 증명 끝.
3.2 직관
볼록 함수에 확률변수를 넣으면, “기대값의 함수값”보다 “함수값의 기대값”이 더 크다.
왜 이런 일이 생기는가? 볼록 함수는 극단값을 “증폭”시킨다. \(X\) 가 평균 근처에 모여 있지 않고 양쪽으로 퍼져 있으면, 볼록 함수는 이 퍼짐을 양의 방향으로 더 크게 키운다.
구체적 예시: \(g(x) = x^2\) (볼록), \(X\) 가 -1과 1을 각각 확률 0.5로 취한다고 하자. - \(E[X] = 0.5 \cdot (-1) + 0.5 \cdot 1 = 0\) - \(g(E[X]) = 0^2 = 0\) - \(E[g(X)] = 0.5 \cdot 1 + 0.5 \cdot 1 = 1\)
\(E[g(X)] = 1 \geq 0 = g(E[X])\) 가 성립한다. \(X\) 가 평균 0 근처에 모여 있는 것이 아니라 -1과 1로 퍼져 있고, 제곱 함수가 이 퍼짐을 양의 방향으로 키웠기 때문이다. 만약 \(X\) 가 항상 0이라면 (퍼짐 없음) 등호가 성립한다.
4 젠센 부등식의 핵심 응용
4.1 분산의 비음수성
\(g(x) = x^2\) 는 볼록이므로:
\[ E[X^2] \geq (E[X])^2 \implies \text{Var}(X) = E[X^2] - (E[X])^2 \geq 0 \]
분산이 항상 비음수라는 자명해 보이는 사실이 젠센 부등식의 직접적 결과이다.
4.2 KL 발산의 비음수성
\(-\log x\) 가 볼록이므로, \(X = q(x)/p(x)\) 로 놓으면:
\[ E_p\!\left[-\log \frac{q(X)}{p(X)}\right] \geq -\log E_p\!\left[\frac{q(X)}{p(X)}\right] = -\log 1 = 0 \]
따라서 \(D_{KL}(p \| q) = E_p[\log(p/q)] \geq 0\) 이다. 두 분포가 같을 때만 등호가 성립한다.
4.3 AM-GM-HM 부등식
양수 \(a_1, \ldots, a_n\) 에 대해 (Casella & Berger, 2002, Example 4.7.8):
\[ a_H \leq a_G \leq a_A \]
- \(a_A = \frac{1}{n}\sum a_i\) (산술평균)
- \(a_G = (\prod a_i)^{1/n}\) (기하평균)
- \(a_H = n / \sum(1/a_i)\) (조화평균)
증명: \(X\) 가 \(a_1, \ldots, a_n\) 을 동일 확률로 취하는 확률변수이면:
- \(\log x\) 가 오목이므로 \(E[\log X] \leq \log E[X]\) , 즉 \(\log a_G \leq \log a_A\)
- \(1/x\) 가 볼록이므로 \(E[1/X] \geq 1/E[X]\) , 즉 \(1/a_H \geq 1/a_A\) 를 결합하면 \(a_H \leq a_G\) 도 따라 나온다
4.4 EM 알고리즘의 ELBO
\(\log x\) 가 오목이므로:
\[ \log E[f(X)] \geq E[\log f(X)] \]
이것이 Evidence Lower Bound (ELBO)의 핵심이다. \(\log p(\mathbf{x}) \geq \text{ELBO}\) 이고, E-step에서 하한을 계산하고 M-step에서 최대화한다.
5 공분산 부등식 (Covariance Inequality)
\(X\) 가 확률변수이고 \(g(x)\) 가 단조증가, \(h(x)\) 가 단조감소이면:
\[ E[g(X)h(X)] \leq E[g(X)] \cdot E[h(X)] \]
\(g\) 와 \(h\) 가 같은 방향(둘 다 증가 또는 둘 다 감소)이면 부등호가 반전된다.
직관: 같은 방향으로 변하는 두 함수의 곱의 기대값은 각 기대값의 곱보다 크다(양의 상관). 반대 방향이면 작다(음의 상관).
이 부등식의 장점: 고차 적률 없이 기대값의 곱을 바운딩할 수 있다. 코시-슈바르츠는 2차 적률을 필요로 하지만, 공분산 부등식은 단조성만 요구한다.
6 응용 분야
| 분야 | 부등식 | 활용 |
|---|---|---|
| EM 알고리즘 | 젠센 (오목) | ELBO 구성, E-step/M-step 분리 |
| 변분 추론 | 젠센 | \(\text{ELBO} \leq \log p(\mathbf{x})\) |
| 정보이론 | 젠센 | \(D_{KL} \geq 0\) , 상호정보량의 비음수성 |
| 경제학 | 젠센 | 위험회피와 볼록 효용함수 |
| 부등식 이론 | 젠센 | AM-GM-HM 증명 |
| 추정 이론 | 공분산 부등식 | 단조 추정량의 바이어스 방향 |
7 코드 예시
7.1 Step 1: 순수 Python 구현 (원리 이해)
젠센 부등식을 다양한 볼록/오목 함수에서 수치적으로 검증한다.
import math
import random
random.seed(42)
n = 100000
# X ~ Exponential(1)
X = [random.expovariate(1) for _ in range(n)]
ex = sum(X) / n
print("=== 젠센 부등식 검증: X ~ Exp(1), E[X] = 1 ===\n")
# g(x) = x^2 (볼록): E[X^2] >= (E[X])^2
eg_x2 = sum(x**2 for x in X) / n
print(f"g(x) = x^2 (볼록):")
print(f" E[g(X)] = {eg_x2:.4f} >= g(E[X]) = {ex**2:.4f} (gap = {eg_x2 - ex**2:.4f})")
# g(x) = log(x) (오목): E[log(X)] <= log(E[X])
eg_log = sum(math.log(x) for x in X) / n
print(f"\ng(x) = log(x) (오목):")
print(f" E[g(X)] = {eg_log:.4f} <= g(E[X]) = {math.log(ex):.4f} (gap = {math.log(ex) - eg_log:.4f})")
# g(x) = e^x (볼록): E[e^X] >= e^{E[X]}
eg_exp = sum(math.exp(x) for x in X if x < 20) / n # overflow 방지
print(f"\ng(x) = e^x (볼록):")
print(f" E[g(X)] = {eg_exp:.4f} >= g(E[X]) = {math.exp(ex):.4f} (gap = {eg_exp - math.exp(ex):.4f})")
# g(x) = 1/x (볼록, x > 0): E[1/X] >= 1/E[X]
eg_inv = sum(1/x for x in X) / n
print(f"\ng(x) = 1/x (볼록):")
print(f" E[1/X] = {eg_inv:.4f} >= 1/E[X] = {1/ex:.4f} (gap = {eg_inv - 1/ex:.4f})")7.2 AM-GM-HM 부등식 검증
import math
# 양수 수열에 대한 AM-GM-HM
data = [2, 3, 5, 7, 11, 13]
n = len(data)
a_A = sum(data) / n
a_G = math.exp(sum(math.log(x) for x in data) / n)
a_H = n / sum(1/x for x in data)
print(f"데이터: {data}")
print(f" 조화평균 (H) = {a_H:.4f}")
print(f" 기하평균 (G) = {a_G:.4f}")
print(f" 산술평균 (A) = {a_A:.4f}")
print(f" H <= G <= A: {a_H:.4f} <= {a_G:.4f} <= {a_A:.4f}")
print(f" 부등식 성립: {a_H <= a_G <= a_A}")7.3 Step 2: scipy/numpy 구현 (실무 활용)
젠센 부등식의 gap이 분포의 분산에 따라 어떻게 변하는지 시각화한다.
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# 1) 젠센 gap vs 분산: g(x) = x^2
sigmas = np.linspace(0.1, 5, 50)
gaps = []
for sigma in sigmas:
X = np.random.normal(1, sigma, 50000)
eg = np.mean(X**2)
ge = np.mean(X)**2
gaps.append(eg - ge)
ax = axes[0]
ax.plot(sigmas, gaps, 'b-', linewidth=2, label='E[X^2] - (E[X])^2')
ax.plot(sigmas, sigmas**2, 'r--', linewidth=2, label=r'Theory: $\sigma^2$')
ax.set_xlabel(r'$\sigma$ (standard deviation)')
ax.set_ylabel('Jensen gap')
ax.set_title(r'Jensen Gap = Var(X) for $g(x) = x^2$')
ax.legend()
# 2) 볼록 함수에서의 젠센: 시각적 설명
x_range = np.linspace(0.1, 4, 200)
g = x_range**2 # 볼록 함수
# X ~ 이산 분포: P(X=1) = P(X=3) = 0.5
x1, x2 = 1.0, 3.0
ex_val = (x1 + x2) / 2 # E[X] = 2
ax = axes[1]
ax.plot(x_range, g, 'b-', linewidth=2, label=r'$g(x) = x^2$')
# 접선 (E[X] = 2에서)
tangent_slope = 2 * ex_val
tangent = tangent_slope * (x_range - ex_val) + ex_val**2
ax.plot(x_range, tangent, 'gray', linestyle='--', alpha=0.5)
# E[g(X)] = (1 + 9) / 2 = 5
eg_val = (x1**2 + x2**2) / 2
# g(E[X]) = 4
ge_val = ex_val**2
ax.plot([x1, x2], [x1**2, x2**2], 'ro', markersize=8)
ax.plot([ex_val], [ge_val], 'g^', markersize=12, label=f'g(E[X]) = {ge_val}')
ax.plot([ex_val], [eg_val], 'rv', markersize=12, label=f'E[g(X)] = {eg_val}')
# 연결선
ax.plot([x1, x2], [x1**2, x2**2], 'r--', alpha=0.5)
ax.annotate('', xy=(ex_val, eg_val), xytext=(ex_val, ge_val),
arrowprops=dict(arrowstyle='<->', color='black'))
ax.text(ex_val + 0.1, (eg_val + ge_val) / 2, 'Jensen\ngap', fontsize=9)
ax.set_xlabel('x')
ax.set_ylabel('g(x)')
ax.set_title("Jensen's Inequality: E[g(X)] >= g(E[X])")
ax.legend(fontsize=8)
ax.set_xlim(0, 4)
ax.set_ylim(0, 12)
plt.tight_layout()
plt.show()8 관련 주제
선행 지식
- 확률 부등식과 항등식 – 전체 부등식 조감
- 수치 부등식 – 횔더, 코시-슈바르츠
후속 주제
관련 개념