导读:本期聚焦于郑钧天创作的《训练数据预处理中Tokenization与Padding到底该怎么选怎么用》,敬请观看详情。把原始文本喂给模型之前,Tokenization和Padding两步直接决定显存占用和训练稳定性。不少初学者照着教程切分词然后补零,却没注意未登录词和变长序列带来的梯度偏移。本文从字符级与子词级切分的底层差异讲起,对比固定长度截断与动态批内补齐的显存表现,并给出一套可复用的预处理流水线写法。弄清切分粒度与补齐策略的匹配关系,能少踩很多坑。

在构建自然语言处理模型时,原始语料并不能直接输入网络,必须经过Tokenization与Padding两道核心工序。Tokenization负责把连续文本转成离散符号序列,Padding则解决不同样本长度不一致导致无法批量计算的问题。这两步如果处理不当,不仅会让词表膨胀、显存浪费,还会引入无意义的掩码噪声,拖慢收敛速度。理解它们各自的适用边界,是写好数据管线的基础。

训练数据预处理中Tokenization与Padding到底该怎么选怎么用

Tokenization的三种主流粒度与底层逻辑

Tokenization本质是将字符串映射为模型可识别的整数编号。最粗粒度是词级切分,以空格或标点断词,实现简单,但面对未登录词只能给未知符号,词表容易超过十万,且中英文混合场景表现差。字符级切分把每个字或字母作为单元,词表极小、未登录词为零,但序列长度暴涨,模型要学更长程依赖,训练成本上升。

目前工业界常用子词级算法,例如BPE、WordPiece、Unigram。它们用统计合并频繁字串,兼顾词表规模和语义完整性。以BPE为例,先按字符初始化,再反复合并语料中相邻共现最高的符号对,直到达到预设词表大小。这样英文“playing”可能拆为“play”“ing”,既控制词表,又保留形态。选择粒度时要看任务:机器翻译偏好子词,简单分类可用词级加未知处理。

下面是一段Python使用子词工具的简化示例,展示训练与编码过程:

from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer

# 初始化BPE模型与训练器
tokenizer = Tokenizer(BPE())
trainer = BpeTrainer(vocab_size=8000, min_frequency=2)

# 假设files是语料文件列表
tokenizer.train(files=['corpus.txt'], trainer=trainer)

# 编码新句子
encoded = tokenizer.encode('训练数据预处理很重要')
print(encoded.ids)

Padding机制与批处理中的长度策略

神经网络要求一个批次内张量形状一致,而文本长度天然不同。Padding就是在短序列末尾补特殊符号,如0或[PAD],使其达到该批最长长度。最简单是全局固定长度,所有样本截断或补到max_len,优点是管线简单,缺点是长尾样本极少达到该长度,大量计算浪费在无效填充上。

更优做法是动态批内Padding:每次组批时以当前批最大长度为准,配合注意力掩码告诉模型哪些位置是填充。这样显存随批内真实长度波动,整体利用率高。但要注意若批大小过大且长度方差大,最长样本会拖长整批,需做长度排序分桶。以下示例展示PyTorch中按批补齐并生成掩码:

import torch
from torch.nn.utils.rnn import pad_sequence

# 假设sequences是编号张量列表,长度不一
sequences = [torch.tensor([1,2,3]), torch.tensor([4,5]), torch.tensor([6,7,8,9])]
padded = pad_sequence(sequences, batch_first=True, padding_value=0)
mask = (padded != 0).long()
print(padded)
print(mask)

除了末尾补零,也有少数场景用开头补齐或镜像补齐,但会打乱位置编码含义,除非模型明确支持,否则不推荐。Padding符号必须在损失函数和注意力中屏蔽,否则模型会学到预测填充符,降低效果。

流水线组合时的常见误区与调优建议

很多管线把Tokenization和Padding完全割裂,先全量切分落盘再读取补齐,导致磁盘膨胀数倍且无法动态调整批长度。正确思路是在数据加载器内联完成:读取原始文本,实时切分,按当前批组 Padding。这样词表更新后无需重新生成中间文件,也方便做在线增强。

另一个误区是忽视特殊符号冲突。若Tokenization词表中已用0作为普通字,又拿0做Padding,模型无法区分。应预留[PAD]、[UNK]、[CLS]等编号,通常从0开始分配特殊符,再排真实字。下表列出建议编号规划:

编号符号用途
0[PAD]补齐占位
1[UNK]未登录
2[CLS]句首分类
3+子词真实语义单元

最后,Tokenization粒度与Padding策略必须联合评估。字符级序列长,动态批内Padding收益最大;词级序列短,固定长度也可能可接受。上线前用真实分布跑一遍长度直方图,定max_len与批大小,才能平衡吞吐和精度。

TokenizationPadding文本预处理修改时间:2026-08-18 09:06:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。