본문 바로가기

Computer Vision/Deep Learning

Gaussian Mixture Model - GMM

Gaussian Mixture Model (가우시안 혼합 모델)

말그대로 여러개의 모델이 Mixture 되었다는 전제에서 시작한다.

어떤 픽셀값, 데이터가 들어오면 걔가 어떤 모델(분포) 출신인지 유추할 수 있는 모델을 생성하는 것이다.

그러려면 일단 모델의 후보가 있어야 되는데, Gaussian Mixture에 여러 모델(분포)가 섞여있기 때문에, 섞인 그 모델들이 후보들이고 그 중 최종적으로 픽셀값이 그중에 어떤 애로부터 왔느냐를 유추하면 된다.

 

Gaussian 이라 하면, 우리는 쉽게 Gaussian 분포를 떠올릴 수 있다. 맞다, 그 분포.

우리가 아는 아래와 같은 분포가 여러개 있다고 생각하면 된다.

기본형 Gaussian Distribution

 

그런데 이러한 Gaussian 분포가 여러개 있다는 것은?

 

Gaussian Mixture

위와 같이 "점선"만을 본다면 개별적인 3개의 가우시안이지만, mixture model은 실선처럼 나타나게 된다.

이렇게 X축은 데이터, 실선은 mixture model, 점선은 mixture model 내부의 개별적 가우시안, 그리고 y축은 x값이 각 mixture model에 속할 확률 이라고 생각하면 되겠다.

 

알고리즘은 일련의 과정을 통하여 input data X를 위와 같은 Gaussain의 분포로써 나타내고, 3개의 가우시안은 우리가 원하는 그룹의 개수이다. 즉, 컴퓨터가 만드는 개수가 아니고 우리가 지정해주는 개수!

 

위의 그림은 3개의 Gaussian Distribution이 합쳐진 모양이다.

그리고 실선 밑의 점선은 독립적인 각 Gaussian Distribution이다.

여기서 포인트는 어떤 한 x 값이 하나의 Distribution에 대한 확률만을 가지고 있는게 아니라는거다.

각 x값은 여러 Distribution에 대해 그 Distribution에 속할 확률, 즉 가능성을 가지고 있다.

다만 우리는 그 x값을 하나의 그룹에 매칭시켜주고 싶은거다. 이 때 나오는 개념은 Responsibility이다.

각 x값이 어떤 Distribution에 대해 가장 높은 Responsibility를 갖느냐에 따라 x값과 Gaussian Distribution이 서로 매칭된다.

 

지금까지 말한 GMM의 로직은 다음과 같다.

 

우리가 이미 아는 데이터셋 X1 이 있다.

이 X1을 k개의 그룹 (cluster) 로 나누고 싶다.

그래서 GMM을 사용해서 k개의 Gaussian Distribution을 합친 하나의 Gaussian Mixture Model (GMM)을 만들었다. 

우리는 X1의 데이터들이 각각 GMM의 어느 Gaussian Distribution에 할당되는지 알 수 있는 Responsibility도 구한다.

따라서, 각 데이터들이 k개 중 어느 Distribution에 소속되는지 모두 구할 수 있다.

 

예시를 들어보자.

100명의 학생이 0점부터 100점까지 분포되어있다고 했을 때, 단순히 상위 33명, 상위 66명, 상위 100명 순으로 줄세워 3 그룹으로 나눌 수도 있겠지만 점수의 분포로 나눌수도 있을 것이다.

 

우선, GMM을 2d에 그려본다고 생각하면 각 x축에는 학생들의 점수들이 나열되어 있을 것이다. Input data니까.

그 위에는 Gaussain Distribution이 3개 (하지만 섞여있으므로, 하나의 곡선처럼 보이겠지) 그려질 것이고 y값은 그 점수 (그 x값) 이 그 반 (그 Gaussian Model) 일 확률을 나타낸다.

이때의 확률(possibility)과 Responsibility는 다르다. 

어떤 데이터 x가 소속되어있는 Distribution을 최종 결정하는 것은 Responsibility이다.

responsibility와 posibility 의 관계 (출처:norman3.github)

그럼 정확히 어떤 알고리즘을 통해 GMM을 생성하는 것일까?

이 때 사용되는 알고리즘은 바로 EM 알고리즘이다. E-step과 M-step으로 나누어지기 때문에 EM 알고리즘인가본데... 

이 알고리즘은 스도코드만 설명해도 한 페이지를 채울 것 같아 다음 번에 기회가 생기면 포스팅해야지. (미루지 말아야지)

 

아무튼, 요지는 EM 알고리즘을 통해 "무엇을" 해야 GMM이 생성되냐는 거다.

우리가 아는 Gaussian Distribution을 정의할 때 필요한 것이 똑같이 여기에서도 필요하다. 즉, 분산과 평균.

따라서 그것을 결정해야 GMM 또한 정의된다.

 

EM 알고리즘은 바로 이러한 분산, 평균같은 parameter들을 결정하기 위한 알고리즘이다.

 

그런데 일반적인 Gaussian Distribution과 다르게 GMM은 parameter 한 개를 더 필요로 한다.

바로 주어진 x 데이터에 대해 k번째 분포가 선택될 확률값인 π(k) 이다. 흔히 혼합계수라고도 한다.

혼합계수 π(k)는 일종의 가중치로서, 각 π는 0과 1 사이이며 k개의 π를 모두 더하면 1이 되는 구조이다.

따라서 분산 Σ, 평균 μ, 그리고 가중치인 π 까지 EM 알고리즘은 총 3개의 파라미터를 결정해야 한다. 

정확히 말하자면 3 x k 개의 파라미터. 각 파라미터들은 model 1개마다 존재하기 때문이다.

 

EM 알고리즘을 통해 k개의 Gaussian에 대한 parameter 3 x k 개를 모두 구했다고 하자. 

parameter을 구했다는 것은 해당 Gaussian model을 "정의" 했다는 것과 마찬가지이다.

단번에 parameter를 모두 확정짓고 Gaussian Mixture Model을 완성하면 참 좋겠지만, EM Algorithm은 기본적으로 iteration based algorithm이다.

즉, k-means algorithm처럼 몇번 돌려야 더욱 정확해지는 모델이다.

 

따라서 EM algorithm을 특정 조건을 만족할때까지 돌리면 GMM이 비로소 완성되고 parameter들도 결정되는 방식이다.

여기서 말하는 특정 조건이란, 두어개를 말해보면

1. 더 돌려도 각 데이터들의 분포가 가우시안 분포에 완벽히 매칭되어 변화가 없을때

2. iteration threshold값을 주어 충분히 loop를 돌았을 때

정도이다.

 

그렇담 위에서처럼 iteration도 충분히 돌려서 GMM을 완성시켰다고 하자.

그런데 새로운 데이터셋 X2가 들어왔다.

그렇다고 기존의 GMM을 만든 X1에 X2를 더해서 다시 GMM을 만드는 게 아니고,

X1 데이터셋으로 만든 GMM에 X2를 적용시켜 X2를 분류하고 싶은 거다.

 

아까의 점수 예시로 돌아가서, 우리는 100개의 데이터 (학생 수)를 가지고 3개의 Gaussian (반) 으로 나누었다.

학생들은 각각 우등반, 보통반, 열등반으로 나뉜 상태인데 새로운 전학생 10명이 온거다!

새로운 전학생 10명을 어떻게든 3개의 반으로 집어넣어야 한다.

시험을 봐서 나온 점수로 결정하기로 했을 때, 우리는 합리적으로 이 친구들을 기존의 3개 반에 할당해주어야 한다.

이때 우리는 기존의 반마다 가지고 있는 parameter(π, μ, Σ)를 알고있다. 왜냐? 우리가 만든 반 (Gaussian) 이니까!

따라서 각 반 (모델)은 π,μ,Σ 을 하나씩 가지고 있고, 이 parameter들을 통해 우리는 새로 들어온 전학생들의 데이터에 이 매개변수를 적용하여 이 전학생들이 어느 반으로 가야 가장 합당한지에 대한 responsibility를 구할 수 있다.

 

GMM은 sklearn에서 구현할 수 있다. 

==>  sklearn.mixture.GaussianMixture

 

다음에 꼭 잊지않고 EM 알고리즘도 더 공부해서 이해가 더 잘 되도록 포스팅해보겠다.

밀린 포스팅이 너무 많은데 ㅠㅠ 그만 게을러져야지...