5기(210102~)/B팀

모두의 딥러닝 2 Lec 10 ~ 13 review

KAU-Deeperent 2021. 1. 29. 22:16

2021-01-23

온라인 스터디

황준성 김정민 서지민 김주안 차원범 문종연

 

1-1) Probabilistic Perspective

머신러닝은 주어진 데이터를 가장 잘 설명하는 '함수'를 찾는 알고리즘을 디자인하는 것이라고 볼 수 있다. 이를 확률적 관점에서 보면, 머신러닝은 '확률 밀도'를 찾는 것으로 생각할 수 있다. 즉, 함수 대신 '확률 밀도'를 찾는 것을 목표로 하고, 적절한 확률 분포의 parameter를 유추하는 것이다. 

 

Function parameter -> Probability Density Function parameter


1-2) Maximum Likelihood Estimation (MLE) : Probability Theory

랜덤 변수에 대한 parameter를 estimate하는 방법이다.

동전을 n번 던졌을 때 p의 확률로 앞면이 나온다고 하면, 앞면이 나올 MLE는 p/n이 되겠다. 일반적으로는 동전을 던졌을 때 앞면이 나올 확률(Probability)은 0.5이지만, 만약 이 동전이 찌그려져서 앞면이 나올 확률을 확정지을 수 없다고 해보자. 실제로 던져봐야 그 확률을 알 수 있는데, 그 때 동전을 던져 앞이 나올 확률을 P라고 하자. 실제로 1000번을 던져봤더니 앞이 400번, 뒤가 600번 나왔다면 우리는 직관적으로 앞면이 나올 확률은 0.4라고 생각할 것이다. 실제 이런 일이 발생할 가능성을 최대로 하는 P, MLE는 0.4가 된다.

앞면이 나올 확률  p에 대한 likelihood  L의 값

앞면이 나올 p에 대한 확률이 위와 같은 분포 보인다고 하자. 위의 상황에서 p=0.4일 때 L의 값이 최대가 된다는 것을 알 수 있다. MLE는 가능성과 확률에 대한 직관을 수리적으로 표현한 것이라고 생각할 수 있다.

 

베르누이 분포

조금 더 수학적으로 설명해보겠다. 어떤 사건이 일어날 확률을 Theta라고 하고, 이는 베르누이 분포를 만족한다고 하자. 이 때 우리가 실행한 n과 k 값을 베르누이 분포의 pdf(Possibility Density Function) 식에 대입하게 된다면 Theta에 관한 함수가 만들어지게 될 것이다. 이 pdf에서 theta에 대한 함숫값(확률)이 최대일 때, 이 값이 MLE가 되는 것이다.

 

어떤 사건이 발생할 가능성이 최대가 되는 값, 즉 MLE를 구하기 위해서는 미분을 이용할 수 있다. 위의 분포에서 가장 최대값을 구하기 위해서는 미분값이 0인 지점을 찾으면 된다. Gradient Descent(or Ascent)를 통해 Observation을 가장 잘 나타내는 MLE값을 구할 수 있다. (수식 증명도 가능)


2-1) Overfitting [과적합]

Machine Learning에서 학습 데이터를 과하게 학습을 시키는 것을 'Overfitting'이라고 한다. 이 때, 학습 데이터에 대해서는 오차가 감소하지만 실제 데이터에 관해서는 오차가 증가하게 된다.

오른쪽 그림에서 빨간색과 파란색 동그라미를 분류하려고 한다. 이 때 우리가 원하는 것은 약간의 오차는 있지만, 검정색 선을 기준으로 분류를 하길 원한다. 하지만 이 학습 데이터에 대해서 과하게 학습을 하게 된다면 초록색 선처럼 동그라미들을 분류하여 'Overfitting'이 일어나는 것이다.

 

이러한 Overfitting을 그래프에서도 살펴보자.

epoch를 거듭할수록 당연히 Train Loss가 줄어드는 것을 확인할 수 있다. 하지만 어느 정도 구간부터는 Overfitting이 일어난다. 그 구간 이후에는 Validation Loss가 증가하게 된다.


2-2) Overffting 방지

과적합을 방지하기 위한 방법으로 Regularization을 이용한다. 이에 대한 방법으로 Early Stopping, Reducing Network Size, Weight Decay, Dropout, Batch Normalize 등이 있다.

 

1) Early Stopping

Validation Loss가 증가하는 시점부터 Overfitting이 일어난다. 따라서, Validation loss가 더 이상 낮아지지 않을 때, 학습을 중지하면 과적합을 방지할 수 있다.

 

2) Reducing Network Size

말 그대로, 신경망의 사이즈를 줄이는 것을 말한다. Overffting의 '과적합'이라는 의미를 다시 생각해보면 당연한 이야기이다. 쉽게 이야기 해보기 위해 예시를 들어본다. 남자와 여자를 구분하는 모델에 있어서 키, 몸무게, 눈동자색, 손톱길이 전부를 고려하면 역효과가 난다. 눈동자색과 손톱길이는 분류에 있어서 혼돈만을 가할 뿐이다. 따라서 feature의 갯수를 줄여 신경망을 단순화시킬 수 있도록 한다.

 

3) Weight Decay 

함수의 복잡도를 단순화시키는 방법이다. Cost function을 수정하여 Local noise를 줄인다. 전체적으로 W의 절댓값이 작아지도록 하면, 분류하는 선이 덜 구불구불해져 과적합을 방지할 수 있다.

다른 방식으로 표현하면 학습된 모델의 복잡도를 줄이기 위해 학습 중 weight가 너무 큰 값을 가지지 않도록 Loss function에 weight가 커질 경우에 대한 패널티 항목을 집어 넣는다. 이 때 패널티에 대한 것으로 L1, L2 Regularization을 사용한다.

 

Dropout, Batch Normalization은 다음 review 때 다루겠다.


3-1) MINST (Modifited National Institute of Standards and Technology database)

손으로 쓴 숫자들로 이루어진 dataset이다. 숫자인식을 학습할 때 많이 이용한다.


3-2) Tensorboard

구글의 Tensorflow에서 만든 데이터 시각화 도구이다. 학습의 실시간 추적 기능과 모델의 그래프화 등 여러 기능이 존재한다. Pytorch 또한 Tensorboard를 지원한다.

Tensorboard의 add_image함수를 통해 Tensorboard 창에 dataset image를 띄워 확인할 수 있다.


4-1) Perceptron

초기의 형태의 인공신경망으로, 다수의 입력으로부터 하나의 결과를 내보내는 알고리즘이다. 각 입력 값이 가중치와 곱해져 인공 뉴런으로 보내지고, 그 곱들의 합과 threshold의 값을 비교하여 결과를 구한다. threshold값을 좌변으로 넘기고 이를 bias형태로 표현할 수 있다.

perceptron은 단일 Layer perceptron을 일반적으로 칭한다. 아래 그림은 AND, OR을 하나의 선(layer)로 구분을 한 것이다. 하지만 XOR은 하나의 layer만으로는 0과 1을 구분하기가 쉽지 않아, single neural network로 표현할 수 없다.

따라서 XOR와 같은 문제를 해결하기 위해 'Multi Layer Perceptron' 방법을 고안해냈다. 이는 아래 그림과 같이 여러 개의 Layer로 구성된 Neural Network이다. 

하지만 MLP를 구현하기 어려워 한동안 암흑기를 겪었으나, 'Backpropagation'의 개념을 통해 이를 해결할 수 있었다. 


4-2) Backpropagation

MLP를 구현하기 위해 고안되었다. 각각의 지점(Layer)에서 각각의 입력이 output에 미치는 영향을 계산하여 이용하도록 한다. 밑의 그림의 화살표가 가리키는 layer를 통과할 때, 각각의 값이 output에 얼마나 영향을 미치는지를 생각해보자.

우선 각 지점에 대한 '미분 값'을 구한다. 

왼쪽 식과 같은 미분 값을 'w가 f에 미치는 영향'이라고 생각하자.

만약, 이 값이 5인 경우에는 w가 1만큼 바뀌었을 때 f는 5만큼 바뀐 것을 알 수 있다. 미분의 정의를 생각하면 쉬운 개념이다.

 

자, 그럼 위에서 이야기 했던 '어떠한 값이 또 다른 값에 미치는 영향'은 미분값을 통해 구할 수 있음을 알았다. 이를 이용하여 input이 output에 미치는 영향을 구할 수 있도록 해보자.

f=wx+b라고 하자. 위 식에서 input은 w,x,b가 될 것이고 output은 f가 될 것이다. 그렇다면 입력 w가 출력 f에 미치는 영향을 구하기 위해서는 f=wx+b식을 w에 대해 편미분 하면 된다.

 

<Single Layer Perceptron>

Layer의 개념을 이해하기 위해 g라는 부분을 만들어서 Layer가 하나 생겼다고 가정하자. 이 때 g=wx가 되고, 전체적으로 바라본다면 f=g+b이다. 이런 경우에는 'chain rule'을 사용하여 구할 수 있다.

이 때, g가 w에 미치는 영향은 'forward' 방향으로 구한 식 g=wx를 미분하면 구할 수 있다.

더불어 f가 g에 미치는 영향은 'backward' 방향으로 구한 식 f=g+b를 미분하면 구할 수 있다. 이 때 backward로 여러 layer들에 대해 하나씩 미분해서 input에 대한 output의 영향을 구하는 과정을 backpropagation이라고 한다.

 

<Multi Layer Perceptron>

위 같은 경우는 g에 대한 1개의 layer밖에 존재하지 않았지만, 실질적으로는 여러개의 multi layer가 존재하게 된다. 이 때 input이 output에 미치는 영향을 구하기 위해서는 chain rule을 계속적으로 이용해야 한다.  

위 그림에서 'O'는 layer를 나타내므로, multi layer를 가지고 있음을 알 수 있다.

여기서 input인 x,y가 output인 f에 끼치는 영향은 보라색 미분식을 말하는데, 이를 구하기 위해 chain rule을 이용한다. 

[Forward] 초록색 미분식의 경우에는 쉽게 g=xy임을 구하고 이를 미분하여 값을 구할 수 있다.

하지만 갈색의 미분식을 한 번에 구할 수는 없다.

[Backward] 따라서 위에서 설명했던 'backpropagation'방식을 사용하는 것이다. f=a+b라는 식을 통해 a가 b에 미치는 영향(미분값)을 구한다. 그리고 이전 layer의 결과값이 a에 미치는 영향을 구한다. 다시 chain rule을 사용하면 이전 layer의 결과값이 f에 미치는 영향을 구할 수 있다. 이 방법을 뒤에서부터 계속하다보면 갈색의 미분식, 즉 g가 f에 미치는 영향을 구할 수 있게 된다. Output f부터 시작하여 Input x,y까지 되돌아가는 것이다.

 

초록색 미분식갈색의 미분식을 이용하여 보라색의 미분식, 즉 input이 output에 미치는 영향까지도 구할 수 있는 것이다.

 

총 과정을 정리해서 설명해보자면,

어떠한 input data를 forward방향으로 training시킨다. 하지만 이렇게 된다면 어느 부분에서 error가 발생했는지 확인하기가 어렵다. 따라서 backward방향으로 'backpropagation'하면서 어느 부분에서 error가 발생했는지 확인을 하는 것이다. 'chain rule'를 통해서 각각의 지점에서 각각의 입력이 output에 미치는 영향을 알 수 있다. 그렇기 때문에 error가 발생하면 어떠한 부분을 수정을 해야하는지 쉽게 파악할 수 있다.

 

즉, backpropagation은 target값과 실제 모델이 계산한 output이 얼마나 차이가 나는지 구한 후 그 오차값을 다시 뒤로 전파해가면서 각 노드가 가지고 있는 변수들을 갱신하는 알고리즘이라고 이해할 수 있다.