0-3. 신경망과 역전파
신경망은 "숫자를 넣으면 숫자가 나오는 함수"다. 그 함수 안에 조절 손잡이가 아주 많이 달려 있고, 학습은 그 손잡이를 조금씩 돌리는 일이다. 이번 수업은 이 두 문장을 풀어 쓴 것이다.
신경망은 함수다
0-1에서 "점을 데이터 분포 쪽으로 옮기는 방법을 신경망에게 가르친다"고 했다. 그 신경망이 하는 일은 이것이다.
- 입력: 노이즈가 섞인 그림(숫자 묶음)과 노이즈 비율 t
- 출력: 그 그림에 섞인 노이즈(같은 크기의 숫자 묶음)
숫자 묶음이 들어가서 숫자 묶음이 나온다. 함수다. 다만 식을 사람이 정하지 않는다. 식의 틀만 정해 놓고, 안에 든 숫자는 데이터를 보면서 맞춘다.
뉴런 하나
가장 작은 부품은 이렇게 생겼다.
출력 = 활성화( w₁·x₁ + w₂·x₂ + … + b )
x: 입력w: 가중치. 각 입력을 얼마나 반영할지 정하는 숫자b: 편향. 더해 주는 숫자- 활성화: 결과를 한 번 구부리는 함수
w와 b가 조절 손잡이다. 이것을 파라미터라고 부른다. "모델이 120억 파라미터"라는 말은 손잡이가 120억 개라는 뜻이다. 모델 파일의 용량은 거의 전부 이 숫자들이다.
활성화가 없으면 안 되는 이유
곱하고 더하기만 하면 직선밖에 못 만든다. 층을 100개 쌓아도 합치면 여전히 곱하기 한 번, 더하기 한 번이다.
중간에 한 번씩 구부려 줘야 복잡한 모양을 만들 수 있다. 가장 단순한 활성화는 ReLU다. 음수는 0으로 만들고 양수는 그대로 둔다. 요즘 이미지 모델은 이것을 부드럽게 다듬은 SiLU나 GELU를 쓴다.
층을 쌓는다
뉴런을 옆으로 여러 개 놓으면 층이 된다. 층을 여러 개 이으면 신경망이다.
입력 → [층 1] → [층 2] → … → [층 N] → 출력
앞쪽 층은 단순한 특징을 잡고, 뒤쪽 층은 그것을 조합해 복잡한 특징을 잡는다. 이미지라면 선과 점 → 눈과 코 → 얼굴 순서다. 이것을 사람이 정해 주지 않는다. 학습하다 보면 그렇게 된다.
손실: 얼마나 틀렸는가
학습하려면 "틀린 정도"를 숫자 하나로 만들어야 한다. 이것이 손실이다. 가장 흔한 것은 제곱 오차다.
손실 = (예측 − 정답)²
0-2에서 본 대로, 가우시안을 다루는 생성 모델의 손실은 결국 이 제곱 오차가 된다. 여러 표본에 대해 평균 내면 MSE(mean squared error)다.
경사하강법: 손실이 줄어드는 쪽으로 조금씩
손잡이 하나를 아주 조금 돌렸을 때 손실이 얼마나 변하는지를 기울기라고 한다. 수학에서 말하는 미분이다.
- 기울기가 양수: 손잡이를 올리면 손실이 커진다. 내려야 한다.
- 기울기가 음수: 손잡이를 올리면 손실이 줄어든다. 올려야 한다.
그래서 규칙은 하나다. 기울기의 반대쪽으로 조금 움직인다.
w ← w − 학습률 × 기울기
학습률은 한 번에 얼마나 움직일지 정하는 숫자다. 너무 크면 정답을 지나쳐 튕겨 나가고, 너무 작으면 한참 걸린다.
숫자로 한 번 해 보자. 모델은 예측 = w·x 하나뿐이다. 입력 x = 2, 정답은 10, 지금 w = 3이다.
| 단계 | 계산 | 값 |
|---|---|---|
| 예측 | 3 × 2 | 6 |
| 손실 | (6 − 10)² | 16 |
| 기울기 | 2 × (6 − 10) × 2 | −16 |
| 갱신 (학습률 0.1) | 3 − 0.1 × (−16) | w = 4.6 |
| 새 예측 | 4.6 × 2 | 9.2 |
| 새 손실 | (9.2 − 10)² | 0.64 |
한 걸음에 손실이 16에서 0.64로 줄었다. 이것을 수없이 반복하는 것이 학습의 전부다.
역전파: 모든 손잡이의 기울기를 한 번에
손잡이가 하나면 위처럼 손으로 계산한다. 120억 개면 어떻게 할까.
층이 이어진 구조에서는 뒤에서 앞으로 거슬러 가면서 기울기를 차례로 구할 수 있다. 이유는 연쇄 법칙이다. "A가 B를 바꾸고 B가 C를 바꾸면, A가 C에 주는 영향은 두 영향의 곱"이라는 규칙이다.
- 입력을 넣어 출력과 손실을 구한다. 앞으로 가는 계산이다.
- 손실에서 출발해 마지막 층, 그 앞 층 순서로 기울기를 넘겨 준다. 뒤로 가는 계산이다.
2번을 역전파라고 한다. 계산 한 번으로 모든 손잡이의 기울기가 나온다. 직접 짤 필요는 없다. PyTorch 같은 도구가 loss.backward() 한 줄로 해 준다.
실제 학습의 모양
반복:
데이터에서 미니배치를 뽑는다
모델에 넣어 예측을 얻는다
손실을 계산한다
역전파로 기울기를 구한다
파라미터를 조금 움직인다
알아 둘 말 몇 가지.
- 미니배치: 한 번에 넣는 표본 묶음. 0-2의 "표본 평균으로 기대값을 대신한다"가 이것이다.
- 스텝: 위 반복 한 번.
- 에폭: 데이터 전체를 한 바퀴 도는 것.
- 옵티마이저: 파라미터를 움직이는 방법. 기본 경사하강법을 다듬은 Adam, AdamW를 주로 쓴다.
- 과적합: 학습 데이터를 외워 버려서 새 입력에는 못 맞히는 상태. 4단계 LoRA 학습에서 계속 만나게 된다.
확인 문제
- 위 예시에서 학습률을 0.3으로 하면 w는 얼마가 되나? 그때 새 손실은?
- 활성화 함수를 전부 빼면 왜 층을 깊게 쌓는 의미가 없나?
- 입력 100개를 받아 출력 50개를 내는 층 하나의 파라미터는 몇 개인가?
풀이
- w = 3 − 0.3 × (−16) = 7.8이다. 새 예측은 15.6, 새 손실은 31.36이다. 손실이 오히려 커졌다. 학습률이 너무 크면 정답을 지나친다.
- 곱하고 더하는 계산을 여러 번 이어 붙여도 결국 곱하기 한 번, 더하기 한 번으로 합쳐진다. 직선밖에 표현하지 못한다.
- 5,050개다. 가중치 100 × 50 = 5,000개에 편향 50개를 더한다.