预训练模型基础:bpe_simple_vocab_16e6.txt 语料库,BPE 算法

发布于:2024-04-24 ⋅ 阅读:(23) ⋅ 点赞:(0)

预训练模型基础

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