Tokenization:今天真正弄懂
先记住:一句话定义 + 一句记忆口诀 一句话定义:Tokenization(分词/标记化)是把人类连续的文本或多模态信号切分成离散的“小积木”,并给每块积木分配一个唯一数字编号(Token ID)的过程。 记忆口诀:切小块、查词表、换数字、喂模型。
【生活类比:乐高拼装说明书】 把一句话或者一段带说话人标签的语音,想象成一只组装好的乐高恐龙。 神经网络像一台严格按零件编号运作的机械臂,它无法直接理解“整只恐龙”。 Tokenization 的工作就是把恐龙拆成标准积木块(Tokens),并翻开零件清单(词表 Vocabulary),在每块积木上刻上零件号(Token ID)。机械臂拿到这串数字,才能开始计算。
【必要公式与符号解释】 给定原始文本序列 $X$: $$X = (c_1, c_2, \dots, c_T) \xrightarrow{\text{Tokenizer}} T = (i_1, i_2, \dots, i_N)$$ - $c_t$:原始输入中的最小基础单元(如单个字符或字节)。 - $N$:分词后的 Token 数量(通常 $N \le T$)。 - $i_n$:第 $n$ 个积木的编号(Token ID),且 $i_n \in [0, |V|-1]$。 - $|V|$:词表大小(Vocabulary Size),即模型认识的所有积木总数。
【它解决什么问题?没有它会怎样?】 计算机本质上只能做矩阵乘法,看不懂人类字符。 1. 没有它,按整词切分:遇到新词、人名或口语化变形(如“Awwwwsome”)直接崩溃,词表膨胀到几百万,显存直接撑爆(OOV 问题,Out of Vocabulary)。 2. 没有它,按纯字符/拼音切分:一个句子被切成上千个字母,序列太长,Transformer 的自注意力计算量呈平方级爆炸($O(N^2)$),长音频转录直接跑不动。 Tokenization(特别是子词算法)在“序列长度”与“词表大小”之间找到了最佳平衡点。
【在主流模型与音视频/说话人日志中的实际位置】 它是模型的最前线海关: 1. 文本与 ASR:在 Whisper 或转录模型中,文本提示和预测文本均先由 Tokenizer 转为 ID。 2. 说话人日志(Diarization + ASR):在端到端联合任务中,特殊标签如 `<spk1>`、`<spk2>` 会作为保留 Token 写入词表,和识别出的字词一起排成序列输出。 3. 学习指引:想建立模型输入端的数据流直觉,推荐阅读 *The Illustrated Transformer*;想在 PyTorch 代码里定位 Tokenizer 索引与 Embedding 的衔接点,看 *The Annotated Transformer*。
Tokenization 输出的数据类型通常是什么?
解决 OOV(未登录词)问题的核心主流技术是什么?
Tokenizer 和 Embedding 层的先后执行顺序是怎样的?
【发展流程】 1. 之前怎么做(规则/词典分词):按空格切英文,按结巴分词切中文。缺点是遇到生僻词直接变成未知符号 `<UNK>`,信息大量丢失。 2. 为什么出现子词算法(Subword):为了用有限的词表(如 32k~100k)拼出无限的新词。高频词保留整词,低频词拆成常见词根。 3. 现在怎么用:主流采用 BPE(Byte Pair Encoding,如 GPT/Whisper)、WordPiece(BERT)或 SentencePiece(Unigram/BPE)。在音频领域,神经编解码器(如 EnCodec/DAC)把连续声音波形量化为离散的“音频 Token”,统一了音视频与文本的表征形式。
【与相近概念的区别】 - Tokenization vs. Embedding:Tokenization 只负责把文字切块并映射成整数 ID(离散索引);Embedding 负责把整数 ID 转换成稠密高维浮点数向量(连续表征)。 - Tokenization vs. 声学特征提取(Fbank/MFCC):传统 Fbank 是切连续的能量频谱切片,数值是连续浮点数;Tokenization 产出的是离散字典 ID。
【当前局限与未来展望】 - 事实局限:多语言不公平(低资源语言被切得过碎,推理慢且费算力);对空格、标点、错别字极为敏感;多模态音频 Token 与文本 Token 长度差异悬殊。 - 推测展望:未来可能向 Byte-level Token-free(无分词直接读原始字节)或全端到端连续表征发展,彻底摆脱人工设计的词表约束。
- 为什么不能直接用整词分词?
- 如果一个新词不在词表里,子词(Subword)分词器会怎么处理它?
- 在说话人转录任务中,如果要新增说话人标识 `<speaker_3>`,对 Tokenizer 应该做哪步操作?