카테고리 없음

딥러닝_경사하강법

멍주다배 2025. 2. 11.

경사하강법
- 정답과 예측 값의 차이(손실 함수)가 적어질 수 있게 최적의 가중치 값 찾기
- 편미분을 사용해 손실 함수의 기울기를 계산 → 극소점(경사가 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가 빠르게 움직임
- 업데이트(큰 폭으로 이동해 탐색) 하면서 손실이 낮아지고 기울기가 작아짐 업데이트 크기가 점점 커짐
- 기울기가 흔들리면서도 최적점에 가까워지기 때문에 전역 최적점에 도달할 확률이 높아짐
BGD 한 번의 방향이 고정되어 있기 때문에 전역 최적점을 지나칠 수도 있음

 

더보기
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

크기: 에포크 * 배치사이즈 (3 * 3 = 9)

 

  • 배치와 확률적 경사하강법 보완
    • SGD보다 안정적이고, BGD보다 속도가 빠름
      • 여러 개의 데이터를 평균 내서 기울기를 계산하면 노이즈의 영향을 줄일 수 있음
      • 방향을 정해 조금 더 안정적인 방향으로 학습됨
    • SGD보다 GPU 성능을 활용한 병렬 처리 가능
      • SGD는 한 번에 하나의 데이터 샘플만 처리
      • 미니배치는 여러 개의 데이터 샘플에 대해 기울기 계산
  • 미니배치 크기를 잘 설정해야 함
    • 너무 크면 BGD처럼 속도가 느려짐
    • 미니배치 크기를 1처럼 너무 작게 정하면 SGD처럼 불안정
    • 적절한 값(32~128)은 있지만 실제로 해보면서 최적의 크기를 찾아야 함

 

더보기

K-Fold 교차 검증

 

- K개의 폴드로 나누어 모델을 여러 번 훈련 및 평가하는 기법

- K번 반복하며 각 Fold를 한 번씩 검증 데이터로 사용하고, 나머지는 훈련 데이터로 사용


 


요즘에는 미니배치 경사하강법과 확률적 경사하강법을 같은 개념으로 보는 경우가 많음❔

- 확률적(확률 표본 기반)이라는 관점에서 SGD를 미니배치 방식으로 확장해서 보는 경향

- 미니배치 방식도 확률적 샘플링을 기반으로 하기 때문에 SGD의 한 형태로 간주
- 딥러닝에서 대부분 미니배치를 사용
    - 딥러닝에서 데이터를 하나씩 학습하는 경우가 거의 없고, SGD는 GPU의 병렬 연산을 활용하기 어렵기 때문

따라서 요즘 말하는 SGD는 보통 Mini-batch SGD(미니배치를 사용하는 확률적 경사하강법)를 의미하는 경우가 많음

 

경사하강법 방식 정리

방식 데이터 사용 방식 장점 단점 PyTorch
배치 경사하강법
(BGD)
전체 데이터 사용 - 노이즈 없이 안정적
- 최적해로 수렴 가능
- 계산량이 많아 느림 batch_size = 전체 데이터 크기
확률적 경사하강법
(SGD)
한 개의 샘플 사용 - 지역 최적점 탈출 가능
- 빠르게 업데이트
- 불안정함
- 최적점 근처에서 계속 흔들릴 수 있음
batch_size = 1 
미니배치 경사하강법 (Mini-batch GD) 미니배치 사용 - 계산 속도와 안정성 균형
- GPU 병렬처리 가능
- 적절한 배치 크기 필요 batch_size = 적절한 값