目录
前言
3Blue1Brown 视频笔记,仅供自己参考
这几个章节主要解析 GPT 背后的 Transformer,本章主要是为理解注意力机制奠定基础,理解词嵌入、点积、softmax 函数等基本概念
1. 预测,采样,重复:预训练/生成式/Transformer模型
GPT 全称为 Generative Pre-trained Transformer(生成式预训练 Transformer)
第一个词很简单,即用来生成新文本的机器人,“预训练” 指的是模型经历了从大量数据中学习的过程,“预” 字则暗示模型能针对具体任务通过额外训练来进行微调,而这里的关键是最后一个词,Transformer 是一种特殊的神经网络,一种机器学习模型,它是当今 AI 热潮的核心发明
我想通过这篇文章以及接下来的章节可视化解释 Transformer 内部运作方式,我们将跟随数据流动方向逐步进行剖析
基于 Transformer 可以构建多种不同的模型,有的模型转录音频,生成文本
有的模型则恰好相反,例如文本转语音模型通过文本转录生成语音
那些在 2022 年风靡全球的工具如 DALL-E 和 Midjourney 这种根据描述生成图像的应用都是基于 Transformer 的,即使我没法让它完全理解 π \pi π 酱应该长啥样,我还是对能有这种应用的出现深感震惊
谷歌在 2017 年推出的原版 Transformer 专注于把一种语言的文本翻译成另一种
而我们要关注的变种,即构建 ChatGPT 等工具的模型,则是输入一段文本甚至伴随着一些图像及音频来预测出文段接下来的内容,并将结果展示为接下来不同文本片段的概率分布
乍一看,你可能会觉得预测下一个词与生成新文本的目标截然不同
但有了这样的预测模型之后要让它生成更长的文本,一个简单的方法是给它一个初始片段,然后从它给出的概率分布中取出一个片段追加到文本末尾,再用所有文本,包括追加的内容,进行新一轮的预测,如上图所示
不知道你怎么想,但我真的不觉得这能行,上面这个动画演示的是我在笔记本上跑 GPT-2,并让它反复预测和抽样下一段文本,让它尝试基于初始文本生成一个故事,结果生成的故事基本没什么逻辑
但如果我换成调用 GPT-3 的 API,它和 GPT-2 是同一个基础模型,只是要大得多,突然像有了超能力一般,故事通顺多了,甚至指出 π \pi π 酱会生活在数学与计算的王国。这个重复预测和抽样的过程正是你与 ChatGPT 或其他大语言模型进行交互时所遇到的单词一个个蹦出来的样子
我特别喜欢一种功能是能看到它在选取每个新词时背后的概率分布
2. Transformer的内部结构
让我们先来总览一下数据如何在 Transformer 里流动,然后再来详细探讨、解释和展开每个步骤的细节
但大体来说,当聊天机器人生成特定单词时背后实际上在做这些事:首先,输入内容会被切分为许多小片段,称为 token,在文本中 token 往往是单词或单词片段或其他常见的字符组合
但对于图像或声音来说 token 则可能代表小块图像或声音片段
每个 token 对应一个向量即一组数字,旨在设法编码该片段的含义
如果将向量看作高维空间中的坐标,那么意思相近的词对应的向量往往也相近,如上图所示
这些向量随后经过 注意力模块 处理,使得向量能够相互交流,通过相互传递信息来更新自己的值
例如 machine learning model 中 model 的含义与 fashion model 中的 model 含义不同
注意力模块的工作就是找出上下文中哪些词会改变哪些词的含义,以及这些词应该更新为何种含义,而我说的 含义 都已经通过某种形式完全编码进了这些向量
之后,这些向量会经过另一种处理,取决于不同资料,有的会把它叫做 多层感知机,也有的叫 前馈层 的,此阶段,向量将不再互相交流而是并行经历同一处理
虽然这一块有点难以解释,稍后我们会说,这一步骤有点像对每个向量提出一系列问题,然后根据这些问题的答案来更新向量
这两块的所有处理,本质都是大量的矩阵乘法,而我们的主要目标是弄懂如何解读这些底层矩阵
我略过了中间一些归一化步骤的细节,因为毕竟这只是个总览,之后基本就是重复该过程,注意力模块和多层感知机模块层层堆叠
最后的目标是能将整段文字的所有关键含义以某种方式融入到序列的最后一个向量,然后对这最后一个向量进行某种操作,得出所有可能 token 的概率分布,即各个小块文本接下来出现的概率
就像之前说的,只要能够根据给定文本预测下一个词,就能给它喂一点初始文本,然后反复进行预测、抽样、追加这一过程
有些人可能还记得,早在 ChatGPT 出现之前,这就是 GPT-3 的早期演示,根据初始化文本自动补全故事和文章
要把这样的工具做出聊天机器人,最基础简单的方法就是准备一段文本,设定用于与 AI 助手互动的场景,即所谓的 系统提示词,然后将用户的初始问题或提示词作为第一段对话,让模型预测热心的 AI 助手进行回应,要做好这一步还需要额外的训练步骤,但总的来说,这就是基本思路
3. 本期总述
在本章中,我们将深入讨论神经网络的最开端是怎样的,最末端是怎样的,同时也会花些时间回顾一些重要的背景知识,这些知识对于 Transformer 时代的机器学习工程师来说都应该是基本常识
若是你熟知一些背景知识,迫不及待想听新内容,也可以直接跳到下一章,下一章将重点介绍注意力模块,那就是 Transformer 的核心
之后,我将详细介绍多层感知器模块,如何进行训练,以及讲解之前所略过的其它细节
顺带一提,这几期视频是深度学习系列课程的补充,没看过前面的也不要紧,我觉得应该不会影响后续内容的观看
4. 深度学习的大框架
但在深入研究 Transformer 之前,我认为有必要确保我们对深度学习的基本概念和架构有一致理解
容我一提,深度学习是机器学习中的一种方法,而机器学习采用数据驱动,反馈到模型参数,指导模型行为
比如说,你想要这样一个函数:输入了图像后就能输出对应的描述标签,或者是给定一段文本,预测下一个单词,或者任何其它需要直觉和模式识别的任务。
尽管我们如今已经习以为常了,但机器学习的理念是不要试图在代码中明确定义如何执行一个任务,那是 AI 发展初期的做法
而是去构建一个具有可调参数的灵活架构,像是一堆旋钮和滑块,然后拿着大量实例,即给定一个输入时应该输出什么,设法调整各种参数值以模仿这种表现
例如,机器学习最简单的形式可能就是线性回归,输入和输出都是单个数字,比如房子的面积和对应的价格,你要做的就是,找到一条最佳拟合线以此预测未来的房价
这条线由两个连续参数描述,比如斜率和截距,线性回归的目标就是确定这些参数,以尽可能拟合数据
当然,深度学习模型会复杂得多,比如 GPT-3 的参数就不只两个,而是有 1750 亿个
但问题是,并不是直接扩大模型参数量就完事了,有时模型要么对训练数据严重过拟合,要么完全训练不出来
深度学习描述的一类模型在过去几十年中,这类模型展现出了出色的规模化能力,它们的共同点是都使用了相同的训练算法即我们在之前的章节介绍过的 反向传播
我想让你理解的是要让这种训练算法在大规模应用中有效运行,模型必须遵循某种特定的结构,对这种结构有所了解之后就能更好理解 Transformer 对语言处理的许多选择,否则有些选择可能会显得没有道理
首先,无论你在构建何种模型,输入的格式必须为实数数组,可以是一维数列,可以是二维数组,或是更常见的高维数组,也就是所谓的 张量
输入数据通常被逐步转换成多个不同的层,同样,每一层的结构都是实数数组,到了最后一层就看作为输出
例如,我们文本处理模型的最后一层是一个数列,表示接下来所有可能 token 的概率分布
在深度学习中,这些模型的参数通常被称为 权重,这是因为这些模型的一个关键特征是参数与待处理数据之间的唯一交互方式就是通过“加权和”,虽然一些模型中也有一些非线性函数,但它们并不依赖于参数
通常情况下,加权和不会像这样赤裸裸地写出来,而是打包成矩阵向量相乘的形式,本质都是一样的,回想一下矩阵向量乘法的原理,就会发现,结果的每一项都像是加权和
概念上更直观的方式是,将充满可调参数的矩阵想象为能够将代表待处理数据的向量进行变换的工具
例如,GPT-3 中的 1750 亿个权重组成了近 28000 个矩阵
这些矩阵又分为八类,我们要做的就是逐一了解各个类别的作用
在我们逐步剖析的过程中,不妨直接引用 GPT-3 的具体数据,来算算这 1750 亿个权重究竟是怎么来的
虽说如今有更大更强的模型,但 GPT-3 作为第一个真正从机器学习社区破圈,吸引世界目光的大语言模型仍具有其独特的魅力。此外,说实话对于更先进的模型公司往往对其具体数据保密
我提前提个醒,当你窥探像 ChatGPT 这种工具的内部机理时,几乎所有的计算过程都体现为矩阵向量乘法
在这数十亿的数字海洋中,很容易会迷失了方向,但你应该在脑海中清晰地区分。模型的权重这部分我会全部用蓝色或红色标出,而待处理的数据这部分我会全部用灰色标出
权重是模型的 大脑,是在训练过程中习得的,它们决定了模型的行为模式;而待处理的数据,则仅仅编码了某次运行模型时的输入,比如一段示例文本
5. GPT的第一层:词嵌入为向量(embedding)
有了以上这些基础,我们来对该示例文本进行第一步处理,即把输入切分成小块并将其转化为向量
之前提到过,这些小块被称为 token,可以是单词片段或标点符号,但在本章尤其是下一章中,我倾向于将其简单理解为单词,因为人类以单词来思考,这样就更便于理解示例,并解释清每一步骤
模型有一个预设的词汇库,包含所有可能的词汇,假设有 50000 个,我们将遇到的第一个矩阵称为 嵌入矩阵(Embedding Matrix)
每个词都对应一列,这些列决定了第一步中每个单词对应的向量,将其记为 W E W_E WE。就和其他矩阵一样,它的初始值随机,但将基于数据进行学习
早在 Transformer 出现之前,将单词转为向量就是机器学习中的常见做法,而对于初次接触的人可能略显奇怪,但它为接下来的一切奠定了基础,所以我们花点时间来熟悉下它
我们通常称其为 词嵌入(Embedding Word),这会让你倾向从几何角度理解这些向量,并将它们视为高维空间中的点
将三个数字视为三位空间坐标很简单,但词嵌入的维度往往高得多,GPT-3 有 12288 个维度,而接下来你将会认识到高维度的重要性
正如你能在三位空间中取一个二维切片,并将所有点投射到该切片上,为了能动画演示简单模型的词嵌入,我将采取类似方法在高维空间中取一个三维 切片,然后将词向量投射到该切片上并显示结果
这里的重点是,当模型在训练阶段调整权重以确定不同单词将如何被嵌入向量时,它们最终的嵌入向量在空间中的方向往往具有某种语义意义
就我在这里运行的简单词向量模型而言,若我搜寻所有与 tower 最接近的词向量,你会发现它们都有一种 塔 的感觉
如果你也想在家里用 python 试一试,上面就是我用来制作动画的模型,它不是一个 Transformer 但足以说明空间中的方向能够承载语义
一个非常经典的例子就是取 woman 和 man 的向量之差,将它视为空间中的一个小向量,从一个向量的尖端指向另一个尖端,这个向量差与 queen 和 king 之差非常相似
所以,假设你不知道女性君主的词,你可以用 king 一词加上 woman 减 man 的方向,然后搜寻最接近该点的词向量来找到它
至少,理论上是这样
尽管这是我正在使用的模型的一个经典例子,但 queen 的实际嵌入点比这里的要偏离一些,大概是因为在训练数据中 queen 一词不仅仅是 国王 的女性化版本
我继续探寻之后,发现家庭关系似乎更符合这一规律,这里的重点是,在训练过程中似乎模型发现用空间中的一个方向编码性别信息会更有优势
另外一个例子是如果将 Italy 的嵌入值减去 Germany 的嵌入值再加上 Hitler 的嵌入值,结果非常靠近 Mussolini 的嵌入值,就好像模型学会了将某个方向与 Italian-ness 联系起来,而某个方向则与 WWII axis leaders 相关联
也许我最喜欢的例子是,在某些模型中 Germany 减 Japan 再加 Sushi 非常接近于 Bratwurst
在玩这个找近邻游戏时,我满意的发现 cat 离 beast 和 monster 都很近
提一个很有用的数学直觉,特别是对下一章来说,就是两个向量的点积可以被看作是衡量它们对齐程度的一种方法
从代数角度,点积实际上是将所有对应分量相乘然后将它们加和,这是好事,毕竟我们很多计算都是加权和
从几何角度,向量的方向相近则点积为正,两向量垂直则点积为零,而向量指向相反则点积为负
例如,你在玩这个嵌入模型时,你猜测 cats 减去 cat 可能代表空间中的 复数 方向
为了验证这一点,我将该 复数 向量与一些单数名词计算点积,并与对应复数名词的点积进行比较,如果你试一试,你会发现与复数名词的点积结果确实总会比单数名词的点积结果要高,这表明它们在该方向上更为 对齐
更有趣的是,如果计算其与一些数词的点积如 one、two、three 等等,它们的值是递增的,就好像能够定量地衡量模型认为某个单词的 复数程度
同样,词嵌入的具体方式也是从数据中学来的,这个嵌入矩阵一列对应一个单词,是我们模型中的第一组权重
根据 GPT-3 的数据,词汇库里有 50257 个词,严格来说里面的不是单词,而是 token,每个嵌入有 12288 维,两者相乘得到权重数约 6.17 亿
将该数字记入统计表,要记得最后总权重数加起来应该是 1750 亿
6. 嵌入空间不仅代表词,还能包含上下文信息
就 Transformer 而言,嵌入空间的向量不能仅视为代表某个单词
首先,它们还编码了单词的位置信息,这一点我们稍后再谈
但更值得你关注的是,这些向量能结合上下文语境,例如,一个代表 King 的词嵌入向量可能会被网络中各个模块逐渐拉扯,最终指向一个更具体细致的方向。比如说一位居住在苏格兰的国王,他通过弑君上位,且被以莎士比亚文风描写
想想你如何理解某个词,它的词义显然会受到上下文语境影响,有时甚至来自很远的上下文,因此构建能够预测下一个单词的模型时,目标就是使其能有效结合上下文信息
要说明的是,在第一步即根据输入文本创建向量组时,每个向量都是直接从嵌入矩阵中拉出来的,所以最开始,每个向量只能编码单个单词的含义,没有上下文信息
而流经这个网络的主要目标就是使这些向量能获得比单个词更丰富更具体的含义
这种网络一次只能处理特定数量的向量称作它的 上下文长度(Context size),GPT-3 的上下文长度为 2048,因此流经网络的数据有 2048 列,每列 12288 维
上下文长度限制了 Transformer 在预测下一个词时能结合的文本量
这就是为什么有些聊天机器人如 ChatGPT 的早期版本,在进行长对话时往往会感觉健忘
7. GPT的最后一层:向量解码为词(Unembedding)
我们稍后再深入注意力机制的细节,我想先谈谈最终阶段的处理
请记住,目标输出是下一个 token 可能的概率分布,例如,如果最后一个词是 Professor,而上下文包括 Harry Potter 这样的词,紧接着前面的又是 least favorite teacher,并且容许我将 token 视为完整单词的话,那么一个训练良好的网络在理解了哈利·波特有关知识后,大概率会给 Snape 一词打高分
这涉及两个步骤,首先用一个矩阵将上下文中的最后一个向量映射到一个包含 50000 个值的列表,每个值对应词库里一个 token
然后,用一个函数将其归一化为概率分布,即 softmax 函数,我们稍后详解
不过在此之前,你可能会觉得只用最后一个嵌入来做预测有点奇怪,毕竟在最后一层中还有成千上万其他的向量都蕴含着丰富的上下文信息
这是因为,在训练过程中效率更高的方法是,利用最终层的每一个向量同时对紧随着这个向量的词进行预测,后面还有更多关于训练的细节,但现在我只想指出这一点
这个矩阵叫做 解嵌入矩阵(Unembedding matrix) 记为 W U W_U WU,和其它权重矩阵一样,它的初始值随机,但将在训练过程中学习
继续统计参数数量,解嵌入矩阵的每行对应词汇库中的一词,每列对应一个嵌入维度,
它与嵌入矩阵非常相似,只是行列对调,这就又是 6.17 亿个参数,即目前参数数超过 10 亿,虽只是总参数 1750 亿中的一小部分,但也并非微不足道
8. 带温度的Softmax函数
本章最后一个小节我想详谈下 softmax 函数
因为下一章注意力机制它还会再次出现
基本想法是若想将一串数字作为概率分布,比如所有可能下一个词的概率分布,那么每个值都必须介于 0 到 1 之间,并且总和为 1
但是对于深度学习,每一步都像是矩阵乘法,那么默认输出显然不满足要求,默认输出中经常会有负值或者远大于 1 的值,而且几乎肯定总和不会为 1
要把任意数列转化为合理概率分布,标准方法是使用 softmax,它使最大值最接近 1,而较小的数值则非常接近 0,了解这一点就够了
但如果你好奇,它的具体原理是对每一项取以 e 为底的指数函数,使得数列中全是正数,然后求和,并将每一项除以该总和,得到归一化后的数列,它的总和为 1
你会发现,如果输入中某一项显著突出,那么输出中对应项就会占绝对主导,这样从中抽样几乎只会选到最大的输入值。但它比只选取最大值要柔和,即当有值靠近最大值时概率分布中也会获得相当大的权重,并随着输入的连续变化输出也会连续变化
在某些情况下,比如 ChatGPT 利用该分布生成下一词时,可以给这个函数加入一点趣味性,给指数加个分母常量 T T T。它被称为 温度,因为它与某些热力学方程中温度的作用有些相似,其效果是当 T T T 较大时会给低值赋予更多权重,使得分布更均匀一些,而如果 T T T 较小时,那么较大的数值就会更占优势,极端情况下,将 T T T 设为零意味着所有权重都给到最大值
例如,我让 GPT-3 生成一个故事,初始文本为“很久很久以前,有一位…”,但每轮测试采用不同的温度,温度为 0 表示模型总是选择最可能的词,得到的结果就是像“金发姑娘”的老套改编
温度越高,模型就更愿意选择可能性较低的词,但风险也更大,如上图右侧所示,故事的开头更加新颖了,讲述一位来自韩国的年轻网络艺术家,但故事很快就沦为了无稽之谈
严格来讲 API 并不允许你选择大于 2 的温度,这没有数学依据,只是人为的一个限制,我猜是为了避免他们的工具产生过于荒诞的内容
所有你好奇的话,上面这个动画实际上是我提取了 GPT-3 生成的可能性最高的前 20 个 token,然后手动给指数乘以 1/5 来调整概率
再介绍一个术语,人们通常将 softmax 函数的输出称为 Probabilities,输入则称为 Logits
举例来说,输入一些文本,所有一些词嵌入都会流经网络,最后再与解嵌入矩阵相乘,机器学习专家会将原始的未归一化的输出称为预测下一个词的 Logits
9. 下期预告:深入注意力机制
本章的主要目标是为理解注意力机制奠定基础
若是你对基本概念如词嵌入、softmax 函数、点积如何衡量相似性以及深度学习的本质即计算往往是带可调参数的矩阵乘法这些都有着深入理解,那么理解注意力机制这一现代 AI 热潮的基石也应该能手到擒来
为此,请随我一同进入下一章
相关资料
- 从零构建 GPT | Andrej Karpathy
- 从概念上了解语言模型 | Vcubingx
- 理解 LLM 可能实际在做什么 | Antropic
- 与 ML 编程和 GPT 相关的练习网站
- 语言模型的历史 | Brit Cruise
- embedding 空间中的方向如何具有意义的论文
结语
这个章节主要为理解 Transformer 中的注意力机制奠定基础,主要讲解了深度学习的结构、词嵌入 Word embedding、点积以及 softmax 函数等基本概念
OK,以上就是本章的全部内容了,下个章节我们来学习注意力机制,敬请期待😄