Computer Science/CS231n

[CS231n] Assignment1

  • -
728x90
반응형

✍️ Q4 : Two-Layer Neural Network

Affine layer : fowrad / backword

문제를 해결하기에 앞서, Affine layer가 어떤 식으로 구성되어 있는지 확인해보자.

위 사진에서 볼 수 있는 것처럼, Affine 계층은 여러개의 input값을 받아서, 여러개의 output값을 출력하는 양상을 띄고 있다. 해당 layer를는 intput, weight, bias로 구성되어있고 각각이 선형결합된 결과로 output이 출력된다.

수식으로 나타내면 다음과 같다.

$$Y = XW + b$$

이때 $X$는 input으로 N x D matrix, $W$는 weight로 D x M matrix, $b$는 bias로 dimension이 M인 vector로 가정하자.

 

foward path의 경우는 단순하게 행렬 곱을 수행해주면 된다.

이 부분에서는 X의 각 행이 input data 1개에 해당한다는 것만 유의해 주면 된다. 따라서 np.dot(X, W) + b를 수행해주면 쉽게 output값을 구할 수 있다.

 

이때, Backpropagation을 활용하면 Upstream gradient 와 local gradient의 곱을 통해 해당 변수에 의한 L(loss function)의 변화를 관찰할 수 있게 된다.

 

결과적으로 Upstream gradient는 local gradient 간의 연산이므로, partial derivative를 수행하기 위해서는 각 변수에 대해서 local gradient를 구하는 것이 중요한 작업이 된다.

 

따라서 $Y = XW + b$ 이므로 $X$, $W$, $b$ 각각에 대해서 $Y$를 partial derivative을 수행한 결과에 대해서 검토할 필요성이 존재한다. $X$와 $W$에 대해서 증명한 결과는 https://calofmijuck.tistory.com/17#recentEntries 를 참고해주면 된다. 물론 가정한 차원을 보고 행렬 곱이 수행되기 위해서는 Transpose처리해야한다는 식의 논리를 펴서 끼워맞출수는 있으나, 정확하게 증명을 할 줄 알아야하므로 잘 정리해두도록 하자.

 

그러면, 이 포스팅에서는 $b$에 대해 partial derivative을 수행한 결과에 대해서 분석해보도록 하겠다. 위 포스팅에서의 결론과 비슷하게 진행해주면 된다.

$$\frac{\partial L}{\partial b_i} = \sum\limits_{\alpha = 1}^N\sum\limits_{\beta = 1}^M \frac{\partial L}{\partial Y_{\alpha\beta}} \frac{\partial Y_{\alpha\beta}}{\partial b_i}$$

 

그런데, 잘 생각해보면

$\frac{\partial Y_{\alpha\beta}}{\partial b_i}$내부 sigma에서 $\beta = i$ 일때만 1이고 나머지는 0이다. 왜냐하면 가중치는 출력층의 각 class에 작용하는 것이므로 $\beta$와 관련이 있기때문이다. ($X$와 $W$는 $b$와 무관한 변수이므로 partial derivative을 수행할 때 고려하지 않는다.)

 

따라서 위 식은 다음과 같이 이해할 수 있다.

$$\begin{align} \frac{\partial L}{\partial b_i} & = \sum\limits_{\alpha = 1}^N\sum\limits_{\beta = 1}^M \frac{\partial L}{\partial Y_{\alpha\beta}} \frac{\partial Y_{\alpha\beta}}{\partial b_i} \\  & = \sum\limits_{\alpha = 1}^N \frac{\partial L}{\partial Y_{\alpha i}}  \end{align}$$

 

이때,

$$\frac{\partial L}{\partial Y} =  \begin{pmatrix}  \frac{\partial L}{\partial Y_{11}} & \frac{\partial L}{\partial Y_{12}} & \frac{\partial L}{\partial Y_{13}} & \cdots \frac{\partial L}{\partial Y_{1M}} \\  \frac{\partial L}{\partial Y_{21}} & \frac{\partial L}{\partial Y_{22}} & \frac{\partial L}{\partial Y_{23}} & \cdots \frac{\partial L}{\partial Y_{1M}} \\  \cdots & \cdots &\ddots & \vdots \\  \frac{\partial L}{\partial Y_{N1}} & \frac{\partial L}{\partial Y_{N2}} & \cdots & \cdots \frac{\partial L}{\partial Y_{NM}}  \end{pmatrix}$$

이므로, (2)는 $\frac{\partial L}{\partial Y}$의 i'th column vector의 sum이라고 생각할 수 있다.

 

따라서 $\frac{\partial Y}{\partial b}$ = np.sum(dout, axis = 0)이 되는 것이다.

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.