当前位置:首页 > 文章列表 > 科技周边 > 人工智能 > Transformers用tokenizer对齐输入长度

Transformers用tokenizer对齐输入长度

来源:17golang原创 2026-11-15 12:39:34 0浏览 收藏

批量文本长度不一致时,Transformers 的 tokenizer 可以在编码阶段统一输入形状:用 padding 补齐短文本,用 truncation 截断过长文本,再用 max_length 指定上限或固定长度。最常用的批处理写法是 tokenizer(texts, padding=True, truncation=True, return_tensors="pt"),它会返回形状一致的 input_ids 和 attention_mask。

官方地址:https://huggingface.co/docs/transformers/

如果目标是“同一批能组成张量”,先使用 padding=True, truncation=True;如果目标是“每批都固定为同一长度”,再改用 padding="max_length", max_length=N。补齐不会增加真实语义,截断却会丢掉超出上限的 token,所以两者要分开判断。

先弄清三个长度参数

padding 决定短序列补到哪里:True 或 "longest" 补到当前批次最长序列,"max_length" 补到 max_length 或 tokenizer 的模型上限,False 则不补齐。truncation 决定长序列是否裁剪;默认不裁剪,启用后才会按照 max_length 或模型最大输入长度截短。

max_length 同时是补齐和截断的目标长度,但只有配合相应策略时才生效。只写 max_length=128,并不会自动让一个批次变成 128;需要显式写出 padding="max_length" 或 truncation=True。

批量输入优先使用最长样本对齐

不要求每批固定长度时,推荐先让 tokenizer 找到当前批次的最长序列,再把较短序列补齐,同时把超过模型上限的内容截掉:

from transformers import AutoTokenizer

# 使用与模型配套的 tokenizer,避免词表和特殊 token 不一致
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
texts = [
    "Transformers 可以把文本编码成模型输入。",
    "批量样本长度可能不同,因此需要补齐。",
]

# 当前批次补到最长样本;过长文本按模型上限截断
batch = tokenizer(
    texts,
    padding=True,
    truncation=True,
    return_tensors="pt",
)

# input_ids 和 attention_mask 的第一维都对应批次大小
print(batch["input_ids"].shape)
print(batch["attention_mask"].shape)

这里的 padding=True 等价于当前批次的 "longest"。如果只传入一条文本,通常不会因为“批内对齐”额外补到模型上限;需要固定长度时,应使用下一节的写法。

Transformers tokenizer 将文本、长度策略和 BatchEncoding 字段连接起来的静态结构图
图1:tokenizer 输入、长度策略与 BatchEncoding 字段的静态结构说明图,不是运行截图。

需要固定长度时同时指定 max_length

分类模型、静态批处理或需要稳定张量形状的推理服务,通常会把目标长度写死。此时要同时打开固定长度补齐和截断:

max_length = 128

# 先截断超过 128 的 token,再把短样本补到 128
fixed_batch = tokenizer(
    texts,
    padding="max_length",
    truncation=True,
    max_length=max_length,
    return_tensors="pt",
)

# 两个字段的形状都应包含固定的 128
print(fixed_batch["input_ids"].shape)
print(fixed_batch["attention_mask"].shape)

固定长度的代价是:短文本会增加 padding token,长文本会丢掉超出 max_length 的内容。对于成批推理,若样本长度差异很大,也可以先按长度分桶,再在桶内使用 padding=True,减少无效补齐。

padding、truncation、max_length 和 pad_to_multiple_of 对输入长度的关系结构图
图2:不同长度策略对输入宽度和 attention_mask 的关系说明图,不是运行截图。

让长度适配批处理粒度

某些硬件或编译路径更适合长度为 8、16 等倍数的张量。tokenizer 支持用 pad_to_multiple_of 把补齐目标向上取整,但它不是截断上限:

# 当前批次先按最长样本确定目标,再向上补到 8 的倍数
aligned_batch = tokenizer(
    texts,
    padding=True,
    truncation=True,
    pad_to_multiple_of=8,
    return_tensors="pt",
)

# 这里检查的是最终宽度,不把“倍数补齐”误当成 max_length
width = aligned_batch["input_ids"].shape[-1]
print(width, width % 8)

如果你既要固定最大长度,又要倍数对齐,可以显式设置 padding="max_length"、max_length 和 pad_to_multiple_of;前提是目标长度与倍数关系合理。不要为了追求整齐,把 max_length 设得远大于模型允许的输入范围。

用 attention_mask 判断补齐位置

input_ids 保存 token id,attention_mask 表示哪些位置参与注意力计算。常见 tokenizer 会让真实 token 对应 1、padding 位置对应 0,但具体 padding 侧仍应以 tokenizer 配置为准。检查字段时不要只看 input_ids 的宽度:

# 打印一条样本的 token id 和掩码,观察补齐区域
ids = batch["input_ids"][0].tolist()
mask = batch["attention_mask"][0].tolist()
print("ids:", ids)
print("mask:", mask)

# 掩码长度应与 token id 长度一致,才能逐位置对应
assert len(ids) == len(mask), "input_ids 与 attention_mask 长度不一致"

如果模型报输入长度超限,优先检查是否启用了 truncation;如果张量无法堆叠,检查是否对一整个列表传入 tokenizer,或者是否遗漏了 padding。如果结果比预期长,确认是否把 padding=True 误认为了固定长度补齐。

常见问题

padding=True 和 padding="max_length" 有什么区别?

前者只补到当前批次最长样本,后者补到指定的 max_length 或模型上限。前者通常更省计算,后者更适合需要稳定 shape 的场景。

只有 truncation=True 可以吗?

可以,它会限制过长输入,但短文本仍可能长度不同;要把一批样本直接组成张量,通常还要打开 padding。

为什么设置 max_length 后长度没有变成这个数?

因为 max_length 是目标值,不是单独的开关。固定长度需要 padding="max_length",而超长样本还需要 truncation=True。

小结

把 Transformers 输入长度对齐,可以按三个问题选择参数:只求批内可堆叠就用 padding=True, truncation=True;需要固定宽度就加 padding="max_length", max_length=N;需要硬件友好的倍数就再考虑 pad_to_multiple_of。最后同时查看 input_ids 和 attention_mask,才能确认补齐和真实 token 的边界。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Transformers处理多模态输入批次Transformers处理多模态输入批次
上一篇
Transformers处理多模态输入批次
Transformers datasets流式读取训练数据
下一篇
Transformers datasets流式读取训练数据
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    1037次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    1035次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    1178次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    1139次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    981次使用