학습은 손실을 줄이는 과정입니다
모델은 입력을 받아 예측값을 만듭니다. 하지만 처음 만든 모델의 예측은 대부분 틀립니다. 그래서 "얼마나 틀렸는지" 숫자로 계산해야 합니다. 이 숫자를 손실값, 또는 loss라고 부릅니다.
손실값이 크면 예측이 정답과 많이 다르다는 뜻입니다. 손실값이 작아지면 모델이 정답에 가까운 방향으로 학습되고 있다는 뜻입니다. PyTorch에서는 손실 함수를 정한 뒤, 모델의 출력과 정답을 넣어 손실을 계산합니다.
loss_fn = nn.CrossEntropyLoss()
loss = loss_fn(outputs, labels)여기서 outputs는 모델이 만든 예측이고, labels는 실제 정답입니다.

분류 문제에는 CrossEntropyLoss를 자주 씁니다
이미지를 보고 티셔츠, 바지, 신발 중 하나를 맞히는 문제처럼 정답이 여러 클래스 중 하나라면 분류 문제입니다. 이런 경우 PyTorch에서는 보통 nn.CrossEntropyLoss()를 사용합니다.
중요한 점은 CrossEntropyLoss가 logits를 입력으로 받는다는 것입니다. logits는 아직 확률로 바꾸기 전의 점수입니다. 예를 들어 클래스가 10개라면 모델 출력은 보통 다음과 같은 모양입니다.
outputs.shape # torch.Size([32, 10])
labels.shape # torch.Size([32])32는 배치 크기이고, 10은 클래스 개수입니다. labels에는 각 데이터의 정답 클래스 번호가 들어갑니다.
labels = torch.tensor([0, 3, 1, 9])CrossEntropyLoss 안에는 확률 계산에 해당하는 처리가 포함되어 있습니다. 그래서 모델 마지막에 따로 softmax를 붙이지 않고 logits를 그대로 넘기는 경우가 많습니다.
회귀 문제에는 MSELoss를 사용합니다
집값, 온도, 키, 매출처럼 연속적인 숫자를 예측하는 문제는 회귀 문제입니다. 이때는 nn.MSELoss()를 자주 사용합니다. MSE는 예측값과 정답값의 차이를 제곱해서 평균낸 값입니다.
loss_fn = nn.MSELoss()
loss = loss_fn(predictions, targets)분류에서는 정답이 클래스 번호입니다. 반면 회귀에서는 정답이 실제 숫자입니다. 그래서 회귀의 predictions와 targets는 보통 같은 모양의 실수 텐서여야 합니다.
predictions.shape # torch.Size([32, 1])
targets.shape # torch.Size([32, 1])정리하면, "무엇 중 하나를 고르는 문제"는 CrossEntropyLoss, "숫자를 맞히는 문제"는 MSELoss에서 시작하면 됩니다.
옵티마이저는 파라미터를 업데이트합니다
손실을 계산했다면 이제 모델을 고쳐야 합니다. 이때 사용하는 도구가 옵티마이저입니다. 옵티마이저는 각 파라미터의 기울기(.grad)를 보고 어떤 방향으로 얼마나 수정할지 결정합니다.
가장 기본적인 옵티마이저는 SGD입니다.
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)model.parameters()는 모델 안의 학습 가능한 가중치와 편향을 옵티마이저에 전달합니다. 옵티마이저는 이 값들을 직접 업데이트합니다.
lr은 learning rate, 즉 학습률입니다. 한 번 업데이트할 때 얼마나 크게 움직일지 정합니다. 너무 크면 손실이 불안정하게 튈 수 있고, 너무 작으면 학습이 지나치게 느려질 수 있습니다.
Adam도 많이 쓰입니다.
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)SGD는 단순하고 기본에 충실합니다. Adam은 파라미터마다 업데이트 크기를 조금 더 유연하게 조절해 초보자가 안정적으로 시작하기 좋습니다. 처음에는 Adam(lr=0.001)이나 SGD(lr=0.01) 정도로 시작해도 충분합니다.
epoch, batch size, learning rate의 의미
학습 설정에서 자주 만나는 값이 세 가지 있습니다.
epoch: 전체 학습 데이터를 몇 번 반복해서 볼지 정합니다.
batch size: 데이터를 몇 개씩 묶어서 모델에 넣을지 정합니다.
learning rate: 파라미터를 한 번에 얼마나 크게 업데이트할지 정합니다.
예를 들어 데이터가 6,000개이고 batch size가 32라면, 모델은 데이터를 32개씩 나누어 여러 번 학습합니다. 이 전체 데이터를 한 바퀴 다 보면 1 epoch입니다.
batch size가 너무 작으면 손실이 흔들릴 수 있지만 메모리를 적게 씁니다. 너무 크면 안정적일 수 있지만 메모리를 많이 씁니다. learning rate는 학습 안정성에 특히 큰 영향을 줍니다. 손실이 줄지 않고 크게 흔들리면 learning rate를 낮춰 보는 것이 좋습니다.
손실값과 정확도는 다릅니다
손실값과 정확도는 둘 다 학습 상태를 보여 주지만 의미가 다릅니다.
손실값은 모델이 정답에 얼마나 가까운 점수를 냈는지 봅니다. 정확도는 최종 예측이 맞았는지 틀렸는지를 셉니다.
예를 들어 정답 클래스의 확률이 0.51인 모델과 0.99인 모델은 둘 다 맞혔으므로 정확도에서는 똑같이 1개 정답입니다. 하지만 손실값은 다르게 나옵니다. 0.99로 확신 있게 맞힌 모델의 손실이 더 작습니다.
그래서 학습 중에는 손실값과 정확도를 함께 보는 것이 좋습니다. 손실은 학습이 어느 방향으로 가는지 보여 주고, 정확도는 실제로 얼마나 많이 맞히는지 보여 줍니다.
다음 단계에서는 이 구성 요소들을 하나로 연결합니다. 모델이 예측하고, 손실을 계산하고, 역전파를 수행한 뒤, 옵티마이저가 파라미터를 업데이트하는 전체 학습 루프를 직접 작성해 보겠습니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.