본문 바로가기
  • Deep dive into Learning
  • Deep dive into Optimization
  • Deep dive into Deep Learning
Deep dive into Deep learning

Deep dive into Deep learning part 11. 신경망 - Updated

by Sapiens_Nam 2023. 4. 11.

모바일 앱 환경에서는 "latex" 수식이 깨져 나타나므로, 가급적 웹 환경에서 봐주시길 바랍니다.

 

오늘은 신경망 두 번째 글로 파라미터를 학습시키는 알고리즘, backpropagation algorithm에 대해 살펴보고자 한다.

 

backpropgation (역전파) 알고리즘은 처음 나온 것은 1970년대이다. 하지만 처음에는 주목받지 못하였다가 1986년 Rumelhart, Hinton, Williams의 논문에 의해 유명해지기 시작하였다. 이 논문은 딥러닝 (정확히는 퍼셉트론)을 backpropagation 알고리즘으로 학습시킬 수 있음을 보여주었고, 딥러닝의 부흥에 큰 기여를 하였다.

 

Backpropagation은 결국 Neural Network (NN) 를 어떻게 학습시키기 위한 알고리즘이다. 앞서 언급하였듯, NN을 학습 (train)하는 것은 파라미터 ($w$)의 값을 업데이트 하면서 손실함수 ($\mathcal{L}(w)$)를 최소화 해나가는 것을 의미하는데, 이때 파라미터를 업데이트 하기 위해서는 NN의 모든 파라미터들 $w$에 대해서, ${\partial \over \partial w}L$을 계산해야 한다. 이를 컴퓨터로 계산가능하게 하는 알고리즘이 backpropagation algorithm이다.

 

자, 먼저 표기부터 정리하고 가자.

$l$번째 layer에서 이뤄지는 연산이다. $l-1$번째 layer의 output $a^{l-1}$이 $l-1$번째 layer와 $l$번째 layer를 연결하는 가중치 행렬 $w^l$과 (선형)연산이 이뤄지고, $\sigma()$는 (비선형) 변환을 위한 activation function을 의미한다. 

activation function은 element-wise operation이기 때문에 각 성분별로 함수 연산이 적용된다.

$b^l$은 bias term을 의미하며, 이후에는 설명의 편의상 위 term을 생략하도록 하겠다.

 

자, $z^l$을 $l$번째 layer의 input으로 정의하자. 즉, $z^l = w^l a^{l-1}$이다.

그렇다면, 위 표기는 다음과 같이 표현된다. $a^l = \sigma(z^l)$

 

그렇다면 이제 backpropagation 연산을 진행해야 하는데, 이를 위해서 미분을 간단하게 복습하고 가자.

backpropagation 연산은 결국 chain-rule 과정이다. (합성함수의 미분, 지난 글에서 NN를 합성함수로 볼 수 있다고 하였음을 기억하자)

미분 ${\partial \over \partial x}y$이 의미하는 것은 $x$가 소폭 변화할 때, 즉 $x \rightarrow x + \delta x$ 일때, $y$는 얼마나 변화하는지, 그 비율을 의미한다. 즉 $\detla x$ \rightarrow 0$에서의 변화율을 보는 것이므로, 다른 말로 '순간'변화율이다.

우리가 원하는 것은 가중치의 값들을 소폭 변화시켜서 손실함수의 값을 감소시키길 원한다. 

이때 NN는 합성함수이고, layer들을 거치면서 선형 / 비선형 연산들이 순차적으로 이뤄지므로 손실 함수에 대한 가중치의 '순간'변화율을 계산할 때도 순차적으로 연산을 진행해나가야 한다. 이 과정이 합성함수의 미분법, chain rule을 통해서 이뤄지는 것이다.

 합성함수의 미분법은 다음과 같이 정의된다. (단순함을 위해 일변수함수에서 보자)

 

우리가 원하는 것은 $x$가 소폭 변화할 때, $f()$가 어떻게 변화하는지에 대한 변화율이다.

그런데 $x$에서 바로 $f$가 적용되지 않고, $g$ 함수가 적용된 이후, $f$가 적용되기 때문에 $x$에 대한 $f$의 '순간' 변화율은, $x$가 소폭 변화할 때, $g$의 '순간' 변화율과 $g$가 변화할 때, $f$의 '순간' 변화율의 곱으로 구해진다.

그렇다면 이를 NN에 적용하면 어떻게 될까?

 

Loss function을 $\mathcal{L}()$로 표기하면, 마지막 layer의 output $a^L$이 소폭 변화할 때, 손실 함수의 변화율은 ${\partial \over \partial a^L}\mathcal{L}$로 정의된다.

더 나아가 마지막 layer의 output은 $a^L = \sigma(z^L)$이므로 $z^L$이 소폭 변화할 때, 손실 함수의 변화율은 ${\partial \over \partial a^L}\mathcal{L} \sigma^{\prime}(z^L)$이다.

 

그런데, 또 $z^L$은 $z^L = w^l a^{l-1}$이므로, $l-1$번째 layer와 $l$번째 layer를 연결하는 가중치 행렬 $w^l$이 소폭 변화할 때, 손실 함수의 '순간' 변화율은 다음과 같이 구할 수 있다.

  

이 연산을 맨 처음 layer까지 순차적으로 진행해나가는 것이 backpropagation algorithm이다.
이때 $w^l$은 위 값을 활용해서 업데이트될 것이다.

앞으로는 이를 그냥 편의상 $\nabla_w \mathcal{L}(w)$로 표기한다. 다변수함수에서 이를 gradient 라 부른다.

 

결국, parameter update는 모든 파라미터의 값을 gradient를 활용해서 업데이트하면서,Loss 값을 바꾸는 것을 의미한다.

그리고, 그때 파라미터를 '음'의 gradient (Negative gradient)로 업데이트를 진행하기 때문에 Loss function의 값은 현재 parameter 지점에서 가장 빠르게 감소하는 방향으로 감소가 이뤄진다.

 

 

위에서 $w_{t+1}$은 $t+1$번째 iteration (step)에서의 파라미터이고, $\eta_t \in \mathbb{R}_{+}$는 step-size (learning rate)이다.

 

다음 글에서는 Neural network의 대표적인 예시들, CNN/RNN/Transformer/GAN 등에 대해 간단하게 소개하도록 하겠다.

728x90

댓글