新智元报道
编辑:桃子
果不其然,继放出 BPE 的 GitHub 代码后,Karpathy 终于上线了「从头构建 GPT 分词器」的课程,引来大波网友关注。
离职 OpenAI 的技术大神 karpathy,终于上线了 2 小时的 AI 大课。
——「让我们构建 GPT Tokenizer(分词器)」。
其实,早在新课推出两天前,karpathy 在更新的 GitHub 项目中,就预告了这件事。
这个项目是 minbpe——专为 LLM 分词中常用的 BPE(字节对编码)算法创建最少、干净以及教育性的代码。
目前,GitHub 已经狂揽 6.1k 星,442 个 fork。
项目地址: https://github.com/karpathy/minbpe
网友:2 小时课程含金量,相当于大学 4 年
不得不说,karpathy 新课发布依然吸引了业内一大波学者的关注。
他总是可以把相当复杂的 LLM 概念,用非常好理解的方式讲出来。
有网友直接取消了晚上的约会,去上课了。
与 karpathy 的约会之夜。
AI 机器学习研究员 Sebastian Raschka 表示,「我喜欢从头开始的实现,我真的很期待看到这个视频」!
英伟达高级科学家 Jim Fan 表示,「Andrej 的大脑是一个大模型,它能将复杂的事物标记化为简单的 token,让我们小型思维语言模型可以理解。
还有 UCSC 的助理教授 Xin Eric Wang 表示,「就个人而言,我非常欣赏他多年前发表的关于 RL 的文章:http://karpathy.github.io/2016/05/31/rl/,这篇文章帮助我进入了 RL 领域」。
还有人直言这两个小时课程的含金量,堪比 4 年制大学学位。
「Andrej 是最好的 AI 老师」。
为什么是分词器?
为什么要讲分词器?以及分词器为什么这么重要?
正如 karpathy 所言,分词器(Tokenizer)是大模型 pipeline 中一个完全独立的阶段。
它们有自己的训练集、算法(字节对编码 BPE),并在训练后实现两个功能:从字符串编码到 token,以及从 token 解码回字符串。
另外,大模型中许多怪异行为和问题,其实都可以追溯到分词器。
就比如:
- 为什么 LLM 拼不出单词?
- 为什么 LLM 无法完成超级简单的字符串处理任务,比如反转字符串?
- 为什么 LLM 不擅长非英语语言方面的任务?
- 为什么 LLM 不擅长简单算术?
- 为什么 GPT-2 在用 Python 编码时遇到了超出必要的麻烦?
- 为什么 LLM 在看到字符串时突然停止?
- 为什么大模型实际上并不是端到端的语言建模
视频中,他将讨论许多这样的问题。讨论为什么分词器是错误的,以及为什么有人理想地找到一种方法来完全删除这个阶段。
两小时大课走起
在本讲座中,他将从头开始构建 OpenAI GPT 系列中使用的 Tokenizer。
根据 YouTube 课程章节介绍,一共有 20 多个 part。
其中包括引言介绍、字节对编码 (BPE) 算法演练、分词器/LLM 图:这是一个完全独立的阶段、minbpe 练习时间!编写自己的 GPT-4 分词器等等。
从讲解到习题演练贯穿了全部课程。
以下是从演讲内容中总结的部分要点。
在视频结尾,Karpathy 重新回顾了 LLM 分词器带来的怪异问题。
首先,为什么 LLM 又时拼不正确词,或者做不了其他与拼写相关的任务?
从根本上说,这是因为我们看到这些字符被分割成了一个个 token,其中有些 token 实际上相当长。
因此,我怀疑这个单个 token 中塞进了太多的字符,而且我怀疑该模型在与拼写这个单个 token 相关的任务方面应该不是很擅长。
当然,我的提示是故意这样做的,你可以看到默认风格将是一个单一的 token,所以这就是模型所看到的。
事实上,分词器不知道有多少个字母。
那么,为什么大模型在非英语任务中的表现更差?
这不仅是因为 LLM 在训练模型参数时,看到的非英语数据较少,还因为分词器没有在非英语数据上得到充分的训练。
就比如,这里「hello how are you」是 5 个 token,而它的翻译是 15 个 token,相当与原始的 3 倍大。
「안녕하세요」在韩语中代表着「你好」,但最终只有 3 个 token。
事实上,我对此感到有点惊讶,因为这是一个非常常见的短语,只是典型的问候语,如你好,最终是三个 token。
而英语中的「你好」是一个单一的 token。这是我认为 LLM 在非英语任务中表现差的原因之一便是分词器。
另外,为什么 LLM 会在简单的算术上栽跟头,也是与数字的 token 有关。
比如一个类似于字符级别的算法来进行加法,我们先会把一加起来,然后把十加起来,再把百加起来。
你必须参考这些数字的特定部分,但这些数字的表示完全是任意的,主要是基于在分词过程中发生的合并或不合并。
你可以看看,它是一个单一的 token,还是 2 个 token,即1-3、2-2、3-1 的组合。
因此,所有不同的数字,都是不同的组合。
不幸的是,有时我们会看到所有四位数字的四个 token,有时是三个,有时是两个,有时是一个,而且是以任意的方式。
但这也并不理想。
所以这就是为什么我们会看到,比如说,当训练 Llama 2 算法时,作者使用句子片段时,他们会确保把所有的数字都分割开来,作为 Llama 2 的一个例子,这部分是为了提高简单算术的性能。
最后,为什么 GPT-2 在 Python 中的表现不佳,一部分是关于架构、数据集和模型强度方面的建模问题。
但也有部分原因是分词器的问题,可以在 Python 的简单示例中看到,分词器处理空格的编码效率非常糟糕。
每个空格都是一个单独的 token,这大大降低了模型可以处理交叉的上下文长度,所以这几乎是 GPT-2 分词的错误,后来在 GPT-4 中得到了修复。
课后习题
在课程下方,karpathy 还给在线的网友们布置了课后习题。
快来打卡吧。
参考资料:
https://twitter.com/karpathy/status/1759996549109776702?t=lnj52VquAiuW4oG8yflJbA&s=19