Transformers 批量文本长度不一致怎么办?核对填充、截断与 attention_mask

处理长度不同的文本输入,按上限补齐与截断并核对 attention_mask;附实际分词长度、有效长度及特殊 token 的区别。

批量输入文本时,各条分词后的长度经常不同。Transformers 可以把短文本填充到相同长度,把长文本截到约定上限,并用 attention_mask 区分实际输入和填充位置。下面检查这三项怎样一起工作,帮助排查不能组成矩形张量、截断位置不明或填充参与计算的问题。

准备两条长度不同的演示文本

安装 transformers==4.57.1,使用英文 DistilBERT 分词器。下面不加载模型权重,不需要 PyTorch;首次下载分词文件仍需要网络。两条英文是人为构造的演示输入,不代表真实业务长度分布。

Transformers 批量文本长度不一致怎么办?核对填充、截断与 attention_mask

from transformers import AutoTokenizer

checkpoint = "distilbert/distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint, use_fast=True)
texts = ["The reply was helpful.", "The reply was helpful. " * 12]
raw = tokenizer(texts)
print("未处理长度:", [len(ids) for ids in raw["input_ids"]])

batch = tokenizer(
    texts, padding="max_length", truncation=True, max_length=12,
    return_special_tokens_mask=True,
)
print("处理后长度:", [len(ids) for ids in batch["input_ids"]])
for i, (ids, mask, special) in enumerate(zip(
    batch["input_ids"], batch["attention_mask"], batch["special_tokens_mask"]
)):
    assert len(ids) == len(mask) == len(special) == 12
    assert all(value in (0, 1) for value in mask)
    print("行", i, "有效长度", sum(mask))
    print(list(zip(tokenizer.convert_ids_to_tokens(ids), mask, special)))
    print("模型输入:", tokenizer.decode(ids, skip_special_tokens=True))

参数含义见 官方 Padding and truncation 指南:padding="max_length" 填充到给定长度;truncation=True 将过长序列截到该长度;max_length=12 只是方便观察的演示值,不是推荐的正式任务上限。

核对补齐和截断是否符合预期

本地 Python 3.11、Transformers 4.57.1 的检查中,原始两条长度为 7 和 62;处理后都为 12。短句的有效长度为 7、其余 5 个位置为填充;长句的有效长度为 12,后续内容已截掉。这里实际运行的是分词预处理,没有测过任何模型准确率或推理耗时。

验证方法是先看所有行的 ID、mask 和 special 长度一致,再检查 mask 为 0 的位置是否对应填充。Tokenizer API说明 attention mask 用于标记模型应处理的输入 token;本例中真实输入位置为 1,填充位置为 0。[CLS] 和 [SEP] 是特殊 token,但属于模型输入,mask 仍为 1;special_tokens_mask 的职责与 attention mask 不同,不能互换。

固定上限还是随批最长文本补齐

配置 含义与适用情况
padding=True 补到本批最长序列。常用于文本长度差异较大、希望减少无用填充的场景。
padding="max_length", max_length=N 按给定 N 补齐。只有同时设截断时,过长序列才会缩短;单独 padding 不会把长文本变短。
truncation=True, max_length=N 限制过长序列,不自动补齐短序列;想创建统一张量时还需合适的 padding。

需要输入 PyTorch 时,在装好 PyTorch 的环境为同一次 tokenizer 调用增加 return_tensors="pt",然后把 tokenizer 返回的输入字段交给配套模型。不要为了让长度一致而丢掉 attention_mask,也不要随意把 padding 方向从右改成左。

使用到自己的任务前检查边界

先把演示文本换成一条短样本与一条最长代表样本,查看被保留和被截掉的内容是否包含分类或问答所需证据。上限要结合该模型配置和任务确定;某些 tokenizer 的 model_max_length 是未设明确上限的巨大哨兵值,不能把它当作实际模型支持的窗口。

如果模型没有 pad token,不能不查模型文档就随意新增词表项;新增后模型嵌入也可能需要对应调整。若仍报长度不齐,检查是否只设了 padding 而没有截断,或者把不同结构的字段手工拼成张量。本文只覆盖单条文本的英文 encoder 分词,不演示句对的截断策略、聊天历史裁剪或 decoder-only 批量生成;这些任务须按各自模型约定处理。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30445.html

赞 (0)
AI小管家的头像AI小管家
Transformers pipeline 怎么批量分类文本?保留行号并核对输出
上一篇 6小时前
MLflow 怎么管理模型实验?记录参数、指标和模型文件
下一篇 6小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部