2장. 신경망과 딥러닝의 기본 원리
층을 쌓은 신경망
회사의 결재 라인을 떠올려 보세요. 담당자 여럿이 각자 서류를 검토해 의견을 올리면, 팀장 몇 명이 그 의견들을 모아 판단하고, 부장 한 명이 최종 결정을 내립니다. 층을 쌓은 신경망도 이렇게 생겼습니다.
왼쪽 청록 동그라미가 입력층(특성 7개), 마젠타 점선 안이 은닉층 둘, 오른쪽 다홍 동그라미가 출력층입니다. 선 하나하나가 가중치 하나입니다. 은닉층의 뉴런 수는 그리기 좋게 줄였고, 실습에서는 32개와 16개를 씁니다. 여기서 담당자가 은닉층 1, 팀장이 은닉층 2, 부장이 출력층입니다. 비유와 다른 점은, 회사에서는 담당자마다 맡은 일이 정해져 있지만 신경망의 뉴런은 학습하면서 스스로 맡을 일이 정해진다는 것입니다.
세 가지 층
| 층 | 뉴런 수를 정하는 법 | 실습 4에서 |
|---|---|---|
| 입력층 | 특성의 수와 같다 | 7(일차, 주말, 공휴일, 기온, 강수mm, 광고비만원, 할인행사) |
| 은닉층 | 사람이 정한다. 2의 거듭제곱(16, 32, 64)을 흔히 쓴다 | 32, 16 |
| 출력층 | 맞힐 값의 수와 같다 | 1(주문량) |
파라미터 수 세기
층과 층 사이의 가중치 수는 "앞 층 뉴런 수 × 뒤 층 뉴런 수"이고, 편향은 뒤 층 뉴런마다 하나입니다.
# 층마다의 뉴런 수: 입력 7, 은닉 32, 은닉 16, 출력 1
sizes = [7, 32, 16, 1]
total = 0
for a, b in zip(sizes, sizes[1:]):
n = a * b + b # 가중치 a×b 개 + 편향 b 개
print(f"{a} → {b}: {n}개")
total += n
print("모두", total, "개")7→32 에 256개, 32→16 에 528개, 16→1 에 17개로 모두 801개입니다.
이 코드가 세는 것
이 코드는 신경망이 학습으로 맞춰야 할 숫자, 곧 가중치와 편향이 모두 몇 개인지 셉니다. 이 수가 모델의 크기입니다.
| 코드 | 뜻 |
|---|---|
sizes = [7, 32, 16, 1] | 신경망의 설계도. 입력 7칸 → 은닉층 32개 → 은닉층 16개 → 출력 1개 |
zip(sizes, sizes[1:]) | 이웃한 두 층을 짝짓는다. (7, 32), (32, 16), (16, 1) 세 쌍이 "층과 층 사이" 하나씩이다 |
a * b | 그 사이의 가중치 수. 앞 층의 뉴런 하나하나가 뒤 층의 모든 뉴런과 이어지고, 그림의 선 하나가 가중치 하나다 |
+ b | 편향 수. 뉴런마다 편향이 하나씩이라 뒤 층의 뉴런 수만큼 생긴다 |
total += n | 세 구간을 모두 더한다 |
| 구간 | 가중치 | 편향 | 합 |
|---|---|---|---|
| 7 → 32 | 7 × 32 = 224 | 32 | 256 |
| 32 → 16 | 32 × 16 = 512 | 16 | 528 |
| 16 → 1 | 16 × 1 = 16 | 1 | 17 |
| 모두 | 801 |
이 숫자를 세어 보는 까닭은 셋입니다.
- 학습이 하는 일의 양입니다. "인공 뉴런" 절에서는 뉴런 하나의 가중치 3개와 편향 1개를 사람이 정해 주었습니다. 이 신경망에서는 그런 숫자 801개를 학습이 데이터를 보며 하나하나 맞춥니다.
- 실제 코드와 그대로 이어집니다. 실습 4는 같은 모양의 신경망을 PyTorch 의
nn.Linear(7, 32),nn.Linear(32, 16),nn.Linear(16, 1)로 만들고,sum(p.numel() for p in model.parameters())로 세어파라미터 수: 801을 얻습니다. 손으로 센 값과 라이브러리가 센 값이 같습니다. - 모델의 크기를 재는 단위입니다. "LLM 이 수십억 파라미터"라고 할 때의 파라미터가 바로 이 숫자입니다. 많을수록 더 복잡한 관계를 배울 수 있지만, 메모리와 학습 시간이 더 들고 과적합도 쉬워집니다.
주의할 점
- 은닉층의 뉴런을 늘리면 더 복잡한 곡선을 그릴 수 있지만, 1장에서 본 과적합도 쉬워집니다.
- 층이 깊을수록 늘 좋은 것은 아닙니다. 표 데이터는 은닉층 두세 개로 충분한 경우가 많습니다.