如何在PyTorch Transformers的BertModel中传入tgt_key_padding_mask?
首先要明确:BERT采用的是双向自注意力机制,其输入序列的query、key、value均来自同一组输入,因此不需要单独区分src_key_padding_mask和tgt_key_padding_mask——Hugging Face Transformers库中的BertModel是通过attention_mask参数统一处理填充掩码的,这个参数同时承担了PyTorch原生Transformer中两种padding mask的功能。
具体使用方法
在调用BertModel的forward方法时,直接传入attention_mask即可:
from transformers import BertModel, BertTokenizer # 初始化tokenizer和模型 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') # 准备带填充的输入文本 texts = ["Hello, world!", "This is a longer sentence that will get padding"] inputs = tokenizer(texts, padding=True, return_tensors="pt") # 传入attention_mask,模型会自动屏蔽填充位置 outputs = model(**inputs)
这里的inputs['attention_mask']是形状为(batch_size, seq_len)的张量,其中1表示有效token,0表示填充token。模型内部会自动将其转换为适合自注意力计算的形状(如(batch_size, 1, 1, seq_len)),在注意力分数计算阶段屏蔽填充位置的影响,完全覆盖你需要的tgt_key_padding_mask的作用。
关于head_mask的误区
你提到的head_mask是用来控制注意力头的启用/禁用的(比如屏蔽某些头以进行剪枝或 ablation study),它作用于注意力头维度,和填充掩码的功能完全无关。用head_mask模拟tgt_key_padding_mask会导致逻辑错误,属于误用,不建议这么做。
特殊场景补充
如果是将BERT作为编码器用于序列到序列任务(配合单独的解码器),此时解码器的掩码需要单独处理,但这不属于BertModel本身的范畴——解码器部分的掩码需要在解码器的forward方法中传入,和BERT编码器的attention_mask是分开的。
内容的提问来源于stack exchange,提问作者carpet119

