스킬캠퍼스

오늘 끝나면

활성화 · 손실 · 옵티마이저

  • 활성화 · 손실 · 옵티마이저의 핵심 문제를 한 문장으로 설명한다
  • 오른쪽 실습에서 활성화이 어떻게 움직이는지 관찰한다
  • 다음 강의와 이어지는 한계를 말할 수 있다

실습 미션

Sigmoid→ReLU, SGD→Adam — 학습을 ‘되게’ 만든 진화사 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.

성공 조건

  • 실습의 기본값을 먼저 관찰
  • 입력값이나 모드를 한 번 이상 바꿔 결과 비교
  • 왜 결과가 바뀌었는지 한 문장으로 설명

AI · Day 3 / 지도학습 · 생성 DL

활성화·손실
옵티마이저

층 쌓는 법은 어제 다뤘다. 이제 세 가지가 남았다. 망에 비선형을 넣고, 틀린 정도를 숫자 하나로 재고, 그 숫자를 보고 어디로 얼마나 갈지 정한다. 이 셋이 학습 엔진이다.

P.01AI · Day 3

왜 비선형이 필요했나

층을 100개 쌓으면 표현력도 100배가 될 것 같다. 그렇지 않다.

활성화 없이 선형 층만 쌓으면 W2(W1x)는 결국 (W2 W1)x로 합쳐진다. 행렬 하나일 뿐이다. 100층이 1층으로 무너지고, 망은 직선밖에 못 그린다. 선형끼리 합성하면 또 선형이기 때문이다.

곡선을 그리려면 중간에 구부리는 장치가 필요하다. 그게 활성화 함수다. 층마다 비선형을 한 번 끼우면 망이 곡면을 휘어 임의의 함수를 흉내 낸다. 활성화가 없으면 100층도 1층이고, 비선형을 끼워야 깊이가 표현력으로 바뀐다.

선형 적층 vs 비선형
선형만 적층 = 직선W2(W1x) = (W2W1)x비선형 끼움 = 곡선임의 함수 근사

활성화 없는 적층은 한 층으로 붕괴된다. 곡선을 그리려면 중간에 비선형을 한 번 끼운다.

P.02AI · Day 3

활성화, Sigmoid에서 ReLU로

2010년 전에는 sigmoid를 썼다. 부드럽고 0과 1 사이로 눌러주기 때문이다. 그런데 망이 깊어지자 학습이 멈췄다.

이유는 기울기다. sigmoid 도함수의 최댓값이 0.25다. 역전파에서 층마다 이 값을 곱한다. 10층이면 0.25^10, 약 9.5e-7이다. 입력층 기울기가 사실상 0이 된다. 이것이 기울기 소실이다.

돌파구는 어이없을 만큼 단순하다. ReLU다. 음수면 0, 양수면 그대로다. 도함수가 0 아니면 1이라 양수 구간에서는 곱해도 줄지 않는다. 그래서 소실이 생기지 않는다.

변형도 있다. LeakyReLU는 음수도 살짝 흘려보내고, GELU는 부드러운 버전으로 트랜스포머 표준이다.

Q. 출력층에는 어떤 활성화를 쓰나?이진 분류는 sigmoid를 써서 확률 하나를 낸다. 다중 분류는 softmax를 써서 합이 1인 확률 분포를 낸다. 회귀는 보통 쓰지 않고 실수를 그대로 내보낸다. 은닉층 ReLU와 출력층 활성화는 역할이 다르다.
직접 조작 · 함수 고르고 z 밀어보기
활성화 함수 · z를 밀며 기울기를 본다
출력 f(z)
0.818
기울기 f′(z)
0.149
10층 곱셈 ⁱⁿ
5.4e-9
기울기 소실. 이 기울기를 10층 곱하면 거의 0이라 입력층까지 신호가 가지 않는다.
P.03AI · Day 3

손실, 틀린 정도를 숫자 하나로

학습은 결국 "틀린 정도"를 줄이는 게임이다. 그 정도를 숫자 하나로 압축한 것이 손실 함수다.

회귀는 MSE(평균제곱오차)를 쓴다. 예측과 정답의 차이를 제곱해 평균 낸 값이다. 분류는 Cross-Entropy를 쓴다. 정답 클래스에 매긴 확률의 로그에 마이너스를 붙인 값이다. 0.99로 맞히면 손실이 거의 0이지만, 0.01로 헛다리를 짚으면 손실이 폭발한다.

왜 분류에 MSE를 쓰지 않을까. Cross-Entropy는 softmax와 만나면 기울기가 (예측 − 정답)으로 깔끔하게 떨어진다. 틀릴수록 더 세게 민다. MSE는 확률이 극단으로 가면 기울기가 죽어 학습이 굼떠진다. 손실은 옵티마이저에게 주는 나침반이다.

파이썬 코드 보기
import torch.nn as nn

# 회귀: 평균제곱오차
mse = nn.MSELoss()

# 다중 분류: softmax + 로그 + NLL 한 번에
ce = nn.CrossEntropyLoss()
# 입력은 raw logits, 타깃은 정수 라벨

loss = ce(logits, labels)
loss.backward()  # 여기서 (예측 - 정답) 기울기가 흐른다
MSE vs Cross-Entropy
정답 확률 →손실−log(p)MSE

정답 확률이 낮은 왼쪽에서 Cross-Entropy는 손실이 폭발한다. 그만큼 더 세게 민다.

P.04AI · Day 3

옵티마이저, 어느 방향으로 얼마나

손실이 나침반이면, 옵티마이저는 그 나침반을 보고 실제로 걷는 다리다.

기본은 SGD다. 기울기 반대 방향으로 learning rate만큼 한 발 내딛는다. 단순하다. 그런데 골짜기에서 좌우로 출렁여 느리다. 그래서 Momentum이 나왔다. 이전 속도를 일부 이어받아 관성으로 미끄러진다. 출렁임이 줄고 빨라진다.

지금 표준은 Adam이다. 파라미터마다 기울기의 평균(1차)과 분산(2차)을 추적한다. 그것으로 보폭을 자동으로 조절한다. 자주 흔들리는 축은 작게, 잠잠한 축은 크게 움직인다. 가중치 감쇠를 제대로 분리한 AdamW가 트랜스포머 학습의 사실상 디폴트다.

하나만 기억하면 된다. learning rate가 너무 크면 발산하고, 너무 작으면 평생 못 내려온다. 학습이 안 되면 옵티마이저를 바꾸기 전에 lr부터 의심한다.

직접 굴려보기 · lr·시작위치 바꿔보기
경사 하강법 · 손실곡면을 굴러내려간다
step 0
x
3.40
손실 f(x)
1.58
기울기
4.66
시작 대기
P.05AI · Day 3

비즈니스, 학습 속도는 돈이다

이 셋은 학문적 디테일이 아니다. 실험 비용을 좌우하는 레버다.

흔한 장면이다. 한 팀이 sigmoid와 SGD로 한 번 학습할 때마다 GPU를 하루씩 태운다. 은닉층을 ReLU로, 옵티마이저를 AdamW로 바꾼다. 같은 모델이 몇 시간 만에 수렴한다. 같은 기간에 실험을 몇 배 더 돌린다. 최종 성능도 올라간다.

엔지니어의 시간은 대부분 수렴을 기다리는 시간이다. 활성화와 손실, 옵티마이저 조합만 맞춰도 그 시간이 줄어든다. 가장 값싼 레버리지다. 비싼 GPU를 더 사기 전에 이 세 칸부터 점검해야 한다.

Q. 분류 모델인데 학습이 처음부터 NaN이 뜬다. 어디부터 보나?세 가지부터 본다. learning rate가 너무 커서 발산하는지 본다. 출력층 softmax에 CrossEntropyLoss(이미 softmax 포함)까지 먹여 이중으로 적용했는지 본다. log(0)이 나는 입력은 없는지 본다. 대개 lr을 10배 낮추거나 loss 입력을 raw logits로 바꾸면 잡힌다.
선택 가이드
상황손실출력 활성화
회귀MSE없음
이진 분류BCEsigmoid
다중 분류Cross-Entsoftmax

은닉층 활성화는 보통 ReLU를 쓰고 트랜스포머는 GELU를 쓴다. 옵티마이저는 AdamW가 기본이고, 막히면 lr부터 의심한다.

3줄 요약

  1. 1Sigmoid→ReLU, SGD→Adam — 학습을 ‘되게’ 만든 진화사
  2. 2활성화 · 손실 · 옵티마이저은 준비운동 → 지도학습 → 시퀀스 → 생성모델 → 실무 적용 흐름 안의 한 칸이다.
  3. 3개념을 외우는 것보다 입력을 바꾸면 무엇이 달라지는지 보는 것이 우선이다.

완료 전 점검

복습 카드

활성화

Sigmoid→ReLU, SGD→Adam — 학습을 ‘되게’ 만든 진화사

모델

입력을 받아 예측이나 출력을 만드는 계산 규칙

손실

예측이 정답에서 얼마나 빗나갔는지 재는 숫자