딥러닝에서 손실 함수의 값이 최소가 되도록 모델의 파라미터를 조정하는 최적화 알고리즘에 대하여 정리해 봤다.
최적화 알고리즘에 쓰이는 미분에 대하여 먼저 정리하고 넘어가자
1. 미분(differentiation)
미분이란, 변수의 변화에 따른 함수값의 변화 혹은 함수 위의 주어진 점에서의 접선의 기울기를 의미한다.
직접 구하기 위해서는 $ h->0 $ 극한을 계산해야 한다. $ \frac{df(x)}{dx} = \lim_{{h \to 0}} \frac{f(x + h) - f(x)}{h}$
즉 변수 x에 대한 미분값 = 변수값이 바뀔 때의 f(x)가 얼마나 변하는지를 의미한다.
1-1. 2차원 평면에서의 미분
$ x $에서의 미분값은 함수 $ f $의 주어진 점$(x,f(x))$에서의 접선의 기울기와 동일하다.
어떤 점에서 함수의 접선의 기울기를 알면, 어느 방향으로 점을 움직여야 함수값이 증가/감소하는지를 알 수 있다.
모델학습을 위해서는 손실함수의 최솟값을 찾아야하며, 즉 함수값이 작아지는 방향으로 움직여야 하고 그러기 위해서는 미분값의 반대 방향 즉 $x$에서 $x-f'(x)$로 이동해야 함을 알 수 있.
미분값 양수 = 증가하는 기울기 : 미분값을 더했을 때 $ x + f′(x)>x $, 오른쪽으로 이동하여 함수값이 증가하게 된다.
미분값 음수 = 감소하는 기울기: 미분값을 더했을 때 $ x+f′(x)<x $, 왼쪽으로 이동하여 함수값이 증가하게 된다.
미분값 양수 = 증가하는 기울기: 미분값을 뺐을 때 $ x−f′(x)<x $, 왼쪽으로 이동하여 함수값이 감소하게 된다.
미분값 음수 = 감소하는 기울기: 미분값을 뺐을 때 $ x−f′(x)>x $ , 오른쪽으로 이동하여 함수값이 감소하게 된다.
1-2. 편미분
위의 예시는 2차원 평면 즉 파라미터 $x$ 하나에 대한 손실함수값을 보면 되었는데, 실제로는 파라미터가 여러 개다.
따라서 이때 `편미분`을 한다. 편미분(partial differentiation)이란 벡터를 입력값으로 받아, 각 변수에 대해 미분하는 것을 말한다. $$ \frac{\partial f(x)}{\partial x_i} = \lim_{{h \to 0}} \frac{f(x + h \mathbf{e}_i) - f(x)}{h} $$
이렇게 모든 파라미터(변수)에 대하여 미분하여 합친 것을 `그래디언트(gradient)`라고 하며 아래와 같이 나타낸다.
즉 그래디언트는 벡터에 대하여 미분하는 것을 말한다. 이를 통해 다변수 함수의 기울기를 알 수 있다.
$$ \nabla f = \left(\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_d}\right)$$
2. 경사하강법
`경사하강법 (Gradient Descent: GD)`는 기울기 $ f'(x) $가 감소하는 방향으로 $x$를 움직여서 $f(x)$의 최소값을 찾는 알고리즘으로, 손실함수($L$)의 그래디언트가 감소하는 방향으로 파라미터를 움직여 손실함수 $L{\theta}$ 의 최소값을 찾는다. (아주 간단하게 정리하면, 모델의 파라미터들을 손실함수를 줄이는 방향으로 업데이트 하는 방법). 이것을 식으로 나타내면 다음과 같다.
$$ \theta_{\text{new}} = \theta - \eta \cdot \nabla \text{L}(\theta)$$
여기서 $ \eta $는 학습률: learning rate를 나타내며 작은 값의 양수로 특정 방향(=기울기가 감소하는 방향)으로 얼마나 움직 일지를 정하는 상수값을 말한다.
이 learning rate도 매우 중요한 파라미터로 적절하게 조절하지 않으면, 모델 학습에 엄청난 시간이 걸리거나, 최소값을 못 찾을 수도 있다.
즉, 정리하면 특정 지점의 접선의 기울기는 손실함수와 거의 유사하다고 볼 수 있기 때문에, 이 기울기가 감소하는 방향으로 ($ \eta$ x 기울기 크기) 만큼 움직이면 손실함수의 최적값으로 이동하게 될 것이다.
이렇게 경사하강법을 통해 손실함수의 최소값에 도달하기 위해서는 손실함수의 전체 모양이 부드러운 U 모양이라는 가정이 있어야 한다.
경사하강법의 학습 과정을 정리하자면,
1. 모델 파라미터 $ \eta={w,b} $를 초기화해 준다.
2. 전체 학습 데이터셋에서 손실함수 값을 구하고 미분을 통해 이를 최소화하는 모델 파라미터 w, b를 찾는다.
3. 2번을 계속 반복하며 종료 조건이 충족되면 학습을 종료한다.
2-1. 경사하강법의 한계
local minima와 learning rate
경사하강법의 한계로는 초기값에 따라 전역해: global minimum을 찾지 못하고 지역해:local minimum에 이를 수 있다.
위에서 볼 수 있듯이 초기값이 왼쪽에서 시작했다면 지역해는 실제 손실함수의 최소값이 아니지만, 초기값에서부터 경사하강법을 진행하게 되면 해당 지역해에 멈추게 된다. 반대로 오른쪽에서 시작했다면 시작부터 기울기 자체가 완만하여 최적해에 근접할 수조차 없다. 이것을 해결하기 위해서 파라미터 초기화를 잘하거나, 모델 구조를 바꿔 그래프의 모양을 변경하거나, learning rate를 바꾸는 방법이 있다.
이 방법은 가중치 초기화나 learning rate 스케줄러 등에 관련된 얘기로 다음 글을 참조하면 될 것 같다.
또 다른 한계로는 모든 샘플에 대하여 loss를 구하여 다 더해야 한다는 단점이 있다. 이를 보완하기 위하여 확률적 경사하강법이라는 알고리즘이 나왔다.
3. 확률적 경사하강법, 미니배치 경사하강법
확률적 경사하강법 Stochastic Gradient Descent:SGD 는 위의 Gradient Descent의 한계점들을 보완하고자 등장하였다.
우선 마지막에 말한 한계점에 대해 다시 얘기해 보자.
자 만약 손실함수가 MSE라고 가정해 보자. 그럼 손실함수를 구하는 식은 다음과 같을 것이다.
$$ L= \sum_{i=1}^{M} L_i = \sum_{i=1}^{M} (y_i - \hat{y}_i)^2 $$ 이다.이 손실함수의 값을 모든 데이터에 대하여 구하고자하니 시간도 너무 오래걸릴 뿐더러, 초기 가중치나 러닝레이트에 따라 지역해에 빠질 수도 있다는 단점이 있다.
아 전체 샘플에 대한 평균 손실값을 나타내면 $L= \frac{1}{M} \sum_{i=1}^{M} L_i $ 인데 이것이 일부 샘플에 대한 평균 손실값과 거의 차이가 없지 않을까라는 생각을 이용하여 확률적 경사 하강법이 등장하게 된다.
$$ \nabla L = \frac{1}{M} \sum_{i=1}^{M} \nabla L_i \approx \frac{1}{m} \sum_{i=1}^{m<M} \nabla L_i $$
이렇게 전체 샘플 M에 대하여 학습을 진행하는 것이 아니라 M보다 작은 m개의 데이터샘플 집합, 배치 데이터 셋을 이용하여 여러 번 업데이트를 진행한다.
이 때 m이 1인 경우를 확률적 경사 하강법, 즉 전체 데이터 셋중 임의의 1개를 골라 경사하강법을 진행한 것을 말하고,
m이 여러개 즉 여러 미니 배치를 통해 경사하강법을 진행하는 것을 미니배치 경사하강법이라고 부른다.
정리해 보면, SGD를 통해 한 번의 학습을 하는 데 사용되는 데이터 샘플의 집합을 `미니배치(mini-batch)`라고 부른다.
기존 GD는 전체 데이터 M개에 대하여 손실함수를 구하여 파라미터 업데이트를 한번 진행한다.
SGD는 M개에서 여러 m개의 데이터셋, 배치를 구하고 각 배치마다 손실함수를 구하여 파라미터를 업데이트한다. 즉 m개의 step을 거쳐 1 epoch가 진행된다. 반대로 GD는 1 step = 1 epoch 즉 1 epoch 당 한 번의 파라미터 업데이트를 진행한다. 이렇게 M에 대한 그래디언트를 구하는 것이 아니라 m개의 배치에 대한 것을 계산하면서 여러 번 업데이트하기 때문에 지역해에 빠지지 않는다.
또한 GD와 SGD에서 손실함수의 그래디언트를 계산하기 위하여 미분을 진행하는데 이 미분을 용이하게 하기 위해서 이전에 나왔던 activation function 활성화함수를 step function이 아닌 sigmoid 같은 미분가능한 함수로 설정한다.
4. GD vs SGD vs MSGD
위의 그림에서 파란색이 GD, 보라색이 SGD, 초록색이 MSGD를 의미한다.
자 이제 (배치)경사하강법, 확률적 경사하강법, 미니배치 경사하강법을 비교해보도록하자.
- 경사하강법
우선 경사하강법은 전체 데이터를 통해 학습시키기 때문에 총 업데이트 횟수가 적다. 1 epoch 당 1번 업데이트를 진행한다. 또한 데이터를 모두 한번에 처리하기 떄문에 메모리가 많이 필요하다. 그러나 항상 전체 데이터를 이용하여 그래디언트를 구하기 때문에 수렴이 안정적이어서 극소값을 찾을 수 있다.
model.fit(X_train, y_train, batch_size=len(trainX))
- 확률적경사하강법
확률적경사하강법은 랜덤한 1개의 데이터를 이용하여 경사하강법을 1회 진행(즉 배치가 1)한다.
속도가 빠르고 각 랜덤한 1개의 데이터마다 손실함수가 다르게 정의되고 기울기가 다르기 때문에 기울기의 방향이 매번 크게 바뀐다 이는 지역해에 빠질 가능성을 줄여준다.. 이는 빠르게 극소값 근처로 다가가지만, 수렴하기는 어렵다. 그리고 1개의 데이터를 이용하기 때문에 gpu의 병렬처리의 효과를 그다지 보지 못한다.
model.fit(X_train, y_train, batch_size=1)
- 미니배치경사하강법
마지막 미니배치경사하강법은 전체 데이터를 batch_size개씩 나눠 배치로 학습을 진행한다. 이는 1 epoch당 n번의 경사하강법을 통해 업데이트 된다. 이 또한 각 배치마다 손실함수가 다르게 정의되어 기울기가 다른 방향으로 변해 SGD와 같이 local minima에 빠질 확률이 적고, 1개의 데이터가 아닌 한배치의 평균으로 경사하강을 진행하기 때문에 확률적 경사 하강법보다 shooting이 덜 하다.
또한 한 배치씩 연산을 진행하기 때문에 메모리 등을 효율적으로 사용가능하다
-> 이때 보통 batch_size는 $ 2^n $ 개(컴퓨터의 계산은 2진수)로 지정하며, 가능한 데이터 개수에 나눠 떨어지도록 설정해야 좋다.
model.fit(X_train, y_train, batch_size=32) #32를 배치 크기로 하였을 경우
이렇게 기본적인 경사하강법의 업데이트 방법을 다양한식으로 발전시켰는데 다음에 시간이되면 다뤄보도록 하겠다 .
아래 글에 다양한 옵티마이저들에 대한 글을 작성해봤다.
참고
'ML & DL > 개념정리' 카테고리의 다른 글
손실 함수(Loss function) (1) | 2023.12.21 |
---|---|
역전파(Backpropagation) 기초 (1) | 2023.12.21 |
퍼셉트론과 다층 퍼셉트론(MLP) (0) | 2023.12.19 |
딥러닝 개요 (0) | 2023.12.19 |
딥러닝 기술 분류 (1) | 2023.12.19 |