Intro.
히든 마르코프 모델(Hidden Markov Model, HMM)은 마르코프 체인의 확장된 모델로, 관측 가능한 데이터(Observable Data)와 숨겨진 상태(Hidden States) 간의 확률적 관계를 모델링 한다. HMM은 감춰진 상태를 통해 관측된 데이터를 설명하는 확률 모델로, 각 상태가 은닉 되어 직접 관찰할 수 없다는 특징을 가진다.
HMM 구성.
- 상태 공간(State Space) HMM은 유한한 개수의 상태들로 구성되며, 이 상태들은 Markov chain의 상태들이다. 상태는 보통 S={s1,s2,s3,…,sn}으로 표현된다.
- 관찰 공간(Observation Space) 관찰값은 V={v1,v2,v3,…,vm}의 값들로 이루어져 있다. 관찰값은 각 상태에 의해 생성된다.
- 초기 상태 분포(Initial State Distribution) 초기 상태의 확률 분포는 π로 나타내며, 이는 각 상태가 처음에 발생할 확률이다. 즉, πi=P(Q1=Si)이다.
- 전이 확률(Transition Probabilities) 전이 확률은 한 상태에서 다른 상태로 이동할 확률이다. A=[aij]로 나타내며,aij=P(Qt+1=Sj∣Qt=Si)이다. 이는 시간 t에 상태 Si에 있을 때 시간 t+1에 상태 Sj로 전이할 확률을 의미한다.
- 관찰 확률(Emission Probabilities) 각 상태에서 관찰값이 발생할 확률이다. B=[bj(k)]로 나타며, bj(k)=P(Qt=vk∣Qt=Sj)이다. 이는 시간 t에 상태 Sj에 있을 때 관찰값 vk가 발생할 확률을 의미한다.
HMM 문제.
- 평가 문제(Evaluation Problem): 관찰된 시퀀스가 주어졌을 때, 특정 HMM이 그 시퀀스를 생성할 확률을 계산하는 문제이다. 주로 Forward 알고리즘을 사용하여 해결한다.
- 디코딩 문제(Decoding Problem): 가장 가능성이 높은 숨겨진 상태의 시퀀스를 찾는 문제이다. Viterbi 알고리즘을 사용하여 해결한다.
- 학습 문제(Learning Problem): 모델의 파라미터를 학습하는 문제이다. 관찰된 데이터가 주어졌을 때, HMM의 파라미터 A, B, π를 최적화하는 것이다. Baum-Welch 알고리즘을 사용하여 해결한다.
Example.
날씨 예측을 HMM으로 설명할 수 있다. 여기서는 숨겨진 상태로 '맑음(Sunny)', '흐림(Cloudy)', '비(Rainy)'가 있다고 가정하자. 관찰값은 '산책(Walk)', '쇼핑(Shop)', '청소(Clean)'이다.
- 상태 전이 확률 행렬 A 한 상태에서 다른 상태로 전이할 확률을 나타내며, 이 행렬은 모델의 숨겨진 상태 간의 전이 확률을 정의한다. 여기서는 행과 열 모두 숨겨진 상태인 날씨를 뜻한다. 예로, a11=0.7로 ‘Sunny’ 상태에서 ‘Sunny’ 상태로의 전이 확률을 의미하며, a23=0.3으로 ‘Cloudy’ 상태에서 ‘Rainy’ 상태로의 전이 확률을 의미한다.
A=⎣⎢⎡0.70.30.20.20.40.30.10.30.5⎦⎥⎤
- 관찰 확률 행렬 B 숨겨진 상태에서 특정 관찰값이 발생할 확률을 나타내며, 이 행렬은 상태와 관찰값 간의 관계를 정의한다. 여기서는 행은 숨겨진 상태인 날씨를 뜻하고 열은 관찰값을 뜻한다. 예로, bsunny(Walk)는 0.6으로 b11을 뜻하며 bcloudy(Clean)은 0.3으로 b23을 뜻한다.
B=⎣⎢⎡0.60.30.20.30.40.30.10.30.5⎦⎥⎤
- 초기 상태 확률 분포 π 시스템이 시작할 때 각 상태에 있을 확률을 나타낸다.
π=[0.50.30.2]
- π1=0.5: 처음에 'Sunny' 상태에 있을 확률이 0.5
- π2=0.3: 처음에 'Cloudy' 상태에 있을 확률이 0.3
- π3=0.2: 처음에 'Rainy' 상태에 있을 확률이 0.2
예제로 사용할 관찰 시퀀스를 O=[Walk,Shop,Clean]라고 가정하자.
Step 1. Forward 알고리즘
-
초기화
각 상태에서 첫 번째 관찰값에 대한 초기 확률을 계산한다.
α1(i)=πi⋅bi(Oi)
여기서 π는 초기 상태 확률, bi(Oi)는 상태 Si에서 첫 번째 관찰 값 O1(Walk)가 발생할 확률을 뜻한다.
- α1(Sunny)=π(Sunny)⋅bSunny(Walk)=0.5⋅0.6=0.3
- α1(Cloudy)=π(Cloudy)⋅bCloudy(Walk)=0.3⋅0.3=0.09
- α1(Rainy)=π(Rainy)⋅bRainy(Walk)=0.2⋅0.2=0.04
-
재귀
다음으로, 각 시간 t에서 모든 상태 j에 대해 αt(j)를 계산한다.
αt+1(j)=(i=1∑Nαt(i)⋅aij)⋅bj(Ot+1)
- α2(Sunny)=(α1(Sunny)⋅aSunny,Sunny+α1(Cloudy)⋅acloudy,Sunny+α1(Rainy)⋅aRainy,Sunny)⋅bsunny,2(shop)=(0.3⋅0.7+0.09⋅0.3+0.04⋅0.2)⋅0.3=0.0822
- α2(Cloudy)=(0.3⋅0.2+0.09⋅0.4+0.04⋅0.3)⋅0.4=0.0384
- α2(Rainy)=(0.3⋅0.1+0.09⋅0.3+0.04⋅0.5)⋅0.3=0.0189
- α2(Sunny)=(0.0822⋅0.7+0.0384⋅0.3+0.0189⋅0.2)⋅0.1=0.00619
- α3(Cloudy)=(0.0822⋅0.2+0.0384⋅0.4+0.0189⋅0.3)⋅0.3=0.01193
- α3(Rainy)=(0.0822⋅0.1+0.0384⋅0.3+0.0189⋅0.5)⋅0.5=0.0733
-
종합
마지막으로, 모든 αt(i)의 합을 계산하여 관찰 시퀀스 O가 주어진 모델에서 발생할 확률을 구한다.
P(O∣λ)=i=1∑NαT(i)
P(O∣λ)=0.00619+0.01193+0.00733=0.02545
따라서, 관찰 시퀀스 O=[Walk,Shop,Clean]가 주어진 HMM에 의해 발생할 확률은 0.02545이다.
Step 2: Viterbi 알고리즘 (디코딩 문제)
이제 Viterbi 알고리즘을 사용하여 가장 가능성이 높은 숨겨진 상태 시퀀스를 찾아볼 수 있다.
-
초기화
δ1(i)=πi⋅bi(O1)
ψ1(i)=0
- δ1(Sunny)=0.5⋅0.6=0.3
- δ1(Cloudy)=0.3⋅0.3=0.09
- δ1(Rainy)=0.2⋅0.2=0.04
💡 δ와 ψ의 정의
- δt(i)는 시간 t에서 상태 Si에 도달할 수 있는 모든 경로 중에서 가장 높은 확률을 가지는 경로의 확률을 의미한다.
- ψt(i)는 시간 t에서 상태 Si에 도달하는 가장 높은 확률의 경로가 시간 t−1에 어떤 상태에서 왔는지를 기록한다.
-
재귀
다음으로, 각 시간 t에서 모든 상태 j에 대해 δt(j)와 ψt(j)를 계산한다.
δt+1(j)=max1≤i≤N[δt(i)⋅aij]⋅bj(Ot+1)
ψt+1(j)=argmax1≤i≤N[δt(i)⋅aij]
- δ2(Sunny)=max(0.3⋅0.7,0.09⋅0.3,0.04⋅0.2)⋅0.3=0.063,ψ2(Sunny)=Sunny
- δ2(Cloudy)=max(0.3⋅0.2,0.09⋅0.4,0.04⋅0.3)⋅0.4=0.036,ψ2(Cloudy)=Sunny
- δ2(Rainy)=max(0.3⋅0.1,0.09⋅0.3,0.04⋅0.5)⋅0.3=0.0108,ψ2(Rainy)=Cloudy
- δ3(Sunny)=max(0.063⋅0.7,0.036⋅0.3,0.0108⋅0.2)⋅0.1=0.00441,ψ3(Sunny)=Sunny
- δ3(Cloudy)=max(0.063⋅0.2,0.036⋅0.4,0.0108⋅0.3)⋅0.3=0.00648,ψ3(Cloudy)=Cloudy
- δ3(Rainy)=max(0.063⋅0.1,0.036⋅0.3,0.0108⋅0.5)⋅0.5=0.0054,ψ3(Rainy)=Cloudy
-
종료
마지막으로, 가장 높은 확률을 가지는 상태를 찾고, 그 경로를 추적한다.
P∗=max1≤i≤NδT(i)
qT∗=argmax1≤i≤NδT(i)
- P∗=max(0.00441,0.00648,0.0054)=0.00648
- q3∗=Cloudy
Step 3. Viterbi 알고리즘 경로 추적
Viterbi 알고리즘에서는 가장 가능성 있는 상태 경로를 추적하기 위해 백트래킹을 사용한다. 우리는 각 시간 단계에서 어떤 상태에서 왔는지를 기록한 δ행렬과 ψ행렬을 사용한다. 이미 q3∗=Cloudy 라는 것을 알고 있으므로, 이전 시간 단계로 돌아가며, 경로를 추적할 수 있다.