epoch 반복 — 같은 데이터를 여러 바퀴 ★★
한 번 업데이트하는 것만으로는 원하는 weight를 얻기 어려워요. 학습률만큼만 조금씩 움직이기 때문이에요. 그래서 같은 학습 데이터를 여러 번 사용하면서 5줄을 반복해요. 전체 데이터를 한 번 쓴 횟수가 epoch이에요.
교수님 노트북의 예제예요. 정답이 y = 2x + 1인 데이터 5개를 nn.Linear(1, 1)에 학습시켜서, 처음엔 랜덤이던 weight와 bias가 2와 1에 가까워지는지 봐요. 데이터가 5개뿐이라 전부 한 번에 넣어요. 그러면 한 epoch이 한 step이에요.
| 코드 줄 | 무슨 뜻 |
|---|---|
torch.arange(-2.0, 3.0).reshape(-1, 1) | -2부터 2까지 5개 숫자를 5줄 1칸으로 놓아요. 입력 특성 1개짜리 데이터 5개예요. |
y_train = 2 * x_train + 1 | 맞혀야 할 정답이에요. 모델은 이 "2와 1"을 모르고 시작해요. |
nn.Linear(1, 1) | 입력 1개, 출력 1개. weight와 bias가 하나씩 있고 처음에는 랜덤 값이에요. |
for epoch in range(201): | 5줄을 201번 반복해요. 매번 전체 데이터를 한 번에 사용해요. |
if epoch % 20 == 0: | 20번에 한 번만 출력해요. (%는 나머지예요. 나머지가 0이면 20의 배수) |
loss.item() | loss Tensor에서 순수한 숫자를 꺼내요. |
위 출력 숫자는 교수님 노트북에서 나온 거예요. 결과를 보면 loss는 20.23에서 0에 가까워지고, weight는 −0.72에서 2에, bias는 −0.60에서 1에 가까워져요. 시작 값이 랜덤이라 처음 숫자는 실행할 때마다 조금 달라요. 학습이 끝난 모델에 새 입력 5와 10을 넣으면 약 11과 21이 나와요(2×5+1, 2×10+1).
자료의 심화 실습은 같은 방식으로 y = 3x − 2를 200 epoch 학습해요. 학습에 쓰지 않은 x = 3.0을 넣으면 정답 7에 가까운 값이 나와요. 이때 최종 weight가 정확히 3, −2가 아니라 가까운 값이어도 되는 이유는 학습 횟수가 유한하고 컴퓨터 계산에 미세한 오차가 있기 때문이에요. 또 optimizer는 반복문 밖에서 한 번만 만들어요.
학습 루프에서 "range(201)이면 step이 몇 번인가"는 전체 데이터를 한 번에 넣을 때 201번이에요. 학습이 잘 되면 loss는 줄어들어요. 그래서 학습 전후 loss 비교 문제에서는 "학습 후 loss가 더 작다"를 고르세요. 또 zero_grad()를 매 epoch 실행하는 이유는 이전 기울기의 누적을 막기 위해서예요.
잠깐 확인 — 학습이 잘 진행되면 epoch이 늘수록 loss는 어떻게 변하나요?
0에 가까워져요. 위 예제에서도 20.23에서 거의 0으로 줄어들었어요.
자료: 6·7주차 · Week04_Autograd_Loss_Optimizer, Week05_Dataset_DataLoader_Train_Validation(part1), 딥러닝 모델 Training 과정.pdf · 7주차 녹취(빅데이터07)