지난 글에 이어서 이번에는 Gaussian Mixture Model (GMM)에 Expectation-Maximization(EM) 알고리즘을 적용하여 최적화해 보겠다. 본 글은 머피의 머신러닝 1 8.7.3장에 해당하는 글을 기반으로 한다.
EM(Expectation-Maximization) 알고리즘의 완벽한 기초
오늘은 다양한 곳에서 사용되는 bound optimization의 하나인 Expectation-Maximization(EM) 설명을 진행해볼까 한다. EM 알고리즘에서 나오는 ELBO에 대한 개념은 VAE(Variational Auto Encoder), 그리고 이미지 계열에
hi-lu.tistory.com
필수 사전지식
EM 알고리즘
이전 포스트의 내용을 복습해보자. EM을 사용하는 전제조건은 다음과 같았다.
전제 조건
- bound optimization이 필요한가. == log likelihood를 대신하는 ELBO를 구해서 ELBO를 maximize 해야 한다.
- 확률모델에 데이터의 유실이 있거나, hidden variable이 있는가. (== z)
이때 E와 M step은 각각 다음과 같은 일을 맡는다.
- E step : 이미 알고 있는 변수 y의 분포를 p(y)로 표현할 수 있다. 이때 hidden variable인 z에 대한 분포를 p(z| y,θ)로 근사할 수 있음을 보였다. 이는 모르는 변수 z의 변수를 Expectation(E) 한 것과 같다.
- M step : ELBO 식을 정리했더니 ∑ log p(y,z|θ)가 됐다. 우리의 목표는 argmax ∑ log p(y,z|θ) 를 만족하는 θ(파라미터)를 구하는 것임을 알았다. 이는 ELBO를 Maximize(M)한 결과다.
GMM
Mixture Model은 확률모델을 더욱 복잡하게 설계하기 위해서 간단한 분포를 여러개 합친 것이다. Gaussian Mixture Model(GMM)은 가우시안 분포 여러개를 엮어놓은 모델을 말한다. 아래 식이 GMM의 확률 분포를 의미하는데, 이는 k개의 가우시안 분포를 합친 것이라 해석할 수 있다. 식의 π는 각 분포의 가중치를 의미하며 ∑π = 1을 만족해야 한다. y의 데이터 집합은 D로 표현한다.
따라서 GMM의 MLE는 다음과 같다.
- MLE θ = argmax log p(y|θ)
- log likelihood를 maximization하는 θ 찾기.
clustering 기법으로 본다면 위 수식에서의 K개의 가우시안 분포는 각각 하나의 군집에 대한 분포를 나타내길 바랄 것이다. (이를 확장하면 Kmeans다.) GMM이 클러스터링을 푸는 데 사용되는 이유는 각 K개의 분포를 latent variable z이 대표할 수 있게끔 구할 수 있기 때문일 것이다. 이 z에 대한 posterior는 이전 포스팅들에서 한 것처럼 baysian을 이용하면 된다. (posterior ~= prior * likelihood 임을 기억하자.)
GMM과 EM
E step
E step에서는 z의 확률분포를 근사하는 작업을 진행하는데, z가 각 k의 분포를 대표하기 때문에 π로 치환될 수 있다. (π는 GMM에서 각 분포별 가중치에 대한 probability를 의미한다. ) 따라서 GMM의 responsibility r, 즉 p(z=k|y,θ) 에 대해 아래와 같이 다시 표기할 수 있다. 기존 p(z = k|θ)의 자리에 확률분포 π를 대입한 것과 같다.
M step
M step은 log likelihood를 최대화해서 파라미터를 업데이트하는 과정이다. z가 포함되는 Log likelihood는 log p(y,z | θ)로 나타내진다. 이를 통해 GMM의 파라미터인 평균값 u와 공분산을 업데이트하자. 여기서 n은 데이터 수, k는 클러스터 수로 정의한다.
M step 과정
1. 시작
p (y, z| θ)는 bayes 이론에 따라 다음과 같이 쓸 수 있다.
양변에 log를 취하면 log p(y,z | θ)를 구할 수 있으므로 MLE(Maximum Likelihood Estimation) 형식으로 문제를 접근할 수 있다. 이 값의 평균값인 아래 수식이 우리가 최대화하고자 하는 식이다.
2. 확률분포에 값 대입
우항의 p(y|z,θ)는 GMM의 가우시안 분포이기 때문에 N(u,∑) 분포로 쓸 수 있다. 아래 수식의 분홍색 괄호는 책 오타를 바로잡은 거다. 각 k개의 클러스터에 대해 n이 k에 해당할 때의 값들만 계산해야 하기 때문에 ( z_nk = I(z_n == k )) 다음과 같이 식을 쓸 수 있는 것이다. (추가로 Π는 곱셈을 의미한다. 각 1,2,3,..,k개의 클러스터에 대한 확률값을 log로 취했으니 log 내에선 곱연산으로 표현되는 것이다. )
첫 번째 항, 두 번째 항 둘 다 log이기 때문에 z_nk는 앞으로 나온다.
이제 E[z_nk]에 대해 생각해 보자. z_nk는 n번째 데이터가 클러스터 k에 해당하는지 아닌지를 가리는 0,1값으로 이루어져 있다. 이의 평균은 즉 GMM의 responsibility와 같아진다! E step에서 responsibility를 r로 표기했으므로 아래와 같이 식이 바뀐다.
이제 가우시안을 확률 함수로 풀어보자!
가우시안이 multivariate일 땐 아래와 같이 평균과 분산값으로 풀어낼 수 있다. (π는 진짜 파이값이다. )

아래 식에선 -1/2 log |2π∑|에서 1/2 log2π 를 상수취급하였다.
다 구했다! 이 값을 미분하여 최적의 평균 u와 분산 ∑를 구하면 된다.
3. 미분을 통해 가우시안 z 구하기
최종으로 구한 식을 각각 u와 ∑에 대해 미분해 보자. 미분해서 0이되는 값의 u와 ∑가 각각 최적이 될 것이다.
먼저 u로 미분해보자.
벡터를 미분할 때의 식 하나를 소개하겠다.

이를 통해 (y-u)를 x, ∑-1을 A로 취급해서 미분할 수 있겠다.
따라서 GMM를 EM으로 푼 결과의 최적 평균값은 아래와 같다.
다음은 ∑로 미분해보자.
이번에 필요한 미분식은 아래와 같다.

가운데에 있는 행렬 미분을 하면 이렇게 된다!
이로써 우리는 GMM에서 Expectation-Maximization을 통해 어떻게 z값을 업데이트할 수 있는지 알았다!
추가로 오늘은 부가적인 사전지식을 위에 두지 않고 글 중간중간에 섞어서 작성해 봤다. 어떻게 작성하는 것이 전달력이 좋을지 조금 더 고민해보려 한다. 누구든 이와 같은 피드백을 주신다면 고마울 거 같다. 이 글을 통해 GMM에 대한 이해가 완벽하기 되었기를 바라며!
'머신러닝 > 아맞다' 카테고리의 다른 글
SVD (Singular Value Decomposition) 수식적 이해 (0) | 2023.09.23 |
---|---|
Eigenvalue Decomposition (EVD)의 수식 기초 (0) | 2023.09.16 |
머신러닝 앙상블 기초, bagging, boosting, stacking, random forest 기법 (0) | 2023.08.26 |
Fisher LDA 이론 정리 (0) | 2023.08.20 |
EM(Expectation-Maximization) 알고리즘의 완벽한 기초 (3) | 2023.08.13 |