1. Padding Mask操作的本质理解
在Transformer架构中,处理变长序列输入时,padding mask是一个至关重要的预处理步骤。想象你正在处理一批英文句子准备输入给BERT模型,这些句子长度参差不齐:有的15个词,有的只有8个词。为了让它们能组成一个规整的张量输入,我们不得不给短句子末尾添加一堆无意义的"[PAD]"标记,这个过程就是padding。
但问题来了——这些填充的token不应该参与注意力计算!这就是padding mask诞生的原因。具体来说,mask操作会在注意力权重计算阶段,将这些padding位置对应的权重设置为一个极小的值(如-1e9),这样经过softmax后,这些位置的注意力概率就会趋近于0。
关键技巧:在实际实现中,我们通常用1标记真实token,0标记padding位置,然后在计算注意力时用(1 - mask) * -1e9来生成屏蔽矩阵。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从原理到实现的完整解析
2.1 数学层面的运作机制
假设我们有一个包含3个序列的batch:
code复制["Hello", "world", "[PAD]"]
["I", "love", "coding"]
["Deep", "[PAD]", "[PAD]"]
对应的mask矩阵应该是:
code复制[[1, 1, 0],
[1, 1, 1],
[1, 0, 0]]
在自注意力计算时,这个mask会先被扩展为4维张量(考虑多头注意力),然后通过以下公式影响注意力权重:
code复制attention_scores = torch.matmul(Q, K.transpose(-2, -1)) / sqrt(d_k)
attention_scores = attention_scores.masked_fill(mask == 0, -1e9)
attention_weights = F.softmax(attention_scores, dim=-1)
2.2 PyTorch实现细节
这里给出一个完整的padding mask生成函数:
python复制def create_padding_mask(seq, pad_token_id=0):
# seq形状: (batch_size, seq
