为什么生成模型中需要输入BOS和EOS等特殊标志

为什么加BOS/EOS

在RNN时代,对于Seq2Seq模型,需要对数据添加开始标志[BOS]和结束标志[EOS],这样做的目的是在解码阶段模型进行自回归计算时,模型可以收到一个结束标志[EOS],同时,在开始解码时,通过输入开始标记[BOS]来确保模型看不到第一个真实的词,这种处理数据的方式被沿用到现在。
|原始文本序列|你是谁?|
|处理后新序列|[BOS]你是谁?[EOS]|

Transformers库提供的预训练模型

以Bart模型为例,源码的forward中有这样的代码:

1
2
3
4
5
if labels in not None:
if decoder_input_ids is None:
decoder_input_ids = shift_tokens_right(
labels,self.config.pad_token_ids,self.config.decoder_start_token_id
)

查看shift_tokens_right的源码,其实现如下:

1
2
3
4
5
6
def shift_tokens_right(input_ids:torch.Tensor,pad_token_id:int,decoder_start_token_id:int):
shifted_input_ids = input_ids.new_zeros(input_ids.shape)
shifted_input_ids[:,1:] = input_ids[:,:-1].clone()
shifted_input_ids[:,0] = decoder_start_token_id
assert pad_token_id is not None
shifted_input_ids.masked_fill_(shifted_input_ids == -100, pad_token_id)

可以发现模型已经将decoder_start_token_id添加到数据当中了。