경사하강법 - 정답과 예측 값의 차이(손실 함수)가 적어질 수 있게 최적의 가중치 값 찾기 - 편미분을 사용해 손실 함수의 기울기를 계산 → 극소점(경사가 0이 되는 지점) 찾기 - 최소 값이 진짜 최소 값이 아닐 수 있는 문제가 있음 (전역 최소값(global minimun)이 아닌 국소 최소값(local minimun)일 수 있다)
학습률(Learning Rate) - 가중치를 얼마나 이동할 것인지 - 학습률이 너무 크면 최소점에 도달하지 못 할 수 있고, 너무 작으면 학습 속도가 느려짐
배치 경사하강법
BGD (Batch Gradient Descent)
전체 데이터셋을 한 번에 사용하여 기울기를 계산하고 가중치를 업데이트하는 방식
한 번에 모든 데이터를 계산해야 함
데이터셋이 적을 때 사용
global minimun을 찾을 순 있지만 연산량이 많아 속도가 느림
국소 최소값(local minimun)에서 못 나올 수 있음
확률적 경사하강법
SGD (Stochastic Gradient Descent)
배치 경사하강법 보완을 위해 나옴
"랜덤 값을 여기저기 던져보고 더 낮은 값을 찾으면 좋다"
데이터에서 하나의 샘플을 랜덤하게 선택
선택한 데이터 샘플의 loss와 gradient를 계산
계산된 기울기로 가중치 업데이트
다음 샘플로 이동해 과정 반복
PyTorch의 torch.optim.SGD는 기본적으로 확률적 경사하강법을 나타냄
batch_size=1 : 확률적 경사하강법처럼 동작
batch_size=N(전체 데이터) : 배치 경사하강법처럼 동작
1 < batch_size < N : 미니배치 경사하강법처럼 동작
계산량이 적어 속도가 빠름
전체 데이터가 아닌 하나의 샘플을 이용하기 때문
지역 최적점에 빠질 위험이 적음
여러 번 업데이트하면서 좋은 방향으로 최적점을 찾아가기 때문
항상 global minimun에 도달한다고 보장할 수 없음
업데이트가 불안정하고, 최적점 주변에서 크게 진동
샘플마다의 기울기가 다르고 노이즈가 있어 최적점 근처를 왔다 갔다 할 수 있음
배치 경사하강법은 기울기가 일정한 방향으로 이동하는데, SGD는 랜덤하게 가중치를 업데이트하기 때문에 기울기가 계속 달라져 불안정한 특성을 가짐
SGD
- 초기: 가중치가 랜덤이라 손실이 높음 → 기울기가 크기 때문에 SGD가 빠르게 움직임 - 업데이트(큰 폭으로 이동해 탐색) 하면서 손실이 낮아지고 기울기가 작아짐 → 업데이트 크기가 점점 커짐 - 기울기가 흔들리면서도 최적점에 가까워지기 때문에 전역 최적점에 도달할 확률이 높아짐
import numpy as np
# 손실 함수의 예제 (y = x^2)
def loss_function(w):
return w**2
# 기울기 계산 (손실 함수의 미분)
def gradient(w):
return 2*w
# 학습률 설정
learning_rate = 0.1
w = 5 # 초기 가중치 값
# 경사 하강법 수행
for i in range(10):
grad = gradient(w)
w -= learning_rate * grad
print(f"Iteration {i+1}: w = {w:.4f}, Loss = {loss_function(w):.4f}")
미니배치 경사하강법
Mini-Batch Gradient Descent
전체 데이터를 여러 개의 작은 그룹(미니배치)으로 나눈 후 가중치를 업데이트
전체 데이터셋을 랜덤하게 섞기
batch size를 정해서 미니배치 만들기
각 미니배치에서 평균 손실과 기울기 계산
기울기를 사용해 가중치 업데이트
모든 미니배치 학습한 후 한 epoch 완료
여러 epoch 반복하며 최적의 가중치 찾기
셔플(shuffling) - 순차적으로 배치가 나누어지면 편향된 결과를 얻을 수 있음 - 셔플을 통해 각 배치가 다양한 데이터를 포함하게 만들기 (일관되지 않은 기울기 계산)
에포크(epoch)🗃️ - 전체 훈련 데이터를 다 사용해서 학습을 진행한 과정 - 예) 10,000개 훈련 데이터 100개 미니배치인 경우, 100회가 1 epoch 60,000개 훈련 데이터 100개 미니배치인 경우, 600회가 1 epoch
- K번 반복하며 각 Fold를 한 번씩 검증 데이터로 사용하고, 나머지는 훈련 데이터로 사용
요즘에는 미니배치 경사하강법과 확률적 경사하강법을 같은 개념으로 보는 경우가 많음❔
- 확률적(확률 표본 기반)이라는 관점에서 SGD를 미니배치 방식으로 확장해서 보는 경향 - 미니배치 방식도 확률적 샘플링을 기반으로 하기 때문에 SGD의 한 형태로 간주 - 딥러닝에서 대부분 미니배치를 사용 - 딥러닝에서 데이터를 하나씩 학습하는 경우가 거의 없고, SGD는 GPU의 병렬 연산을 활용하기 어렵기 때문
따라서 요즘 말하는 SGD는 보통 Mini-batch SGD(미니배치를 사용하는 확률적 경사하강법)를 의미하는 경우가 많음