Token:SentencePiece论文阅读--大模型中主流的分词算法


更多内容:XiaoJ的知识星球


Token:SentencePiece论文阅读


1.系统概述

SentencePiece:一种简单且独立于语言的文本分词器和去分词器,主要用于基于神经网络的文本生成系统。

SentencePiece 实现了两种子词分割算法,字节对编码 BPE 和 unigram 语言模型,并扩展了原始句子的直接训练。

深度神经网络对自然语言处理产生了巨大影响。神经机器翻译 (NMT)可以利用神经网络通过简单的端到端架构直接执行翻译。

1)SentencePiece组件

SentencePiece 包括 4 个主要组件: Normalizer、Trainer、Encoder 和 Decoder。

  • Normalizer模块,用于将语义等效的 Unicode 字符规范化为规范形式。

  • Trainer 从规范化语料库训练子词分割模型。我们指定一种类型的子词模型作为 Trainer 的参数。

  • Encoder 在内部执行 Normalizer 来规范化输入文本,并使用 Trainer 训练的子词模型将其分词为子词序列。

  • Decoder 将子词序列转换为规范化文本。

2)SentencePiece使用示例

SentencePiece端到端示例: training (spm_train), encoding (spm_encode), and decoding (spm_decode)

输入文本是通过 spm_encode 和 spm_decode 进行可逆转换的。

图 1:SentencePiece 的命令行用法


2.设计和实现

本节介绍包含命令行和代码片段的 SentencePiece 的设计和实现细节。

1) 无损分词化(lossless tokenization)

(1)依赖于语言

原始句子和分词化句子示例,依赖于语言的预处理。

  • Raw text: Hello world.

  • Tokenized: [Hello] [world] [.]

"world" 和 "." 之间不存在空格的信息不会保留在分词序列中。Detokenization 是从 tokenized 序列中恢复原始原始输入的过程,由于这些不可逆的作,它必须依赖于语言。

例如,虽然 在大多数欧洲语言中,detokenizer 通常在原始标记之间放置空格,但在日语和中文中不需要空格。

  • Raw text: [こんにちは世界。] (Hello world.)

  • Tokenized: [こんにちは] [世界] [。]

这种特定于语言的处理通常是在手动构建的规则中实现的,这些规则的编写和维护成本很高。

(2)无损分词化(lossless tokenization)

SentencePiece 将 Decoder 实现为 Encoder 的 逆运算,即:

D e c o d e ( E n c o d e ( N o r m a l i z e ( t e x t ) ) ) = N o r m a l i z e ( t e x t ) . Decode(Encode(Normalize(text))) = Normalize(text). Decode(Encode(Normalize(text)))=Normalize(text).

这种设计称为无损分词化(lossless tokenization),其中再现规范化文本的所有信息都保留在编码器的输出中。

无损分词的基本思想是将输入文本视为 Unicode 字符序列。甚至空格也被作为普通符号处理。

为了清楚起见,SentencePiece 首先用元符号 _ (U+2581) 转义空格,并将输入分词化为任意子词序列,例如:

  • Raw text: Hello_world.

  • Tokenized: [Hello] [_wor] [ld] [.]

由于空格保留在Tokenized文本中,因此可对Tokenized文本进行去分词化(detokenize),而不产生歧义。

应该注意的是,subword-nmt 对子词单元采用不同的表示形式。它侧重于如何将单词分割成子词,并使用 @@ 作为单词内边界标记。

  • Tokenized: [Hello] [wor] [@@ld] [@@.]

这种表示形式并不总是执行无损分词化,因为在处理空格时仍然存在歧义。更具体地说,不能用这种表示形式对连续的空格进行编码。

2) 高效的子词训练和分割

现有的子词分割工具从预先分词化的句子中训练子词模型。引入这种预分词化是为了有效的子词训练。但不能总是假设预分词化可用,尤其是对于非分段语言。此外,预分词化使得执行无损分词变得困难。

SentencePiece 采用多种加速技术进行训练和分割,以使用大量原始数据进行无损标记化。

例如,给定一个长度为 N 的输入句子(或单词),在每次迭代中天真地扫描这对符号时,BPE 分割需要 O(N ) 计算成本。SentencePiece 采用 O(N log(N )) 算法,其中合并的符号由二进制堆(优先级队列)管理。此外,单元语法语言模型的训练和分割复杂性与输入数据的大小呈线性关系。

3) 词汇 ID 管理

SentencePiece 管理词汇表到 id 的映射,以直接将输入文本转换为 id 序列,反之亦然。

SentencePiece 为特殊元符号保留词汇 ID,例如:未知符号(), BOS(), EOS(), padding ()。它们的实际 ID 配置了命令行标志。

我们还可以定义自定义元符号,将上下文信息编码为虚拟令牌。示例包括语言指标 <2ja> 和 <2de>表示多语言。

4)可自定义的字符规范化

字符规范化是处理现实世界文本的一个重要预处理步骤,其中涉及语义等效的 Unicode 字符。

Unicode 标准规范化形式,如 NFC(规范组合形式)和 NFKC(兼容性分解及规范组合形式),因其更好的可重复性以及作为 Unicode 标准得到广泛使用。

默认情况下,SentencePiece 使用 Unicode NFKC 规范化对输入文本进行规范化。规范化规则通过spm_train--normalization_rule_name=nfkc标志来指定。SentencePiece 中的规范化是通过字符串到字符串的映射以及最左最长匹配来实现的。规范化规则被编译成一个有限状态转换器(Aho - Corasick 自动机)以高效地执行规范化操作。

SentencePiece 支持自定义规范化规则,以 TSV 文件定义,通过特定标志指定,特定任务规则可扩展默认 NFKC 规则。

5)自包含模型

严格来说,NFKC 规范化可能会产生不同的结果,具体取决于 Unicode 版本。

理想情况下,所有预处理的规则参数必须以自包含的方式嵌入到模型文件中,这样只要我们使用相同的模型文件,我们就可以重现相同的实验设置。

SentencePiece 模型设计为完全自包含的。模型文件不仅包括词汇表和分割参数,还包括用于字符规范化的预编译有限状态传感器。SentencePiece 的行为仅由模型文件决定,没有外部依赖项。这种设计保证了完美的可重复性。

6)用于动态处理的库 API

文本预处理一般是离线处理,在 NMT 训练前用独立预处理器将原始输入转为 ID 序列,但存在两大问题:一是独立工具难集成到需实时处理用户输入的 NMT 应用;二是离线处理不利于子句级数据增强和噪声注入。这些技术对于提高NMT模型的准确性和鲁棒性至关重要。

为了解决这些问题,SentencePiece不仅提供了离线预处理的命令行工具,还支持C++、Python和TensorFlow库API,实现实时处理,能够轻松集成到现有的NMT框架中。

此外,SentencePiece还实现了子词正则化,通过动态采样和噪声注入来增强训练数据,进一步提升NMT模型的性能。

图3: C++ API的使用(与图1相同)

图4: Python API的使用(与图1相同)

图5:TensorFlow API的使用

SentencePiece模型(模型协议)是TensorFlow操作的一个属性,并嵌入到TensorFlow图中,从而使模型和图完全自包含。

图 6 显示了用于子词正则化的 Python 示例代码,其中根据 unigram 语言模型对一个子词序列进行采样。我们可以发现文本"New York"的标记化方式不同。

图 6:使用 Python API 进行子词采样


3.总结

本文介绍了SentencePiece,一个用于神经网络文本处理的开源子词分词器和解分词器。它能够直接将文本转换为ID序列,实现端到端的处理,无需依赖特定语言的资源。SentencePiece的模型文件是自包含的,确保了处理的可重复性。


SentencePiece参考:

BPE参考:


声明:资源可能存在第三方来源,若有侵权请联系删除!

相关推荐
IT猿手43 分钟前
2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB
人工智能·python·算法·数学建模·matlab·智能优化算法
Jet45052 小时前
玩转ChatGPT:GPT 深入研究功能
人工智能·gpt·chatgpt·deep research·深入研究
毕加锁2 小时前
chatgpt完成python提取PDF简历指定内容的案例
人工智能·chatgpt
Wis4e4 小时前
基于PyTorch的深度学习3——基于autograd的反向传播
人工智能·pytorch·深度学习
Dream it possible!4 小时前
LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)
c++·算法·leetcode
西猫雷婶4 小时前
神经网络|(十四)|霍普菲尔德神经网络-Hebbian训练
人工智能·深度学习·神经网络
修己xj5 小时前
算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
算法
梦丶晓羽5 小时前
自然语言处理:文本分类
人工智能·python·自然语言处理·文本分类·朴素贝叶斯·逻辑斯谛回归
SuperCreators5 小时前
DeepSeek与浏览器自动化AI Agent构建指南
人工智能·自动化
开心比对错重要5 小时前
leetcode69.x 的平方根
数据结构·算法·leetcode