vocabulary
将自然语言转换为token id是根据模型使用的词汇表(vocabulary)进行的。这个过程通常分为两个步骤:
-
分词(Tokenization)
将输入的自然语言文本按照某种规则分割成一系列的token,可以是单词、子词或者字符等。分词的规则需要事先定义好,通常使用诸如基于词典、基于规则、基于统计等方法。
-
查表(Lookup)
将分词得到的每个token在词汇表中查找对应的数值id。词汇表本质上是一个token到整数id的映射表。对于模型来说,处理token id比处理原始文本更高效。
具体来说,模型在训练阶段会先构建一个词汇表,包含了所有可能出现的token及其对应的id。在预测时,输入文本首先被分词器分割成token序列,然后模型将每个token查表得到对应的id,运算时使用这些id代替原始token。
值得注意的是,有些token可能在训练集中从未出现过,这种情况下一般会将它们映射为一个特殊的未知token id,例如 “< unk >”。
所以token id这一步是将自然语言离散化,使其可以被模型高效处理,是连接自然语言和神经网络模型的关键环节。
词汇表的大小对语言模型的性能和效果非常重要,主要有以下几点原因:
-
覆盖率
词汇表越大,能够覆盖的词汇就越多,对于拥有丰富词汇的语料来说,较大的词汇表可以更好地表示语言的多样性,避免过多的未知词。 -
参数量
词汇表的大小直接决定了模型的Embedding层参数量。较大的词汇表意味着需要更多参数来存储每个词的Embedding向量,从而增加模型的容量,但也可能导致过度拟合。 -
计算效率
在预测时,模型的输出层计算量与词汇表大小成正比。较大的词汇表会导致计算开销的增加,延长模型响应时间。 -
稀疏性
过大的词汇表会加剧模型Embedding层的稀疏性,使得大量的Embedding向量无法被有效地利用和优化。
因此在设计语言模型时,需要在词汇表大小、模型覆盖能力、计算效率、参数量之间权衡取舍。通常采用以下策略:
-
对于开放域场景,需使用较大词汇表以覆盖更多词汇。
-
对于特定领域,可构建较小的领域词汇表。
-
采用子词或字符级别的表示,避免词汇表过大。
-
使用词汇表裁剪等技术,移除低频词。
词汇表的大小对模型非常重要,主要因为以下几个方面:
-
性能与精确度:一个较大的词汇表可以更精确地覆盖和表达语言的多样性,包括专业术语、新词等。这可以提高模型处理复杂文本的能力。然而,过大的词汇表可能会使模型变得参数庞大,训练和推理的计算成本增加。
-
泛化能力:较小的词汇表可能导致更高的词汇外(Out-Of-Vocabulary, OOV)率,即模型遇到未在词汇表中的词汇时无法正确处理。这对模型的泛化能力是不利的。通过合理设计词汇表可以减少OOV问题,例如使用子词分割(Subword Tokenization)方法。
-
内存与存储:词汇表的大小直接影响模型的内存使用和存储需求。更大的词汇表需要更多的内存来存储词嵌入(Word Embeddings),这可能在资源受限的环境中成为问题。
-
训练时间:词汇表越大,模型在训练期间需要学习的参数就越多,这可能导致训练时间延长。
预先构建词汇表
词汇表(vocabulary)是在训练语言模型之前就需要预先构建的。它定义了模型在输入和输出时将使用哪些词/字符的集合。词汇表的构建通常有以下几种常见方式:
- 语料统计
最常见的做法是基于大规模语料库统计词频,按一定规则(如设置词频阈值)选取高频词构建词汇表。这种方式可以覆盖语料中常见词汇。
- 预定义词表
在某些特定领域,可以使用预先定义好的专业词表,确保模型可以很好地覆盖该领域核心词汇。
- 基于规则
有些模型直接基于一套规则从训练语料中提取token,如字符级别、bytes等。这种做法无需预先统计词频。
- 子词切分
一些流行的做法如BPE(Byte Pair Encoding)、WordPiece等,是将单词按照统计规则切分成子词序列,子词作为词汇表的基本单元。这种方式可以处理未见词问题。
- 词汇表融合
在很多情况下,会将以上多种方式结合使用,构建覆盖面更广的融合词汇表。如先使用基本词表,再加入子词、专业词等。
除了上述构建词汇表的方法,还需要考虑如何处理稀有词、是否添加特殊token(如UNK)等问题。另外,为了控制模型计算复杂度,词汇表大小通常也有一定限制。
总的来说,合理构建高质量的词汇表对语言模型的性能非常重要,需要结合具体任务场景选择合适的构建策略。
例子
input: OpenAI’s large language models process text using tokens, which are common sequences of characters found in a set of text.
tokenization:
- 分词
![[Screen Shot 2024-04-27 at 22.10.40 PM.png]] - 编码
![[Screen