근데 이제 자연어 처리 문제는 단순한 개별 분류 문제와 달라서, 요소들(단어, 구절 등) 간의 관계와 순서, 의존성을 고려하는 특별한 접근 방식(학습 및 추론 방법)이 필요함..
일반적인 분류 문제는 각 데이터(사례, case)를 독립적으로 취급..
즉, 하나의 데이터를 분류하는 결정이 다른 데이터의 분류에 영향을 미치지 않는다고 가정합니다.
(스팸 메일 분류 시, 한 메일이 스팸인지 아닌지 판단하는 것은 다른 메일의 판단과 무관하다고 보는 것)
-> 근데 사실 언어는 여러가지 의미들이 주변 단어들에게 영향을 받음 -> 의존적... 의존성이 있음..
-> 이전 결과를 다음 결과에 영향을 주는 것..
-> dependency 를 인코딩 하기 위해 hmm 을 이용..
-> 새로운 기법 필요..
여러 개의 서로 종속적인 분류 문제를 한 번에 처리할 때 단순히 개별적으로 독립적인 모델을 사용하는 것이 아니라, 전체적으로 가장 가능성 높은(global assignment) 결과를 결정하는 모델을 쓰는 것
자연어 처리(NLP)에서는 문장이나 텍스트를 다룰 때, 각 단어들이 독립적으로 존재하지 않고 서로 긴밀히 연결된 형태로 나타나는 경우가 많음. 이를 효과적으로 모델링할 수 있는 방법 중 하나가 바로
Hidden Markov Model(HMM)
HMM은
숨겨진 상태(hidden states)와 관측값(observations) 사이의 관계를 확률적으로 모델링
하는 방식임.
HMM은 마르코프 모델에 기반을 두고 있음. 마르코프 모델은 현재 상태에서 다음 상태로 넘어가는 확률을 정의하는 모델임.
마르코프 property 를 기반으로 함..
마르코프 모델은 확률적 상태 전이(Probabilistic State Transitions)를 나타내며, 상태 간의 이동이 확률로 표현됨.
-> FSA에 probability가 붙은 형태
q3 q2 q1 q4의 시퀀스에서의 확률, P(q3 q2 q1 q4) = 0.0012 라고 할때
markov model 을 쓸 수 있다.
hidden state가 실생활에서 추론하기 어려운 것이므로 hmm을 사용해서 추론하는 것
q0 : start state
q4 : finiite state
여러 state 가 존재하고 각각의 state 사이에 transition probability 존재,
그리고 각각의 state 별로 emission probability 존재
Hidden Markov Model을 정의하려면 다음 요소들이 필요함.
observation likelihood이 아니라 emission probability 라고 하는 게 맞음
(likelihood 와 probability 의 차이는 나중에 다룰 예정)
그러면 이제 generation 하면 됨
최종 출력: "My unicorn laughed"
observation Likelihood: How likely is a particular observation sequence to occur?
learning : 기존 hmm 을 어떻게 쓰는지를 이해했는데, learning 은 hmm을 빌드하는 과정 (특정 알고리즘을 사용해서.. em 알고리즘?)
seqeunce classification
sentiment classification -> hmm 이용 가능
hmm이 각 클래스별로 존재
-> positive 담당 hmm 에게서 확률 구하기, negative 담당 hmm에게서 확률 구하기
-> 최종적으로 높은 확률의 클래스 선택
실질적으로 hmm에서 observation likelyhood 계산하는 방법..
naive하게 생각하면:
A : transition probability matrix
given observation sequence prob : 현재 상태
-> repeat all possible state sequences..
이전 모든 상태의 값을 계속해서 곱하기 때문에 복잡도가 매우 높음
여기서 보면 세로 줄은 N 개의 state -> t 번만큼 반복
= N^T
시퀀스를 한 번 계산할 때 transition(가로줄) 을 T 번 곱함
그래서 O(TN^{T})...
재사용할수있는건 재사용해보자... -> forward algorithm
다이나믹프로그래밍 이용해서 재사용을 하자
q_j 의 확률 값을 계산한다면,
이전의 상태만 고려하면 됨
모든 t (time) 에 대해서 t와 t-1에만 계산해주면 되기 때문에
해당 스텝의 모든 state(N개) 에 대해서 각각 곱해줘야 되기 때문에 ( N * N )
시간복잡도는 O(TN^2) 가 됨.
2799년 날씨 예측을 할 수 있을까?
근데 직접적으로 관련된 데이터가 없음, 근데 아이스크림 먹은 데이터가 있음
아이스크림 : observation
날씨 : Hidden state
세개의 시퀀스 존재
Day 1 (3), Day2 (1), Day3 (3)
이걸 기반으로 HMM 을 만듦
start state : q0
q0 에서 hot, cold 각각의 state 로 가는 transition probability 가 있음
hot 과 cold 라는 hidden state를 예측하고 싶은 것임..
각 state에서 emission probability 가 있음
이 내용을 수식으로 쓰면??
직전 state (t-1) 에서의 확률만 이용하기.
q_j state 의 확률 알파 값을 구할 때
start state 에서 갈 수 있는 모든 state 에 대해서 \alpha 를 계산해줌
o_{1} state들의 확률
그리고 이제 o{2} state를 계산할 때
o{1} state의 확률 값을 가지고 계산 -> dp 를 이용한 재사용이다..
이 방식으로 state에 도달할 확률을 계속해서 구해줌
이때 h -> c, c -> c 하나의 state에 도달하는 경우가 두개 이상인데, 이 값들을 더해줌
0.32 * 0.14 + 0.2 * 0.8 = 0.464
final state에서는 모든 state에서 오는 값을 더해줌..
3 1 3 이라는 observation 을 예측했다..
더하는게 아니고 max로 만들어주는 확률을 골라서 해당 state의 확률로 저장해줌
bt(backpointer) : 백트레킹할때 어떤 state에서 온 값인지 알기 위해 사용하는 notation
viterbi(max값 선택) -> backpointer
Viterbi is basically the forward algorithm + backpointers, and substituting a max function for the summation operator
forward는 다 더해줬는데, 비터비는 max값을 선택하고 backpointer를 저장한다.
max값을 계속 저장
0.01254 는 어디서 왔지?
그러면 hot -> hot -> hot 으로 날씨 예측을 할 수 있다...