技术大神卡帕西离职OpenAI以后,营业可谓相当积极啊。
这不,前脚新项目刚上线,后脚全新的教学视频又给大伙整出来了:
这次,是手把手教咱构建一个GPT Tokenizer(分词器),还是熟悉的时长(足足2小时13分钟)。
Ps. 上次讲课还是俩月前的大模型科普。
所谓“卡帕西出手,必属精品”,大伙火速码码码:
今晚的约会取消,卡帕西来了我要去上课(狗头)
再说一遍,付费都买不到的这样高质量的课程,冲。
具体都有哪些干货?
“太长不看版”已为大家准备好。
为什么要关注Tokenizer
如大神介绍:
Tokenizer即分词器是大语言模型pipeline中一个完全独立的阶段。
它们有自己的训练集、算法(比如BPE,字节对编码),并在训练完成后实现两个功能:
从字符串编码到token,以及从token解码回字符串。
为什么我们需要关注它?
卡帕西指出:
因为LLM中的很多奇怪行为和问题都可以追溯到它。
比如:
- 为什么大模型不能处理简单的字符串处理任务,例如反转?
- 为什么大模型在非英语语言任务方面的性能更差?
- 为什么大模型不擅长简单的算术?
- 为什么我的模型在看到字符串“”后就突然“宕机”了?
- 为什么大模型实际上并不是端到端的语言建模?
- ……
所以为了弄清这些问题,便有了今天的课程——尽管大神本人对这部分内容其实也不太喜欢。
上这门课大家会注意到我的表情全程都很凝重。不过,其中的细节真的太重要了(大家还是忍忍吧)。
以下为视频主要内容文字版。
从头构建OpenAI大模型中使用的分词器
视频的最开始主要是对分词器的一些介绍。
包括最简单的字符级分词操作(即每个字符是一个token)以及更为复杂和常用的chunk级操作(即多个字符也会组成一个token)。
在这之中,业内最常用的算法是BPE,即byte pair encoding,字节对编码,因此我们要想构建自己的分词器,最重要的是了解这个算法。
卡帕西介绍:
BPE可以更好地处理非英语语言、对词汇表大小进行调整,对于模型的性能有显著影响。
比如GPT-4分词器通过改进BPE算法,最终在处理Python代码时更加高效,因为它能够将多个空格合并为单个标记,从而减少序列长度,使得模型能够关注更长更多的代码。
需要注意的是,尽管BPE算法可以处理UTF-8编码的字节序列,但直接使用这些序列会导致词汇表过大、序列过长,从而影响模型的注意力机制和上下文长度,因此需要压缩处理。
理解BPE算法后,如何构建自己的分词器?
简单来说,主要包括以下几个步骤:
1、初始化词汇表
基于UTF-8编码的字节。
2、合并字节对并不断迭代,直到词汇表大小达到预设值
在实际演示中,卡帕西通过20次合并,将文本的token数量减少了约27%。
3、处理特殊字符和不同语言的字符
4、整体优化
词汇表过大可能会导致模型训练困难,过小则可能无法捕捉到足够的语言细节。
5、选择一个包含丰富语言特征的数据集来训练
在此,卡帕西提到了SentencePiece库,它支持多种分词算法包括今天提到的BPE。
我们可以用它进行分词器的训练,包括配置选项和如何处理罕见字符。
训练好的分词器用于编码和解码文本也讲了。
6、最后就是评估+集成到模型中了。
当然,后续我们还需要根据模型的表现进行持续调整。
具体道每一步,大神都给咱配了详细的Python实现,包括如何找到最频繁的字节对、如何合并这些对以及如何构建合并字典等等,具体大家就请参阅视频吧。
在这之中,卡帕西也提醒了n个细节,比如:
在解码过程中,如果遇到无效的UTF-8字节序列,可以使用“errors=’replace’”来替换;使用“end of text”特殊标记来在训练数据中分隔文档等等。
实际远比此复杂
毫无疑问,卡帕西带大家实现的是比较基础的一个分词器版本,实际模型中远比这要复杂得多。
比如OpenAI官方提供的BPE分词器——tiktoken。
它用了正则表达式来分割文本,以此来保证某些类型的字符也不会被合并。在GPT-2中,它就在某些方面表现得不错了。
到了GPT-4,官方也对其进行了一些调整。
主要的改变在于:
- GPT-4会将空格合并;
- 大小写不敏感;
- GPT-4最多只合并3位数字,避免了长数字序列token。
不过由于官方并没有公开具体训练细节,所以我们也无法知道其详细的实现。
而除了更复杂的算法,分词器本身在处理长字符串、非英语语言、数字和特殊字符时都可能遇到问题。
因此,讲来讲去,大神在视频中还是表达了一个“朴素的愿望”:
非常希望有一天能够不需要分词,直接将字节流输入到语言模型中。
不过由于这就需要我们对Transfomer架构进行重大修改了,所以现阶段,构建和优化分词器仍然是实现高效大模型的关键步骤。
完整视频见:https://weibo.com/6105753431/O1BQB96Yg