산업공학/Deep Learning

[딥러닝] Gradient Descent (경사하강법) - 심화

테드리 2024. 8. 28. 02:28
이전 포스팅에서 Gradient Descent에 대한 기본적인 내용을 다룬 바 있다. 오늘은 이와 이어지는 내용으로 Gradient Descent의 더 심화된 버전을 다뤄볼 생각이다. 이번 포스팅의 내용에서는 쉬운 이해와 간결성를 위해 Activation Function은 배제하고 생각하겠다.

 

경사하강법" target="_blank" rel="noopener" data-mce-href="http://경사하강법">http://경사하강법

 

[딥러닝] Gradient Descent (경사하강법)

1. ML as an Optimization Problem기계학습이 해야 할 일을 식으로 정의하면, 주어진 cost function $J(\theta)$에 대해, $J(\theta)$를 최소로 하는 $\hat{\theta}$를 찾는 것.$$ \hat{\theta} = argmin_{\theta}J(\theta)$$ 2. Iterative

taekyounglee1224.tistory.com

 

Multi - Variate Neural Network

  • 여러 개의 뉴런들 $W \in \mathbb{R}^{M \times D}$로 구성된 Layer들이 쌓여 있고
  • 입력값이 다차원의 벡터 $x \in \mathbb{R}^D$이다.
  • 예를 들어, ResNet의 경우 2300만개의 가중치 파라미터들을 갖는다

$\sum_{i=1}^{N} x_iw_{ji}$ : 이전 Layer의 출력값 $x_j$은 가중치 $w_{ji}$에 곱해져서 더해진다

 

Forward Propagation in Matrix Multiplication

출처: https://www.bogotobogo.com/python/scikit-learn/Artificial-Neural-Network-ANN-2-Forward-Propagation.php

 

$$x_j^{(t+1)} = \sum_{i=1}^{N} w_{ji}x_i^{(t)} = w_{j1}x_1 + w_{j2}x_2 + \cdots + w_{jN}x_N$$

는 j번째 뉴런에 대한 출력이다. 이것을 벡터의 내적으로 표현할 수 있다

 

$$\sum_{i=1}^{n} w_{ji}x_i^{(t)} = \begin{pmatrix}
w_{j1} & w_{j2} & w_{j3} & \cdots & w_{jN} \\
\end{pmatrix}
\begin{pmatrix}
x_1^{(t)} \\
x_2^{(t)} \\
: \\
x_N^{(t)} \\
\end{pmatrix} $$

 

이를 나머지 뉴런들에 대해서도 확장을 해보자.

$$\sum_{j = 1}^{M} \sum_{i=1}^{N} w_{ji}x_i^{(t)} = \begin{pmatrix}
w_{11} & \cdots & w_{1i} & \cdots & w_{1N} \\
w_{21} & \cdots & w_{2i} & \cdots & w_{2N} \\
: & : & : & : & : \\
w_{M1} & \cdots & w_{Mi} & \cdots & w_{MN}  \\
\end{pmatrix}
\begin{pmatrix}
x_1^{(t)} \\
x_2^{(t)} \\
: \\
x_n^{(t)} \\
\end{pmatrix} 
= \begin{pmatrix}
x_1^{(t+1)} \\
x_2^{(t+1)} \\
: \\
x_N^{(t+1)} \\
\end{pmatrix} $$

 

이때, $M$은 hidden layer의 노드의 개수이고, $N$은 입력값 벡터의 차원이다.

 

Partial Differentiation 

Partial Differentiation(편미분)은 $h = (f_1, f_2, x)$와 같이 multi-variate할 때 Gradient를 구하는 것이다. 즉, 미분하고자 하는 변수를 제외한 다른 변수를 제외하고, 경사를 구하는 것이다.

출처: https://wikidocs.net/235768

 

ex) $f(x1, x2) = 3x_1^2 + 5x_1x_2 + x_2^2$ 이면, 

  • $\frac{\partial f}{\partial x_1} = 6x_1 + 5x_2$
  • $\frac{\partial f}{\partial x_2} = 5x_1 + 2x_2$

즉, 정리하면 $z = f(x,y)$라고 했을 때, $\frac{\partial z}{\partial x}| _{y = b}$는 $y = b$일 때, $z$에서의 접선의 기울기

 

Chain Rule

Chain Rule : 미분의 연쇄법칙

 

합성함수 $y = y(f(x))$를 예시로 살펴보자. 미분의 연쇄법칙에 따르면,

$$\frac{dy}{dx} = \frac{dy}{df} \frac{df}{dx}$$

 

더 나아가 $y = y(f_3(f_2(f_1(x))))$는 

$$\frac{dy}{dx} = \frac{dy}{df_3} \frac{df_3}{df_2} \frac{df_2}{df_1} \frac{df_1}{dx}$$

 

임을 확인할 수 있고, 따라서 미분의 연쇄법칙이란

  1. 어떤 합성함수의 미분값은 각 구성 함수들의 미분값의 연쇄적인 '곱'이다
  2. Computational Graph를 거꾸로 타고 올라가면서 구한 미분값들을 곱해주는 형태로 구현
  3. Reverse Differentiation의 원리

 

Auto Differentiation

Gradient Descent를 수행하기 위해서는 Loss를 Weight들에 대해 미분한 값들이 필요하다. 즉, $\frac{\partial L}{\partial w}$를 각각의 $w$들에 대해 구한 값들이 필요하고, Auto Differentiation은 Chain Rule을 이용해서 그 값들을 구하는 방법이다.

 

Auto Differentiation의 종류 중 Reverse Differentiation이 있는데, PyTorch와 Tensorflow등 DL Framework의 기반이 되는 것이 Reverse Differentiation이다. 

 

Auto Differentiation은 Forward Pass와 Back Pass의 과정으로 이루어지는데, Forward Propagation과 Backward Propagation이라고도 한다.

 

Forward Propagation

편의상 Hidden Layer의 개수는 2개로 가정하겠다.

 

$$L(y, \hat{y}(h^{(2)}(h^{(1)}(x, w^{(1)}, w^{(2)}) , w^{(3)}))$$

  • $L = L(y, \hat{y}_l)$
  • $\hat{y}_l = \hat{y}_l (h_k^{(2)}, w_{lk}^{(3)})$
  • $h_k^{(2)} = h_k^{(2)}(h_j^{(1)}, w_{kj}^{(2)})$
  • $h_k^{(1)} = h_k^{(1)}(x_i, w_{ji}^{(1)})$

이 때 ,$i, j, k$는 각각 Layer들의 인덱스들이다. $i$는 input layer의 인덱스, $j,k$는 hidden layer들의 $index$, $l$은 output layer의 인덱스이다. 즉, 스칼라 값들이 아닌 $i, j, k, l$로 인덱스되는 벡터라는 것이다.

 

여기까지의 과정이 Forward Propagation이다.

 

Backward Propagation

1. $\frac{\partial L}{\partial w_{lk}^{(3)}} = \sum_{l'} \frac{\partial L(y_{l'}, \hat{y}_{l'})}{\partial w_{lk}^{(3)}} = \frac{L(y_l, \hat{y}_l)}{w_lk^{(3)}} = \frac{\partial L}{\partial \hat{y}_1} \cdot \frac{\partial \hat{y}_1}{\partial w_{lk}^{(3)}}$

 

2. $\frac{\partial L}{\partial w_{kj}^{(2)}} = \sum_{l} \left( \frac{\partial L(y_{l}, \hat{y}_{l})}{\partial \hat{y}_l} \right) \cdot \left( \frac{\partial \hat{y}_l}{\partial w_{kj}^{(2)}} \right) = \sum_{l} \left( \frac{\partial L}{\partial \hat{y}_l} \right) \cdot \left( \frac{\partial \hat{y}_l}{\partial h_k^{(2)}} \right) \cdot \left( \frac{\partial h_k^{(2)}}{\partial w_{kj}^{(2)}} \right)$

 

3. $\frac{\partial L}{\partial w_{ji}^{(1)}} =  \sum_{l,k} \left( \frac{\partial L}{\partial \hat{y}_l} \cdot \frac{\partial \hat{y}_l}{\partial h_k^{(2)}} \cdot \frac{\partial h_k^{(2)}}{\partial h_j^{(1)}} \cdot \frac{\partial h_j^{(1)}}{\partial w_{ji}^{(1)}} \right)$

 

수식의 형태를 보면 알겠지만 Backward Propagation에서 한 단계씩 진행할 때마다 이전에 계산된 편미분 값들을 저장하고 재사용하는 것을 볼 수 있다. 이렇게 함으로써 계산의 효율성을 증가시킬 수 있는 방식이 Reverse Differentiation이다.

 

Reverse Differentiation의 과정

Steps

$l$번째 output node에 대한 loss의 경사를 계산한 값을 $t_{\hat{y}_l}$이라고 하도록 하자

Update Rule:

$$t_{n_m} = t_{n_{m+1}} \frac{\partial L}{\partial \hat{y}_l}$$

  1.  Descendent Node로부터 시작 : $t_L = 1$
  2. $\hat{y}_l$ 노드의 $t_{\hat{y}_l}$ 계산 : $t_{\hat{y}} = t_L \cdot \frac{\partial L}{\partial \hat{y}_l}$
  3. 이 과정을 모든 hidden layer를 거꾸로 거쳐가면서 반복하며 $t$를 업데이트 한다.

 

Multivariate Gradient Descent

$w \in \mathbb{R}$가 Scalar일 때

$$w_{i+1} = w_i - \gamma \cdot \frac{dL}{dw_I}$$

 

$w \in \mathbb{R}^{M \times N}$가 Matrix일 때

 

Index Notation으로는 다음과 같이 표현한다

$$w_{m,n}^{i+1} = w_{m,n}^{i} - \gamma \frac{\partial L}{\partial w_{m,n}^{i}}$$

 

Matrix Notation으로는 다음과 같이 표현한다

$$W^{i+1} = W^i - \gamma \bigtriangledown_w L$$

 

이때, $\bigtriangledown_w L$은 편미분된 값들의 행렬로, Jacobian Matrix(야코비안 행렬)로도 불린다.

$$\bigtriangledown_w L = \begin{pmatrix}
\frac{\partial L}{\partial w_{11}^{i}} & \cdots & \frac{\partial L}{\partial w_{1n}^{i}} & \cdots & \frac{\partial L}{\partial w_{1N}^{i}}  \\
: & : & : & : & : \\
\frac{\partial L}{\partial w_{m1}^{i}} & \cdots & \frac{\partial L}{\partial w_{mn}^{i}} & \cdots & \frac{\partial L}{\partial w_{mN}^{i}} \\
: & : & : & : & : \\
\frac{\partial L}{\partial w_{M1}^{i}} & \cdots & \frac{\partial L}{\partial w_{Mn}^{i}} & \cdots & \frac{\partial L}{\partial w_{MN}^{i}} \\
\end{pmatrix}$$

 

경사하강이 잘 작동하기 위한 전제조건

경사하강법을 잘 이용하면 model의 Loss를 줄여나갈 수 있다. 하지만 최종적으로 줄인 값이 과연 Global Minimum일까? 경사하강법을 통해 찾은 Minimum Loss값이 Global Minimum이 되기 위한 전제조건은 바로 Convexity(볼록성)이다. Convexity를 만족하면 Loss의 함수가 아래로 볼록한 형태여야 하고, 전제조건은 다음과 같다

$$\frac{d^2L}{dw^2} \geq 0 \quad (\forall w)$$

 

위 조건을 만족하지 않는 경우, Non-Convex하다고 하며, 이 경우에는 경사하강으로 Loss를 감소시킬 수 있지만, Global Minimum이 아니라 Local Minimum에 다다를 확률이 높다.

 

 

PyTorch 구현

Gradient Descent" target="_blank" rel="noopener" data-mce-href="http://Gradient Descent">http://Gradient Descent

 

GitHub - taekyounglee1224/Pytorch_DL: Hands-on deep learning models with Pytorch

Hands-on deep learning models with Pytorch . Contribute to taekyounglee1224/Pytorch_DL development by creating an account on GitHub.

github.com