81. 확률적 경사 하강법 (SGD, Stochastic Gradient Descent)

⚠️ 이 문서는 딥러닝 모델이 한 걸음을 내디딜(가중치를 업데이트할) 때마다 회사에 있는 수백만 개의 전체 데이터를 다 꺼내어 완벽한 기울기를 구하느라 세월아 네월아 하던 배치 경사 하강법(BGD)의 치명적인 느림을 극복하기 위해, **전체 데이터 대신 무작위로 뽑은 소수의 '미니배치(Mini-batch)'만 보고 쏜살같이 발걸음을 옮기는 속도전의 마법, SGD(확률적 경사 하강법)**를 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 모델 학습 시 가중치를 한 번 업데이트하기 위해 전체 데이터를 다 계산하는 것(Full Batch)을 포기하고, 통계학적 '샘플링(Stochastic)'에 기반하여 일부 데이터(예: 32개, 64개)만 랜덤하게 뽑아내어 재빨리 오차를 구하고 업데이트를 시도하는 알고리즘이다.
  2. 가치: 학습 속도를 수백 배 이상 미친 듯이 끌어올리며, 그래픽 카드(GPU)의 제한된 메모리 용량(VRAM) 안에 데이터 뭉치를 쏙 들어가게 맞춰주어 거대한 딥러닝 모델의 현실적인 학습을 가능케 한 1등 공신이다.
  3. 기술 체계: 일부 데이터만 보고 걷기 때문에 방향이 비틀비틀(노이즈 발생) 지그재그로 내려가지만, 오히려 이 요동치는 스텝 덕분에 깊은 함정(Local Minima)에 갇히지 않고 튕겨 나오는 예상치 못한 '탈출 효과'라는 축복을 얻게 되었다.

Ⅰ. BGD의 몰락: 완벽함이 부른 거북이걸음

데이터가 수백만 개로 늘어나자 기존의 완벽한 훈련법은 더 이상 쓸 수 없게 되었다.

  1. 배치 경사 하강법 (Batch Gradient Descent, BGD):
    • 가중치를 단 한 번 업데이트하기 위해 전체 데이터 100만 개의 오차를 모두 더하고 평균을 내는 '완벽주의자'다.
    • 100만 번의 연산이 끝나야 비로소 $W$가 아주 살짝 1스텝 움직인다. 한 걸음 내디딜 때마다 지구 전체 인구를 투표시켜야 하니 속도가 절망적으로 느리고, GPU 메모리에 100만 개 데이터가 다 들어가지도 않아 에러(OOM)가 터진다.
  2. 속도의 필요성:
    • 딥러닝은 보통 수십만 번(Epoch)의 스텝을 밟아야 바닥(정답)에 도달한다. 완벽한 방향으로 1번 걷는 것보다, 조금 삐뚤빼뚤하더라도 1,000번 빠르게 걷는 것이 목적지에는 훨씬 빨리 도착한다는 사실을 깨달았다.

📢 섹션 요약 비유: 전국 맛집 지도를 완성하기 위해, 한 걸음 내디딜 때마다 전 국민 5천만 명에게 설문조사를 돌리고 그 평균값으로 다음 식당을 고르는 짓(BGD)을 하니 10년이 걸렸습니다. 그래서 이 바보 같은 짓을 멈추고 거리에 보이는 무작위 사람 1명에게만 물어보고 번개처럼 튀어가는 기법이 등장한 것입니다.


Ⅱ. SGD와 미니배치의 등장: 확률적 꼼수

1개만 뽑으면 너무 비틀거리고, 다 뽑으면 너무 느리다. 황금비율을 찾아야 한다.

  1. 순수 확률적 경사 하강법 (Pure SGD):
    • 이름 그대로 데이터를 딱 1개만 랜덤하게 쑥 뽑아서 그 오차만 보고 걷는다.
    • 속도는 총알 같지만 1개의 데이터가 하필 '이상치(Outlier, 노이즈)'라면 산 밑이 아니라 산꼭대기로 거꾸로 뛰어 올라가는 등 발걸음이 만취한 사람처럼 널을 뛴다.
  2. 타협의 미학: 미니배치 경사 하강법 (Mini-Batch SGD):
    • 오늘날 우리가 흔히 'SGD'라고 부르는 것은 사실 이 미니배치 방식을 말한다.
    • 전체 데이터가 100만 개라면, 무작위로 32개, 64개, 256개(Batch Size) 씩 한 움큼만 바구니에 퍼 담아 이들의 평균 오차를 구하고 한 발짝 걷는다.
    • 이 적당한 바구니 크기(2의 거수제곱)는 엔비디아(NVIDIA) GPU 메모리에 한 번에 꽉 차게 쏙 들어가서 칩의 병렬 연산 코어(CUDA)를 100% 효율로 갈구며 엄청난 가속을 끌어낸다.

📢 섹션 요약 비유: 전 국민에게 다 물어보기(BGD)는 너무 느리고, 지나가는 아무나 1명에게 물어보기(순수 SGD)는 사기꾼을 만나면 길을 완전히 잃습니다. 그래서 길거리에 모여있는 64명의 군중(Mini-Batch)에게 다수결을 물어보고 빠르게 걷는 타협안이, GPU라는 64인승 버스와 완벽하게 규격이 맞아떨어져 대박을 친 것입니다.


Ⅲ. 뜻밖의 축복: 노이즈가 만들어낸 Local Minima 탈출

미니배치 SGD의 덜덜거리는 진동은 치명적 단점이 아니라 신이 내린 축복이었다.

  1. 노이즈 (Noise) 수반:
    • 미니배치마다 표본 집단이 다르기 때문에, 손실 함수 그래프를 내려가는 발걸음이 깔끔한 직선이 아니라 사시나무 떨리듯 지그재그 진동(Fluctuation)을 그리며 내려간다.
  2. 안장점(Saddle Point)과 웅덩이 탈출:
    • 만약 딥러닝이 계곡을 내려가다 작은 웅덩이(Local Minima)나 평평한 고원(안장점)에 갇혔다고 치자. 완벽한 BGD는 "기울기가 0이네? 여긴 바닥이야"라며 영원히 멈춰버린다.
    • 하지만 SGD는 이상한 데이터 64개를 뽑았을 때 발생하는 '순간적인 엉뚱한 방향의 미분값(강력한 노이즈 펀치)' 때문에, 차가 덜컹거려 구덩이 밖으로 확 튕겨 튕겨 나가게 된다. 이 덕분에 진짜 깊은 바닥(Global Minimum)을 향해 다시 굴러갈 수 있는 극강의 안정성을 확보하게 되었다.

📢 섹션 요약 비유: 완벽하게 둥글고 매끄러운 바퀴(BGD)로 산을 내려가면 작은 움푹 파인 웅덩이에 빠졌을 때 매끄러워서 절대 빠져나올 수 없습니다. 하지만 짱돌이 잔뜩 박힌 울퉁불퉁한 찌그러진 바퀴(SGD의 노이즈)로 산을 구르면, 그 덜컹거리는 요동치는 힘(반동) 때문에 얕은 웅덩이 따위는 퉁! 하고 치고 넘어버리는 엄청난 오프로드 탈출 능력을 얻게 된 것입니다.