함수 부등식 (Functional Inequalities)

젠센 부등식, 볼록/오목 함수, AM-GM-HM 부등식, 공분산 부등식

함수 부등식은 볼록/오목 함수의 성질을 활용하여 기대값을 바운딩한다. 젠센 부등식은 EM 알고리즘의 ELBO, KL 발산의 비음수성, AM-GM 부등식 등 통계학과 머신러닝의 핵심 결과를 한 줄로 증명하는 도구이다. 이 포스트에서는 젠센 부등식, 공분산 부등식, 그리고 그 응용을 교재 기반으로 심층적으로 다룬다.

Statistics
저자

Kwangmin Kim

공개

2026년 03월 30일

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 볼록 함수와 오목 함수

정의 (Casella & Berger, 2002, Ch.4)

함수 \(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)

정리 4.7.7 (Casella & Berger, 2002, Ch.4)

\(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)

정리 4.7.9 (Casella & Berger, 2002, Ch.4)

\(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 관련 주제

선행 지식

후속 주제

관련 개념

Subscribe

Enjoy this blog? Get notified of new posts by email: