Skip to content

5 · 커널 방법론

지금까지 다룬 선형 매개변수 모델은 입력에서 출력까지의 사상이 매개변수에 종속적이었고, 훈련 데이터는 매개변수의 점 추정치나 사후 분포를 구한 뒤 버려졌다. 이와 달리 훈련 데이터의 전부 혹은 일부를 예측 단계에서도 사용하는 패턴 인식 방법론이 있다.

5.1 듀얼 표현

  • 많은 선형 매개변수 모델은 듀얼 표현dual representation으로 재구성할 수 있으며, 이 형태에서는 훈련 데이터에서 계산한 커널 함수kernel function들의 선형 결합으로 표적값을 예측한다. 고정된 비선형 특징 공간feature space 사상 ϕ(x)에 대해 커널은
k(x,x)=ϕ(x)ϕ(x)

로 정의되며, 인자에 대해 대칭이다(k(x,x)=k(x,x)). 커널을 특징 공간의 내적으로 정의할 수 있다는 점을 이용해 알고리즘을 확장하는 기법을 커널 트릭kernel trick이라 한다.

  • 정규화된 제곱합 오류 J(w)=12n{wϕ(xn)tn}2+λ2www에 대해 풀면, 해가 ϕ(xn)들의 선형 결합임을 알 수 있다.
w=n=1Nanϕ(xn)=Φa,an=1λ{wϕ(xn)tn}
  • w=Φa를 대입하면 오류 함수는 그램 행렬Gram matrix K=ΦΦ(Knm=k(xn,xm))만으로 표현된다.
J(a)=12aKKaaKt+12tt+λ2aKa
  • a에 대해 풀면 a=(K+λIN)1t이고, 새 입력에 대한 예측은 커널만으로 표현된다.
y(x)=k(x)(K+λIN)1t,kn(x)=k(xn,x)

이렇게 해를 커널만으로 표현하는 것을 듀얼 공식화dual formulation라 한다. 특징 벡터 ϕ(x)를 명시적으로 다루지 않고 커널 값만 계산하면 되는 것이 핵심이다.

그림 5.1 · 기저 함수 집합으로부터 커널을 구성하는 도식. 각 열의 위쪽은 기저 함수, 아래쪽은 커널 k(x,x). 다항식(왼쪽)·가우시안(가운데)·시그모이드(오른쪽) 기저 함수.

실습 · 커널 릿지 회귀 (듀얼 표현)

가우시안 커널의 그램 행렬 Ka=(K+λI)1t를 풀고, 새 입력을 y(x)=k(x)a로 예측해 sin(2πx)를 근사합니다. 특징 벡터를 전혀 명시하지 않고 커널만으로 회귀가 이루어집니다.

python
import numpy as np
rng = np.random.default_rng(0)
N = 20; x = np.linspace(0, 1, N); t = np.sin(2*np.pi*x) + 0.1*rng.standard_normal(N)
def gk(a, b, s=0.1):                                    # 가우시안 커널
    return np.exp(-(a[:,None]-b[None,:])**2/(2*s**2))
lam = 1e-2
K = gk(x, x)
a = np.linalg.solve(K + lam*np.eye(N), t)              # a = (K+λI)⁻¹ t
xt = np.linspace(0, 1, 6); yp = gk(xt, x) @ a          # y(x) = k(x)ᵀ a
for xi, yi in zip(xt, yp):
    print(f"x={xi:.2f}: y_pred={yi:+.3f}   sin(2πx)={np.sin(2*np.pi*xi):+.3f}")

5.2 커널의 구성

  • 유효한 커널을 만드는 한 방법은 특징 사상 ϕ()을 정하고 대응하는 커널 k(x,x)=iϕi(x)ϕi(x)을 찾는 것이다. 다른 방법은 커널을 직접 정의하되, 특징 공간의 내적으로 표현될 수 있음을 보장하는 규칙을 따르는 것이다.

커널 규칙

유효한 커널 k1, k2가 주어졌을 때 아래 방식으로 만든 커널 역시 유효하다.

k(x,x)=ck1(x,x)k(x,x)=f(x)k1(x,x)f(x)k(x,x)=q(k1(x,x))k(x,x)=exp(k1(x,x))k(x,x)=k1(x,x)+k2(x,x)k(x,x)=k1(x,x)k2(x,x)k(x,x)=k3(ϕ(x),ϕ(x))k(x,x)=xAx

c>0은 상수, f()은 임의의 함수, q()은 음이 아닌 계수의 다항식, A는 대칭 양의 준정부호 행렬이다.

  • 널리 쓰이는 가우시안 커널 k(x,x)=exp(xx2/2σ2)은 위 규칙으로 유효성을 확인할 수 있다. 생성 모델로 정의하는 피셔 커널Fisher kernel피셔 점수 g(θ,x)=θlnp(xθ)피셔 정보 행렬 F=Ex[gg]k(x,x)=g(θ,x)F1g(θ,x)이다.

5.3 가우시안 과정

5.3.1 선형 회귀 재검토

  • M개의 기저 함수 선형 결합 y(x)=wϕ(x)에 가우시안 사전 분포 p(w)=N(w0,α1I)를 두자. 훈련 포인트에서의 함숫값 벡터 y=Φw는 가우시안의 선형 결합이므로 가우시안이며, 평균과 공분산은
E[y]=0,cov[y]=1αΦΦ=K,Knm=1αϕ(xn)ϕ(xm)
  • 이 모델이 가우시안 과정Gaussian process의 한 예다. 가우시안 과정은 임의의 유한 포인트 집합에서 함숫값들이 결합 가우시안이 되도록 하는 y(x)에 대한 분포이며, 평균과 공분산(커널)만으로 완전히 정의된다. 보통 평균은 0으로 두고 커널로 공분산을 정한다.

5.3.2 가우시안 과정을 통한 회귀

  • 표적값에 노이즈 tn=yn+ϵn, p(tnyn)=N(tnyn,β1)을 두면, 주변 분포 p(y)=N(y0,K)와 결합해
p(t)=N(t0,C),C(xn,xm)=k(xn,xm)+β1δnm

를 얻는다. 널리 쓰이는 공분산 함수는 지수 이차항에 상수·선형항을 더한 k(xn,xm)=θ0exp{θ12xnxm2}+θ2+θ3xnxm이다.

그림 5.2 · 가우시안 과정에서 추출한 표본. 청색은 함수에 대한 사전 분포, 적색 원은 yn, 녹색 원은 노이즈를 더한 tn.

  • 새 입력 xN+1에 대한 예측은 결합 분포 p(tN+1)=N(tN+10,CN+1)의 공분산을 분할해 얻는 조건부 가우시안이다.
(6.66)CN+1=(CNkkc),m(xN+1)=kCN1t(6.67)σ2(xN+1)=ckCN1k

예측 분포의 평균과 분산 모두 시험 입력 xN+1에 종속한다.

그림 5.3 · (왼쪽) 훈련·시험 포인트 하나씩에 대한 결합 분포 p(t1,t2)와 조건부 p(t2t1). (오른쪽) 사인 곡선 데이터에 대한 가우시안 과정 회귀. 적색 선은 예측 평균, 음영은 ±2σ 구간이며 데이터가 없는 오른쪽에서 불확실성이 커진다.

실습 · 가우시안 과정 회귀 (예측 평균·분산)

공분산 CN=K+β1I를 만들고, 시험 입력마다 (6.66)의 평균 kCN1t와 (6.67)의 분산 ckCN1k를 계산합니다. 데이터 범위 [1,1] 밖에서 불확실성이 급증하는 것을 확인합니다.

python
import numpy as np
rng = np.random.default_rng(1)
Xtr = np.sort(rng.uniform(-1, 1, 8)); ttr = np.sin(3*Xtr) + 0.05*rng.standard_normal(8)
th = (1.0, 10.0, 0.0, 0.0)                              # θ0 exp(-θ1/2‖·‖²)+θ2+θ3 x x'
def kern(A, B):
    d = (A[:,None]-B[None,:])**2
    return th[0]*np.exp(-th[1]/2*d) + th[2] + th[3]*(A[:,None]*B[None,:])
beta = 100.0
C = kern(Xtr, Xtr) + np.eye(len(Xtr))/beta             # C = K + β⁻¹ I
Cinv = np.linalg.inv(C)
for xs in [-0.5, 0.0, 0.9, 1.8]:
    xs = np.array([xs]); k = kern(xs, Xtr)[0]; c = kern(xs, xs)[0,0] + 1/beta
    m = k @ Cinv @ ttr                                  # (6.66) 평균
    v = c - k @ Cinv @ k                                # (6.67) 분산
    print(f"x*={xs[0]:+.2f}: 평균={m:+.3f}  표준편차={np.sqrt(max(v,0)):.3f}")

5.3.3 초매개변수 학습

  • 공분산 함수의 매개변수 θ(상관 길이 척도, 노이즈 정밀도 등)는 로그 가능도를 최대화해 추정한다.
lnp(tθ)=12ln|CN|12tCN1tN2ln(2π)

기울기는 θilnp=12Tr(CN1CNθi)+12tCN1CNθiCN1t이다. lnp(tθ)는 일반적으로 비볼록이라 여러 극댓값을 가질 수 있다.

5.3.4 가우시안 과정을 통한 분류

  • 가우시안 과정은 실수축 전체의 값을 내므로, 출력에 로지스틱 시그모이드를 씌워 (0,1) 확률로 만든다. 2클래스 문제에서 함수 a(x)에 가우시안 과정을 두고 y=σ(a)로 변환하면, 표적값 분포는 베르누이 p(ta)=σ(a)t(1σ(a))1t이다.

그림 5.4 · (왼쪽) a(x)에 대한 가우시안 과정 표본. (오른쪽) 로지스틱 시그모이드로 변환한 결과.

  • 예측 분포 p(tN+1=1tN)=σ(aN+1)p(aN+1tN)daN+1은 해석적으로 풀 수 없어, 변분 추론·기대 전파·라플라스 근사 중 하나로 근사한다. 분류에서는 모든 훈련값이 정확하다고 보므로 노이즈항 대신 수치 안정용 νδnm을 더한 C(xn,xm)=k(xn,xm)+νδnm을 쓴다.

5.3.5 라플라스 근사법

  • 사후 분포 p(aNtN)의 로그 Ψ(aN)=lnp(aN)+lnp(tNaN)의 기울기와 헤시안은
Ψ=tNσNCN1aN,Ψ=WNCN1

σNσ(an)을, WNσ(an)(1σ(an))을 대각 원소로 갖는다. σNaN에 비선형 종속이라 기울기를 0으로 두는 대신 뉴턴–라프슨(반복 재가중 최소 제곱)으로 최빈값을 찾는다.

aNnew=CN(I+WNCN)1(tNσN+WNaN)
  • 최빈값 aN에서 헤시안 H=WN+CN1으로 가우시안 근사 q(aN)=N(aNaN,H1)을 얻고, 시험 입력에 대한 잠재값의 평균·분산은
E[aN+1tN]=k(tNσN),var[aN+1tN]=ck(WN1+CN)1k

그림 5.5 · 가우시안 과정 분류. (왼쪽) 데이터와 최적 결정 경계(녹색), 가우시안 과정 결정 경계(흑색). (오른쪽) 예측 사후 확률.

실습 · 가우시안 과정 분류 (라플라스/뉴턴)

잠재 함수의 사후 최빈값을 뉴턴 갱신 anew=CN(I+WCN)1(tσ+Wa)로 구한 뒤, 시험 입력의 E[a]·var[a]로 클래스 확률을 근사합니다.

python
import numpy as np
def sig(z): return 1/(1+np.exp(-z))
def rbf(A, B, s=1.0): return np.exp(-(A[:,None]-B[None,:])**2/(2*s**2))
rng = np.random.default_rng(2)
Xtr = np.sort(rng.uniform(-3, 3, 20))
ttr = (rng.uniform(size=20) < sig(1.5*Xtr)).astype(float)
nu = 1e-2; CN = rbf(Xtr, Xtr) + nu*np.eye(len(Xtr)); a = np.zeros(len(Xtr))
for it in range(20):                                   # 뉴턴–라프슨 최빈값 탐색
    s = sig(a); W = s*(1-s)
    a_new = CN @ np.linalg.solve(np.eye(len(a)) + CN*W[None,:], ttr - s + W*a)
    step = np.linalg.norm(a_new - a); a = a_new
    if step < 1e-8: break
print(f"Newton 수렴: {it+1}회,  |Δa|={step:.1e}")
s = sig(a); W = s*(1-s)
for xs in [-2.0, 0.0, 2.0]:
    xs = np.array([xs]); k = rbf(xs, Xtr)[0]; c = 1.0 + nu
    Ea = k @ (ttr - s)                                  # E[a_*] = kᵀ(t-σ)
    va = c - k @ np.linalg.solve(np.diag(1/W) + CN, k)  # var[a_*]
    p = sig(Ea/np.sqrt(1 + np.pi*va/8))                 # 시그모이드-가우시안 근사
    print(f"x*={xs[0]:+.1f}: E[a]={Ea:+.3f}  var={va:.3f}  p(t=1)={p:.3f}")

5.4 최대 마진 분류기

  • 커널 기법의 한계는 모든 데이터 쌍에 대해 커널을 계산해야 한다는 점이다. 희박한sparse 해를 갖는 방법은 데이터의 부분 집합에만 의존한다. 대표적인 서포트 벡터 머신support vector machine; SVM볼록 최적화convex optimization 문제를 풀어 지역 최적해가 곧 전역 최적해가 되며, 사후 확률이 아니라 결정을 출력한다.

  • y(x)=wϕ(x)+b로 정확히 분리되는 해가 여럿일 때, SVM은 마진margin(결정 경계와 가장 가까운 점 사이의 거리)을 최대화하는 경계를 고른다.

그림 5.6 · 마진은 결정 경계와 가장 가까운 데이터 포인트 사이의 거리다. 마진을 최대화하면 오른쪽 경계를 얻으며, 경계를 결정하는 부분 집합이 서포트 벡터(원 표시)다.

  • 가장 가까운 점에 대해 tn(wϕ(xn)+b)=1로 정규화(정준 표현)하면 모든 점이 tn(wϕ(xn)+b)1을 만족하고, 마진 최대화는 12w2 최소화가 된다.
(7.5)argminw,b 12w2s.t.tn(wϕ(xn)+b)1
  • 라그랑주 승수 an0을 도입하고 w, b를 소거하면 커널만 등장하는 듀얼 표현을 얻는다.
L~(a)=n=1Nan12n=1Nm=1Nanamtntmk(xn,xm),an0, n=1Nantn=0

예측은 y(x)=nantnk(x,xn)+b이며, an0인 점(서포트 벡터)만 기여한다. 편향은 서포트 벡터 집합 S의 평균으로 안정적으로 구한다.

b=1NSnS(tnmSamtmk(xn,xm))

5.4.1 클래스 분포 간의 중첩

  • 클래스가 겹칠 때는 오분류를 허용하되 벌점을 주기 위해 느슨한 변수slack variable ξn0을 도입한다. 올바른 마진 안쪽이면 ξn=0, 아니면 ξn=|tny(xn)|이며 제약은 tny(xn)1ξn이 된다. ξn>1을 금지하면 강한 마진hard margin, 허용하면 약한 마진soft margin이다.

그림 5.7 · 느슨한 변수를 적용한 SVM. 원으로 강조된 점이 서포트 벡터다.

  • 목표 함수는 Cnξn+12w2이며(C>0은 벌점과 마진의 트레이드오프), 듀얼은 강한 마진과 동일하되 제약이 0anC로 바뀐다.
(7.21)Cn=1Nξn+12w2

5.4.2 로지스틱 회귀와의 관계

  • 목표 함수를 nESV(yntn)+λw2(λ=(2C)1) 형태로 쓰면 ESV힌지hinge 오류 [1yntn]+이다. 정규화된 로지스틱 회귀의 오류는 ELR(yt)=ln(1+exp(yt))로, 둘 다 오분류 오류의 연속 근사이며 형태가 유사하다.

그림 5.8 · 힌지 오류(청색), 1/ln2로 재척도한 로지스틱 오류(적색), 제곱 오류(녹색), 오분류 오류(흑색).

실습 · 힌지 · 로지스틱 · 0–1 오류 비교

z=yt에 대해 힌지 [1z]+, 재척도 로지스틱 ln(1+ez)/ln2, 0–1 오류를 계산해 비교합니다. 두 연속 오류가 z=1 근처에서 오분류 오류를 매끄럽게 근사함을 확인합니다.

python
import numpy as np
z = np.array([-2, -1, 0, 0.5, 1, 2], dtype=float)      # z = y·t
hinge = np.maximum(0, 1-z)
logistic = np.log(1+np.exp(-z))/np.log(2)              # 1/ln2 재척도
zero_one = (z < 0).astype(float)
print("   z(=y·t)   hinge   logistic   0-1")
for i in range(len(z)):
    print(f"  {z[i]:+5.1f}   {hinge[i]:6.3f}   {logistic[i]:7.3f}   {zero_one[i]:3.0f}")

5.4.3 서포트 벡터 머신을 이용한 회귀

  • 회귀에서 희박성을 얻기 위해 ϵ-둔감 오류 함수ε-insensitive error를 쓴다. |y(x)t|<ϵ이면 0, 아니면 |y(x)t|ϵ이다. 두 느슨한 변수 ξn, ξ^n을 도입해
tny(xn)+ϵ+ξn,tny(xn)ϵξ^n

제약하에 Cn(ξn+ξ^n)+12w2을 최소화한다. 듀얼을 풀면 예측은 커널로 표현된다.

y(x)=n=1N(ana^n)k(x,xn)+b,0anC, 0a^nC

그림 5.9 · 서포트 벡터 회귀. ϵ-튜브 바깥의 점만 느슨한 변수로 벌점을 받는다.

연습문제

문제 5.1

최소 제곱 선형 회귀의 듀얼 공식화에서, 해 w가 특징 벡터 ϕ(xn)들의 선형 결합으로 표현됨을 보이고, 듀얼 표현으로 얻은 예측이 원래 매개변수 표현의 예측과 일치함을 증명하라.

풀이

선형 결합 표현 — 정규화된 오류 J(w)=12n{wϕ(xn)tn}2+λ2ww의 기울기를 0으로 두면

wJ=n=1N{wϕ(xn)tn}ϕ(xn)+λw=0

이를 w에 대해 정리하면

w=1λn=1N{wϕ(xn)tn}ϕ(xn)=n=1Nanϕ(xn)=Φa

즉 계수 an=1λ{wϕ(xn)tn}을 갖는 특징 벡터들의 선형 결합이다.

예측 일치 — 원래 표현의 예측은 y(x)=wϕ(x)이다. 위 결과를 대입하면

y(x)=aΦϕ(x)=n=1Nanϕ(xn)ϕ(x)=n=1Nank(xn,x)=k(x)a

J(a)a에 대해 최소화하면 a=(K+λIN)1t이므로 y(x)=k(x)(K+λIN)1t. 이는 w를 통한 예측과 정확히 같다. 즉 듀얼 표현은 커널 k(x,x)=ϕ(x)ϕ(x)만으로 동일한 예측을 재현한다.

문제 5.2

고정 집합 D의 모든 부분집합 A에 대해 k(A1,A2)=2|A1A2|로 정의된 함수가, ϕU(A)=1 (UA), 0 (그 외)로 인덱스되는 2|D|차원 특징 공간의 내적임을 증명하라.

풀이

특징 사상 ϕ(A)D의 모든 부분집합 U로 인덱스되며(따라서 차원은 2|D|), 성분은 ϕU(A)=1[UA]이다. 두 부분집합 A1, A2의 특징 벡터 내적은

ϕ(A1)ϕ(A2)=UDϕU(A1)ϕU(A2)=UD1[UA1]1[UA2]

1[UA1]1[UA2]UA1이면서 UA2일 때, 즉 UA1A2일 때만 1이다. 따라서 합은 A1A2의 부분집합의 개수와 같다.

ϕ(A1)ϕ(A2)=|{U:UA1A2}|=2|A1A2|=k(A1,A2)

크기가 m인 집합의 부분집합은 2m개이므로 마지막 등식이 성립한다. 이렇게 k가 특징 공간의 내적으로 표현되었으므로 유효한 커널이다.

PDF