지금 코드에서 쓰이는 손실함수는 토큰 단위 Cross Entropy Loss(교차 엔트로피 손실) 입니다.
조금 더 정확히 말하면:
AutoModelForSeq2SeqLM 내부에 정의된 nn.CrossEntropyLoss(ignore_index=-100)
를 써서, 타깃 토큰 시퀀스에 대한 음의 로그 우도(NLL) 를 최소화하고 있습니다.
아래처럼 단계별로 보시면 됩니다.
1. 우리 코드에서 loss가 어디서 오는가?
지금 학습 루프는 Seq2SeqTrainer가 돌리고 있고, 우리는 따로 compute_loss를 정의하지 않았죠.
trainer = Seq2SeqTrainer(
model=model,
args=training_args,
train_dataset=tokenized_train,
eval_dataset=tokenized_valid,
tokenizer=tokenizer,
data_collator=data_collator,
)
이 경우 Trainer는:
- 배치에서 input_ids, attention_mask, labels를 꺼내서
- 그대로 model(**batch)에 넣습니다.
- AutoModelForSeq2SeqLM 의 forward()가 loss와 logits를 리턴합니다.
- Trainer는 그 중 outputs.loss 를 손실값으로 사용합니다.
즉, 손실함수를 직접 설정한 적이 없기 때문에, 모델 안에 구현된 기본 loss를 그대로 쓰는 구조입니다.
2. AutoModelForSeq2SeqLM의 기본 손실: 토큰 단위 Cross Entropy
T5 계열 AutoModelForSeq2SeqLM의 기본 언어모델링 손실은:
- 타깃 문장의 각 토큰에 대해
예측 분포(logits)와 정답 토큰(labels) 사이의 - Cross Entropy Loss (교차 엔트로피) 를 계산하고,
- 배치 + 시퀀스 길이 전체에 대해 평균(mean) 을 취한 값입니다.
개념적으로는:
- 디코더는 teacher forcing으로 target을 한 토큰씩 예측
- 각 시점 tt 에 대해

- 정답 토큰 yt에 대해 Cross Entropy:

- 전체 문장/배치에 대해 평균:

PyTorch 코드로 치면 대략 이런 느낌입니다:
loss_fct = nn.CrossEntropyLoss(ignore_index=-100)
# logits: [batch, seq_len, vocab_size]
# labels: [batch, seq_len]
loss = loss_fct(
logits.view(-1, vocab_size), # [batch*seq_len, vocab]
labels.view(-1), # [batch*seq_len]
)
3. padding, -100, ignore_index 처리
DataCollatorForSeq2Seq 가 중요한 역할을 하나 합니다:
- 배치로 묶을 때 labels의 padding 토큰을 -100으로 바꿔 줍니다.
- 그리고 CrossEntropyLoss(ignore_index=-100) 이기 때문에
- -100 위치의 토큰은 loss 계산에서 완전히 무시됩니다.
그래서:
- 문장마다 길이가 달라서 생긴 padding 부분은
모델 성능 평가에 영향을 주지 않습니다. - 실질적으로는 “실제 단어 토큰들만 대상으로 한 토큰 단위 Cross Entropy”라고 보면 됩니다.
4. 정리:
지금 우리의 ke-t5-large-ko 번역 파인튜닝에서는:
- 모델: AutoModelForSeq2SeqLM (T5 계열)
- 손실함수:
- 디코더 출력 logits와 target token 사이의
토큰 단위 Cross Entropy Loss (negative log-likelihood) - padding 위치는 -100으로 마스킹되어 loss에서 제외 (ignore_index=-100)
- 디코더 출력 logits와 target token 사이의
- 의미:
- “정답 번역 문장을 최대한 높은 확률로 예측하도록 모델의 파라미터를 업데이트하는 과정”
'HRDI_AI > 머신러닝_딥러닝 핵심 기술과 실무 중심 생성형 AI 프로젝트' 카테고리의 다른 글
| translate_article.py (0) | 2025.11.29 |
|---|---|
| finetune_ke_t5_ko2en.py (0) | 2025.11.28 |
| AutoModelForSeq2SeqLM (0) | 2025.11.27 |
| AdamW란 무엇인가, 왜 쓰는가, 수식/직관/실전 세팅까지 (0) | 2025.11.27 |
| 1. Trainer 하이퍼파라미터 정리 (0) | 2025.11.27 |