BPE算法
- 1. 引子
- 1.1 词表构成问题
- 1.2 bpe压缩算法
- 1.3 bpe在NLP中使用
- 2. 大语言模型-Tokenization
- 2.1 为什么不直接用Unicode
- 2.1.1UTF-8
- 2.2 bpe的使用
- 2.2.1 拓展
1. 引子
1.1 词表构成问题
由于在NLP模型训练中, 词表(字表)是必要的
;传统做法是统计训练语料中的所有字符或词
,但有以下问题:
- 使用或者测试数据中,出现训练时没有出现的词
- 词表过大
- 对于不同的语种,需要统计大多并且,不同的语种怎么去划分词、字存在很大的差异。也不灵活,成本较大。
1.2 bpe压缩算法
简介: bpe算法是数据压缩的一种方案,即byte pair encodeing。
原理: 一串长的文本或者图像中,几乎必然会找到重复的词或者组合,通过设定一个新的字来代替这个组合,就可以减少原有数据的长度,代价仅仅是记录下这个组合与代替的字之间的关系。并且bpe的窗口一般都是2个
。
举例:
- 字符串: “aaabdaaabac”
- 重复的
aaa可以替代
,这里为了示范,取aa;使得Z = aa- 字符串: “ZabdZabac”
- 重复ab,使用Y= ab
- 字符串: “ZYdZYac”
- 重复ZY; 使的 W =ZY
- 字符串: “WdWac”
这里可以看到,相对原有字符串,缩减了;对于大的文件来说,这种相同的内容是非常多,从而能够做到压缩。
1.3 bpe在NLP中使用
- 假设现在又语料:”he had a cat“,“the cat is sitting on the mat”
- 拆分上述语料的词,则有:
[“h”,“e”,“a”,“d”,“c”,“t”,“i”,"s’,“n”,“g”,“o”,“m”] - 统计相邻出现的两个字符的频率,中间有空格不算相邻;则有:
he : 3 (the* 2 ;he)
at: 3 (cat * 2, mat)
…
- 将统计得到的频率最大的组合,组合成一个新的词;则有新词组合:[“h”,“e”,“a”,“d”,“c”,“t”,“i”,"s’,“n”,“g”,“o”,“m”,“he”,“at”]
- 在上面的基础上词带入语料中,还可以进行新的统计,得到新的词。
优点: 上面的找新的词的做法,可以不断的循环,直到最后整个语料作为一个新的词;所以,通过这种方法,可以控制,产生的词表的大小。
2. 大语言模型-Tokenization
前言: 在大语言模型中,需要兼容多种格式的语言,那么必定有一种方式可以表示几乎所有的语言,即Unicode。
简介: Unicode 是一种全球通用的字符编码标准,旨在解决不同语言和字符集的兼容性问题。存储在计算机中的是2进制数,需要通过Unicode转换成能够让人类识别使用的字符。即相当于计算机数字和人类字体之间对应的字典。计算机只认数字,人只认识字体,Unicode记录了那个数字是那个字。
2.1 为什么不直接用Unicode
方案: 如果使用Unicode就可以表示不同语种的字符,将语料转换成Unicode,当成训练模型的语料,就可以解决上述多语种的问题。
原因:
- Unicode码表太大,14万+,这样会导致模型的词表过于庞大,增大计算量。
- 英文一个字符是一个Unicode码,”hello“就需要5个,这样一句话占用的序列长度就太大了,也不利于机器学习训练、使得模型训练难度较大。
- Unicode在不断的添加变化。
2.1.1UTF-8
简介: UTF-8是对Unicode的再编码,简单来说,就是用1-4个16进制数,即[0,255]
之间的数字,组合表示一个Unicode码。
UTF-8也不能作为训练大模型的词表
原因: 一个字符由一个Unicode组成,一个Unicode由四个数字的UTF-8表示,这样相当于1个字符需要1-4个token,这样的序列太长了,训练难度很大。
2.2 bpe的使用
原理步骤:
- 将一串文本字符转换成Unicode码,
- 将每一个Unicode码转换成1-4个0-255之间的数字。
- 使用bpe去统计相邻两个数字的在语料中出现的次数,比如: 178,245
- 将这种组合,用新的token表示,即从256开始;前0-255个token,则表示实际的0-255的数字。
- 在4的基础上,会出现:
278,988
这样组合的次数也特别高的情况,就将它作为一个新的词,使用更大的数字去代表token,比如:10001;- 通过上述的方式,就可以设置一个30000的数字,最后
词把token序号用完了即结束
- 上述方式就会导致模型的token,有可能是表示的1个成语:
自强不息
通过两两数字组合不断叠加形成的token。也有可能表示一个字符:a
通过上述步骤,则实现了一个大预言模型的tokenizer的词表内容
2.2.1 拓展
由上面的词表构建的方案,可以解释某些现象
- 大模型不擅长去数,一个单词中有几个字符,模型没有办法很好的回答,这是因为,这个草莓的单词strawberry经过转化后,是一个token,即一个向量,模型没法去数
举例:strawberry有几个r
- 大模型不擅长处理数字的运算,也有这个原因,因为在大模型接收到的信息中,可能3.14是一个token、3.1是一个token。所以不太好计算。
- 比如让大模型将某个英文单词的顺序倒过来写,就无法完成,因为这个
单词在大模型里面是一个token,比如:maybe
。 - 存在大模型输出固定组合的情况,比如: 某个token对应着==》”自强不息“ 会导致,输出这个token得到的就是四个字,固定搭配,导致一些语义上的笑话或者现象。