【转载】人人都能看懂的大模型原理(三)

发布时间 2023-09-22 16:42:03作者: bonelee
 

三、 多头注意力算子和transformer

        如前文所述,我们已经发现了自监督学习特性,也发明了对应的代理任务,接下来我们需要发明一种具体的算子能够实现这种代理任务。在介绍self-attention之前,我们先介绍一下传统CNN和RNN方案是怎么来的,他们的理论依据是什么。他们的优点和短板是什么。这样大家就能由浅入深地理解self-attention算子的背后逻辑。

3.1 CNN算子和局部线性假设

        一副图像是由很多像素构成的矩阵。为了理解图像表达的语义,计算机视觉是采用机器学习方法判断图像像素是否存在某种模式。比如如果像素构成一张脸,这种像素构成就是一种模式。见图3.1,图中一幅图像是一个像素值(0-255)构成的矩阵。如果我们将像素值表示成灰度值,那么视觉上就形成一张人脸。但是对计算机来说,它看到的就是一个数值矩阵。为了让计算机理解这是一个人脸,就必须从数值矩阵中找规律。这个道理和自然语言处理是类似的,比如“我爱你”这三个字就满足某种语法,并构成了一个语义。那么为了挖掘这种模式,我们就需要计算每个像素之间的关系,这显然需要消耗大量的计算。

图3.1 像素值构成人脸(林肯)

        那有没有办法降低计算量呢。再过去几十年计算机视觉研究中,科学家一致致力于解决这个问题(事实上现实问题远比这个要复杂得多,我们忽略掉只抓重点)。科学家们发现了一个规律,“像素的局部偏移不会影响语义”,并将这个特性总结为局部线性性。如图3.2所示,局部改变人脸框的位置,人脸框之间的语义相关性改变很小,甚至可以认为在局部范围内,人脸框的语义变化和位移距离成线性关系。

图3.2 像素框的局部线性性假设

           因为这种局部线性性的存在,我们不再需要为每个像素计算一个权重了。我们可以让他们之间共享权重,因此设计一个统一的卷积核作为算子。这样一来,参数量和计算量大幅减少,让在有限计算量的情况下,对大规模像素进行模式挖掘成为可能。局部线性性是图像特有的特性,因为图像的语义原本就是由距离相近的像素共同表达出来的。所谓独木不成林,凑在一起就构成一幅画。

 

3.2 RNN算子和马尔科夫假设

        自然语言是由一个个字符按先后顺序连接在一起构成的,因此可以认为它是一个满足时间序列关系的信号。早期科学家借鉴图像的做法将卷积网络应用到这种序列信号上,发现并不管用。针对时间序列信号,我们最常用的方法是假设它满足马尔科夫性,然后设计算子进行建模。马尔科夫性假设是假设当前词汇状态只和上一个词汇相关,而与上上个词汇不相关,与上上个词汇的相关性都体现在上个单词上。

        基于这种假设,我们很容易设计算子。我们只需要将上一时刻的状态和当前时刻的输入词汇输入到网络,就可以预测下一个词汇了。科学家设计了RNN模型结构来对这种情况进行建模。如图3.3所示,x是输入,o是输出,s是模型状态。

图3.3 RNN网络结构示意图

        显然这种建模方式是有问题的,词汇之间的长距离依赖会随着传播而消失掉。他无法用来挖掘更深层次的语义,如行文风格、推理逻辑等。

3.3 self-attention理论

        既然RNN在挖掘上下文关系方面有这种缺陷,那么我们能否发明一种更加全局的相关性计算方式方法呢?

3.3.1 Self-attention

        自注意力(self-attention)是注意力理论的一种特殊形式。注意力机制是解决数据有效性的一种常用手段,他的做法是通过学习产生注意力权重,并利用权重对信号的重要程度进行筛选,从而提升数据的有效性。比如图像领域的显著性检测,就是一个很好的注意力机制的例子。目标往往出现在显著变化的地方,通过这种方法,可以大大提升准确性。

        自注意力需要自身根据信号的特点,自己判断自己的重要性。那在一组数据里面怎么样判断自己重不重要呢,一个很直接的想法是大家来投票。比如全班同学作为一组数据,某个同学重不重要,是其他人来共同投票决定。但是信息本身是没有自主判断能力的,这时候就需要计算他们的相关性作为依据了。

        根据上面的理论,我们将每个单词(我们暂时忽略token的概念),表示成三个词向量K、Q、 V;Q用来表示请求向量,K用来表示键值向量,V用来表示值向量。可以看出Self-attention算子是通过点积计算两个词向量(QK)的相关性,并利用这种相关性来表达自己(V)。并且我们还可以看到,这种相关性计算是在全局范围内实施的,即两两之间都要进行这种计算。具体示意图如3.4所示。

图3.4 self-attention计算示意图

        可以清楚的看到,这种计算方式不在依赖于上下文的结果,因为天然可以做分布式计算了。这也是self-attention成功的重要原因。

3.3.2 多头注意力

        我们知道单词具备多意性,特别是中文。中文通过汉字之间的不同组合和上下文可以表示非常多的意思。那么如果我们用单一的词向量无法表示差异化的语义呢。为了解决这个问题,很自然我们想到一个词由多组词向量表达。这就是多头注意力的由来。如图3.5所示。

图3.5 多头注意力示意图

3.3.3 序列长度的影响

        LLM有一个发展趋势,训练的一次输入的序列长度越来越长,这又是为什么呢?GPT系列从2K的序列长度发展到32K的序列长度。序列越长,意味着一次性全局计算相关性的范围越广。32K序列就相当于模型一次性能够阅读50页A4纸的资料,然后在里面找任何词汇之间的相关性。这种能力已经完全超越了人的阅读能力。

图3.6 GPT序列长度

3.4 编码器解码器是什么

        编码器(encoder)解码器(decoder)是在LLM中最常见的结构。但是什么是编码器,什么是解码器呢?为什么要设计这种结构?为了解释清楚这个问题,我们从磁带机的例子说起。将语音信号编码成模拟电信号,然后记录在磁带上,这过程叫做编码过程。播放的时候,从磁带上读取信号,然后解码成语音信号,这个过程叫做解码器。所以编码器是将原始信号变成电信号,而解码器是将点信号恢复成声音信号。通过编码器和解码器,就可以把声音信号保存下来,方便传播、加工、编辑。

        但是AIGC要做的事情可不仅仅是把原始信号保存下来,而是要将信号的语义提取出来,并对语义进行加工,最后能恢复(生成)出语言。因此大模型的编码器和解码器实际上是对信号进行语义特征提取,并恢复语言的过程。Transformer就是这个编码器-解码器结构的基本单元。如图3.7所示,左边是编码器,右边是解码器。可以看到,无论是编码器还是解码器,self-attention只是里面的一个算子。

图3.7 transformer示意图

我们总结一下,机器学习的第一性原理是从数据中计算广泛存在的模式,依赖广泛的连接和计算。在不同场景中由于信号的相关性表现不同而需要设计不同的算子。借助现代计算机技术提供的超强算力和超级通信能力,我们对数据进行暴力计算,挖掘信号内在模式。这种模式目前正在快速渗透到AI for Science里面的各种特殊性信号的模式挖掘,比如气象问题、基因突变检测问题、蛋白质和小分子空间耦合问题、合金材料里原子作用力问题。