为什么加BOS/EOS
在RNN时代,对于Seq2Seq模型,需要对数据添加开始标志[BOS]和结束标志[EOS],这样做的目的是在解码阶段模型进行自回归计算时,模型可以收到一个结束标志[EOS],同时,在开始解码时,通过输入开始标记[BOS]来确保模型看不到第一个真实的词,这种处理数据的方式被沿用到现在。
|原始文本序列|你是谁?|
|处理后新序列|[BOS]你是谁?[EOS]|
Transformers库提供的预训练模型
以Bart模型为例,源码的forward中有这样的代码:
1 | if labels in not None: |
查看shift_tokens_right的源码,其实现如下:
1 | def shift_tokens_right(input_ids:torch.Tensor,pad_token_id:int,decoder_start_token_id:int): |
可以发现模型已经将decoder_start_token_id添加到数据当中了。