Deep Learning 1 - ML Overview
Before starting
“Class” 카테고리에 있는 포스팅들은 실제로 수업에서 배운 내용을 정리하려는 목적으로 작성되었다. 이 글은 그 중 Deep Learning 과목의 수업을 다룬다.
Machine Learning in a Nutshell
딥러닝은 머신러닝의 한 갈래이므로 머신러닝을 먼저 알아야 한다. 머신러닝 하면 떠오르는 대표적인 예시인 MNIST(Modified National Institute of Standards and Technology)를 가져와보자. 여기의 데이터는 각각 28x28 크기의 이미지로 되어있다. 즉, 이미지 하나당 픽셀이 28 * 28 = 784개 존재하므로 784차원의 데이터이다.
이 이미지셋을 이용해서 손글씨를 인식하는 프로그램을 만드려고 한다. 그런데 전통적인 알고리즘으로는 손글씨를 숫자로 변환시키는 일반적인 Rule을 만들기가 매우 어렵다. 그 이유는 당연히 같은 숫자를 가리키더라도 모양이 다 조금씩 다르기 때문이다. 각각의 모든 경우에 대해 일일이 찾아내려고 해도 가능한 Variation이 너무 많아서 일반화가 어려운 상황이고, 이럴 때 머신 러닝을 쓰면 된다.
구체적으론, 다음과 같은 상황에서 머신러닝을 사용하면 효과를 볼 수 있다.
- 사람이 설명할 수 없는 경우: 음성 인식, 손글씨 등등 사람은 자연스럽게 하지만 “왜” 그게 되는지에 대해 명확한 이유를 설명할 수 없을 때
- 전문가가 존재하지 않을 경우: 사전 지식이나 이론적 배경이 없어서 모르지만 데이터는 존재할 때
- 솔루션을 알고는 있으나 시간에 따라 계속 변하는 경우
- 솔루션이 특정한 상황에 따라 달라져야 할 때: 성장함에 따라, 혹은 안경 등의 여부로 인한 변화를 캐치해야 하는 얼굴인식 같은 경우
전통적인 프로그램은 데이터(Input)과 알고리즘이 주어지면 그에 맞는 적절한 출력(Output)을 리턴하는 구조인 반면, 머신러닝은 Data와 이를 기반으로 한 Desired Output이 주어져 있고, 이들을 기반으로 패턴을 찾아 이 문제를 풀 수 있는 일반화된 Rule을 알아낸 후 이를 새로운 Input에 적용해서 답을 도출하는 방식이다.
아까의 그 손글씨 인식 문제로 다시 돌아가면, 데이터셋 $N$개를 준비한다. 여기서는 데이터 1개당 28x28 크기의 이미지, 즉 784차원의 벡터가 된다. 그리고 정답이 될 수 있는 집합 $\Large y$를 생각해본다. 여기서는 당연히 인식된 숫자, 즉 $\lbrace 0, 1, \ldots, 9 \rbrace$가 된다. 그리고 학습을 하기 위해 적절한 알고리즘, 즉 함수 $f(x)$를 정한다.
그런데 이 함수는 $x \Rightarrow f(x;\theta) \Rightarrow y$를 만족해야 한다는 것만 알고 어떻게 생겨야 하는지는 모른다. 다만 $\mathbb{R}^784 \rightarrow \lbrace 0, 1, \ldots, 9 \rbrace$가 되어야 한다는 것만 알 뿐이다. 여기서는 별 수 없이 가설을 세워서 하나하나 최적화를 해본 후 검증을 해야 한다. 그리고 Bayes classifier, CNN, SVM, Gaussian mixture model, Hidden Markov model 등이 전부 이 $f$의 형태를 의미한다.
그런데 위의 단계 사이에 하나를 더 끼워넣어야 한다. MNIST 데이터셋만 봐도 손글씨가 그려지지 않은 빈 공간 등이 존재하기 때문에 784차원의 모든 정보가 전부 유의미하진 않다. 이런 데이터들을 걷어내고 유의미한 부분만 추출해서 모델에게 줘야 모델의 부담이 줄어들 것이다. 이 과정을 Feature Extraction, 혹은 Feature Representation이라고 한다. 당연하지만 굳이 이런 명확한 부분이 아니더라도 각종 최적화 방법을 통해 데이터의 차원을 가능한 한 줄이려고 하는 노력들이 모두 포함된다.
즉, 전통적인 머신러닝의 Training 세션은 다음의 파이프라인을 따르게 된다.
- Collecting training samples - 데이터 수집
- Preprocessing - 노이즈 제거 등의 기본 전처리
- Feature extraction/representation - 차원 압축
- Feature selection - 유의미한 데이터 추출
- Classifier/regressor learning - 모델 선택 및 최적화
위의 과정을 거쳐 학습이 완료되었으면 다음의 순서로 Testing 세션을 수행하게 될 것이다.
- Given testing samples
- Preprocessing
- Feature extraction/representation
- Feature selection
- Outputs from classifier/regressor
즉, 1~4 과정이 모두 동일하며, 5번도 사실상 같은 일을 하는 셈이다. 위의 전처리 과정들을 한번 정의해서 그대로 훈련시켰으면 실제로 추론을 할 때도 동일한 과정을 거쳐야만 한다는 의미이다.
Machine Learning Basics
그럼 이제 간단한 예시를 가지고 위의 과정들을 따라가보자.
목표는 $sin(2\pi x)$를 추정하는 것이다. 이를 위해 $0 ~ 1$ 사이의 랜덤한 수 10개를 뽑은 후, 그 각각의 값들에 대한 $sin$값을 계산하고, 거기에 Gaussian noise를 추가한다. 여기서 노이즈를 추가하는 것은 이론과 달리 실제 데이터는 노이즈가 끼어있는 경우가 많기 때문이다.
그러면 위와 같은 형태의 점 10개를 얻을 수 있다. 당연하지만 임의로 뽑힌 10개의 값, 그리고 노이즈의 상태에 따라 이 데이터셋은 달라질 것이다. 그리고 이 데이터들만 가지고, 즉 $sin(2\pi x)$에서 왔다는 사실을 잠시 잊고 원래의 함수를 찾는 것이다.
그럼 우선 해야할 것은 데이터의 특성을 파악해서 적절한 함수를 선정하는 것이다. 위의 데이터셋의 형태를 보면 적어도 선형 그래프는 아니라는 것은 확실하다. 그러면 가장 쉽게 생각할 수 있는 것은 아래와 같은 형태의 Polynomial function이 될 것이다.
\[y(x, w) = w_0 + w_1x + w_2x^2 + \cdots + w_Mx^M = \sum_{j=0}^{M}w_jx^j\]물론 이것은 가설이니 이게 정답인지 아닌지는 잘 모른다. 그렇기 때문에 여러 모델을 놓고 비교를 해야하며, 이를 Model Selection이라고 한다. 그리고 사실 위의 식에서 다항식의 차수 $M$ 또한 우리가 미리 결정해야 하는 사항이다. 당연히 $M$에 따라 함수의 형태가 달라지기 때문이며, 이 때문에 다양한 $M$에 따라 테스트를 하는 것으로 일단은 위의 과정을 갈음했다고 할 수 있을 것이다.
그런데 위의 함수의 형태를 다시 생각해보자. 분명 위 함수는 $x$에 대해선 Polynomial function이다. 그런데 우리가 구해야 하는건 $x$가 아니라 $w = \left[w_0, w_1, \ldots, w_M \right]^T$이다. 위 식을 $w$의 공간에서 생각해보면 이건 선형이다. 그렇기 때문에 이 모델은 Linear Model이라고 부르며, 사실 굉장히 간단한 형태가 된다.
다음으로 해야 하는 것은 얼마나 정확한지를 판단할 기준, 즉 Loss Function이다. 손실 함수의 디자인도 중요한 문제지만 여기서는 실제 값과 예측 값의 차이를 제곱한 값, 즉 MSE(Mean Square Error)로 계산할 것이다.
제곱을 취한 이유는 두 가지가 있는데, 하나는 이 상황에선 손실함수가 음수인 것이 특별한 이유를 가지지 않으며 오히려 상쇄될 위험을 없애게 하기 위함이고, 두번째는 손실함수가 미분이 가능해야 추후 계산하기 편하기 때문이다. 물론 음수로 떨어지는게 중요한 상황이라면 음수가 나오는 그대로 써는 것이 맞다. 음수를 없애는 방법 중 대표적인 다른 방법인 절댓값은 위의 미분가능성 문제 때문에 여기서는 쓰지 않을 것이다.
그러면 이제 전체 데이터셋에 대한 오차, 즉 Empirical Risk를 정의하면 다음과 같다.
\[E(w) = \dfrac{1}{2}\sum_{n=1}^{N} \left\lbrace y(x_n, w) - t_n \right\rbrace^2\]그리고 우리의 목표는 이 $E(w)$가 최소가 되게 하는 $w$를 찾는 것이고, 이제 이 문제는 최적화 단계로 넘어가게 된다.
여담으로, 딥러닝에 이르러서는 위의 최적화 과정을 1번만 하는 것이 아니라 여러 번 반복해서 수행한다고 한다.
그러면 이 문제를 어떻게 최적화시킬까? 우리가 정의한 함수의 형태는 $w$의 공간에서 Linear Function이고, 손실함수는 이 값을 제곱하는 형태다. 즉, 우리가 최적화해야 할 Empirical Risk는 결국 $w$에 대한 2차식의 형태가 된다. 그렇기 때문에 이 함수를 미분하면 0이 되는 지점을 쉽게 찾을 수 있고, 심지어 Unique하다. 그 값을 그대로 쓰면 된다. 이 과정을 수식으로 쓰면 아래와 같다.
\[\begin{aligned} E(w) &= \dfrac{1}{2}\sum_{n=1}^{N} \left\lbrace y(x_n, w) - t_n \right\rbrace^2 \\ y(x, w) &= \sum_{j=0}^{M}w_j x^j \\ \dfrac{\partial E(w)}{\partial w_i} &= \sum_{n=1}^{N} \left\lbrace \sum_{j=0}^{M} w_j x_n^j - t_n \right\rbrace x_n^i = 0 \\ \sum_{n=1}^{N} \sum_{j=0}^{M} w_j x_n^{i+j} &= \sum_{n=1}^{N} t_n x_n^i \end{aligned}\]그럼 이제 위의 모델의 형태를 결정하기 위해, 차수 $M$을 정해보자. 사실 $M$이 몇이어야 최적인지는 해보기 전까진 모르기 때문에 다양한 $M$에 대해서 학습을 시켜봐야 한다. 이를 Model Selection 혹은 Model Comparison이라고 한다. 다음은 몇가지 $M$에 대한 학습 결과를 나타낸 것이다.
위의 결과에서 보이는 몇 가지 특징을 꼽자면 다음과 같다.
우선 $M=0$이면 전혀 비슷하지도 않다. 사실 이 경우엔 예측값이 $x$의 함수로 표현되지도 않으므로 뭔가 배우는 것도 없긴 하다. $M=1$이면 뭔가 배우기는 하지만 그렇다고 우리가 목표로 하는 답을 잘 찾아낸다고 보긴 어렵다. $M$을 점점 더 늘려서 $M=3$이 되면 $\sin$과 가장 유사한 형태가 되지만, 여기서 $M$을 더 늘려 $M=9$에 도달하면 오히려 $M=1$일 때보다도 튀는 모습을 보이게 된다.
이 예시에서 모델의 차수 $M$이 높아질수록 모델이 복잡하다는 것은 자명하다. 모델이 복잡하다는 것은 모델의 표현력이 좋아진다는 의미이다. 표현력이 늘어날수록 마냥 좋은 것은 아니다.
우선 모델이 복잡해질수록 더 복잡한 상황을 표현할 수 있지만, 그만큼 배워야 하는 파라미터의 숫자가 늘어나게 된다. 이는 곧 학습의 어려움으로 직결된다.
또 모델이 복잡해지면 내가 가진 데이터에 한해서 완벽하게 답을 얻을 능력을 가지게 된다. 위의 예시만 봐도, 데이터의 개수가 10개인 이상 $M=9$의 9차식을 가져오면 어떤 점을 주더라도 이걸 전부 지나가게 하는 함수를 반드시 하나 이상 찾을 수 있다. 이것이 overfitting이다. 반대로 $M \lt 3$이라면 이 모델은 정답인 사인파와 비슷한 형태를 그릴 능력이 부족해서 학습이 제대로 되지 않는다. 이것을 underfitting이라고 한다.
이는 위의 그래프를 보면 더 잘 이해할 수 있다. $M=8$까지는 10개의 점을 다 지나가갈 능력이 부족하다. 그렇기 때문에 $M=3$과 마찬가지로 괜찮게 학습이 되는 모습을 보인다.
그런데 $3 \leq M \leq 8$까지는 거의 차이가 없는건 왜일까? 이는 $M=3$으로도 사인파를 표현하는 데에는 충분하기 때문이다. 즉, $4 \leq M \leq 8$에서는 사실상 불필요한 표현을 하고 있다는 의미이다. 실제로 4~8차항의 계수를 보면 아마도 0에 가까울 것이다. 그렇기 때문에 오차율이 거의 비슷하게 가다가, 모든 데이터를 다 완벽하게 맞출 능력이 되는 $M=9$에서부턴 더 이상 근사할 이유가 없어지므로 과적합이 일어나게 된다.
이러한 과적합이 일어났을 때의 특징을 하나 찾아보자면, 파라미터의 값이 굉장히 커지게 된다. 위의 예시에서도 실제로 학습이 된 각 항의 계수, 즉 파라미터를 비교해보면 다음과 같다.
실제로 $M=9$일 때의 학습 결과를 보면 억지로 데이터셋에 맞추기 위해 그래프의 기울기가 급격하게 변하는 것을 확인할 수 있다. 억지로 데이터셋에 맞추느라 파라미터가 대체로 크게 나올 수 밖에 없고, 반대로 이러한 현상이 보인다면 이는 과적합을 의심해야 한다.
그런데 이 예시는 사인파가 정답이라는걸 알고 있기 때문에 $M=9$에서 이상하게 학습된다는 것을 바로 알 수 있었지만, 실제로 학습할 때는 이게 과적합인지 부적합인지 아니면 적당한 상태인지를 모른다. 그렇기 때문에 일단 단순한 모델에서부터 시작해서 복잡도를 늘리는 방향으로 모델을 바꿔나가는 방식을 베이스로 삼아야 한다.
그럼 과적합을 방지하는 방법은 뭐가 있을까? 우선 데이터의 개수를 늘리는 방법이 있다. $M=9$에서 과적합이 발생하는 이유는 우리가 가진 데이터가 딱 10개밖에 없어서 $M=9$로 모든 점을 강제로 지나가게 하는 것이 가능하기 때문이다. 그러면 데이터의 개수를 늘리면 $M=9$로도 모든 점을 다 지나가게 할 수 없으니 해결되지 않을까?
실제로 해결된다! 데이터를 5개 늘려서 15개만 되어도 그럴싸한 모양이 나오며, 더 늘려서 100개가 되면 상당히 유사하게 나온다. 과적합은 어디까지나 “우리가 가진 데이터의 개수에 비해” 모델의 표현력이 너무 좋아서 발생하는 현상이니, 그 좋은 표현력으로도 강제로 맞추지 못할 정도로 데이터를 많이 제공하면 과적합은 발생하지 않는다.
또 다른 방법은 과적합이 되면 파라미터의 값이 터무니없이 커진다는 점을 이용하는 것이다. 즉, 우리가 최소화시켜야하는 그 Empirical Risk에 아래와 같이 파라미터에 대한 항을 페널티로 추가하는 것이다. 이러한 방식을 Regularization이라고 한다.
\[E(w) = \dfrac{1}{2}\sum_{n=1}^{N} \left\lbrace y(x_n, w) - t_n \right\rbrace^2 + \dfrac{\lambda}{2}\lVert w \rVert^2\]즉, 모델이 자기 자신의 계수도 너무 커지지 않도록 조정하게 만든다. 여기서 $\lambda$는 그 계수 페널티를 얼마나 중요하게 볼 것일지를 결정한다. 이 값은 데이터로부터 찾는 값이 아니고 우리가 직접 설정해줘야 하는 값이며, 이를 Hyper parameter라고 부른다.
$M=9$일 때 $\lambda$를 조정하면서 학습을 시켜본 것이다. 위의 결과에선 $\ln \lambda = -18$일 때가 가장 괜찮게 학습이 되었다. 즉 이 때가 가장 균형을 잘 잡은 것이다. 이보다 $\lambda$가 더 커지게 되면 모델이 학습하면서 파라미터를 줄이는 데에만 치중하게 되어 일직선에 가깝게 나올 것이다.
Linear Basis Function Models
우리가 아까 작성한 모델은 선형 결합이었고, $y(x, w) = \sum\limits_{j=1}^{M}w_j x^j + w_0$ 형태로 쓸 수 있다. 그런데 여기서 $x^d$ 또한 $x$에 대한 함수니까, 이걸 보다 일반적으로 표현하면 다음과 같이 표현할 수 있다.
\[y(x, w) = \sum_{d=1}^{D}w_d x_d + w_0\]이 표현을 보면, $x$와 $w$ 각각에 대한 선형결합이다. $x$에 대한 선형결합은 너무 단순한 형태의 모델이라 심각한 성능적인 한계점이 존재하는데, 이를 극복하기 위해 $x_d$를 $x^d$ 형태의 간단한 형태가 아니라 다른 비선형 함수를 사용해서 모델의 복잡도를 끌어올릴 수 있다.
\[\begin{aligned} y(x, w) &= \sum_{j=1}^{M-1} w_j \phi_j(x) + w_0 \\ &= \sum_{j=0}^{M-1} w_j \phi_j(x) \\ &= w^T\phi(x) \end{aligned}\]그러면 $\phi_j$에 어떤 함수가 들어갈 수 있을까? $\phi_j(x) = x^j$ 말고도 다음과 같은 형태들이 주로 쓰인다.
Radial Basis Function(RBF) \(\phi_j(x) = \exp \left\lbrace -\dfrac{(x-\mu_j)^2}{2s^2} \right\rbrace\) 이 함수를 그대로 그려보면 가우시안 분포와 같은 형태가 나온다. 여기서 $\mu_j$와 $s$는 원래 가우시안 분포처럼 평균과 표준편차에 관여하는 변수이다. 물론 우리는 이걸 지금 확률분포의 의미로 쓰고 있진 않지만 말이다.
Sigmoidal Basis Function \(\phi_j(x) = \sigma \left(\dfrac{x-\mu_j}{s}\right), \sigma(a) = \dfrac{1}{1 + \exp(-a)}\) 혹은 $\tanh(a) = 2\sigma(2a) - 1$이기 때문에 그냥 $\tanh$ 함수라고도 부른다.
Fourier, Wavelet, …
물론 하나만 쓰라는 법은 없다. 지금 하는 것은 어디까지나 모델의 복잡도를 끌어올리기 위한 수단이기 때문에, 위의 기저함수들을 여러개 섞는게 더 결과가 좋을 것 같으면 그렇게 해도 아무 문제는 없다. 물론 뭐가 정답일지는 해보기 전까진 모른다.
이렇게 모델을 변형했더라도 전체적인 개념은 바뀌지 않으며, 손실함수 및 risk를 계산하는 부분도 예외는 아니다.
\[E(w) = E_D(w) + \lambda E_w(w)\]위에서 다룬 regularization 개념까지 도입하면 이렇게 일반화시킬 수 있겠다.
이제 조금 특별한 경우를 보자. 손실함수를 MSE로 가정하고, Regularization term을 아래처럼 일반화시켜보자.
\[E(w) = \dfrac{1}{2}\sum_{n=1}^{N} \left\lbrace t_n - w^T\phi(x_n) \right\rbrace^2 + \dfrac{\lambda}{2}\sum_{j=1}^{M}|w_j|^q\]여기서 $q$라는 변수가 새로 등장했는데, 이 $q$에 따라 뒤의 Regularization term은 $w$ 공간에서 다음과 같이 변화한다.
즉 $q$가 커질수록 점점 사각형에 가까워진다. 이 중 특히 $q=2$일 때를 quadratic regularizer, 혹은 ridge regressor라고 부르고, $q=1$일 때를 LASSO(Least Absolute Shrinkage and Selection Operator)라고 부른다.
위 그래프에서 파란색 원이 risk term, 즉 $E_D(w)$다. 가운데 중심으로부터 퍼지는 형태가 되고, 이를 최소화시키는 지점을 찾아야 한다. 아래 원형, 혹은 다이아몬드 형태의 사각형은 regularization term, 즉 $E_w(w)$이고, 이 크기는 hyper parameter $\lambda$에 의해 결정된다. 우리의 목표는 Regularization term 위의 점 중, $E_D(w)$의 값이 가장 작은 지점을 찾는 것이다.
그런데 $q=1$일때, 즉 LASSO에서는 $w_1=0$이 된다. 즉, 이 상황에선 $w_1$은 무의미하다는 의미가 된다. 이것이 $q=1$을 쓰는 핵심적인 이유가 된다. 즉, 어떤 파라미터가 중요하고 그렇지 않은지를 찾아낼 수 있게 해준다.
Linear Classification
우리가 지금까지 본 문제, 모델, 상황들은 전부 값이 하나로 정해지는, 즉 Regression 문제였다. 그러면 Classification 문제는 어떻게 해결할 수 있을까? 답을 정해진 선택지 중에서 하나로 골라야 하니 더 쉽겠지만, 사실 수학적으론 더 어렵다. 결국 위의 모든 과정을 수행해야 하는 것은 변하지 않는데, 그렇게 나온 값을 분류를 원하는 각 클래스에 맞게 배정하는 함수가 하나 더 필요하기 때문이다.
\[y(x)=f(w^T\phi(x))\]즉, 위와 같이 함수 $f$가 추가로 필요하다. 이 함수를 Activation function이라고 부른다.
그러면 이 activation function은 어떻게 만들 수 있을까? 우선 간단하게 2클래스짜리 분류 문제를 살펴보자.
이 경우에는 activation function으로 sigmoid를 사용한다.
\[y(x_n) = f(w^T\phi(x_n)) = sigmoid(a_n) = \dfrac{1}{1+\exp(-a_n)} = P(C_1 \mid \phi(x_n)) \text{ , where } a_n = w^T\phi(x_n)\]즉, Sigmoid를 씌운 값을 분류 $C_1$에 속할 사후확률로 해석할 수 있게 된다.
\[p(t=(t_1,\ldots,t_N)^T|w) = \prod_{n=1}^{N}y_n^{t_n}\left\lbrace 1 - y_n \right\rbrace^{1-t_n}\]이렇게 됐을 때 우리의 목표는 위의 우도를 최대화시키는 것이다. 즉 MLE 문제로 변한다. 그런데 여태까지 우리는 손실함수를 계산할 때 전부 최솟값을 찾는 방식으로 구했었다. 또한 위의 우도함수는 직접적으로 계산하기 좀 어렵다. 그렇기 때문에 음의 로그를 취해서 손실함수를 정의한다.
\[E(w) = -\ln p(t|w) = -\sum_{n=1}^{N}\left\lbrace t_n \ln y_n + (1-t_n)\ln (1-y_n) \right\rbrace\]그렇게 나온 손실함수는 위와 같은 형태가 되고, 이걸 Cross-entropy라고 부른다. 여담으로 $-p\ln p$ 형태를 정보이론에서 엔트로피라고 부르는데, Cross-entropy라는 이름은 여기서 유래한 것이다.
그렇다면 여러 클래스가 있는 분류 문제는 어떨까? 2클래스 문제와 비슷한 방식으로 접근하는데, Sigmoid로는 $k$개의 클래스를 구분할 수 없으므로 이를 일반화한 아래의 Softmax 함수를 사용한다.
\[y_k(x_n) = \dfrac{\exp(a_nk)}{\sum_{j}\exp(a_nj)} = P(C_k|x_n) \text{ where } a_nk = w_k^T \phi_n\]여기서도 아까와 마찬가지로 우리의 목표는 아래의 우도를 최대화시키는 것이다.
\[p(T|w_1, \dots, w_K) = \prod_{n=1}^{N} \prod_{k=1}^{K} P(C_k|x_n)^{t_{nk}} = \prod_{n=1}^{N} \prod_{k=1}^{K} y_{nk}^{t_{nk}}\]여기서 $t_n \in \left\lbrace 0, 1 \right\rbrace^K$는 1-of-K coding scheme, 즉 정답에 해당하는 클래스만 1이고 나머지는 모두 0인 벡터고, $y_{nk} = y_k(x_n), T=[t_{nk}]$는 각 변수에 대한 $N \times K$ 행렬이다.
그 후 해야할 것도 마찬가지로 음의 로그를 취해서 Cross-entropy 함수를 만든 후, 이를 손실함수로 정의하는 것이다.
\[E(w_1, \ldots, w_K) = -\ln p (T|w_1, \ldots, w_K) = -\sum_{n=1}^{N} \sum_{k=1}^{K} t_{nk}\ln y_{nk}\]







