본문 바로가기
HRDI_AI/머신러닝_딥러닝 핵심 기술과 실무 중심 생성형 AI 프로젝트

AutoModelForSeq2SeqLM의 손실함수

by Toddler_AD 2025. 11. 27.

지금 코드에서 쓰이는 손실함수는 토큰 단위 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는:

  1. 배치에서 input_ids, attention_mask, labels를 꺼내서
  2. 그대로 model(**batch)에 넣습니다.
  3. AutoModelForSeq2SeqLM 의 forward()가 loss와 logits를 리턴합니다.
  4. 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)
  • 의미:
    • “정답 번역 문장을 최대한 높은 확률로 예측하도록 모델의 파라미터를 업데이트하는 과정”