tokenizer是如何训练的

说是训练,不如说是统计。

基础

utf-8编码是1到4个字节编一个token,一个字节0到255,所以一个字儿可能是多个0到255的数字组合而成的,一句话也就肯定有超出其字符数数量的0到255的数组成。

bpe

bpe是基于utf8编码的词表扩充法。首先,0到255这256个是基础token,openai在此基础上增加5万整词表规模,加上一个特殊token,总和50257词表大小。
新词是怎么选出来的呢?
我们首先准备巨量的文本,然后转换成utf8,文本就变成最大255的数字序列了。然后两两数字组合,统计配对的词频(就是数有几对)。
假如(138,168)在这巨大的统计量里词频排第一,那么我完全有理由把它直接加入词表,成为光荣的第256个token(token是从0开始编号的)。从此以后,再在文本里看到138 168连着,你就把它看做一个数,叫256。
既然被加入的词已经二合一了,那么我们还可以继续统计两两配对的词频。显然,如果此时256和198又登顶第一,那么它俩可以成为257号token。此时,这个257就是三个数的综合了,是三个基础token的绑定了。这就是多token分配一个编号的由来。
总之就这样一直搞下去。直到词表上限50257被填满。
这里一定会有疑问,我选新词的时候只选一个,我能不能一次性选两个,top2?或者过某个坎儿的,或者前百分之多少的,塞进去?太对了,不这么干哪来的效率,肯定是要一次填入多个新词的。

sentencepiece

这是谷歌的开源库,帮你做词表和分词的。
库如其名,是句子分片。bpe是基于256个基础token,而sentencepiece是基于五万多个token,我猜是把所有常用符号都作为基础token了,里面自然也有汉字,在sentencepiece里是一个上万的数字19997,在bpe里是3个0到255的数字表示的,这就是二者基token的区别。
为什么基有区别?因为sentencepiece想要处理语言之间的差异。例如英文能靠空格轻松得到词,而中文不能,基于bpe怕是可能会把汉字本身的表示切到俩个新token里了。为避免语义崩坏,也是怕做自回归的时候生成大量非法token,所以必须以现实里用的最小单元为基础token。
接着,sentencepiece构造词表的方式就随意了。可以用bpe的方式,也可以用wordpiece的方式,还有个叫unigram的方式,下面讲👇🏻。

wordpiece

如果认为一个句子,token是t1到tn,可重复,句子的出现是每个token概率生成的结果,那么一个句子产生的概率是其中所有token生成概率之积。
注,token概率可以用统计所有语料词频的方式得到。
如果你觉得token1和2是一个新的token,那么请得到它的概率,然后你会发现句子生成的概率多了一个p(ab),少了p(a)和p(b)。我想衡量一下这一多一少,整个句子的概率亏了多少。概率是乘积关系,不好看,所以用log处理概率,即logp(句子),那么ab凑一起的前后,logp(句子)的变化就是logp(ab)-logp(a)-logp(b)。在全局上,把所有语料看做一个大句子,然后找哪对ab亏得最小。
显然,如果a频率很低,b频率很低,ab还总是粘一起,那么算完实际上是个正值,而且还很大。因此wordpiece鼓励稀有但绑定程度很高的词,例如魑魅魍魉这种,反而高兴这种词要往后稍一稍了。
所以如果你的数据里,专有名词少但很重要,用wordpiece。

unigram

这个不想多说了,累了。
主要思路是:有一个理想的词表,能使得一句话生成的概率最大。我们虽然不知道是什么词表,但是首先我们拟一个巨大的词表,然后通过删除词的方式不断增加该句被生成的概率。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值