Transformer是一种特殊的神经网络,一种机器学习模型。
谷歌在2017年推出的原版Transformer,论文《Attention Is All You Need》,专注于将一种语言的文本翻译成另一种。
而我们要关注的Transformer变种,即构建ChatGPT等工具的模型,则是输入一段文本、图像或音频,预测文本接下来的内容,并将结果展现为,接下来不同文本片段的概率分布。
你可能觉得预测下一个词与生成新文本的目标截然不同,但有了这样的预测模型后,要让它生成更长的文本,一个简单的方法是,给它一个初始片段,然后从它给出的概率分布中取一个片段,追加到文本末尾,再用所有文本包括追加的内容,进行新一轮的预测。
这个重复预测和抽样的过程,正是你与GPT或其他大语言模型,进行交互时所遇到的一个一个打印出来的词。它的展现过程,也是它的原理。
数据如何在Transformer里流动?
聊天机器人生成特定单词时,背后实际在做的事情,主要分5步。①分词 ②变id ③变向量 ④加位置编码 ⑤计算attention。
1、分词。将输入内容切分为多个小片段,每个小片段称为tokens;在文本中,token往往是单词、单词片段或其他字符组合。
对于图像或声音而言,token则可能代表小块图像或声音片段。
每个token对应一个向量,即一组数字。目的是编码该片段的含义。
如果将向量看作高维空间中的坐标,那么意思相近的词,对应的向量也相近。
这些向量随后经过attention block处理,使得向量能够相互交流。通过相互传递信息,来更新自己的值。
例如机器学习中的model和时尚中的model含义不同,attention block就是找出上下文中哪些词会改变哪些词的含义,以及这些词应该更新为何种含义。
之后,这些向量会经过另一种处理,取决于不同的资料,有的叫多层感知机(multi-layer perceptron),有的叫前馈层(feed-forward layer)。此阶段,向量不再相互交流,而是并行经历相同的处理。
对每个向量提出一系列问题,然后根据这些问题的答案来更新向量。
这里的所有处理,本质都是大量的矩阵乘法。而我们的主要目的是弄懂如何解读这些底层矩阵。
之后,基本是重复这个过程,attention blocks 和 multi-layer perceptron blocks 层层堆叠。
最后的目标是能将整段文字的所有关键含义,以某种方式融入到序列的最后一个向量,然后对这最后一个向量进行某种操作,得出所有token可能的概率分布,即各小块文本接下来出现的概率。
前面提到的,只要能够根据给定的文本,预测下一个词,你能给它喂一点初始文本,然后反复进行预测、抽样、追加,这一过程。
在GPT出现之前,GPT-3的早期演示,根据初始文本自动补全故事和文章,把这样的工具做成聊天机器人,最基础简单的方法是,准备一段文本,设定用户与AI助手互动的场景,即系统提示词(system prompt),然后将用户的初始问题或提示词作为第一段对话,让模型预测AI助手会如何回应。要做好这一步,还需要额外的训练步骤。
神经网络的开始端和结尾端是怎样的?
深度学习是机器学习中的一种方法。
机器学习采用数据驱动,反馈到模型参数,指导模型行为。
比如:输入图像,经过模型处理后,能够输出对应的描述标签。或是,给定一段文本,预测下一个单词。
机器学习的理念是,不要在代码中明确定义如何执行一个任务,而是去构建一个具有可调参数的灵活架构。机器学习最简单的形式,可能是线性回归。
这条线受2个参数影响,即斜率slope和截距intercept。y=wx+b。线性回归的目标是确定这些参数,以尽可能拟合数据。
深度学习就比较复杂了,比如GPT-3的参数不止2个,而是有1750亿个,但问题是,并不是直接扩大模型参数量就可以。发现有时数据严重过拟合,有时完全训练不出来。
深度学习描述的一类模型,在过去几十年中,这类模型展现了出色的规模化能力,它们的共同点是都使用相同的训练算法,即反向传播(Backpropagation)。要让这种训练算法,在大规模应用中有效运行,模型必须遵循某种特定的结构,对这种结构有所了解后,就能更好理解transformer对语言处理的许多选择,否则有些选择可能会显得没道理。
首先,无论你在构建何种模型,输入的格式必须为实数数组,可以是一维数列、二维数组或是更高维的数组,也就是所谓的张量。输入数据通常被逐步转换成多个不同的层,同样,每一层的结构都是实数数组,到了最后一层,就看作输出。
例如,文本处理的最后一层,是一个数列,表示接下来所有可能token的概率分布。在深度学习中,这些模型的参数被称为权重(weight)。
这些模型的关键特征是参数与待处理数据之间的唯一交互方式,就是通过加权和。虽然模型中也有一些非线性函数,但它们并不依赖于参数。通常情况下,加权和不会直接这样写出来,而是打包成矩阵向量相乘的形式。
例如,GPT-3有1750亿个weights,组成了约28000个矩阵,这些矩阵分为8类,我们需要逐一了解各个类别的作用。
虽说现在有更大更强的模型,但GPT-3作为第一个真正从机器学习破圈,爆火全球的大语言模型,仍具有其独特的魅力。对于更先进的模型,公司往往对其具体数据保密。
当你研究ChatGPT这种工具的内部原理时,几乎所有的计算过程,都体现为矩阵向量乘法。
图里模型的权重用蓝色或红色标注,待处理数据用灰色标注。
权重相当于模型的大脑,是在训练过程中学习的,决定了模型的行为模式。待处理数据,则仅编码了某次运行模型时的输入,比如一段示例文本。
有了以上这些基础,我们来对该示例文本进行第一步的处理。
即把输入切分成小块(这些小块被称为token),然后转化成向量。
模型有预设的词汇库,包含所有可能的词汇,假设有5万个,我们将遇到的第一个矩阵,被称为嵌入矩阵(embedding matrix)。每个词都对应一列,这些列决定了第一步中,每个单词对应的向量,将其记为。跟其他矩阵一样,它的初始值随机,但将根据数据进行学习。
在transformer出现之前,将单词转化为向量就是机器学习的常见做法,但对于初次接触的人,可能略显奇怪。但它为接下来的一切,奠定了基础,所以我们花点时间来熟悉一下。
我们通常称其为词嵌入(embedding a word),从几何角度来理解这些向量,将它们视为高维空间中的点。
将3个数字视为三维空间坐标很简单,但词嵌入的维度往往高的多。GPT-3有12288个维度。
在三维空间中,取一个二维切片,并将所有点投射到该切片上。
当模型在训练阶段调整权重,以确定不同单词将如何被嵌入向量时,它们最终的嵌入向量,在空间中方向,往往具有某种语义意义。
嵌入矩阵,一列对应一个单词,是我们模型中的第一组权重,根据GPT-3的数据,词汇库里有50257个词,即50257个token,每个嵌入有12288维,两者相乘,得到权重数约为6.17亿。将该数字记入统计表,要记得最后,总权重数加起来应该是1750亿。
就transformer而言,嵌入空间的向量,不能仅视为代表单个单词,它们还编码了单词的位置信息。值得关注的是,这些向量能结合上下文语境。例如,一个词嵌入向量国王(King),可能会被网络中各个模块逐渐拉扯,最终指向一个更具体细致的方向。比如说居住在苏格兰(lived in Scotland),它通过弑君上位(murdered predecessor),且用莎士比亚文风描述(in Shakespearean language)。
思考一下,你如何理解某个词。它的词义显然会受到上下文语境的影响。有时甚至来自很远的上下文,因此,构建能够预测下一个单词的模型时,目标就是使其能有效结合上下文信息。
在第一步,即根据输入文本创建向量数组时,每个向量都是直接从嵌入矩阵中拉出来的。所以最开始,每个向量只能编码单个单词的含义。
没有上下文信息,而流经这个网络的主要目标是使这些向量能获得 比单个词更丰富更具体的含义。这种网络一次只能处理特定数量的向量,称作它的上下文长度(context size)。
GPT-3的上下文长度为2048,因此流经网络的数据有2048列,每列12000维。上下文长度限制了transformer在预测下一个词时能结合的文本量。这就是为什么有些聊天机器人,如chatgpt早期版本,在进行长对话时,时常会感觉健忘。
请注意,目标输出是下一个可能token的概率分布。例如,如果最后一个词是Professor,而上下文包含Harry Potter这样的词,紧接着前面的又是least favourite teacher,如果将token视为完整单词的话,那么一个训练良好的网络,在叠加了Harry Potter有关知识后,大概率会给Snape一词打高分。
这包含两个步骤,首先,用另一个矩阵将上下文中的最后一个向量,映射到一个包含50000个值的列表,每个值对应词库里的一个token,然后用Softmax函数将其归一化为概率分布。
你可能会疑问,只用最后一个嵌入来做预测,有点奇怪。毕竟在最后一层中,还有成千上万其他的向量,都蕴含着丰富的上下文信息。这是因为在训练过程中,效率更高的方法是,利用最终层的每一个向量,同时对紧随着这个向量的词进行预测,后面再单独详述更多关于训练的细节。
若想将一串数字作为概率分布,比如所有可能下一个词的概率分布,那么每个值都必须介于0到1,并且总和为1。但对于深度学习,每一步都像是矩阵向量乘法,那么默认输出完全不满足要求,经常会有负值,或远大于1,而且几乎肯定总和不会为1。
要把任意数列转换为合理概率分布,标准方法是使用softmax,它使最大值最接近1,而最小值接近0。softmax是对每一项取以e为底的指数函数,使得数列中全是正数,然后求和。并将每一项除以该总和。得到归一化后的数列,它的总和为1.
如果输入中某一项显著突出,那么输出中,对应项就会占绝对主导,这样从中抽样,也只会选到最大的输入值,但它比只选取最大值要柔和,即当有值靠近最大值时,概率分布中也会获得相当大的权重,随着输入的连续变化,输出也连续变化。
在某些情况下,如ChatGPT利用该分布生成下一词时,可以给这个函数加入一点趣味性,给指数加个分母,常量T,它被称为温度,因为它与某些热力学方程中温度的作用有些相似,其效果是,当T较大时,会给低值赋予更多权重,使得分布更均匀一些。当T很小时,则较大的数值更占优势。极端情况下,将T设为0,意味着所有权重都给到最大值。
例如,让GPT-3生成一个故事,初始文本为:“one upon a time there was a ",每轮测试采用不同的温度,温度为0表示模型总是选择最可能的词。得到的结果有点像金发姑娘的老套改编。温度越高,模型就越可能选择可能性较低的词,但风险也更大。
严格来说,API不允许你选择大于2的温度,这没有数学依据,只是人为的限制,可能是为了避免工具产生过于荒诞离谱的内容。
大家通常将Softmax函数的输出作为概率,输入则称为logits。