본문 바로가기

강의/cs231n

CS231n - Lecture4

안녕하세요. 이번 시간엔 CS231n의 Lecture4에 대해 보도록 하겠습니다.

참고 자료는 다음과 같습니다.

 

강의 비디오

www.youtube.com/watch?v=d14TUNcbn1k&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv

 

강의자료

cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf

 

이번 시간에는 주로 미분에 대해 공부합니다.

※ 글에서 '가중치'는 'Weight'라고 쓰기도 합니다.

 

위의 슬라이드는 Neural Network에서 Loss를 구하는 과정이며 이를 Computational graphs로 나타낸 것입니다. x는 input이며 W는 가중치입니다. f라는 함수에 넣어서 score를 만들며(그래프에서 파란색 동그라미인 (*)에 해당) 이를 hinge loss에 넣은 뒤 해당 값을 Regularization term을 더해서 최종 loss를 구하게 됩니다.

 

Loss를 구했으면 이제 각 변수에 대한 gradient을 구해야 합니다. 여기서 Backpropagation(역전파)을 쓰게 됩니다. Backpropagation이란 우리가 앞에서 Loss를 구하는 과정이었던 Forward propagation(순전파)의 반대로 Loss에서 모든 가중치(Weight)까지 거꾸로 전파하는 것을 말합니다. 이를 통해 각 가중치 값을 update하게 되는 것이죠. 즉, Forward propagation을 통해 Loss를 구하고 Loss에서 다시 Backpropagation을 통해 가중치 값을 update하게 되는 것입니다.

위의 슬라이드는 이 과정을 나타낸 것으로 L은 Loss, z는 f의 다음 단계 input입니다. f는 연산이며, x, y는 이전단계의 f에 대한 input값입니다.

 

사실 변수에 대한 정의는 다음 예시에서 보면 이해할 수 있으며 여기서 중요한 것은 Serena 박사님이 gradients는 target 변수(x, y) 직전 단계 변수로 Loss를 미분한 값, local gradient는 target 변수로 직전 단계 변수를 미분한 값으로 정의한 점입니다. 이처럼, target 변수로 Loss를 미분할 때 위의 2가지 값으로 계산하면 훨씬 단순해집니다.

정리하면 $\frac{\partial L} {\partial x} = \frac{\partial L} {\partial z} \frac{\partial z} {\partial x} = $ gradients * local gradients 입니다.

 

위의 슬라이드는 미분 예시로, f(w,x)를 각 단계별로 쪼개서 computational graph로 나타낸 것입니다. 초록 글자는 이전 초록 값에서 동그라미 연산을 한 결과값이며, 빨간 글자는 각 동그라미 단계에서 backpropagation을 한 결과입니다.

 

첫 번째로 최종 결과 변수를 최종 결과 변수로 미분하므로 1이 나오게 됩니다.

위의 노트를 보면 검은 숫자는 forward propagation, 빨간 글자는 back propagation 결과입니다. 각 빨간색에 대해 계산 과정이 있는데, 여기서 중요한 것은 위의 gradients*local gradient를 기억해야 합니다.  즉, 각 과정에서의 gradient를 구하는 과정에서 이 식을 쓰는 것입니다. 예를 들어 $\frac{1}{x}$ 단계에 대한 gradient를 구할 경우(해당 식을 f로 전제) 식은 다음과 같습니다.

gradients : 1

local gradient : $- \frac{1}{x^{2}}$

-> $- \frac{1}{1.37^{2}} \cdot 1 = -0.53$

뒤에도 이런 식으로 구하게 됩니다.

 

위의 그림은 특정 조건에서 gradient를 구하는 예시입니다. max 함수의 경우 큰 쪽은 자기값, 작은 쪽은 0이며, 곱셈의 경우 곱한 상수값으로 나오게 됩니다.

branch가 있는 경우 $\sum_{i=1}^{n} branch_{i} \, gradients * local \, gradient$로 gradient 값을 구합니다.

 

위의 사진은 vector로 vector를 미분할 경우를 나타냅니다. 만약 4096x1의 input과 output을 수행하는 연산이 있다면 해당 연산에 대해 input 변수로 미분한 output size는 4096 x 4096이 나오게 됩니다. 이는 각 1개 변수당 4096개의 변수로 미분하기 때문이죠

여기서 mini-batch 단위가 100이라면 409600 x 409600이라는 엄청난 size의 gradient matrix(Jacobian matrix)가 나오게 됩니다. 하지만 $x_i$ input은 $x_i$ output에만 영향을 주기 때문에 이 점을 고려하여 미분하면 size를 훨씬 줄일 수 있습니다. (Jacobian matrix : diagonal로 나오게 됨)

 

위의 사진은 vector input과 vector output 연산에 대한 미분입니다. 검은 숫자는 forward propagation이며 초록 숫자는 back propagation입니다.

- L2 loss로 구한 최종 결과값은 0.116이며(f) f를 f로 미분하면 1이므로 맨 끝의 back propagation 결과는 1입니다. 

- [0.22, 0.26] 파트의 경우, f를 미분하면 다음과 같은 결과가 나옵니다.(q : W로 전제)

  $\frac{\partial f}{\partial q_i} = 2 \cdot q_i $

    -> [0.22, 0.26] * 2 * 1 = [0.44, 0.52]

- q를 x에 대해 미분할 때 $q = Wx$ 부분을 참고하면 됩니다. 식에서 $W_{1,1}x_{1} + ...$ 부분이 있는데 이를 각 x에 대해 미분하면 $\frac{\partial q_k}{\partial x_i}$, $\frac{\partial f}{\partial x_i}$의 결과를 곱한 값이 됩니다.

($q_k$는 q vector의 k번째 값입니다.)

 

그리고 Summary 부분을 보면 이 neural network는 매우 크고 복잡하기 때문에 결국 backpropagation을 계산해 각 가중치에 대한 gradient를 얻게 됩니다.

 

tip

- Neural network의 layer가 2개 이상 쌓일 경우 W2부터는 가중치 등이 섞이기 때문에 template가 아님.(W1은 가능)

 

여기까지가 Lecture 4에 대한 내용이었습니다. 궁금하신 부분이나 잘못된 점 있으면 말씀해주세요!

'강의 > cs231n' 카테고리의 다른 글

CS231n - Lecture3  (0) 2021.02.20
CS231n - Lecture2  (0) 2021.02.11