본문 바로가기
ML & DL/Study

AutoEncoder (1) : Maximum likelihood 관점에서의 해석

by 별준 2021. 2. 9.
- Reference
Slide : https://www.slideshare.net/NaverEngineering/ss-96581209
강의(youtube) :
(1/3) https://www.youtube.com/watch?v=o_peo6U7IRM&ab_channel=naverd2
(2/3) https://www.youtube.com/watch?v=rNh2CrTFpm4&ab_channel=naverd2
(3/3) https://www.youtube.com/watch?v=LeVkjCuUdRs&ab_channel=naverd2

Naver 이활석님의 'AutoEncoder의 모든 것'이라는 강의를 바탕으로 학습하고 정리하였습니다.


AutoEncoder

위키피디아에서 오토인코더를 검색하면 아래의 결과를 볼 수 있습니다.

출처 : https://en.wikipedia.org/wiki/Autoencoder

오토인코더는 unsupervised 방법으로 효율적인 data coding을 학습하는 artificial neural network의 한 종류입니다.

그리고 data coding을 통해서 data의 representation을 학습하는데 당연히 data가 압축되므로 차원이 축소(dimensionality reduction)됩니다. 

또한, 오토인코더는 reduction 측면과, reconstructing 측면이 함께 학습되며, 압축된 data coding을 통해서 실제 입력과 최대한 가까운 결과를 생성하기 때문에 Generative Model의 역할도 수행할 수 있습니다.

 

위 내용을 토대로 위키피디아에서 오토인코더의 키워드는 다음과 같습니다.

Keword

- Unsupervised learning

- Representation learning (= Efficient coding learning)

- Dimensionality reduction

- Generative model learning

 

주로 오토인코더는 Dimensionality reduction, 차원 축소를 위해서 많이 사용됩니다.

오토인코더의 차원축소는 정확히 말하면 Nonlinear Dimensionality Reduction이며, 이는 Representation learning / Efficient coding learning / Feature extraction / Manifold learning과 동일한 의미입니다.

 

벤지오 선생님이 작성한 기술분류표를 살펴보면, AutoEncoder는 Representation learning에 해당합니다. (오토인코더가 가장 많이 사용되는 유형입니다.)

출처 : http://videolectures.net/kdd2014_bengio_deep_learning/

 

그리고 GAN을 만든 이안 굿펠로우의 분류를 살펴보면, 정확히 VAE(Variational AutoEncoder)의 기술을 따라가다보면 결국 Maximum Likelihood Estimation과 관련이 있는 것을 알 수 있습니다.

 

최종적으로 정리를 하면, 오토인코더는 다음과 같은 4개의 주요 키워드가 있습니다.

오토인코더가 학습할 때,

비교사 학습 방법(Unsupervised learning)으로 학습하고, Loss는 negative ML(ML density estimation)으로 해석되고,

학습된 오토인코더에서,

인코더는 차원 축소 역할을 수행(Manifold learning)하며, 디코더는 생성 모델의 역할(Generative model learning)을 수행합니다.

 

- Revisit Deep Neural Networks

AE, VAE를 알아보기 전에 Deep Neural Network의 학습을 Maximum likelihood(ML) 관점에서 살펴보겠습니다. 

 

(DNN의 학습이 결과적으로 ML estimation과 동일하다는 것을 이해하는 것이 목적입니다.)

 

Classic Machine Learning

전통적인 머신러닝(Machine Learning)의 접근 방법은 다음과 같습니다.

1. 학습을 위한 데이터를 수집하고 데이터셋을 구성합니다.

2. 학습할 모델을 준비합니다. (Hypothesis function / Loss function)

3. Loss function을 최소화하는 파라미터를 찾도록 학습을 수행합니다.

4. 학습이 완료되면 예측을 하는데, 이때 입력과 출력은 고정되어 있습니다.

 

Deep Neural Networks

DNN에서도 일반적인 머신러닝의 절차를 따르지만, 모델을 정의하는 방법에서 약간의 차이가 있습니다.

Deep Neural Network를 모델로 사용하며, 사용되는 Loss function은 다음과 같은 두 가지의 제약이 있습니다.

- Assumption 1 : DNN의 전체 Loss는 각 training sample의 loss의 합이여야 한다.

- Assumption 2 : 각 training sample의 loss는 DNN의 최종 output이어야 한다. -> Loss function의 인자는 True Label과 네트워크의 output만 사용되어야 합니다.

 

이는 Backpropagation을 통해서 DNN을 학습시키기 위한 조건이며, Loss function은 해당 조건들이 만족해야 합니다. Mean Square Error(MSE)나 CrossEntropy(CE)가 해당 조건을 만족하기 때문에 우리는 Loss function으로 주로 MSE나 CE를 자주 보게 되는 것입니다. (Loss function을 아무거나 사용할 수 없다는 의미입니다.. !)

 

학습(Training)은 Loss function을 최소로하는 파라미터는 찾도록 진행하며, 대부분 Gradient Descent의 방법을 사용합니다. (Gradient Descent는 최적화 방법 중의 하나이며, iterative method(반복 수행하면서 최적화)을 사용합니다.

여기서 우리는 어떻게 파라미터 \(\theta\)를 업데이트해야하는가언제 학습을 멈출것인가를 결정해야합니다.

Gradient Descent를 통해서 학습은 Loss 값이 줄어드는 방향<L(\(\theta\) + \(\Delta\theta\)) < L(\(\theta\))>으로 계속 파라미터를 업데이트하며, 더 이상 loss 값의 변화가 없을 경우에 학습을 멈추게 됩니다.

 

그렇다면 여기서 \(\Delta\theta\)는 어떻게 찾는 것일까요?

DNN에서 파라미터의 수는 굉장이 많을 수 있습니다. 따라서, 어떻게 파라미터를 업데이트할 지에 대한 전략이 필요한데 기본적으로 Taylor Expansion에 기초하여 근사할 수 있습니다.

Taylor Expansion을 통해서 L(\(\theta\) + \(\Delta\theta\))를 미분항들을 통해서 나타낼 수 있으며, 2,3,4차 미분항까지 계산하여 오차를 최소화하도록 구할 수 있지만, 계산이 복잡하고 시간이 오래걸리기 때문에 딥러닝에서는 1차 미분항까지만 사용하여 근사화합니다. 만약 더 많은 차수의 미분항을 사용하게 된다면, 오차가 더 작아지게 됩니다.

 

우리는 1차 미분항만 사용하여 근사화하기 때문에, 좁은 영역에서만 감소 방향이 정확합니다. 따라서 learning rate(\(\eta\))를 사용하여서 조금씩 파라미터 값을 변경하는 전략으로 파라미터를 업데이트하게 됩니다.

 

학습의 전체적인 과정을 정리해보면 다음과 같습니다.

준비된 DB를 가지고 모델의 입력으로 사용해서 예측값을 출력하고, Loss를 계산하게 됩니다. 전체 데이터에 대한 Loss는 각 데이터 샘플에 대한 Loss의 합이므로 미분 계산을 효율적으로 계산할 수 있게 됩니다.

(만약 전체 데이터의 Loss가 각 샘플의 Loss의 곱으로 구성되어 있다면, 모든 샘플들의 결과를 메모리에 저장해야하므로 메모리 측면에서 매우 비효율적이며 계산 시간 또한 증가됩니다.)

 

그리고 기본적으로는 모든 데이터에 대한 Loss의 미분값을 모두 합하고 파라미터를 갱신하지만(Redefinition 부분), 효율적인 학습과 학습 속도 증가를 위해서 mini batch별 Loss를 구해서 파라미터를 batch 별로 갱신할 수 있습니다.(Stochastic Gradient Descent)

 

BackPropagation(BP)

DNN은 많은 layer들로 구성되어 있으며, 각 layer마다 weight와 bias로 이루어진 파라미터들이 존재합니다. 그렇기 때문에 엄청난 개수의 파라미터들에 대해서 Loss function의 미분을 계산해야합니다.

이 과정이 매우 복잡하고 엄청난 연산량을 요구하기 때문에 이런 문제로 인해서 BackPropagation(BP, 역전파)가 나오기 전까지 DNN은 암흑기를 겪었으며, BP 알고리즘이 나오면서 이 과정이 매우 수월해졌습니다.

BP의 자세한 내용은 생략하도록 하겠습니다 !

위 수식은 Link에서 확인할 수 있습니다. (BP를 Step by Step으로 잘 설명해주고 있습니다.)

 

 

여기까지 머신러닝/딥러닝의 기본적인 내용을 알아봤고, 다음으로 Loss function에 대해서 살펴보도록 하겠습니다.

Loss Function

BP의 제약조건을 만족하는 것이 MSE나 CrossEntropy이기 때문에 MSE와 CE가 많이 사용된다고 했습니다.

그렇다면 두 Loss function은 어떤 상황에서 가장 적합할까요?

여기서 두 가지 관점에서 살펴볼 수 있는데, 하나는 BP 관점 / 다른 하나는 ML 관점입니다.

 

결론을 우선 말씀드리면,

BP가 잘 동작하는 관점에서 살펴보면 MSE보다는 CE가 더 좋고,

ML 관점에서 살펴보면, Continuous Value에 대해서는 MSE가 더 좋고, Discrete Value에 대해서는 CE가 더 좋습니다.

 

먼저 BP 관점에서 MSE와 CE를 비교해보도록 하겠습니다.

MSE / Quadratic loss

1.0의 입력을 주면 0.0의 출력을 내는 간단한 모델을 생각해봅시다. 이 모델은 weight와 bias의 파라미터를 가지며, activation function은 sigmoid입니다. (입력이 weight와 곱해지고, bias를 더한 후에 activation function을 거쳐 output을 출력합니다.)

BP를 계산하면, 결과적으로 파라미터는 \(w = w - \eta \delta\), \(b = b - \eta \delta\)로 업데이트됩니다.

 

그럼 초기값을 다르게 해서 학습을 수행시켜 보겠습니다.

결과를 보다시피 왼쪽이 훨씬 학습이 잘 된 것을 볼 수 있습니다. 같은 시점에서 오른쪽의 Loss 값이 더 크게 나타나고 있습니다. 초기값만 다를 뿐인데, 초기값이 왜 이런 큰 차이를 발생시켰을까요?

 

결국은 초기값이 다르기 때문에 이런 현상이 발생했는데, BP의 관점에서 살펴보면 다음과 같습니다.

미분식을 살펴보면 activation function의 미분값이 곱해지고 있습니다. 즉, 어떠한 activation function이든지, BP 수식안에 activation function의 미분값이 들어가게 됩니다.

따라서 위 그래프를 통해서 학습이 잘 된 왼쪽의 초기 미분값(어느 정도 값이 있음)이 학습이 잘 안 된 오른쪽의 초기 미분값(0에 가까움)보다 큰 것을 확인할 수 있습니다. 

 

즉, 오른쪽 학습의 경우에는 Gradient 값이 거의 0이기 때문에 파라미터의 변화량이 매우 작게 되고, 학습 초기에 파라미터의 변경이 거의 없으며, 학습이 진행하면서 Gradient 값이 어느 정도 커지기 시작하면서 학습의 속도가 증가하게 됩니다.

반면에 왼쪽 학습의 경우에는 초기부터 Gradient 값이 어느 정도 존재하기 때문에 빠르게 수렴하고 있습니다.

 

Sigmoid의 미분값의 최대가 0.25인데, Deep layer에서 BP를 계속 수행하면서 입력단으로 갈수록 Error의 값이 1/4로 계속 감소하며 결국에는 Gradient Vanishing 문제를 일으켜 학습이 되지 않는 현상이 발생합니다.

그렇다면 activation function의 미분값이 문제이므로, activation function의 미분값을 잘 바꿔주면 해결할 수도 있다는 것을 알 수 있습니다. 따라서 최근에는 ReLU를 activation function으로 많이 사용합니다.

(ReLU가 항상 좋다는 것은 아니며, BP관점으로 이렇게 해석할 수 있다는 것입니다.)

 

Cross Entropy

똑같은 예제로 Cross Entropy를 살펴보도록 하겠습니다. CE로 Loss function을 구성하면, 다음과 같이 Error 값을 구할 수 있습니다.

\[\delta_{CE} = \nabla_{a}C\bigodot \sigma'(z^{L}) = \frac{a - y}{(1 - a)a}(1-a)a = a-y\]

MSE와 비교하면, CE에서는 Error값에 activation function의 미분값이 곱해지지 않습니다.

(다중 layer에서 BP 알고리즘 두번째에서는 activation function의 미분값이 곱해집니다.)

따라서, 아까와 동일한 초기값에서 학습을 진행해도, 초기값이 민감하게 반응하지 않고 두 경우 모두 정상적으로 학습이 진행됩니다.

 

Maximum Likelihood

다음으로 두번째 관점인 Maximum likelihood 관점에서 Loss function을 살펴보도록 하겠습니다.

여기에서는 해석이 매우 중요한데, 네트워크 출력에 대한 해석이 중요합니다.

네트워크의 출력 값이 정답과 가까워지도록 두 값이 차이를 loss function을 통해서 계산해서 차이를 줄여나가도록 학습하는 것은 이전과 동일합니다.

다만, 출력에 대한 해석을 네트워크의 출력(\(f_\theta(x)\))이 있을 때, 원하는 정답이 나올 확률, p(y|\(f_\theta (x)\))이 높도록(최대가 되도록) 하는 관점으로 살펴보는 것이죠.

 

이 관점에서 확률분포에 대한 likelihood값이 최대가 되는 것이 목적이고, 이를 위해서 확률 분포 모델을 미리 정해주어야 합니다. (conditional probability 조건부 확률이 무슨 모델인지 정해주어야 합니다.)

ex) 가우시안 분포, 베르누이 분포

 

예를 들어, 네트워크 조건부 확률의 분포 모델을 가우시안 확률 분포로 설정했다면, 이 네트워크의 출력은 확률 분포를 정의하기 위한 파라미터라고 할 수 있습니다. 그렇다면, 네트워크의 출력은 가우시안 분포를 위한 평균이 되는 것이죠.(여기서 표준편차는 무시했습니다.)

 

즉, 네트워크의 출력값은 우리가 정해놓은 확률 분포의 파라미터를 추종하는 것입니다. 

만약 \(\theta_2\)가 있을 때의 네트워크 출력은 평균이 되고, 그 평균으로 가우시안 분포가 그려지게 됩니다. 그리고, y는 training DB에 의해서 정해진 값이며 고정된 값이 됩니다. 따라서 네트워크 출력에 의한 가우시안 분포와 y값을 통해서 이때의 likelihood값, p(y|\(\theta_2 (x)\))을 구할 수 있습니다.

 

그렇다면 언제 Maximum likelihood를 가지게 될까요?

바로 평균과 y값이 같아질 때 최대의 likelihood를 가지게 됩니다.

 

BP 관점에서는 네트워크의 출력값이 정답과 같아지기를 바라는 것이었다면,

ML 관점에서는 확률이 최대가 되는 추정하는 확률 분포 모델의 파라미터 값이 정답과 같기를 바라는 것입니다.

 

이제 다시 loss function을 살펴보면, loss function은 negative log likelihood로 정의됩니다. 여기서 log는 BP의 제약 조건 중에서 전체 loss는 각 샘플의 loss의 합이라는 조건을 만족시키기 위해서 추가되었습니다.

따라서, \(\theta^\ast = \underset{\theta}{\text{argmin}}[-log(p(y|f_\theta (x)))]\) 를 최적화해서 주어진 데이터를 가장 잘 설명하는 모델을 찾게 됩니다.

 

학습이 완료되어서 모델을 찾게되면, 이는 BP 관점과는 다르게 확률 분포의 모델을 찾았다는 것을 의미하게 됩니다.

그렇게 되면, 새로운 입력에 대해서 확률 분포를 얻게되는 것이고, 이 확률 분포를 통해서 샘플링이 가능합니다.

그렇기 때문에 확률 분포의 성향을 따르는 다양한 출력을 얻을 수 있습니다.

(VAE가 이러한 관점으로 확률 분포를 찾는 학습을 수행합니다.)

 

만약 Maximum likelihood estimation을 수행한다고 한다면, 그 확률분포에서 최대 likelihood를 취하기 때문에 평균으로 출력이 고정이 되므로, MLE를 사용한다면 고정 출력을 얻을 수도 있습니다.

 

Negative log likelihood

조금 전에 Loss function으로 negative log likelihood를 사용한다고 했는데, 이것이 BP의 조건들을 만족하는지 살펴보겠습니다.

\(p(y|f_\theta (x))\)는 i.i.d condition을 만족하는데, 다음과 같은 가정들을 만족합니다.

- 각각의 샘플에 대한 확률은 독립적이며, 데이터 전체의 확률은 각각의 샘플들의 확률을 곱한 것과 동일하다.

- 각 샘플에 대한 확률 분포는 모두 동일한 확률 분포를 사용한다.

이 두 조건들을 만족하기 때문에 BP의 가정들을 모두 만족하게 됩니다.

 

확률 분포 모델은 가우시안 분포와 베르누이 분포를 예시로 살펴보겠습니다. 다른 분포 모델은 수학적으로 어렵다고 합니다.

위의 negative log likelihood를 가우시안 분포와 베르누이 분포에 대해서 최소화되도록 식을 풀면 다음과 같습니다.

식을 풀게 되면, 가우시안 분포의 loss function은 MSE와 동일하게 되고, 베르누이 분포의 loss function은 CE와 동일하게 됩니다. 

따라서 해석상, MSE를 사용한다는 것은 출력값 y의 분포가 가우시안 분포에 가깝다는 것을 의미하고, 네트워크의 출력값이 가우시안 분포를 따르면 MSE를 사용하는 것이 낫다라고 해석할 수 있습니다.

마찬가지로 네트워크의 출력값이 베르누이 분포를 따른다면 CE를 사용하는 것이 낫다고 해석할 수 있습니다.

 

또한, MSE를 왜 사용하냐는 질문에 대해서는 네트워크의 출력이 가우시안 분포를 따른다고 가정하기 때문이라고 설명할 수 있고, CE의 경우에는 베르누이 분포를 따르는 게 좋기 때문이라고 설명할 수 있습니다.

(해석상 이렇게 설명할 수 있다는 것이고, 항상 이런 것은 아닙니다.)

(보통 continuous한 값은 주로 가우시안 분포를 따른다고 가정해서 MSE를 사용하고, discrete한 값은 베르누이 분포를 따른다고 가정해서 CE를 사용하는 것이 낫다고 해석합니다.)

 

마지막으로 정리하자면, Maximum likelihood 관점에서 해석할 때, 네트워크의 출력값은 likelihood값이 아닙니다.

우리는 학습을 통해서 우리가 설정한 확률 분포 모델의 파라미터(ex, 가우시안 분포의 평균과 분산)를 추정합니다.

 

아래는 벤지오느님의 강의 슬라이드입니다.

네트워크 입력 X에 대한 출력 Y의 조건부 확률을 추정하고자 할 때, X가 기본이 아닌 w를 찾는데, w는 네트워크의 출력이 됩니다.

Loss는 BP를 위해서 -logP(Y|X)가 됩니다.

그리고 만약 Y가 가우시안 분포라면, w는 \(\mu, \sigma\)로 구성되고, loss function은 MSE criterion과 동일합니다.

Y가 베르누이(멀티누이) 분포라면 loss function은 CE criterion과 동일하게 됩니다.

'ML & DL > Study' 카테고리의 다른 글

AutoEncoder (3) : AE, DAE  (0) 2021.02.15
AutoEncoder (2) : Manifold Learning  (1) 2021.02.10
Convolutional Neural Network(CNN)  (0) 2021.01.04
Gradient Descent  (0) 2020.12.16
Activation Function (Feat, non-linearity 비선형)  (3) 2020.12.14

댓글