강의자료 · 인공지능응용

Multiclass Classification과 Logits

인공지능응용 · 8주차

이번 주 목표 · 출력 차원과 label을 연결하고 logit·softmax·argmax를 구분합니다.

실행: Colab에서 내 Drive에 사본을 저장한 뒤 Code Cell의 ▶ 또는 Shift+Enter로 위에서부터 실행하세요. ⟦직접 입력⟧ 표시가 있는 Text Cell은 더블클릭해서 수정합니다.

Binary에서 Multiclass로 확장하기

7주차는 점수 하나에서 두 Class를 판정했습니다. 이번에는 C개 Class마다 점수 하나씩 만들므로 출력이 (N,C)가 됩니다. 예를 들어 Logit [1,2,4]의 가장 큰 값은 Class Index 2입니다. 정답이 2일 때 학습용 Label은 숫자 하나이며, Model 출력 세 개와 역할이 다릅니다. 이번 CSV에는 표본마다 특징이 16개 있으므로 입력 shape는 (N,16)입니다. 모델은 이 특징들을 이용해 Class별 점수를 계산합니다.

1. 출력 하나로는 부족한 이유

클래스가 C개이면 각 표본에 대해 C개의 점수를 출력합니다. 입력이 (N,16)이면 선형층의 출력은 (N,C)입니다. CSV label 열이 하나라는 사실과 모델 출력 차원이 하나라는 말은 다릅니다.

출력 하나로는 부족한 이유

label은 정답 클래스의 인덱스 한 개입니다. 0부터 C-1까지의 long Tensor(텐서) (N,)로 준비합니다. 실제 데이터의 고유값을 먼저 확인하고 필요한 경우 인덱스를 매핑합니다.

2. 점수에서 확률과 판정으로

softmax(dim=1)는 한 표본의 클래스 점수를 합이 1인 값들로 바꿉니다. argmax(dim=1)는 가장 큰 점수를 가진 클래스 인덱스를 고릅니다. 클래스 축 대신 Batch 축에 적용하지 않도록 주의하세요.

점수에서 확률과 판정으로

Softmax를 적용해도 가장 큰 점수의 Class는 그대로입니다. 따라서 Logit에서 argmax로 고른 Class와 확률에서 고른 Class가 같습니다. 동점에서는 구현의 선택 규칙에 따라 하나가 선택됩니다.

3. Loss(손실)에는 logit을 넣기

CrossEntropyLoss는 logit과 정답 인덱스를 받습니다. 학습 전에 softmax를 따로 넣지 않습니다. loss와 Accuracy(정확도)를 함께 기록하고 어떤 표본을 틀렸는지 살펴보세요.

Loss에는 logit을 넣기

Accuracy는 같아도 올바른 클래스에 주는 점수가 개선되면 loss가 달라질 수 있습니다. 출력 범위와 dtype 오류는 전체 데이터를 학습하기 전에 데이터 몇 개를 모델에 넣어보면 빠르게 찾을 수 있습니다.

4. 오분류를 확인하는 순서

처음 10개 표본의 예측·정답·확률을 출력하고 prediction!=label인 인덱스를 찾습니다. 최대 세 개의 오분류를 골라 어떤 클래스로 혼동했는지 적으세요. 오분류가 없으면 없다고 기록합니다.

오분류를 확인하는 순서

이 실습의 Accuracy는 제공 데이터에서의 학습 결과 확인 지표입니다. 별도 평가 데이터를 사용하지 않았다면 학습 데이터에서 얻은 Accuracy라고 표시하세요.

학습 내용 확인

  1. 코드에 넣을 값은 무엇이며, 결과 배열의 각 행·열은 무엇을 뜻하나요? 물리량을 계산한다면 단위도 확인했나요?
  2. 조건을 하나 바꿨을 때 다시 실행해야 하는 부분을 찾을 수 있나요?
  3. 실행 결과가 예상과 맞나요? 다르다면 출력값이나 그래프를 보고 이유를 설명할 수 있나요?

PyTorch 공식 Tutorials

실습 자료