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에서 제외할 위치를 표시하는 용도로 설명되었다.
이 에서 한 번 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 target과 맞추기 위해서다. 마지막 position에는 다음 target이 없는 예시다.
Token별 CE가 5개이면 backward도 5번 해야 하는가?
Answer
아니다. 유효 losses를 평균한 scalar로 한 번 backward한다.