大模型基础 | 第一章 token词典

token词典

1、什么是OOV溢出词表的词

OOV 是 “Out Of Vocabulary” 的缩写,中文可以翻译为溢出词表的词未登录词,指的是在自然语言处理(NLP)系统中,出现在输入文本中但不在系统预设词汇表(vocabulary)中的词语。


一、分词的概念

基于词汇的分词在某些语言(如中文)中可能对相同输入产生不同的分词结果,导致生成包含海量低频词的庞大词表,还可能存在未登录词(Out-of-Vocabulary, OOV)问题。因此,当前语言模型更多地采用字符作为最小单位进行分词。

那么怎么设计最小分词单位比较好呢?

从分词粒度来看,主要包括三种类型:WordSubwordChar

Word分词

  • 以完整的单词为单位进行分词,能够很好地保留词的语义,适合上下文理解和语义分析。
  • 然而,它面临着长尾效应和稀有词问题,可能导致词汇表庞大并且出现OOV问题(Out-of-Vocabulary)。

Char分词

  • 将文本拆分为字符级别,可以解决OOV问题,因为任何字符都能处理。
  • 缺点是可能缺乏明确的语义信息,且粒度过细会增加后续处理的计算成本和时间。

Subword分词

  • 介于Word和Char之间,旨在克服两者的缺点,同时保留语义信息并减少OOV问题的发生。
  • Subword分词方法如 BPE(Byte Pair Encoding)WordPiece 通过统计学方法切分单词为更小的有意义的单元,在处理生僻词和缩写时更为有效。

二、Transformer分词方法

其中子词分词器(Subword Tokenizer)被广泛应用于基于Transformer的语言模型中,包括 BPE分词WordPiece分词Unigram分词 三种常见方法。

BPE/BBPE分词

  • BPE(Byte Pair Encoding)从字符级别开始,逐步合并最频繁连续出现的字符或字符组合,形成新的词汇单元。
  • BBPE(Byte-Level BPE)扩展BPE,将字节视为合并操作的基本符号,实现更细粒度的分割,并解决未登录词问题。代表性语言模型包括 GPT-2、BART 和 LLaMA。
  • 对于英文和拉丁体系的语言,使用BPE分词足以在可接受的词表大小下解决OOV问题。但对中文、日文等语言,需要使用字节级BBPE来解决不同语言的分词问题。
    在这里插入图片描述
BPE词表构建整体流程:
  1. 初始化字符集,转化为字符序列。
  2. 统计频率最高的字符对并合并。
  3. 重复上述步骤,直至达到预设词汇表大小。

WordPiece分词

  • WordPiece分词与BPE类似,但合并选择标准不同:
    • 不选择最频繁的词对,而是为每个词对计算分数,综合考虑词对和每个词的出现频率。
    • 合并得分最高的词对,更新词汇表。
  • WordPiece通过将所有「常用字」和「常用词」存到词表中来分词,但要穷举所有语言中的常用词会导致词表过大,难以实现。
使用分词策略进行合并子词

计算合并后的似然值:

WordPiece 方法的一般步骤如下:

  1. 准备足够大的训练语料库,并确定期望的子词词表大小。
  2. 将单词拆分成最小的单元,作为初始词表。
  3. 根据不同的分词策略,以不同的最大化目标合并子词形成新的子词单元。
  4. 重复执行单元合并,直至达到设定的子词词表大小。

在执行 WordPiece 方法时,子词合并时最大化的目标是本次合并相邻子词能否使得整个语料库的似然值升高。使用形式化语言描述,具体如下:

log⁡P(S)=∑i=1nlog⁡P(ti) \log P(S) = \sum_{i=1}^{n} \log P(t_i) logP(S)=i=1nlogP(ti)

其中,tit_iti是每一个子词。如果执行合并操作,将tit_ititjt_jtj进行合并以形成tkt_ktk,那么log⁡P(S)\log P(S)logP(S)的变化为:

Δlog⁡P(S)=log⁡P(tk)−[log⁡P(ti)+log⁡P(tj)] \Delta \log P(S) = \log P(t_k) - \left[ \log P(t_i) + \log P(t_j) \right] ΔlogP(S)=logP(tk)[logP(ti)+logP(tj)]


Unigram分词

  • Unigram分词器与BPE和WordPiece不同,其构建过程是一个反向的操作,构建过程如下:
    • 初始化时创建一个非常大的词汇表。
    • 根据标准逐步丢弃不常用的词汇单元,直到满足限定的词汇表大小。
  • 这种方法尤其适合处理生僻词。

三、总结

在自然语言处理(NLP)中,OOV(Out-of-Vocabulary,未登录词)问题是分词与语言建模中的关键挑战,指输入文本中出现但未包含在模型词汇表中的词语。为有效应对这一问题,现代语言模型普遍采用更灵活的分词策略,取代传统的以“词”或“字符”为单位的分词方式。

分词的最小单位主要分为三类:

  • Word分词:语义清晰,但易导致词汇表庞大,难以处理稀有词和OOV问题;
  • Char分词:粒度最细,可避免OOV,但语义信息弱,计算成本高;
  • Subword分词:介于两者之间,兼顾语义保留与OOV缓解,成为当前主流方案。

在基于Transformer的模型中,子词分词器(Subword Tokenizer) 被广泛采用,主要包括以下三种方法:

  1. BPE(Byte Pair Encoding):从字符出发,迭代合并高频字符对,逐步构建词表。其字节级变体 BBPE 更适用于多语言场景(如GPT-2、LLaMA等模型),能有效处理中文、日文等复杂语言的分词问题。
  2. WordPiece:与BPE类似,但选择合并对象时基于似然值最大化原则,即优先合并能使整体语言模型概率提升最大的子词对,从而优化语料表达。
  3. Unigram分词:采用“反向构建”策略,从大词表开始逐步剔除低频单元,适合处理生僻词,具备良好的泛化能力。

综上所述,Subword 分词方法通过平衡语义表达与词汇覆盖能力,显著缓解了OOV问题,是当前大语言模型实现高效、鲁棒文本处理的核心技术之一。其中,BPE及其变体因高效性和通用性,已成为主流架构(如GPT、BERT等)的重要基础组件。

### 大模型中的 Token 概念及其重要性 在大型语言模型(LLM)中,Token 是指模型能够理解和生成的最小意义单位[^3]。这些 Tokens 不仅限于完整的单词;它们也可以是单词的一部分或是单个字符,具体取决于所使用的标记化方案。 Tokens 在 LLM 中扮演着至关重要的角色: - **基础构建模块**:作为输入和输出的基本单元,Tokens 构成了模型处理的所有文本的基础。 - **语义表达**:通过学习 Tokens 间的统计关系,模型得以捕捉并再现自然语言中的复杂模式。 - **效率提升**:合理的 Token 设计有助于提高计算资源利用率,在保持性能的同时减少内存占用。 ### 实现方式和技术细节 为了有效利用 Tokens,开发人员通常会采取以下措施之一或组合使用多种策略: #### 自适应分词算法 自适应分词器可以根据训练数据动态调整其词汇表,从而更好地匹配目标领域内的常见短语结构。这种方法允许更灵活地表示多样的语言现象,同时也提高了对于罕见词语的支持度。 #### 子词编码(Subword Encoding) 子词编码是一种介于字符级与全词级别之间的折衷方案。它将常见的高频词汇保留为单一 token,而对于低频词汇则进一步拆解为其组成部分(subwords),这样既兼顾了灵活性又能维持较高的解析速度。 ```python from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') text = "Transformers are amazing!" tokens = tokenizer.tokenize(text) print(tokens) ``` 此代码片段展示了如何使用 Hugging Face 的 `transformers` 库加载预训练好的 BERT 分词器,并将其应用于一段英文文本上得到相应的 tokens 列表。 #### 上下文窗口管理 除了关注个体 Tokens 的质量外,合理设置上下文窗口(Context Window)同样不可忽视。这涉及到确定一次前向传播过程中所能容纳的最大 token 数量——即所谓的“上下文长度”。较大的上下文窗口虽然有利于长期依赖性的建模,但也意味着更高的硬件需求以及潜在的时间开销增加问题[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值