目录

写在前面

一、Transformer要解决的问题

1.长距离依赖问题

2.序列处理瓶颈

二、整体结构

三、自注意力机制

1.Scaled Dot-Product Attention

2.Multi-Head Attention

四、Position-wise Feed-Forward Networks(FFN)

五、位置编码

六、总结


写在前面

        Transformer有多牛逼不用多说,时隔7年我们再来看看论文原文,看看这篇深刻改变世界的文章都说了什么。当然逐字逐句解读已经意义不大,我们只列考点。

        Transformer是文章"Attention is All You Need"中提出的一种新的神经网络架构,最初用在机器翻译,该论文由当时谷歌的Vaswani 等7人(截止2024年的今日,7人已经全部离职)于 2017 年在 NeurIPS 2017 上发表的。

        Transformer分两半。encoder延伸出判别模型BERT(Bidirectional Encoder Representations from Transformers),作者谷歌,主攻文本分类、NER、摘要等判别工作;另一半decoder延伸出生成模型GPT(Generative Pre-trained Transformer),由OpenAI开发,GPT从1演变到3,进而到现在的ChatGPT,已经家喻户晓。

        现在的LLM基础架构GPT,当然此外还有最近很火的mamba和昙花一现的rwkv,但都还没有形成气候。在可见的未来,GPT仍然会统治LLM相当长的时间。

一、Transformer要解决的问题

1.长距离依赖问题

        传统序列模型的循环结构造成了“遗忘”的发生,简单地说,越靠后的token权重越大。为了解决这个问题,Attention机制诞生了。它在每个解码步中计算注意力分数并聚合输入序列的相关信息,attention机制可以减轻RNN的长期依赖问题。

        Attention机制并不是Transformer发明的,比如Seq2Seq就就可以使用Attention机制。

图1

        在传统Seq2Seq结构中,encoder把所有的输入序列都编码成一个统一的语义向量Context,然后再由Decoder解码。

        由于context包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个Context可能存不下那么多信息,“遗忘”就发生了,造成精度的下降。

        使用了Attention机制后,“遗忘”的问题得到了缓解,但只是缓解,不是解决。因为循环的结构,模型不可能平等的看待序列中每一个token。而且注意力主要用于解码阶段,即每个解码步时,根据注意力分数计算hidden states,编码时还是RNN结构,因此这种注意力机制并不彻底。

2.序列处理瓶颈

        无论怎么修改,传统的序列模型都是基于循环的(RNN、LSTM、seq2seq等),这种循环形式可以将token的位置与时间进行对齐,天然的带有位置信息,但是不能并行,在处理较长的序列时变得很慢,处理速冻成为模型的瓶颈。

        为了解决上述两个问题,Transformer做了如下工作。

二、整体结构

        结构图再熟悉不过:

图2

1.模型不使用循环结构,输入Inputs是整个的token序列,输出也是直接的结果。模型可以并行,解决了序列处理瓶颈的问题。

2.Transformer使用了编解码结构,encoder将输入的token序列(x1,...,xn)映射到一个连续表示的序列z,decoder根据z输出结果序列(y1,...,ym)。

3.encoder和decoder全都使用attention机制,堆叠Self-attention和全连接层,它们分别由6个结构相同的层组成;

4.encoder每个层有两个子层,第一层是一个多头自注意机制,第二层是一个全连接。两个子层使用残差连接,然后进行层归一化。也就是说,每个子层的输出是LayerNorm(x +子层(x)),其中子层(x)是由子层本身实现的函数。为了方便这些剩余的连接,模型中的所有子层以及嵌入层都会产生尺寸数据模型= 512的输出。

5.decoder每个层有三个子层,前两个和encoder结构非常相似。第三个子层对encoder的输出执行多头注意。与编码器类似,我们在每个子层周围使用剩余连接,然后进行层归一化。第三层的自注意子层使用掩码,以防止位置关注后续的位置,确保了对位置i的预测只能依赖于小于i的位置的已知输出。

三、自注意力机制

        为了解决传统Attention机制的不足(不能并行和“遗忘”),Transformer发明了Self-Attention机制。Self-Attention是并行的,而且能够在一个步骤中计算整个输入序列中任意两个位置之间的依赖关系,通过直接捕捉全局依赖关系(不依赖逐步传播),同时在encoder中也使用了注意力机制,提高了捕捉长距离依赖的能力。有效的解决了上述两个问题。

1.Scaled Dot-Product Attention

        输入经过三个全连接分别得到QKV,然后计算具有所有K和Q的点积,将每个键除以\sqrt{d_k},并用一个softmax函数来获得这些值的权重,得到的就是注意力分数。再讲注意力分数施加到值向量(V),得到注意力的输出,公式如下:

Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V

        对于维度较大的大值,点积的结果会越来越大,将softmax函数推到具有极小梯度的区域。为了抵消这种效应,作者除以\sqrt{d_k}来缩放点积。关于Scaled Dot-Product Attention的更多信息,请看这里

2.Multi-Head Attention

        多头注意可以让模型同时关注来自不同位置的不同表示子空间的信息。从而提高模型的表达能力、增加鲁棒性。

        类比多层卷积更好理解,多层卷积网络中,每个卷积层提取不用的特征。多头就相当于多个卷积层,每个头相当于每个卷积层。示意图如下,可以看到多头的数量h,默认64:

       

四、Position-wise Feed-Forward Networks(FFN)

        encoder和decoder的每个层都包含FFN,通常由两个线性变换和一个激活函数(如ReLU)组成。公式如下:

FFN(x)=max(0,xW_1+b_1)W_2+b_2

        FNN可以独立处理每个位置的特征:因为它是逐位置(position-wise)应用的,相当于每个token都会有对应的一套FFN(默认64个),它在序列中的每个位置独立地应用同一个全连接网络。这意味着FFN不会在不同位置之间引入交互,这种独立处理方式有助于模型保持位置之间的独立性,同时增强每个位置上的特征表示。

        增强表示能力:FFN通过非线性变换来增强模型的表示能力。每个位置上的表示都会经过一系列非线性函数的变换,从而提升模型在该位置上的特征表达能力。

        引入非线性特征变换:由于FFN包含激活函数(如ReLU),它引入了非线性变换。这种非线性变换有助于模型学习更复杂的模式和特征,而不仅仅是线性变换所能捕捉到的简单模式。

五、位置编码

        由于Transformer不是循环结构的,为了使模型具有序列的特性,必须注入关于序列中token的相对或绝对位置的信息。为此,我们在encoder和decoder的底部向输入嵌入中添加“位置编码”。公式如下:
PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}})
PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}})
        其中pos是位置,i是维度。也就是说,位置编码的每个维度都对应于一个正弦曲线。波长形成了一个从2π到10000·2π的几何级数。根据题的介绍请看 这里

六、总结

        Transformer不是循环结构,是端到端的。

        Transformer是encoder和decoder结构的。

        重点是Transformer使用了Self-Attention机制。

        Self-Attention机制是并行的,同时在encoder中也使用了注意力机制,提高了捕捉长距离依赖的能力。

        Self-Attention的核心是点积注意力(Scaled Dot-Product Attention);并且使用Multi-Head增加了模型的表示能力。

        使用了基于三角函数的位置编码。

        Transformer这篇论文就简单介绍到这里,关注不迷路(*^▽^*)

         还在为找工作烦恼吗,用这个宝藏小程序,拿Offer快人一步!Offer入口》》》 ​​​​​​​

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐