Learning the Network : BackProp/Lec 4

2021. 1. 1. 13:04딥러닝 강의 정리

전 강의에서 Loss function을 미분을 하고 minimum 값을 iterative하게 찾는 방법을 보였다. 그래서 계속 step을 밟아 나아간다면 결국은 converge(수렴)하게 된다. 이때 함수의 종류에 따라 결과가 달라진다. 먼저 Convex함수의 경우에는 항상 minimum을 찾을 수 있다.

하지만 non-convex 함수의 경우 local minimum을 찾을 수도 있다. 

 

전강의에서 Loss function을 아래와 같이 정의하였다. 

이 식에서 f()를 살펴보자. 이것은 생성한 네트워크에서 나온 함수의 output이다.

 

여기서 나온 output 하나를 아래의 식으로 나타낼 수 있다. 

그리고 이것은 generally하게 나타내면 아래와 같다.

이때 이 함수는 미분이 가능해야 한다. 미분이 불가능하면 gradient를 모르게 되고 결국 수정을 할 수 없게 된다.  이때 f(x)는 activation function을 의미하고 아래와 같이 표현이 가능하다. 

 

전체 output은 아래와 같이 벡터로 나타낼 수 있다.

여기서 f()는 set of input을 set of output으로 만들어주고 이 함수를 vector activation이라고 한다. vector activation의 종류로는 softmax가 있다. 

일반적인 네트워크의 구조는 아래와 같다.

각 부분 마다 표기법이 있는데 weight와 bias의 표기법을 보면 아래와 같다.

이제 이 네트워크의 input, output, desire을 벡터로 표기해보자.

여기서 input-output pair는 (X1,d1), (X2,d2)... 이런식으로 표현 할 수 있다. 

output의 종류는 두가지가 있는데 scalar output과 vector output이다.

왼쪽이 Scalar Output, 오른쪽이 Vector Output

 

Multi-class Network를 살펴보면 아래와 같은 구조를 가지고 있다.

labeling이 one-hot vector로 구성되어있고 output은 확률로 표현되어 다 합치면 1이 된다. 따라서 이때 위에서 말한 Softmax activation을 이용한다. 이때 y_i는 class i가 될 확률이며 아래와 같은 식으로 나타낼 수 있다. 

이제 Divergence function을 살펴보자. 그중 한 예는 L2 Div이며 가장 많이 사용하기도 한다. 그 방식은 아래와 같다. 

전 강의에서 Divergence function은 미분이 가능해야한다고 했는데 이것 역시 미분이 가능하다. 

Binary classifier에서는 주로 cross entropy를 사용한다. 

그래프로 나타내면 아래와 같다.

 

이것을 미분하면 아래와 같다. 

이때 주위해야할 것이 예를들어 d=1일때 y도 1일때가 optimal할때인데 이때의 기울기는 0이 아니라 -1이다. L2를 사용할때와는 다르다. 

물론 Binary classifier에서도 L2 divergence function을 사용해도 된다. 하지만 아래 그림을 보면 단점이 보인다.

d=1일때의 L2 loss function은 위의 보라색 그래프 모습을 할 것이다. 업데이트를 할떄 기울기를 가지고 하는데 cross entrophy일때가 정답 부근에서 더 기울기가 가파르고 이것은 업데이트가 더 잘 된다는 것을 의미한다. 

위의 cross entrophy를 multi class classification에 적용해보자. 이때 d는 one-hot vector로 나타내며 정답은 1, 그 외는 0으로 나타낸다. 따라서 아래의 식으로 나타낼 수 있다. 

그리고 이것의 기울기는 아래와 같다. 

이때도 역시 정답일 때 기울기가 0이 아님을 주의해야 한다. 

이를 응용해서 d를 one hot vector가 아닌 정답은 (1-(K-1)e)로 두고 그외는 e로 두는 방법도 사용한다. 이 방법은 Label smoothing을 만들며 gradient descent를 더 잘 되게 하도록 한다. 아래는 그에대한 식이다. 

이제 Neural Network를 gradient descent로 training하는 법을 살펴보자. 우선 Total training Loss는 아래와 같이 나타낸다. 

이 div의 Y는 output값이고 weight와 input의 weighted sum으로 이루어진 결과이다. 따라서 우리는 weight를 수정하고 싶음으로 이 Loss값을 각각의 weight에 대하여 편미분하여 weight가 바뀔때 Loss값의 변화의 정도를 살펴보고 수정하면 된다. 따라서 수정하는 법은 아래와 같다. 

그리고 이식에서 Loss를 편미분한것은 다음과 같이 쓸 수 있다. 

계산 과정을 보기전에 간단한 미적분학에 대해 집고 넘어가자.

y = f(x)라는 함수를 미분하면 x의 변화량에 대한 y의 변화량은 다음과 같이 나타낼 수 있다. 

또한 이 x가 multi variable이면 다음과 같이 나타낼 수 있다. 

그리고 chain rule도 알아보자. 

위의 두 성질을 이용하면 아래와 같이 서로 멀리 연결되어 있는 요소들간의 관계를 파악할 수 있다. 

multi variable일 때 역시 같은 방식으로 표현이 가능하다. 

위를 다이어 그램으로 나타내면 좀더 파악이 쉬워진다. 

x에서 y로 가는 길목에 g()라는 함수가 있어서 변화율을 관찰할 때 x에대한 g를 미분하고 그다음 g에대한 y를 미분해야 하는 것이다. 

 

그렇다면 우리가 궁극적으로 해야하는 는 어떻게 해야하는 것일까? 아래 그림을 우선 살펴 보자. 

이러한 네트워크로 구성되어있을 떄 div를 weight에대해 미분하려면 먼저 네트워크를 한번 계산을 해주어야 한다. 그 이유는 아래와 같다. 

먼저 y를 z에대해 미분을 하려면 z의 위치를 알아야 한다. 그래야 미분값을 계산할 수 있기 떄문이다. 그럴러면 2번째 hidden layer의 output이 필요하고 그를 위해서는 activation에 들어가기전의 결과 z를 알아야하고 결국은 모든 네트워크를 한번 forward path로 계산을 해줘야 미분값을 구할 수 있는 것이다. 

그 순전파들에 대한 계산 결과는 아래와 같다. 

그런다음 이에대한 drivative를 구한다. 먼저 divergence function에 대한 derivative를 구하는 것으로 시작한다. 

그다음 chain rule에 의해 z에대한 divergence function의 derivative를 구한다. 여기서는 편의상 두번째 뉴런인 z_1에대한 derivative를 구하였다. 

이러면 위에 빨간색 동그라미는 바로 직전에 이미 구한 결과 값임으로 y에대한 z의 미분값만 구하면 된다. 따라서 아래의 식으로 바꿀 수 있다. 

여기서 f()는 activation function의 식이다. 

그다음은 wN에 대한 derivative를 구한다. (사진의 파란선은 w_41인데 11로 잘못나온듯 하다)

그런데 z를 w에대해 미분하려고 보니 weighted sum이여서 미분의 결과는 y만 남게 된다. 따라서 아래와 같은 식으로 나타낼 수 있다. 

이것을 일반화 하면 아래와 같다.

이제 y에 대한 derivative를 구해보도록 한다. 

y는 그 다음 단의 뉴런 갯수가 j개라면 각각의 펼쳐져 있는 y의 미분 값을 모두 구한 뒤 더하면 된다. 

그런데 z를 y에 대한 식으로 나타내면 weighted sum임으로 아래와 같은 식이고 

이를 y에 대해 미분하면 w만 남게 된다. 따라서 아래의 식으로 나타낼 수 있다. 

이를 일반화 하면 아래와 같다. 

이 과정을 input layer까지 하면 된다.