目录
一、前言
当构建作为ChatGPT的主力Transformer架构时,我们先从一些基本定义开始。
二、机器学习
机器学习是人工智能的一个分支。人工智能的研究历史有着一条从以“推理”为重点,到以“知识”为重点,再到以“学习”为重点的自然、清晰的脉络。
是实现人工智能的一个途径之一,即以机器学习为手段,解决人工智能中的部分问题。机器学习在近30多年已发展为一门多领域科际集成,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。
机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法(要防止错误累积)。很多推论问题属于非程序化決策,所以部分的机器学习研究是开发容易处理的近似算法。
机器学习可以分成下面几种类别:
监督学习从给定的训练数据集中学习出一个函数,当新的数据到来时,可以根据这个函数预测结果。监督学习的训练集要求是包括输入和输出,也可以说是特征和目标。训练集中的目标是由人标注的。常见的监督学习算法包括回归分析和统计分类。
监督学习和非监督学习的差别就是训练集目标是否有人为标注。他们都有训练集 且都有输入和输出
无监督学习与监督学习相比,训练集没有人为标注的结果。常见的无监督学习算法有生成对抗网络(GAN)、聚类。
半监督学习介于监督学习与无监督学习之间。
增强学习机器为了达成目标,随着环境的变动,而逐步调整其行为,并评估每一个行动之后所到的回馈是正向的或负向的。
而一般来说,机器学习是选择正确类型的函数,然后找到最适合训练数据的该类型函数的参数值的过程。
比如考虑一个函数 ,它接受输入向量
并输出向量
,计算时候一般是我们有了函数
和输入
而计算
,
,给定
计算出
。
在机器学习中,反转这种范式,如果我们给您输入对,
,
等,会猜测
是
。而
和
之间的关系大多数时候不是这么简单。比如在一维中,通过线性回归
,拟合一条靠近这些点的直线。还可以拟合二次函数
。现在需要调整三个参数以使函数适合数据。还可以用两个参数
和
拟合指数曲线
。可以有许多不同的函数系列可供选择,每个系列都有自己的一组参数,可以选择这些参数来最适合数据。
三、神经网络和参数
人工神经网络(英语:artificial neural network,ANNs)简称神经网络(neural network,NNs)或类神经网络,在机器学习和认知科学领域,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统,通俗地讲就是具备学习功能。现代神经网络是一种非线性统计性数据建模工具,神经网络通常是通过一个基于数学统计学类型的学习方法(learning method)得以优化,所以也是数学统计学方法的一种实际应用,通过统计学的标准数学方法我们能够得到大量的可以用函数来表达的局部结构空间,另一方面在人工智能学的人工感知领域,我们通过数学统计学的应用可以来做人工感知方面的决定问题(也就是说通过统计学的方法,人工神经网络能够类似人一样具有简单的决定能力和简单的判断能力),这种方法比起正式的逻辑学推理演算更具有优势。
一般我们大脑中的一个神经元与大约一万个其他神经元相连。神经元通过电脉冲进行交流。神经元之间的连接强度决定了脉冲从一个神经元传递到另一个神经元的强度。当我们学习或忘记事物时,这些联系的强度就会发生变化。当到达神经元的所有脉冲的总强度超过阈值时,该神经元就会放电并向下游神经元发送电脉冲。
在人工神经网络中,人工神经元与其他人工神经元相连,一对神经元之间的连接强度是在训练过程中设置的可编程参数。神经元通常是分层组织的。第一层称为输入层,最后一层称为输出层。不同层以特定方式连接,该方式由作者选择的网络架构决定。网络的可编程连接越多,它可以学习或记住的东西大致就越多。大量的可编程参数或连接也意味着需要更多的训练数据来训练有意义的东西,并且需要更多的计算来训练网络或使用。
四、卷积神经网络(CNN)
是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。
卷积神经网络由一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网络,卷积神经网络需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。
卷积层
卷积层可以产生一组平行的特征图(feature map),它通过在输入图像上滑动不同的卷积核并执行一定的运算而组成。此外,在每一个滑动的位置上,卷积核与输入图像之间会执行一个元素对应乘积并求和的运算以将感受野内的信息投影到特征图中的一个元素。这一滑动的过程可称为步幅 ,步幅
是控制输出特征图尺寸的一个因素。卷积核的尺寸要比输入图像小得多,且重叠或平行地作用于输入图像中,一张特征图中的所有元素都是通过一个卷积核计算得出的,也即一张特征图共享了相同的权重和偏置项。
线性整流层
线性整流层(Rectified Linear Units layer, ReLU layer)使用线性整流(Rectified Linear Units, ReLU)作为这一层神经的激励函数(Activation function)。它可以增强判定函数和整个神经网络的非线性特性,而本身并不会改变卷积层。
如双曲正切函数,或者Sigmoid函数的一些函数也可以用于增强网络的非线性特性。
相比其它函数来说,ReLU函数更受青睐,这是因为它可以将神经网络的训练速度提升数倍,而并不会对模型的泛化准确度造成显著影响。
池化层
池化(Pooling)是卷积神经网络中另一个重要的概念,它实际上是一种非线性形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。
直觉上,这种机制能够有效地原因在于,一个特征的精确位置远不及它相对于其他特征的粗略位置重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的网络结构中的卷积层之间都会周期性地插入池化层。池化操作提供了另一种形式的平移不变性。因为卷积核是一种特征发现器,我们通过卷积层可以很容易地发现图像中的各种边缘。但是卷积层发现的特征往往过于精确,我们即使高速连拍拍摄一个物体,照片中的物体的边缘像素位置也不大可能完全一致,通过池化层我们可以降低卷积层对边缘的敏感性。
池化层每次在一个池化窗口(depth slice)上计算输出,然后根据步幅移动池化窗口。下图是目前最常用的池化层,步幅为2,池化窗口为的二维最大池化层。每隔2个元素从图像划分出的区块,然后对每个区块中的4个数取最大值。这将会减少75%的数据量。
除了最大池化之外,池化层也可以使用其他池化函数,例如“平均池化”甚至“L2-范数池化”等。过去,平均池化的使用曾经较为广泛,但是最近由于最大池化在实践中的表现更好,平均池化已经不太常用。
由于池化层过快地减少了数据的大小,目前文献中的趋势是使用较小的池化滤镜,甚至不再使用池化层。
RoI池化(Region of Interest)是最大池化的变体,其中输出大小是固定的,输入矩形是一个参数。
池化层是基于 Fast-RCNN 架构的卷积神经网络的一个重要组成部分
完全连接层
最后,在经过几个卷积和最大池化层之后,神经网络中的高级推理通过完全连接层来完成。就和常规的非卷积人工神经网络中一样,完全连接层中的神经元与前一层中的所有激活都有联系。因此,它们的激活可以作为仿射变换来计算,也就是先乘以一个矩阵然后加上一个偏差(bias)偏移量(向量加上一个固定的或者学习来的偏差量)。
五、循环神经网络(RNN)
是神经网络的一种。单纯的RNN因为无法处理随着递归,权重指数级爆炸或梯度消失问题,难以捕捉长期时间关联;而结合不同的LSTM可以很好解决这个问题。
时间循环神经网络可以描述动态时间行为,因为和前馈神经网络(feedforward neural network)接受较特定结构的输入不同,RNN将状态在自身网络中循环传递,因此可以接受更广泛的时间序列结构输入。
编码器:
编码器将输入序列 编码为一个固定长度的隐藏状态
。
输入序列 可以是一系列编码为数字的词语,例如整个句子。
隐藏状态 随时间更新。当新的词语输入到方程中,之前的状态
转换为和当前输入
相关的
。这表现出时间相关性。
非线性方程 可以是简单的 Logistic 方程(
),也可以是复杂的 LSTM 单元(长短时记忆)。
有了隐藏状态序列,就可以对下一个出现的词语进行预测。
解码器:
解码器将编码后的信息解码为人类可识别的信息。
隐藏状态 是解码器的参数,需要继续迭代。
非线性模型 是作为输出的循环神经网络。
最终目标是最大化条件概率 P(y∣x),得到最佳翻译结果。
双向读取:
使用两个循环神经网络从两个方向读取一个序列,以获得更好的“注意力”。
将两个隐藏状态 拼接在一起,创造更多短期依赖关系,提高模型表现。
六、长短期记忆 (LSTM) 网络
是一种时间循环神经网络,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。LSTM的表现通常比时间循环神经网络及隐马尔科夫模型(HMM)更好,比如用在不分段连续手写识别上。
LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为它可以记忆不定时间长度的数值,区块中有一个gate能够决定input是否重要到能被记住及能不能被输出output。
图底是四个函数单元,最左边函数依情况可能成为区块的
,右边三个会经过
决定
是否能传入区块,左边第二个为input gate,如果这里产出近似于零,将把这里的值挡住,不会进到下一层。左边第三个是forget gate,当这产生值近似于零,将把区块里记住的值忘掉。第四个也就是最右边的input为output gate,他可以决定在区块记忆中的input是否能输出 。
七、Attention
注意力机制(英语:attention)是人工神经网络中一种模仿认知注意力的技术。这种机制可以增强神经网络输入数据中某些部分的权重,同时减弱其他部分的权重,以此将网络的关注点聚焦于数据中最重要的一小部分。数据中哪些部分比其他部分更重要取决于上下文。可以通过梯度下降法对注意力机制进行训练。
类似于注意力机制的架构最早于1990年代提出,当时提出的名称包括乘法模块(multiplicative module)、sigma pi单元、超网络(hypernetwork)等。注意力机制的灵活性来自于它的“软权重”特性,即这种权重是可以在运行时改变的,而非像通常的权重一样必须在运行时保持固定。注意力机制的用途包括神经图灵机中的记忆功能、可微分神经计算机中的推理任务、Transformer模型中的语言处理、Perceiver(感知器)模型中的多模态数据处理(声音、图像、视频和文本)。
要将法语句子 je suis étudiant 翻译为“我是一名学生”。je 一词对应于 I,étudiant 一词对应于学生。Suis 有点映射到 am 和 a。因此,如果你想看看在生成相应单词时要注意哪个单词,下面的矩阵将会非常有帮助。
下面的你会注意到,某些单词需要来自多个单词的信息,并且它肯定不是一对一的映射。如果单词稍微改变,注意力矩阵也会改变。例如,在“The lamp was not be met into the bag because it was too big”这句话中,“it”一词指的是灯。在这句话中。“it”这个词指的是手提箱。因此,获得这些注意力矩阵的唯一方法就是从数据中学习。
这里需要注意的一件事是,当我们谈论 RNN 和 LSTM 时,我们谈论的是可以通过这些网络产生最终向量的任意长度序列。然而,由于两个原因,这种方法被放弃了。首先,除非输入和输出长度受到某种限制,否则无法计算注意力矩阵。其次是梯度消失的问题。
大多数现代神经网络通过传播误差来学习,或者传播训练标签所说的输出应该与当前网络预测之间的差异。这意味着从给定节点到输出节点的路径中的每个节点将每个输出相对于输入的偏导数相乘。随着路径长度的增加,偏导数的乘积变得太大或太小的可能性越来越大。太大意味着训练过程会不稳定,太小意味着训练进展不够,无法取得良好的结果。两者都不好。
对于 RNN 和 LSTM 来说,学习相距较远的单词之间的关联非常困难。这导致了一种架构,其中所有中间隐藏状态都通过注意力过程从编码器传递到解码器。这再次要求网络仅限于固定长度的序列。
八、Transformer
Transformer模型是一种采用自注意力机制的深度学习模型,这一机制可以按输入数据各部分重要性的不同而分配不同的权重。与循环神经网络(RNN)一样,Transformer模型旨在处理自然语言等顺序输入数据,可应用于翻译、文本摘要等任务。而与RNN不同的是,Transformer模型能够一次性处理所有输入数据。注意力机制可以为输入序列中的任意位置提供上下文。如果输入数据是自然语言,则Transformer不必像RNN一样一次只处理一个单词,这种架构允许更多的并行计算,并以此减少训练时间。
Transformer模型于2017年由谷歌大脑的一个团队推出,现已逐步取代长短期记忆(LSTM)等RNN模型成为了NLP问题的首选模型。并行化优势允许其在更大的数据集上进行训练。这也促成了BERT、GPT等预训练模型的发展。这些系统使用了维基百科、Common Crawl等大型语料库进行训练,并可以针对特定任务进行微调。
顺序处理
门控RNN模型按顺序处理每一个标记(token)并维护一个状态向量,其中包含所有已输入数据的表示。如要处理第n个标记,模型将表示句中到第n−1个标记为止的状态向量与最新的第n个标记的信息结合在一起创建一个新的n向量,以此表示句中到第个标记为止的状态。从理论上讲,如果状态向量不断继续编码每个标记的上下文信息,则来自一个标记的信息可以在序列中不断传播下去。但在实践中,这一机制是有缺陷的:梯度消失问题使得长句末尾的模型状态会缺少前面标记的精确信息。此外,每个标记的计算都依赖于先前标记的计算结果,这也使得其很难在现代深度学习硬件上进行并行处理,这导致了RNN模型训练效率低下。
自注意力机制
注意力机制解决了上述这些问题。这一机制让模型得以提取序列中任意先前点的状态信息。注意力层能够访问所有先前的状态并根据学习到的相关性度量对其进行加权,从而提供相距很远的标记的相关信息。
翻译是一个能够突显注意力机制优势的例子,其中上下文对于句子中单词的含义至关重要。例如在一个将英语翻译为法语的系统中,法语输出的第一个词很可能取决于英语输入的前几个词。然而在经典的LSTM模型中,为了产生法语输出的第一个单词,模型需要访问处理完最后一个英语单词后得到的状态向量。理论上这个向量包含了整个英语句子的信息,从而为模型提供所有必要的知识。然而在实践中,LSTM通常无法很好地保存这些信息。可以通过添加注意力机制来解决这个问题:解码器可以访问每个英语输入单词的状态向量,而不仅仅是最后一个单词。同时模型可以学习注意力权重,这些权重决定了对每个英语输入状态向量的关注程度。
在RNN模型中添加注意力机制能提高模型的性能。而Transformer架构的发展表明,注意力机制本身就足够强大,并且不需要像RNN模型一样再对数据进行顺序循环处理。Transformer模型采用了没有RNN模型的注意力机制,它能够同时处理所有标记并计算它们之间的注意力权重。由于注意力机制仅使用来自之前层中其他标记的信息,因此可以并行计算所有标记以提高训练速度。
输入
输入文本使用字节对编码以进行标记化,每个标记通过词嵌入转换为向量。然后,将标记的位置信息添加到嵌入向量中。
编码器-解码器架构
与早期的seq2seq模型一样,原始的Transformer模型使用编码器-解码器(encoder–decoder)架构。编码器由逐层迭代处理输入的编码层组成,而解码器则由对编码器的输出执行相同操作的解码层组成。
每个编码层的功能是确定输入数据的哪些部分彼此相关。它将其编码作为输入再传递给下一个编码层。每个解码层的功能则相反,读取被编码的信息并使用集成好的上下文信息来生成输出序列。为了实现这一点,每个编码层和解码层都使用了注意力机制。
对于每个输入,注意力会权衡每个其他输入的相关性,并从中提取信息以产生输出。每个解码层都包含一个额外的注意力机制,它会在从编码层提取信息之前先从之前解码器的输出中提取信息。
编码层和解码层都有一个前馈神经网络用于对输出进行额外处理,并包含残差连接和层归一化步骤。
缩放点积注意力
Transformer模型的基本构建单元是缩放点积注意力(scaled dot-product attention)单元。当一个句子被传递到一个Transformer模型中时,可以同时计算所有标记互相之间的注意力权重。注意力单元为上下文中的每个标记生成嵌入,其中包含有关标记本身的信息以及由注意力权重加权得到的其他相关标记的信息。
对于每个注意力单元,Transformer模型学习三个权重矩阵,分别为查询(query)权重,键(key)权重
以及值(value)权重
。对于每个标记
,输入词嵌入
分别与三个权重矩阵相乘以得到查询向量
、键向量
与值向量
。再使用查询向量和键向量计算注意力权重,即计算
和
的点积以得到从标记
到标记
的注意力权重
。之后再将注意力权重除以向量维度的平方根
以在训练期间j梯度,并通过softmax函数对权重进行归一化。
与
的不同意味着注意力是非对称的:如果标记i不同意味着注意力是非对称的:如果标记
很关注标记
(即
很大)并不一定意味着标记
也反过来关注标记
(即
可能很小)。对每一个标记i而言,注意力单元的输出是以
(标记
到每一个标记的注意力)加权所有标记的值向量得到的加权和。
对所有标记的注意力计算可以表示为使用softmax函数的一个大型矩阵计算,由于可以对矩阵运算速度进行优化,这十分利于训练速度的提升。矩阵、
和
可分别定义为第
行是向量
、
和
的矩阵。
多头注意力
一组()矩阵称为一个注意力头(attention head),Transformer模型中每一层都包含多个注意力头。每个注意力头都表示不同标记相互之间的注意力,而多个注意力头则可以针对不同的“相关性”计算不同的注意力权重。许多注意力头编码的相关性信息是人类可以理解的,例如某个注意力头可能主要关注下一个单词,而另一个注意力头则可能主要关注动词与其直接宾语之间的关系。每个注意力头的计算可以并行执行,这使得处理速度得以加快。注意力层的输出被连接起来传递到前馈神经网络层。
编码器
每个编码器由一个自注意力机制和一个前馈神经网络两个主要部分组成。自注意力机制接受来自前一个编码器的输入编码,并计算它们之间相关性的权重以生成输出编码。前馈神经网络则进一步单独处理每个输出编码。然后将这些输出编码作为输入传递给下一个编码器以及解码器。
第一个编码器将输入序列的位置信息和嵌入作为其输入。位置信息向Transformer模型提供了序列的顺序信息,这是模型中唯一利用这一信息的部分。
编码器是双向的,这意味着当前标记的注意力可以放在之前或之后的标记上。
解码器
每个解码器由一个自注意力机制、一个针对编码器的注意力机制和一个前馈神经网络三个主要部分组成。解码器的功能与编码器类似,但插入了一个额外的注意力机制,它从编码器生成的编码中提取相关信息。这种机制也可以称为编码器-解码器注意力(encoder-decoder attention)。
与第一个编码器一样,第一个解码器也将输出序列的位置信息和嵌入作为其输入。因为模型不能使用当前或未来的输出来预测输出,因此必须对输出序列进行部分屏蔽以防止这种反向信息流。这使得自回归文本生成成为可能。最后一个解码器之后是最终的线性变换和softmax层以产生所有词汇的输出概率。
GPT是一种仅具有解码器的架构。
替代架构
训练基于Transformer模型的架构可能很昂贵,尤其是对于长输入而言。替代架构包括Reformer模型、ETC/BigBird模型等,前者可以将计算复杂度从 减少到
,
后者则可以减少到O(N),其中N表示序列长度。其实现得益于局部敏感哈希与可逆层。
原始的Transformer模型需要与上下文窗口大小成二次方的内存大小。无注意力Transformer模型(Attention Free Transformer)则将对内存的需求减少为线性依赖,同时通过连接链与值保留了Transformer模型的优势。
如果想了解更多信息插图转换器。
可见Transformer 的作者为了注意力的目的而减小向量的大小,但同时具有多个并行的注意力机制。这使得神经网络能够多次捕捉不同类型的上下文。此外,让自注意力层重复多次可以让网络将更大的短语中的上下文结合起来。例如,在“这是 Apple 1984 年广告的仿制品”这句话中。首先,需要消除“Apple”一词的歧义,在广告中,1984 肯定是公司而不是水果。然后你就有了上下文来理解 1984 年意味着什么。然后你将“它”所指的内容置于上下文中。我在这里进行推测,但我的猜测是,当你需要一个接一个地执行一系列推理时,多层自注意力变得非常有用。
除了自注意力之外,Transformers 还引入了位置编码的思想,使网络结构与序列中单词的相对位置无关。然后将位置信息以三角函数的形式添加回作为输入。这是一个非常有趣的选择,似乎也有助于提高网络的效率。
生成式预训练 Transformer (GPT) 与 BERT
生成式预训练 Transformer 是由 OpenAI 训练用于语言建模任务的一系列 Transformer 模型。第一个GPT模型早于 BERT 模型。BERT 依赖于巧妙的训练目标,而 OpenAI 则致力于训练模型来预测下一个单词(语言建模)。第一个 GPT 模型有 1.17 亿个参数,并且大大提高了许多任务的最先进数字。但直到拥有 15 亿个参数的 GPT-2 才开始引起公众的关注。
GPT 背后的最初想法是针对大量文本的语言建模任务预训练网络,然后针对各种语言任务微调网络。通过这种方式,可以在无监督的情况下对模型进行训练,无需任何人工生成的标记数据,但仍然可以利用针对特定任务的较小标记数据的监督训练。因此,术语“预训练”。然而,更令人惊讶的是,语言建模任务本身成为了一个极其强大的工具。你可以简单地与模型交谈并要求它执行一项任务,它会给出一个有点智能的答案,让你大吃一惊。
该网络仅被训练来预测给定输入文本的下一个单词,但根据您提供的文本,该模型显示出智能的迹象,这在几年前还是不可想象的。因此,我们开始将输入文本称为提示。