在构建自然语言处理模型时,原始语料并不能直接输入网络,必须经过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