※ 본 내용은 stanford에서 제공하는 cs231n 강의, 강의자료를 바탕으로 작성하였습니다.

 

Assignment2 에서는 코드보다는 진행했던 실험에 대한 결과와 구현 시 어려웠던 점을 중점적으로 정리할 예정이다.

 

 

<Batch Normalization>

https://vstylestdy.tistory.com/38

 

[Lec6] Training Neural Networks, Part 1

※ 본 내용은 stanford에서 제공하는 cs231n 강의, 강의자료를 바탕으로 작성하였습니다. Lecture 6에서는 신경망의 학습에 대해서 다루고 있다. 학습시키기 위해 주의할 점이나 training process 를

vstylestdy.tistory.com

Batch normalization에 대해 강의에서 다룬 내용을 정리해둔 글이다.

이론적 내용은 위 글을 참고 하면 되겠다.

Batch Normalization 수식

Q2에서는 batch normalization layer를 구현하는 내용을 진행하였다.

 

Affine이나 ReLU 등을 layer로 구현하여 forward, backward 연산을 구현한 것처럼 batch normalization에 대해서도 forward, backward를 구현하면 된다. 

 

그 중 역전파를 계산하는 과정이 복잡했어서 해당 내용에 대해 정리하겠다.

 

 

BN back propagation

먼저 batch normalization을 계산 그래프로 표현하면 다음과 같다. 

Batch Normalization의 계산 그래프

평균을 구하는 mean이나 표준편차를 계산하는 std 등이 일반적이진 않지만, 위 계산 그래프를 바탕으로 역전파를 계산하면 backward()의 수식을 구현할 수 있다.

 

또 하나 주의할 점은 행렬 간의 미분이 필요하다는 점이다.

 

https://vstylestdy.tistory.com/35

 

[Assignment1 - Q4] 2-layer NN

※ 본 내용은 stanford에서 제공하는 cs231n 강의, 강의자료를 바탕으로 작성하였습니다. Q4에서는 affine 계층 및 SVM, softmax loss를 layer로 구현한 후, layer들을 이어붙여 2-layer Neural Network..

vstylestdy.tistory.com

Assignment1 에서 affine layer의 역전파를 구현할 때 사용했던 방법을 그대로 적용했다.

 

직접적으로 미분을 구하기 보다는 chain rule을 이용한다.

 

우선 $ \frac{dL}{dx'} $까지의 역전파 과정을 나타내면 다음과 같다.

(편의상 $ \hat x$를 x'으로 나타내었다.)

 

 

앞서 말했듯이 affine layer때 역전파를 계산한 것처럼 chain rule을 적용하여 계산하면 된다.

 

위 과정 중에서 $\frac{dL}{dx'} $이 r*dout이 되는 과정에 대해서만 chain rule을 통해 계산하는 법을 적용해보겠다.

gamma나 beta에 대한 미분도 동일한 원리를 적용하면 쉽게 유도할 수 있을 것이다. 

 

 

$\frac{dL}{dx'} = r*dout$ 유도

 

$x'$과 $r$의 곱을 $t$라고 하고, dout을 통해 전달되는 값($ \frac{dL}{dy}$)의 i행 j열을 $ o_{ij}$라고 표현하겠다.

(역전파 계산은 생략되었지만, $ \frac{dL}{dy} = \frac{dL}{dt}$ 이다.)

 

 

 

$ \frac{dL}{dx'_{11}}$의 미분만 살펴보면, 위와 같이 계산된다. Matrix 사이의 dot은 element-wise 곱을 의미한다.

 

※ 수식 자체에서 matrix가 사용되는 것은 아니고, scalar간의 합을 한 번에 표현하기 위해서 위와 같이 표현했다.

(좌측의 시그마와 동일한 표현이다.) 

 

$ \frac{dt_{11}}{dx'_{11}}$을 제외한 미분 값은 모두 0이 되므로 $ r_1$과 $ o_{11}$의 곱으로 정리된다.

 

동일한 원리로 나머지 원소의 미분값을 계산하면 $ \frac{dL}{dx'}$은 다음과 같이 $ dout*r$이 된다.

 

 

$ \frac{dL}{dx'}$ 이후의 역전파는 다음과 같이 계산된다. 

마지막의 $ \frac{dL}{dx}$는 3가지로 갈라진 곳에서 전달되는 역전파를 모두 합하면 된다.

 

이번 역전파의 계산도 모두 chain rule을 기반으로 계산하였고, root나 역수 등으로 인해 계산이 조금 껄끄러워지고 식이 복잡해지긴 했지만 그 원리는 동일하다.

 

평균을 구하는 mean 노드와 표준편차를 구하는 std 노드는 조금 새로운데, 막상 계산해보면 특이할 것은 없다.

'mean' 노드의 역전파만 조금 더 자세히 살펴보겠다. 

Mean 노드의 역전파

먼저 x, u와 역전파를 전달되는 값은 위와 같이 표현하겠다.

 

마찬가지로 $ \frac{dL}{dx_{11}}$을 먼저 살펴보면, 다음 식이 성립한다.

dot은 element-wise 곱을 의미한다.

위 예시에 대해서는 n = 2겠지만 $ u$는 평균으로 계산되는 값이므로 일반화하여 n으로 표현하였다. 

 

같은 방식으로 모든 $ x$에 대해 계산하면, $ \frac{dL}{dx}$는

위와 같다.

(k는 전달되는 역전파 값이며, 다른 방향에서 계산되는 $ \frac{dL}{dx}$ 값과 더해져야 최종적인 미분이 계산된다.)

 

표준 편차를 계산하는 루트로 흐르는 역전파의 계산도 같은 원리로 계산할 수 있다.

 

 

실험 - with BN vs without BN

Forward와 backward를 모두 추가하여 batch normalizaton layer를 구현한 후, 

실제로 affine layer와 ReLU 사이에 해당 layer를 추가한 후 train 과정을 비교하는 실험을 진행했다.

 

BN을 적용한 경우

BN을 추가한 상태로는 10 epoch로 loss가 1 정도로 감소하였다.

 

BN을 적용하지 않은 경우

BN을 적용하지 않았을 때는 10 epoch로 loss가 1.4 정도까지만 감소하였다.

 

with BN vs without BN

파란색으로 표현된 결과가 BN을 적용한 결과, 주황색으로 표현된 결과가 BN을 추가하지 않은 결과이다. 

더 빠르게 수렴하는 것을 확인할 수 있다. 

 

with BN vs without BN / Different Initialization

이번엔 다양한 weight initialization에 대해 BN을 적용한 경우와 BN을 적용하지 않은 경우를 비교한 실험이다.

BN을 적용한 경우에는 initialization의 영향을 훨씬 덜 받는다.

 

실험 - Batch size의 영향

 

다양한 batch size 실험

Batch size를 다양하게 한 후 학습 과정을 비교한 결과이다. baseline은 BN을 적용하지 않은 경우이다. 

 

먼저 실험 결과를 살펴보면, batch size가 클수록 training accuracy가 더 빨리 증가하는 모습을 보인다.

그러나 validation accuracy의 경우에는 큰 차이를 보이지 않는다. 

 

관련 내용을 찾아본 결과,

기본적으로 batch size가 클수록 batch의 통계가 전체 training data의 통계에서 크게 벗어나지 않을 확률이 커지기 때문에, 더 빠르게 수렴하고 좋은 성능을 보이는 것이 맞다고 한다.

 

반대로 batch size가 작은 경우 수렴은 덜 안정이지만, 일종의 regularization 효과를 준다고 한다.  

+ Recent posts