BERT/Transformer模型如何支持不同长度的输入批次?
Transformer类模型(包括BERT)本质上要求同批次输入的尺寸必须一致,你看到的“支持不同长度输入批次”,是靠「动态填充(Dynamic Padding)」+「注意力掩码(Attention Mask)」的组合实现的,具体逻辑如下:
动态填充(Dynamic Padding):按需填充,减少冗余
不是把所有样本都强制填充到model.max_input_size,而是针对每个单独的批次,找到该批次里最长样本的token长度,再把批次内所有样本填充到这个长度。比如某批次最长样本是150个token,就把其他样本都补到150,而非硬拉到模型的最大输入长度(比如BERT-base的512),既满足了同批次尺寸统一的要求,又大幅减少了无效填充的计算开销。注意力掩码:让模型忽略填充内容
填充的[PAD]token属于无效内容,不能让模型参与计算。注意力掩码会生成一个和输入序列长度一致的张量,其中真实输入的位置标记为1,填充位置标记为0。模型在计算注意力机制时,会自动忽略掩码值为0的位置,只处理有效的文本内容,避免填充部分干扰语义理解。HuggingFace的落地实现
使用HuggingFace的DataCollatorWithPadding时,它会自动完成两个核心操作:对当前批次做动态填充,同时生成对应的注意力掩码。你传入不同长度的样本后,经过这个数据整理步骤,每个批次都会变成尺寸统一的张量,再喂给模型时,模型依靠掩码识别有效内容,最终实现了“无需手动填充到最大长度即可批量输入”的效果。
内容的提问来源于stack exchange,提问作者The Wanderer

