討論的是在訓練大型語言模型(Transformer-based models,比如GPT等)時,文本序列的填充(padding)問題,即訓練和推理時分辨填充在序列的左側(left padding)或右側(right padding)進行?
先說結論:常規實踐時,訓練時,我們通常使用右填充(right padding);在推理時,使用左填充(left padding)。當然在通常的訓練推理框架中這是一個可選配置。例如,在Hugging Face的Transformers庫中,默認的填充方式可以通過tokenizer的設置來選擇。
為什么會有這樣的常規設置?
下面先詳細解釋一下左右padding的含義:
1. 右填充(Right Padding): 在序列的右側(即末尾)添加填充符號(如[PAD] token)直到達到最大長度。 例如,假設最大長度為5,一個序列為["A", "B"],右填充后變成["A", "B", "[PAD]", "[PAD]", "[PAD]"]。
2. 左填充(Left Padding): 在序列的左側(即開頭)添加填充符號。 同樣的例子,左填充后變成["[PAD]", "[PAD]", "[PAD]", "A", "B"]。
padding的作用是:
-
一個批次(batch)中的文本序列長度不同,需通過添加特殊符號(如
[PAD]
)使所有序列等長。 -
便于并行計算(如GPU加速),避免因長度不一致導致的計算錯誤。
接下來解釋為什么訓練是右填充,推理是左填充:
訓練時,對于自回歸模型(從左到右生成),我們一次處理整個序列,模型在預測下一個token時,注意力機制會關注到左側的所有token,因此我們把填充部分放在右邊,右填充確保真實token集中在左側,模型更易學習連續依賴關系。然后通常會對填充位置計算損失時進行掩碼(mask),所以填充部分不會影響訓練。
在推理時,當我們使用批次推理(batch inference)并采用自回歸生成時,左填充可以使得每個序列的真實內容都位于右側,這樣在生成過程中,模型每次只需要關注最新的token(即最右側的token),而左側的填充不會干擾生成。同時,由于模型在生成時是從左到右,左填充確保了真實內容在生成過程中始終位于模型的右側上下文,生成文本時(如逐token生成),左填充將真實token推向右側,使模型每次只需關注最新生成的token(右側)。若用右填充,生成過程中真實token在左側,而模型會根據右側Padding token來生成新內容,效果差。