시험공부빅데이터분석
← 보드학습 루프와 검증 · 2/7

epoch 반복 — 같은 데이터를 여러 바퀴 ★★

한 번 업데이트하는 것만으로는 원하는 weight를 얻기 어려워요. 학습률만큼만 조금씩 움직이기 때문이에요. 그래서 같은 학습 데이터를 여러 번 사용하면서 5줄을 반복해요. 전체 데이터를 한 번 쓴 횟수가 epoch이에요.

교수님 노트북의 예제예요. 정답이 y = 2x + 1인 데이터 5개를 nn.Linear(1, 1)에 학습시켜서, 처음엔 랜덤이던 weight와 bias가 2와 1에 가까워지는지 봐요. 데이터가 5개뿐이라 전부 한 번에 넣어요. 그러면 한 epoch이 한 step이에요.

x_train = torch.arange(-2.0, 3.0).reshape(-1, 1) # [-2, -1, 0, 1, 2], 크기 (5, 1) y_train = 2 * x_train + 1 # 정답: [-3, -1, 1, 3, 5] model = nn.Linear(1, 1) criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.02) for epoch in range(201): optimizer.zero_grad() prediction = model(x_train) loss = criterion(prediction, y_train) loss.backward() optimizer.step() if epoch % 20 == 0: print( f"epoch={epoch:3d} loss={loss.item():.6f} " f"w={model.weight.item():.4f} b={model.bias.item():.4f}" )
epoch= 0 loss=20.231350 w=-0.7189 b=-0.5958 epoch= 20 loss=1.161789 w=1.4870 b=0.2947 epoch= 40 loss=0.127610 w=1.9032 b=0.6882 epoch= 60 loss=0.021393 w=1.9817 b=0.8622 epoch= 80 loss=0.004053 w=1.9966 b=0.9391 epoch=100 loss=0.000787 w=1.9993 b=0.9731 epoch=120 loss=0.000154 w=1.9999 b=0.9881 epoch=140 loss=0.000030 w=2.0000 b=0.9947 epoch=160 loss=0.000006 w=2.0000 b=0.9977 epoch=180 loss=0.000001 w=2.0000 b=0.9990 epoch=200 loss=0.000000 w=2.0000 b=0.9995
코드 줄무슨 뜻
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)