pad_token 是 <|endoftext|>(id 0)。正文里字面出现这个串时会被编成同一个 id, 而 labels[input_ids == pad_token_id] = -100 是按 token id 屏蔽的, 于是这个真实的正文 token 被当成 padding 从 loss 里丢掉。 改为按位置屏蔽 labels[n_real:] = -100,n_real = len(bos + 正文 + eos)。 padding 只可能出现在序列尾部,所以按位置屏蔽在语义上更准确,也更便宜。 SFTDataset 不受影响:它的 generate_labels 从全 -100 出发、扫描 assistant 区间来填,不依赖 pad id。 |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| dataset.md | ||
| lm_dataset.py | ||