‹ Lecture 3 21 / 21

Shifted Targets & Backward

Causal Mask & Next-Token Loss에서는 미래 정보를 가리면서 모든 positions의 loss를 함께 만들었다. 여기서는 그 관계가 코드의 indices로 어떻게 나타나는지 확인한다. Input과 target을 한 칸 어긋나게 맞추는 shift와, 정보 누설을 막는 Attention Mask는 서로 다른 역할이다.

Aligning Logits and Labels

Input이 The / cat / sat / on / the / mat라면 The position의 logits는 cat을, cat position의 logits는 sat을 예측해야 한다. 따라서 전체 logits에서 마지막 position을 빼고, labels에서는 첫 position을 빼면 대응하는 길이가 같아진다.

shift_logits = lm_logits[..., :-1, :].contiguous()
shift_labels = labels[..., 1:].contiguous()

Logits의 마지막 축은 Vocabulary다. Position 축을 한 칸 줄이는 것이며, Vocabulary의 마지막 ID를 버리는 코드가 아니다. Labels의 첫 token The는 이 예시에서 앞 position의 예측 target이 없으므로 shift된 targets에서 제외된다. 마지막 mat position의 output도 다음 label이 없어서 이 loss에 쓰지 않는다.

One Scalar, One Backward

슬라이드의 GPT-2 발췌는 shift한 logits와 labels를 CrossEntropyLoss에 전달한다. Positions를 펼쳐 각 token의 classification loss를 구하되, 유효 target들만 평균하여 하나의 scalar를 만든다. Ignore index인 -100은 학습 target에서 제외할 위치를 표시하는 용도로 설명되었다.

L=ℓ1+ℓ2+ℓ3+ℓ4+ℓ55L=\frac{\ell_1+\ell_2+\ell_3+\ell_4+\ell_5}{5}

이 LL에서 한 번 backward하면 각 position의 계산이 공통 parameters의 gradient에 기여한다. Loss가 다섯 개였다는 이유로 optimizer step도 다섯 번 하는 것이 아니다. Padding이나 선택하지 않은 turns를 loss에서 제외해도 그 tokens를 context에서 읽을지 여부는 Attention Mask가 별도로 정한다.

마지막 token에 종료 token label을 제공하는 dataset도 가능하다. 여기의 마지막 loss 제외는 보여 준 sequence와 코드 예시에 관한 처리이며, 모든 문서가 마지막 token을 무조건 학습하지 않는다는 규칙으로 일반화하지 않는다.

Check

왜 logits 마지막 position과 labels 첫 position을 각각 잘라 맞추는가?

Answer

Position t의 예측을 다음 token xt+1x_{t+1} target과 맞추기 위해서다. 마지막 position에는 다음 target이 없는 예시다.

Token별 CE가 5개이면 backward도 5번 해야 하는가?

Answer

아니다. 유효 losses를 평균한 scalar로 한 번 backward한다.

Contents