预训练模型分词方式

本文详细介绍了用于自然语言处理的tokenize技术,包括BPE、WordPiece和SentencePiece。这三种算法旨在将文本拆分成具有语义意义的子词,以解决词汇表大小和长尾问题。BPE通过合并常见子词对构建词汇表,WordPiece则寻找最大化训练数据似然的合并策略。SentencePiece结合了BPE和Unigram,以句子为单位进行处理。BERT、GPT-2和XLNet等模型分别采用了这些算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BPE、WordPiece、SentencePiece

tokenize的目标是将输入的文本流, 切分成一个个子串,使得每个子串具有相对完整的语义,便于学习embedding表达和后续模型的使用。

tokenize三种粒度:word、subword、char

word/词:最自然的语言单元,中文需要分词算法。由于词汇表较大,存在长尾现象,词汇表可能超大。常规的词汇表,一般大小不超过5万。

char/字符:最基本的字符。字符的数量是少量有限的,由于字符数量太小,在为每个字符学习嵌入向量表示的时候,每个向量容纳太多的语义信息,学习困难。

subword/子词级别:介于字符和单词之间,平衡了词汇量和语义独立性常用词应该保持原状,生僻词应该拆分成子词以共享token压缩空间

常用tokenize算法

  • BPE(Byte-Pair Encoding)
  • WordPiece
  • SentencePiece
ModelType of Tokenizer
BERTWordPiece
GPT-2BPE
XLNetSentencePiece
ALBERTSentencePiece
T5SentencePiece

BPE:字节对编码。核心思想在于将最常出现的子词对合并,直到词汇表达到预定大小时停止。

  • 依赖于预分词器pretokenizer完成初步的切分。pretokenizer可以是简单基于空格,也可以基于规则
  • 分词后,统计每个词的词频
  • 建立基础词汇表,包括所有的字符
  • 根据规则,分别考察2-gram, 3-gram的基本字符组合。将高频的n-gram组合依次加入到词汇表中,直到词汇表达到预定大小停止
  • 最终词汇表的大小 = 基础字符词汇表大小 + 合并串的数量(例如:GPT, 40478 = 478(基础字符) + 40000(merges))

WordPiece

子词粒度的tokenize算法subword tokenization algorithm。例如BERT、DistilBERT、Electra均使用它。

其原理同BPE接近,在做合并之时,不是根据最高频的组合,而是寻找最大化训练数据似然的merge。

Unigram

与BPE或者WordPiece不同, Unigram的算法思想从一个巨大的词汇表出发,再逐渐删除trimdown其中的词汇,直到size满足预定义。

初始的词汇表采用所有预分词器分出来的词,再加上所有高频的子串。每次从词汇表中删除词汇的原则是使预定义的损失最小。训练时,计算loss的公式为:Loss = -\sum_{i = 1}^{N} log(\sum_{x \in S(x_{i})}^{} p(x))

SentencePiece

将一个句子看作一个整体,再切分成片段,而没有保留天然的词语的概念。

空格space也当作一种 特殊字符来处理,再用BPE或者Unigram算法来构造词汇表。

SentencePiece与Unigram算法联合使用, 例如ALBERT、XLNet、Marian、T5

切分实例与代码分析

BertTokenizer / WordPiece

【BertTokenizer, 基于WordPiece算法, base版本的词汇表大小为21128】

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
tokens = tokenizer.encode("我是一个好人")
  • 在BertTokenizer中,用##符号表示非开头的子词
  • 标点符号、生僻字等未出现的token被[UNK]代替
  • 中文基本拆分成了字的形式
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')

print(tokenizer)    # tokenizer信息打印

tokens = tokenizer.encode("我是一个好人")

print(tokens)    # encode编码

### 使用 BERT 预训练模型进行分词 为了使用 BERT 预训练模型执行分词操作,可以利用 Hugging Face 提供的 `transformers` 库中的 `BertTokenizer` 类。该类实现了基于 WordPiece 的分词算法[^2]。 下面是一个简单的 Python 代码示例来展示如何加载并应用 BERT 分词器: ```python from transformers import BertTokenizer # 初始化 BERT tokenizer,默认会下载 'bert-base-uncased' 版本的 vocab 文件 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') text = "Using a Transformer model like BERT to tokenize text." # 将输入字符串转换成 token ID 列表 token_ids = tokenizer.encode(text, add_special_tokens=False) print(f"Token IDs: {token_ids}") # 获取原始 tokens (不带特殊标记) tokens = tokenizer.tokenize(text) print(f"Tokens: {' '.join(tokens)}") ``` 这段程序首先导入必要的库,并通过指定预训练模型名称 `'bert-base-uncased'` 来实例化一个 `BertTokenizer` 对象。接着定义了一段待处理的文字作为测试样本。调用 `encode()` 函数可获得对应于输入文本的一系列整数形式的 token ID;而如果想要查看实际分割后的词汇,则应该使用 `tokenize()` 方法获取到具体的 subword units 或完整的单词片段[^1]。 #### 关键点说明 - **WordPiece Tokenization**: BERT 使用的是改进版的 Byte-Pair Encoding (BPE),即 WordPiece 模型来进行子词级别的切分工作。这允许它有效地表示未知或罕见词语以及捕捉不同形态变化之间的关系。 - **Special Tokens Handling**: 默认情况下,在编码过程中可能会自动加入一些特殊的起始 ([CLS]) 和结束 ([SEP]) 符号用于某些下游任务的需求。这里设置参数 `add_special_tokens=False` 是为了避免这些额外符号干扰单纯的分词过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值