thu-coai/CDial-GPT

为什么模型输入不用包括attention_mask呢?

li3cmz opened this issue · 7 comments

你好,想问下,既然是LM,训练的时候用第n个token预测第n+1个token,那为什么不用引入attention_mask呢?这样不就使得预测n+1token的时候,已经看到了ground_truth了吗?这样的话,和测试时候的场景是不是就不一致了呢?是否训练的时候加入attention_mask,可以使得测试的效果更好点呢?

训练的时候添加了future mask的。

请问具体是体现在哪里呢,我看到这里model的input是没有的。

(lm_loss), *_ = model(input_ids, labels=lm_labels, token_type_ids=token_type_ids)

model的input中,attention_mask这个参数是限定attention不会attend到pad token上。

在transfertransfo的实现中,并没有加入attention_mask,因为模型本身做的都是masked self attention,所以会自动将所有future token给mask掉,包括所有的pad token。因此不需要加入attention_mask这一输入。

至于future_mask,在model中计算attention的时候已经使用了,可以参考这里的代码
https://github.com/huggingface/transformers/blob/02e05fb0a532e572b56ba75dad6ba3db625bbdeb/src/transformers/models/gpt2/modeling_gpt2.py#L174

嗯嗯,感谢。因为我看的是OpenAIGPT,它这里确实是没有你指出的gpt2的is_cross_attention那小段代码,也就是OpenAIGPT是没有做future mask的吧

gpt2的代码:
https://github.com/huggingface/transformers/blob/02e05fb0a532e572b56ba75dad6ba3db625bbdeb/src/transformers/models/gpt2/modeling_gpt2.py#L174

OpenAIGPT的代码
https://github.com/huggingface/transformers/blob/02e05fb0a532e572b56ba75dad6ba3db625bbdeb/src/transformers/models/openai/modeling_openai.py#L176

看到了!非常感谢~

咕咕咕GIF反腐败复古风:分不够古古怪怪股