밑바닥부터 생각하는 HMM — 이론편 (1)
딥러닝이 HOT하다.
사실 HOT한지 좀 됐다. 기업은 점점 더 많은 Deep Learning Engineer 혹은 Machine Learning Engineer를 필요로 하고 있다.
Deep Leaning Enginner에 대해서 JD를 대충 보면 크게 위 그림처럼 3개가 많이 나오는 것 같다. 물론 어 저는 “영상”하는 혹은 “추천”하는 DL Engineer인데요? 라고 하면 오다선생님한테 가서 왜 3대장으로만 했는지 물어봐달라.
아무튼 이 삼대장, 아니 이 3개의 큰 필드에는 접근 방법이 다양하지만 체감상 텍스트가 가장 자료가 많았고 그 다음이 비전, 마지막으로 오디오 라고 생각한다.
그래서 이번 글에서는 오디오 에 연관이 되어있는 (사실 몰랐는데 알고보니 오디오쪽에도 쓰인다고 한다) HMM을 소개하겠다.
번외로, 이 HMM은 원래 부트캠프 컨텐츠로 만들려고 했던 것인데, 그냥 풀기로 했다. 유어 웰컴
HMM
요즘 핫한 현대상선 아니다.
Hidden Markov Model 의 줄임말로 예전에 통계책을 보면 항상 뒷부분 (대략 chapter 6같은)에 있어서 대체로 짚고만 갔던 그러한 내용들인데, 무슨 바람이 불었는지 2월 말에 갑자기 HMM을 공부해야겠다 라는 마음이 들어 오늘과 같은 정리 글을 쓰게 되었다.
HMM의 가장 기초적인 예시는 아무래도 날씨 모델링일 것이다.
(기존 관측에 의하면) 오늘이 맑은 날일때, 다음날 흐릴 확률이 0.3이고 반대로 오늘이 흐린날이라면 내일이 맑을 확률은 0.6이다. 와 같은 상황이다.
여기에 추가로 “π”라고 표현되는 첫 날의 날씨 확률이 주어진다면 아래와 같은 문제를 풀어낼 수 있다.
사실 나라면, 이 정도 예측을 할 수 있다는 것만으로 싱글벙글했겠지만 역시 역사적으로 수학하는 사람들은 더 더 더 어려운걸 풀고 싶어했던 것 같다.
(여전히 관측을 통해) 해가 뜬 날에는 육식을 할 확률이 0.2이고, 흐린 날에는 채식을 할 확률이 0.8이라는 정보가 있다면. 풀 수 있는 문제는 더 많아진다.
가령 조선왕조실록 같은 과거 기록을 통해 식단의 정보가 주어진다면 이를 통해서 그 날의 날씨를 추정할 수 있게 되는 것이다.
이 날씨-식단 모델에서 우리가 가지고 있는 “보여지는” 정보 (식단) 를 Emission 이라 부르고, 알지 못하는 “숨겨진” 정보(날씨) 를 Hidden 이라고 부른다. 추가로 확률을 transition이라고 부르는 것 같은데 뭐 찾아보면 나온다
여전히 수학하는 사람들은 날씨를 유추하는 것에서 만족하지 못하고 더 더 더 어려운 문제들을 어렵게 풀기 위해 고민을 했던것 같다.
날씨 기록이 주어졌을때, 이를 가장 잘 설명하는 확률 전이 모델 (HMM)을 만들기로 한 것이다. (여기서 모델이란 Transition, Emission, Pi를 모두 포함한다)
앞서 말했던 문제들을 좀 있어보이게 표현하면 각각 Evaluation, Decode, Learning 이라고 부른다.
Evaluation
Evaluation은 사실 너무 쉽다. 모델이 있는 상태에서 주어진 Observation이 나올 확률을 계산하는 것이기 때문이다.
우리의 날씨-식단 모델을 다시 한번 불러와보자
이를 계산 하는 것은 조금 귀찮긴 하겠지만, 조건부 확률을 이용하면 금방 구할 수 있다. 즉 날씨가 어떤지는 모르겠지만 가능한 날씨들의 모든 조합에 대해 각자 확률을 모두 구한 뒤 더하면 되는 것이다.
p(meal = 채, 육, 채, 채|weather = 맑, 맑, 맑, 맑) +
p(meal = 채, 육, 채, 채|weather = 맑, 맑, 맑, 흐) +
… +
p(meal = 채, 육, 채, 채|weather = 흐, 흐, 흐, 흐)
( 각각 채식, 육식, 맑음, 흐림이다. )
여기까진 좀 귀찮긴 하지만 그래도 노가다로 할만하다.
그러나 만약 날씨가 2종류가 아니고, 식단이 2종류가 아니라면 해야할 삽질은 정말 밑도 끝도 없이 많아진다.
이를 노가다로 푸는 것은 너무나도 비효율적이라 판단했는지 수학하는 사람들이 가뭄에 단비처럼 알고리즘을 만들어냈다. 이름하야 Forward / Backward Algorithm이다. (이름에서 볼 수 있듯 앞에서 부터 그리고 뒤에서부터 계산하는 방법이다.)
Forward Algorithm
Forward Algorithm은 이전 단계까지의 확률 값을 미리 계산하여 “상수로” 둔뒤 상수 * 새로운 확률 이라는 하나의 계산만 하는 방식이라고 생각하면 편하다.
위 예시의 채식-육식-채식 이라는 이벤트는 사실
첫날 채식 그리고 둘째날 육식 그리고 마지막 날 채식
이라는 의미를 가지고 있다.
그럼 첫날 채식일 확률과 그 상태에서 두번째 육식일 확률을 계산하는걸 예시로 들어보겠다. (Pi = 맑음 0.3, 흐림 0.7라고 가정한다)
첫날 채식일 확률은 (다시 한번 조건부 확률을 사용하면) 첫날 맑으면서 채식할 확률 과 첫날 흐리면서 채식할 확률로 구분 할 수 있고, 이는 아래 그림처럼 나타낼 수 있다.
자 이제 첫날 채식, 그리고 둘째날 육식일 확률이다.
사실 이 부분이 조금 더 생각해야 할 것이 있다.
바로 이전 단계로 부터의 날씨변화 도 같이 고려해야 하는 것이다.
예를 들면 첫날 맑았지만 둘째날도 맑고, 그 와중에 육식을 했을 확률 (이전에 계산한 것처럼)을 찾아야 한다는거다.
이제 대망의 3일째 채식을 계산 할 시간이다.
즉 우리가 처음에 계산 하려던 모델은 최종의 합인 0.128이 되는 것이다.
우리가 방금 했던 이 귀찮은 계산을 수식으로 있어보이게 표현하면 다음과 같다.
이 Evalution 은 단순히 확률 계산도 할 수 있지만, 더 나아가 주어진 observation이 여러개의 HMM 중 어느 쪽에 속할 것인가 에 대한 예측 혹은 이에 기반한 분류가 가능하다.
Backward Algorithm
한편 Backward는 반대로 “뒤에서 부터, 뒤의 state에 대한” 계산을 하는 것이다. 그리고 맨 마지막에 pi를 반영한다.
내 기준으로, 처음에 받아들이기 어려웠 점은 마지막 확률은 1이라는 것이다. 채식은 이미 했으니 마지막 날의 날씨가 맑던 흐리던 그 합은 1이다 라는 걸로 이해를 했더니 좀 나았다.
아무튼, 2일차는 아래와 같다.
마지막으로 첫날에 pi를 반영하면
초기 모델 설정 값을 묘하게 해서 그런지 좀 찜찜하겠지만 아무튼 Forward때와 같은 결과 값이 나오게 된다.
이게 중요한 점은 동일한 Observation에 대해서는 forward로 하나 backward로 하나 동일한 결과 를 나타낸다는 것이며, backward에 경우는 learning problem에도 쓰인다는 것도 인지하면 좋을 것 같다.
decoding 과 learning 내용은 나중에 작성하겠다.
번외 : 계산은 제대로 하자…