You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyTorch Transformers的BertModel中传入tgt_key_padding_mask?

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:32:40