预训练模型基础
- bpe_simple_vocab_16e6.txt
- BPE
bpe_simple_vocab_16e6.txt
bpe_simple_vocab_16e6.txt.gz
文件是一个使用字节对编码(Byte Pair Encoding,BPE)算法生成的词汇表文件。文件内的单元是基于统计学上的频次自动生成的子词单元。如下所示:
"bpe_simple_vocab_16e6.txt#version: 0.2
i n
t h
a n
r e
a r
e r
th e</w>
...
在python可逐行读取:
merges = gzip.open(bpe_path).read().decode("utf-8").split('\n')
该文件名中的“bpe”和“16e6”表示该词汇表是使用BPE算法 在包含约16百万单词的语料库训练得到。bpe算法是当前最常见 tokenizer 的编码方法,用于 GPT (OpenAI) 和 Bert (Google) 的 Pre-training Model。
BPE
BPE(Byte Pair Encoding)是一种自然语言压缩算法,目的是使用最少的 token 数目来表示一个语料库 corpus。
主要步骤如下:
1. 初始化:将文本中的每个字符作为初始子词单元。
2. 计算频率:统计相邻字符对的频率。
3. 循环直到达到预定的子词单元数量或合并次数:3.1 合并:合并频率最高的字节对;3.2 计算频率:更新文本中相邻字符的频率;
4. 返回学习到的子词单元。
例子:已知文本为aaabdaaabac
1. 初始化:a a a b d a a a b a c
2. 计算频率:{aa:4, ab:2, bd:1, da:1, ba:1, ac:1}
3. 循环不再有重复出现的子词单元:3.1 合并:Z <- aa,得到 ZabdZabac;3.2 计算频率:{Za:2, ab:2, bd:1, dZ:1, ba:1, ac:1};3.3 合并: Y <- Za,得到 YbdYbac;3.4 计算频率:{Yb:2, bd:1, dY:1, ba:1, ac: 1};3.5 合并:X <- Yb,得到 XdXac;3.6 计算频率:{Xd:1, dX:1, Xa:1, ac:1};
4. 返回 {X, d, a, c} ={Yb, d, a, c}={Za, d, a, c}={aa a, d, a, c}
改进后的算法在每个单词末尾加上边界符号</w>
,以区分字符在末尾与非末尾的不同情况,实现更准确的分词与编码。
[1] 文本: BPE(Byte-Pair Encoding)简介
[2] 文本: 字节对编码
[3] 视频: 什么是BPE算法Byte-Pair Encoding
[4] 代码:Byte Pair Encoding