神经网络Transformer架构中的词汇表构建
字数 1864 2025-11-27 07:35:06
神经网络Transformer架构中的词汇表构建
词汇表构建是自然语言处理中的基础预处理步骤,为文本数据中的单词或子词分配唯一的数字标识符。其核心目标是将非结构化的文本转换为模型可处理的数值化形式。
1. 基本概念与必要性
- 文本数据(如句子、文档)由字符序列组成,但机器学习模型仅能处理数值张量。词汇表充当一个映射字典:它将每个词汇单元(单词或子词)映射到一个唯一的整数索引(即标记ID)。
- 一个典型的词汇表结构为:
{"the": 1, "cat": 2, "sat": 3, "<unk>": 0, "<pad>": 4}。其中,特殊标记如<unk>(未知词)和<pad>(填充)是必不可少的。
2. 构建流程的关键步骤
词汇表构建是一个数据驱动的过程,主要包含以下步骤:
-
文本收集与归一化:首先,从训练语料库中收集所有文本。随后进行文本归一化,这是一个清理和标准化过程,通常包括:
- 转换为小写(可选,取决于任务)。
- 去除重音符号。
- 处理标点符号(例如,将句尾的句点与单词分离)。
- Unicode规范化。
-
词汇单元切分:此步骤决定词汇表的基本构成单元。主要有两种策略:
- 单词级:将文本按空格和标点进行分割。例如,"I don't like it." 被分割为
["I", "don't", "like", "it", "."]。这种方法直观,但词汇表会很大,且无法处理训练集外的生僻词(OOV)。 - 子词级:旨在解决单词级方法的缺陷。它将单词拆分为更小的、可重用的语义单位(子词)。例如,"unhappiness" 可能被分解为
["un", "happi", "ness"]。这样,"un"和"ness"可以用于构建其他单词,显著减小词汇表大小,并增强对未登录词的生成能力。
- 单词级:将文本按空格和标点进行分割。例如,"I don't like it." 被分割为
-
词汇单元统计与选择:对切分后的所有词汇单元进行频率统计。然后根据预定义的词汇表大小上限,选择最高频的N个词汇单元加入词汇表。剩余的、低频的词汇单元则被归为
<unk>。 -
分配索引与序列化:为最终选定的词汇单元分配唯一的整数索引。通常,索引0、1、2等会预留给特殊标记。最后,将
{词汇单元: 索引}这组映射关系保存为文件(如vocab.json),供后续的标记化过程使用。
3. 子词切分算法详解
子词切分是现代词汇表构建的核心,主流算法包括:
-
Byte Pair Encoding (BPE):
- 初始化:将每个单词拆分为字符序列,并将整个训练语料库视为由这些字符序列组成的集合。
- 迭代合并:在每一轮中,统计所有相邻符号对的出现频率,将最频繁出现的那对符号合并为一个新的符号,并将此新符号加入词汇表。
- 终止:重复合并过程,直到达到预定的词汇表大小或合并次数。例如,从
('l', 'o')->'lo'(在"low"和"lower"中出现频繁)开始,最终可能合并出'low'整个词。
-
WordPiece:
- 该算法由BERT模型推广。其流程与BPE类似,也是从字符开始迭代合并。
- 关键区别:BPE根据频率选择合并对,而WordPiece根据一个概率分数来选择:
score = (freq_of_pair) / (freq_of_first * freq_of_second)。它倾向于合并那些共现频率高,但各自频率并不高的符号对,从而可能捕获到更有语言学意义的单元。
-
Unigram Language Model:
- 初始化:与BPE和WordPiece相反,它从一个巨大的、过完备的种子词汇表开始(例如,所有频繁出现的单词和子串)。
- 迭代剪枝:在每一轮中,它使用一个语言模型来评估当前词汇表中每个子词对整体语料库似然度的贡献,然后移除贡献最小的子词。
- 优势:它可以输出不同概率的子词分割方式,提供了不确定性信息。
4. 词汇表构建的考量与影响
- 词汇表大小:这是一个关键的超参数。大小不足会导致过多的信息被压缩进
<unk>,造成信息损失;过大则会使模型嵌入层变得臃肿,增加计算和存储开销,并可能引入噪声。通常在数万到数十万之间。 - 词汇表对模型性能的影响:词汇表的质量直接影响到模型:
- 覆盖度:高质量的词汇表应能覆盖绝大多数输入文本,最小化
<unk>标记的使用。 - 泛化能力:子词词汇表通过共享子词单元,使模型能够理解和生成在训练中未见过的单词,从而显著提升泛化能力。
- 效率:合适的词汇表大小是模型效率(更小的嵌入矩阵)与效果(更好的表示能力)之间的平衡。
- 覆盖度:高质量的词汇表应能覆盖绝大多数输入文本,最小化