一文了解:大模型中的分词(Tokenization)是个啥?

分词(Tokenization)是自然语言处理(NLP)中的基础预处理步骤,它架起了原始文本与机器学习模型之间的桥梁。分词过程涉及将文本分解为称为“token”的更小单元,随后这些token被转换为数字ID。这些ID会作为LLM的输入,并通过嵌入层映射为捕捉语义含义的向量表示。

分词方法的选择对LLM的性能和效率起着关键作用。本文将深入探讨三种流行的分词算法:BPE、WordPiece和SentencePiece。每种算法采用不同的方法将文本分割为token,分析其机制、优势与局限性。

1、 什么是分词?

分词是将非结构化文本转换为机器学习模型可理解的结构化格式的过程。其核心在于将一段文本(无论是句子、段落还是文档)分割为更小的可管理单元,即“token”。根据所采用的分词策略,这些token可以是单词、子词,甚至是单个字符。分词后,每个token会从预定义词汇表中分配一个数字ID,从而将文本转换为如下所示的数字序列:

img

接下来,通过查表从预训练的嵌入矩阵中为每个token ID检索词嵌入(向量表示)。这些嵌入捕捉了语义含义,使模型能够理解单词之间的关系,例如“cat”和“kitten”的相似性。这一过程是NLP任务的基础。

2、分词的类型

根据token的粒度,分词策略主要有三种类型:字符级、词级和子词级分词。每种方法各有优劣,具体选择取决于NLP任务的特定需求。

2.1 字符级分词

在字符级标分词中,文本被分割为单个字符。例如,单词“hello”会被标记为[“h”, “e”, “l”, “l”, “o”]。

优势:

  • 有效处理罕见词或词汇表外(OOV)词,因为所有可能的字符都包含在词汇表中。
  • 适用于形态复杂或词边界模糊的语言(如中文、日文)。
  • 与词级分词相比,词汇表规模更小。

劣势:

  • 导致序列变长,增加计算复杂度。
  • 丢失词级语义,使模型更难捕捉词间关系。
2.2 词级分词

在词级分词中,文本被分割为单个单词。例如,句子“I love coding”会被标记为[“I”, “love”, “coding”]。

优势:

  • 保留词级语义,便于模型理解词间关系。
  • 与字符级分词相比,序列更短,减少计算开销。

劣势:

  • 难以处理罕见词或未见过的词(OOV问题)。
  • 词汇表规模可能极大,尤其在形态丰富的语言或处理领域特定术语时。
2.3 子词级分词

子词级分词将单词分割为更小的单元,如前缀、后缀或其他有意义的子词成分。例如,单词“unbelievable”可能被标记为[“un”, “believ”, “able”]。子词级分词的常用算法包括字节对编码(BPE)、WordPiece(用于BERT)和SentencePiece。

优势:

  • 平衡了字符级和词级分词的优缺点,既能轻松处理OOV词,又能保持较短序列
  • 捕捉形态信息,适用于词结构复杂的语言。
  • 与词级分词相比,减少词汇表规模,同时保留部分语义。

劣势:

  • 需要仔细调整子词分割算法,避免过度分割或分割不足。
  • 单词分割方式可能仍存在歧义,尤其对于形态边界不明确的语言。

3、字节对编码(BPE)

字节对编码(BPE)一种平衡词汇量与OOV处理能力的子词分词算法,通过迭代合并最频繁的字符/子词对进行文本压缩。该方法在保留常见完整词的同时拆分罕见词,既高效处理未知词又避免词汇膨胀。

BPE的一个关键优势是能够避免对模型性能不利的UNK(未知)token。当单词不在模型词汇表中时,会产生UNK token,导致:

  • 信息丢失:模型丢弃与未知词相关的所有上下文和含义。
  • 语言表示低效:过多UNK token会扭曲模型对输入的理解。
  • 泛化能力差:当UNK token普遍存在时,模型难以泛化到未见文本。
  • 下游任务性能下降:翻译或摘要等任务会因误解而受损。
3.1 BPE的工作原理
  1. 预分词:输入文本首先被分词为更小的单元,通常通过空格或标点分割。例如,句子“applied deep learning”可能被分割为[“applied”, “deep”, “learning”]。

  2. 初始词汇表:初始词汇表由文本中的所有单个字符组成。例如,单词“deep”会被拆分为[“d”, “e”, “e”, “p”]。

  3. 迭代合并:BPE迭代合并最频繁的字符或token对。例如,如果对(“e”, “e”)是最频繁的,会被合并为单个标记"ee",并添加到词汇表中。

  4. 词汇表更新:合并过程持续到达到预定义的词汇表大小,每次合并操作都会创建新token并添加到词汇表。

  5. 最终分词:词汇表确定后,使用学习到的子词单元对文本进行分词。

3.2 示例

以输入文本“low lower lowest”为例:

步骤1:初始字符级分词 → [“l”, “o”, “w”, “l”, “o”, “w”, “e”, “r”, “l”, “o”, “w”, “e”, “s”, “t”]

步骤2:统计字符对频率,最频繁对为"l"和"o"(出现3次)。

步骤3:合并为新标记"lo" → [“lo”, “w”, “lo”, “w”, “e”, “r”, “lo”, “w”, “e”, “s”, “t”]

步骤4:重新统计对频率,最频繁对为"lo"和"w"(出现3次)。

步骤5:合并为新标记"low" → [“low”, “low”, “e”, “r”, “low”, “e”, “s”, “t”]

步骤6:统计对频率,最频繁对为"e"和"r"、“e"和"s”(各1次),任选"e"和"r"合并。

步骤7:合并为"er" → [“low”, “low”, “er”, “low”, “e”, “s”, “t”]

步骤8:最后一次迭代,合并"low"和"er" → 最终分词为[“low”, “lower”, “low”, “e”, “s”, “t”]

优势与局限性

  • 优势:有效处理OOV词,可适应不同语言。
  • 局限性:需要预分词,对中文等无空格语言处理困难。

4、WordPiece

WordPiece是一种类似于BPE的子词分词算法,但其核心区别在于选择合并token的方式:WordPiece不是合并最频繁的对,而是合并能最大化训练数据似然的对,这使其在BERT等模型中尤为有效。

“最大化训练数据似然” 可以简单理解为:合并两个字符 / 子词后,让模型预测整个句子的概率变得更高。WordPiece 的核心就是每次选择合并时,都要计算 “合并后是否让整个训练数据的预测更准确”,而不是单纯选出现最多的组合。

4.1 WordPiece的工作原理
  1. 初始词汇表:与BPE类似,从单个字符的词汇表开始。

  2. 似然最大化:WordPiece选择合并后能最大化训练数据似然的token对,通过计算对的概率除以单个token概率的乘积来确定,即选择使P(tok1,tok2)/(P(tok1)×P(tok2))最大化的对(tok1, tok2)。

img

  1. 迭代合并:合并选定的对,重复该过程直到达到所需的词汇表大小。

  2. 最终标记化:使用学习到的子词单元对文本进行分词。

优势与局限性

  • 优势:有效捕捉有意义的子词单元,广泛应用于BERT等模型。
  • 局限性:与BPE类似,需要预分词,对某些语言可能存在问题。

5、SentencePiece

BPE和WordPiece都需要预分词作为初始步骤,即在合并前将文本分割为子词单元,但这对中文和日文等词边界不明确的语言构成挑战,使预分词困难或不可行。SentencePiece是专门为克服这些限制而设计的标记化算法。与BPE和WordPiece不同,它将输入文本视为原始字符流(包括空格),无需预分词。这种方法使SentencePiece能够无缝处理词边界模糊的语言,成为多语言和非空格分隔语言的通用选择。

img

5.1 SentencePiece的工作原理
  1. 作为字符流的输入:SentencePiece不先将文本分割为单词,而是将整个输入文本视为包括空格在内的连续字符序列。

  2. 合并算法:采用与BPE类似的合并算法或一元分词器:

  • 类BPE合并:类似BPE,迭代合并最频繁的字符对。
  • 一元分词器:初始化时使用大量token,逐步修剪每个token以获得更小的词汇表,直到达到所需大小。
  1. 空格处理:SentencePiece使用下划线作为空格的占位符。

img

  1. 句子重建:通过连接token并将下划线替换为空格,可重建原始句子。
5.2 示例

对于句子“deep learning engineer”,SentencePiece可能生成标记如[“deep”, “_learning”, “_engineer”],下划线代表空格,以便重建原句。

优势与局限性

  • 优势:高度灵活,无需预分词即可处理多种语言。
  • 局限性:将空格作为token的一部分,可能使某些应用的输出不够直观。

6、 BPE、WordPiece和SentencePiece的对比

img

7、结论

分词是为大语言模型准备文本数据的关键步骤。本文讨论的三种算法(BPE、WordPiece和SentencePiece)各有优势,适用于不同场景:BPE和WordPiece分别广泛应用于GPT和BERT等模型,而SentencePiece为多语言应用提供了更高的灵活性。通过理解这些算法的细微差别,从业者可以针对特定的NLP任务,明智地选择合适的分词方法。

8、如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

### 关于自然语言处理中的分词概念 文本分词是将连续的字符序列按照一定的规则切分成具有语义合理性的词语片段的过程[^1]。这一过程对于不同语言有着不同的挑战;例如,英文可以通过空格来较为容易地区分单词边界,而中文则缺乏明显的词间分隔符。 #### 基础分词方法 基础的分词方式主要包括简单依据空白字符或标点符号来进行切割。这种方式适用于像英语这样有明显间隔的语言环境。然而,这种方法并不总是能给出最理想的分词效果,尤其是在面对诸如缩写形式(如 I.B.M)、称呼前缀(如 Mr.)等情况时可能会出现问题[^4]。 ```python import re def simple_tokenizer(text): # 使用正则表达式匹配非字母数字字符作为分隔符 tokens = re.split(r'\W+', text.lower()) return [t for t in tokens if t] text_example = "Hello, how are you?" print(simple_tokenizer(text_example)) ``` #### 复杂分词技术 为了提高准确性,还可以采用更加先进的算法和技术: - **基于统计的方法**:通过计算相邻字串共现频率构建n-gram模型,以此预测最优的词语划分方案。 - **基于机器学习的方式**:利用监督学习训练特定类型的分类器(如条件随机场CRF、最大熵MaxEnt),让其学会识别正确的词汇边界位置。 以下是使用Python NLTK库实现的一个例子,该库提供了多种内置工具支持高效完成高质量的分词操作: ```python import nltk from nltk.tokenize import word_tokenize # 下载必要的资源包 nltk.download('punkt') sample_text = "Hello, how are you?" # 应用NLTK自带的word_tokenize函数进行分词 result_tokens = word_tokenize(sample_text) for idx, tok in enumerate(result_tokens, start=1): print(f'Token {idx}: "{tok}"') ``` 此外,TensorFlow Keras API同样提供了一个简易接口用于快速创建并适应自定义语料库特征提取需求的Tokenizer对象[^2]: ```python from tensorflow.keras.preprocessing.text import Tokenizer sentences_list = [ 'i love my dog', 'I, love my cat', 'You love my dog!' ] keras_tokenizer = Tokenizer(num_words=100) keras_tokenizer.fit_on_texts(sentences_list) # 输出词汇表映射关系 print(keras_tokenizer.word_index) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值