최적화 (Optimization)
최적화란 마치 넓고 커다란 협곡에서 돌아다니는 것이라고 비유했다.
협곡의 높이가 손실 값을 나타내고 협곡의 각 점들을 가중치의 값이라고 했을 때 해당 협곡의 가장 낮은 지점 (손실 값이 가장 작을 때)를 찾는 것이 최적화의 목표이다.
물론 간단한 모델 같은 경우 손실 함수 자체를 미분하여 기울기가 0인 부분을 찾아 최솟값을 찾을 수 있지만 대부분의 모델들은 직접 기울기를 계산할 수 있을 정도의 복잡도를 가지고 있지 않기에 다른 방법이 필요하다.
#1 임의 검색
해당 방법은 임의로 여러가지의 W 값을 시도해보고 손실 값이 가장 적은 W를 찾는 방법이다.
이 방법은 너무나 비효율적이므로 절대 사용되지 않는 방법이다.
#2 경사 따라가기
다시 협곡에 비유하자면 시야가 가려진 상태에서 발의 감각으로만 가장 경사가 급한 곳으로 이동하고 멈추고 경사를 판단하여 다시 이동하는 방안이다.
이 방법이 가장 보편적으로 많이 사용되는 방법이다.
경사 하강법 (Gradient Descent)
경사를 따라 내려간다면 그럼 가중치의 경사를 어떻게 구할까?

첫번째 방법은 미분의 정의를 따라 아주 작은 값을 더해 그 차를 구해 해당 값을 나누는 방식이다.

해당 방법을 통해 기울기를 구한다면 모든 가중치 마다 일일히 복잡하게 계산을 해줘야된다는 특징이 있다.
이러한 방식으로 구한 기울기는 numerical gradient라고 한다.
하지만 numerical gradient는 너무나 오랜 시간이 걸리기에 좋은 방법은 아니다.

우리에겐 라이프니츠와 뉴턴이 개발해낸 미적분이라는 방법이 있기에 단순히 손실함수를 W에 대해 편미분을 진행하면 손쉽게 dW 즉, 기울기의 경사를 구할 수 있게 된다. 이렇게 구한 기울기를 analytical gradient 라고 한다.

그렇다면 numerical gradient는 쓸모가 없는 것인가? 그건 또 아니다.
코드 상에서 analytical gradient를 구사할 때 버그가 일어날 수도 있는데 디버깅 과정에서 numerical gradient와 비교를 해보아 어떤 부분에서 버그가 일어났나 확인 할수 있는 좋은 디버깅 툴이 될 것이다.
학습률 (Learning Rate)
#Vanilla Gradient Descent
while True:
weights_grad = evaluate_gradient(loss_fun, data, weights)
weights += - step_size * weights_grad #perform parameter update
다음과 같이 경사를 구하고 가중치를 수정하는데 step_size라는 것이 기울기에 곱해져 가중치가 수정된다.
step_size는 아까 위에 사용했던 비유에 빗대자면 보폭 즉, 찾은 경사로 얼마나 이동할 것인가 이다.
step_size 변수를 학습률이라고도 부르는데 학습률도 하이퍼파리미터의 한 종류로 이것도 튜닝이 필요하다.
경사 하강법의 종류

해당 사진에서 빨간색이 손실 값이 가장 적은 구간이고 파란색 부분에서 가중치가 시작되어 경사 하강법에 따라 손실 값이 적은 구간으로 향하는 걸 볼수 있다.
하지만 경로가 다양하게 나뉘어져 있는 걸 볼 수 있는데 경사 하강법은 종류가 하나가 아니라 단점들을 보완하기 위해 여러 종류가 만들어졌다. Adam, Momentum 등등... 많은 최적화 방법이 있는데 해당 방법들은 나중에 알아보도록 하자.
Stochastic Gradient Descent (SGD)
SGD 같은 경우 데이터가 너무나 많을 경우 효율적으로 최적화를 하기 위해 만들어진 방법이다.
데이터를 미니 배치 (mini-batch)로 나누어 임의로 몇개의 데이터를 샘플링해 경사 하강법을 통해 가중치를 수정하고 다음에는 또 다르게 같은 수의 데이터를 샘플링해 가중치를 수정한다.
미니 배치의 사이즈는 보통 2의 n승으로 이루어지며 보편적으로 32개, 64개, 128개를 사용한다.

'Deep Learning > CS231n' 카테고리의 다른 글
| [3-1강] Loss Function & Regularization (0) | 2024.05.11 |
|---|---|
| [과제 1] K-Nearest Neighbor (KNN) (2) | 2024.04.25 |
| [2강] Image Classification (0) | 2024.04.16 |
| [1강] Introduction to Convolutional Neural Networks for Visual Recognition (0) | 2024.04.10 |