최적화 (Optimization)
✔ 손실 함수 값(loss)을 최소화하는 파라미터( : )를 구하는 과정
기울기(Gradient)
✔ 미분 가능한 N개의 다변수 함수 를 각 축이 가리키는 방향마다 편미분 한것
최적화 기법
경사 하강법(Gradient Descent)
- 일차 미분을 이용한 최적화 기법
- = Learning Rate, Step Size (하이퍼 파라미터, 보통 0.01 ~ 0.001)
- step size가 너무 작으면 매 step 별로 이동하는 거리가 너무 작아 수렴하지 못하고, 너무 크면 발산하게 될 수 있다
- 수식을 통해 손실 함수의 값이 거의 변하지 않을 때까지(약 ) 가중치를 업데이트하는 과정을 반복
의문점 및 해결
모든 w(축)에 대해 편미분을 통해 각각의 gradient를 구하고 learning rate의 스케일 만큼 w를 조정(더하거나 빼거나)하여 가장 적은 loss 값을 향하여 찾아간다.
의문점: 대부분의 설명이 w를 x축으로 하는 2차원 그래프에서 설명되어있는데, 학습을 하는 중간에(혹은 최초에) 해당 그래프 모양을 알 수 있는가? 그래프는 매번 업데이트하면서 그려나가야 하는게 아닌가..
해결: 경사하강법 다시 정리
목적: loss 값이 최소가 되는 지점(, )을 찾는 것
방법: w가 1개인 직선방정식의 예
loss를 구하기 위해 손실함수를 정의 (예: MSE)
업데이트(학습)하고자 하는 파라미터(, )에 대한 loss와의 관계식 정의
각 파라미터와 loss에 대한 관계식에서 편미분을 통해 기울기를 구함 (각 파라미터와 loss에 대한 관계식에서 기울기가 0이 되는 지점을 향해 찾아가도록 해야함)
- 경사하강법을 이용한 기울기 업데이트
이때, 와 2는 상수이므로 2는 생략가능
SO, loss를 최소화 하는 w, b 를 구하는 것이 목적 →
정의된 loss 함수에 따라 loss가 정해짐(MSE loss의 경우 볼록함수 그래프 안에 loss가 반드시 존재함을 가정) → 경사하강법을 쓴다면 정의된 loss 함수를 각 파라미터()에 대해 편미분하여 기울기 값을 구하고, 기울기값을 이용해 파라미터를 줄여나감(업데이트)
배치 경사 하강법(Batch Gradient Descent)
- 일반적으로 Batch Gradient Descent를 Gradient Descent라 지칭하기도 함.
- 주요 특징은 역전파가 이루어질 때 전체 데이터셋을 이용하는 것이며, 전체 데이터셋에 대한 평균 손실과 각 파라미터의 평균 gradient를 역전파에 사용함.
errors = []
# random 한 값으로 w, b를 초기화 합니다.
w = np.random.uniform(low=-1.0, high=1.0)
b = np.random.uniform(low=-1.0, high=1.0)
for epoch in range(num_epoch):
y_hat = x * w + b
error = ((y_hat - y)**2).mean()
if error < 0.0005:
break
w = w - learning_rate * ((y_hat - y) * x).mean() # w 파라미터의 gradient 평균
b = b - learning_rate * (y_hat - y).mean() # b 파라미터의 gradient 평균
errors.append(error)
if epoch % 5 == 0:
print("{0:2} w = {1:.5f}, b = {2:.5f} error = {3:.5f}".format(epoch, w, b, error))
print("----" * 15)
print("{0:2} w = {1:.1f}, b = {2:.1f} error = {3:.5f}".format(epoch, w, b, error))
경사 하강법의 한계
1. Local Minimum
볼록함수(Convex Function)
- 아래 또는 위로 볼록한 함수를 볼록 함수
- 초기 파라미터 값이 어떻게 설정되어도 경사 하강법을 활용하면 최적의 값에 도달할 수 있지만, 현실에서는 대부분의 함수는 비볼록 함수 형태
- L1 Loss, L2 Loss 등
비볼록함수(Non-Convex Function)
- Global minimum < Local minimum 일 때, Global minimum 을 구해야 하지만, Local minimum에 빠지는 현상을 초례함
2. 안장점 (Saddle Point)
- 기울기가 0이지만 극값이 되지 않음
- 경사하강법은 안장점에서 벗어나지 못함
확률적 경사 하강법 (Stochastic Gradient Descent)
- GD의 경우 모든 데이터를 한꺼번에 넣고 순전파 후 전체에러에 대해 역전파를 통해 파라미터를 업데이트시킴(전체 데이터셋에 대해 epoch 만큼 학습).
- 베이직 SGD는 한 개 혹은 임의의 샘플데이터만 활용해서 gradient를 계산함.
- Mini-Batch Gradient Descent를 Stochastic Gradient Descent (SGD)의 한 변형으로 표현하기도 한다. 엄밀히 말하면, Mini-Batch Gradient Descent는 SGD의 일반화된 형태로 볼 수 있으며, 두 알고리즘 간의 차이는 배치 크기(batch size) 에 있다.
Mini-Batch Gradient Descent
- Mini-batch SGD는 Min-batch의 크기만큼 데이터의 일부만 활용해서 gradient를 계산함.
- 특히, 실제로 딥러닝에서 사용되는 대부분의 “SGD” 알고리즘은 Mini-Batch Gradient Descent를 의미함.
- Mini-batch SGD에서는 배치 단위 내에서 각 데이터마다 손실과 파라미터들의 gradient를 구하고, 평균 손실과 평균 gradient의 정보를 이용해 배치 단위의 파라미터 업데이트가 이루어짐.
GD, SGD
- Gradinet Descent
- 최적값을 찾아가는 것은 정확하지만 너무 느리다.
- local minimum에 수렴할 가능성이 있다.
- Stochastic Gradient Descent (Mini-batch Gradient Descent)
- 최적값을 찾아가는 방향이 뒤죽 박죽이고, 한 스템 나아가기 위한 사이즈를 정하기 어렵지만 빠르다.
- Mini-Batch를 사용하면 배치 평균을 기반으로 기울기를 계산하므로, 기본 SGD보다 더 안정적인 업데이트를 수행하며 수렴 속도를 높일 수 있다.
- local minimum 문제를 어느정도 해결할 수 있다.
다양한 최적화 기법
Momentum
- 관성의 법칙을 이용해 최적화하는 방법이다. 속도가 크게 나올수록 기울기가 크게 업데이트 된다. 진행중인 방향으로 관성을 더해 지역 최소점(Local minimum)에 빠지지 않도록 한다.
AdaGrad
- Adagrad의 경우 squared gradient(기울기 제곱)에 반비례하도록 학습률을 조정하는데, 이는 기울기가 가파를수록 조금만 이동하고, 완만할 수록 조금 더 이동하게 함으로써 변동을 줄이는 효과가 있다. 무엇보다 행렬곱 연산을 통해 가중치마다 다른 학습률을 적용한다는 점에서 더욱 정교한 최적화가 가능해진다.
- 단점은 기울기가 0인 부근에서는 학습이 느려져서 local minima에 빠지게 될 수 있다. 그 문제를 해결하고자 나온 것이 RMSProp 이다.
RMSProp
- AdaGrad의 업그레이드 버전인데 보폭을 줄이되 이전 기울기 변화의 맥락을 살핀다. a가 너무 작아져서 학습이 안되는 것을 방지해준다.
Adam
- Momentum + AdaGrad의 장점을 합쳐서 만든 기법이다. 방향과 보폭 둘 다 적절하게 조절해준다. 대부분의 상황에서 결과가 잘 나오는 편이라 잘 모를 때는 Adam을 쓰도록 하자.
참고
- 경사하강법(gradient descent)
- [Deep Learning] 최적화 개념과 경사 하강법(Gradient Descent)
- 신경망 학습 최적화 방법 Optimization
- 딥러닝(Deep learning) 살펴보기 2탄
- 👍최적화 알고리즘들
- Gradient Descent (경사하강법)과 기초 수학
- 경사하강법의 세 종류(BGD, SGD, MGD)
Prev: 5. 역전파(Back Propagation)
Next: 7. 성능평가지표(Evaluation)