Transformer 介绍
约 2625 字大约 9 分钟
2025-02-22
时间:2017年
关键技术:自注意力机制与多头注意力机制的完美融合
处理数据:针对长序列数据展现卓越处理能力
应用场景:广泛应用于自然语言处理、机器翻译、文本生成等诸多领域
Transformer,作为一种基于自注意力机制的神经网络模型,凭借其独特的架构和机制,成为了深度学习领域的璀璨明星。其精妙之处在于由多个编码器和解码器共同构建的基本结构,编码器负责将输入的序列精妙地转换为向量表示,而解码器则负责将这一向量表示巧妙地还原为输出序列。
Transformer的创新之处在于引入了自注意力机制,这一机制赋予了模型捕捉序列中长距离依赖关系的非凡能力。它不再局限于传统的局部信息处理,而是能够洞察全局,把握整体,从而在处理长序列数据时表现出色。
在自然语言处理领域,Transformer以其卓越的性能赢得了广泛的赞誉和应用。无论是机器翻译中的精确翻译,还是文本生成中的流畅表达,Transformer都展现出了令人瞩目的成果。它的出现,无疑为自然语言处理领域的发展注入了新的活力。
从2017年Google Brain团队推出Transformer架构逐步取代长短期记忆(LSTM)等“循环神经网络(RNN)模型”成为首选模型,到后来首个线性时间序列架构Mamba推出又对Transformer架构构成挑战,大语言模型底层架构的迭代正在迅速改变人们对于AI的认知和理解。
Transformer架构是一种用于序列建模的深度学习架构,最初由Vaswani等人在2017年提出,并广泛应用于自然语言处理(NLP)任务中。它引入了自注意力机制(self-attention)来捕捉输入序列中元素之间的依赖关系,并在大规模数据集上取得了显著的性能提升。以下是Transformer架构的主要组成部分:
自注意力机制(Self-Attention):自注意力机制是Transformer的核心组件之一。它允许模型在输入序列中的每个位置上根据其他位置的信息进行加权聚合。通过计算每个位置与其他位置之间的相对重要性,模型可以更好地理解序列中不同元素之间的依赖关系。
编码器(Encoder):编码器是Transformer的基本模块,用于将输入序列转换为上下文感知的表示。编码器由多个相同的层堆叠而成,每个层都包含自注意力机制和前馈神经网络(Feed-Forward Network)。自注意力机制用于捕捉输入序列内部的依赖关系,而前馈神经网络则提供非线性变换和特征映射。
解码器(Decoder):解码器也是由多个相同的层堆叠而成,与编码器类似,但还包括额外的自注意力机制层,用于对编码器的输出进行进一步的上下文感知。解码器常用于生成目标序列,如机器翻译任务中将源语言句子翻译成目标语言句子。
位置编码(Positional Encoding):由于Transformer中没有使用递归或卷积操作,模型需要一种方式来处理输入序列中的位置信息。位置编码是一种将位置信息嵌入到输入序列中的方法,使模型能够区分不同位置的元素。通常使用正弦和余弦函数生成位置编码。
多头注意力机制(Multi-Head Attention):为了增强模型的表达能力和建模能力,Transformer中的自注意力机制被扩展为多个并行的注意力头。每个注意力头可以关注序列中不同的相关性和特征,然后将它们的输出进行拼接或加权平均。
Transformer架构的突出特点是其并行性和全局视野能力,允许模型在处理长序列任务时保持高效。它在许多NLP任务中取得了巨大成功,如机器翻译、文本生成、问答系统等。同时,Transformer的思想也被广泛应用于其他领域,如计算机视觉和语音处理,取得了显著的成效。
生成三个向量:查询向量query-vec、键向量key-vec、值向量value-vec
通过向量方式计算自注意力的第一步,就是从每个编码器的输入向量(即每个单词的词向量)生成三个向量:查询向量query-vec、键向量key-vec、值向量value-vec
查询向量、键向量、值向量这三个向量的维度在论文中设置的是64,在维度上比词嵌入向量更低,因为词嵌入和编码器的输入/输出向量的维度是512,但也不是必须比编码器输入输出的维数小,这样做主要是为了让后续多头注意力的计算更稳定 (在下文你会看到,transformer通过多头注意力机制multi headed attention,对每个512维的输入向量都设置了8个头,不同的头关注每个输入向量不同的部分,而每个头的维度则是:512/8 = 64,且再多说一句,也可以设置为2个头,不一定非得设置为8个头)
至于这三个向量的生成方法是把输入的向量分别乘以三个不同的权重矩阵WQ 𝑊 𝑄 、WK 𝑊 𝐾 、WV 𝑊 𝑉 ,得到Q、K、V,而这些权重矩阵是在模型训练阶段中训练出来的「对于权重矩阵WQ 𝑊 𝑄 /WK 𝑊 𝐾 /WV 𝑊 𝑉 如何训练出来的,还是标准老套路:先随机初始化,然后在损失函数中表示出来,最后通过反向传播不断优化学习得出,最终目标是最小化模型的预测误差,至于什么是反向传播,请参见参考文献17」
最终使得输入序列的每个单词各自创建一个查询向量、一个键向量和一个值向量
可能有的读者有疑问了,设置这三个向量的用意何在或有何深意,实际上
查询向量Query是当前单词的表示形式,用于对所有其他单词(key)进行评分,我们只需要关注当前正在处理的token的query 键向量Key可以看做是序列中所有单词的标签,是在我们找相关单词时候的对照物 值向量Value是单词的实际表示,一旦我们对每个单词的相关度打分之后,我们就要对value进行相加表示当前正在处理单词的value
第一次看到这里的朋友,可能会有疑问,正如知乎上有人问(https://www.zhihu.com/question/341222779?sort=created):为什么Transformer 需要进行Multi-head Attention,即多头注意力机制?
叫TniL的答道:可以类比CNN中同时使用多个滤波器的作用,直观上讲,多头的注意力有助于网络捕捉到更丰富的特征/信息 且论文中是这么说的:Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. 关于different representation subspaces,举一个不一定妥帖的例子:当你浏览网页的时候,你可能在颜色方面更加关注深色的文字,而在字体方面会去注意大的、粗体的文字。这里的颜色和字体就是两个不同的表示子空间。同时关注颜色和字体,可以有效定位到网页中强调的内容。使用多头注意力,也就是综合利用各方面的信息/特征(毕竟,不同的角度有着不同的关注点) 叫LooperXX的则答道:在Transformer中使用的多头注意力出现前,基于各种层次的各种fancy的注意力计算方式,层出不穷。而Transformer的多头注意力借鉴了CNN中同一卷积层内使用多个卷积核的思想,原文中使用了 8 个 scaled dot-product attention ,在同一multi-head attention 层中,输入均为 KQV,同时进行注意力的计算,彼此之前参数不共享,最终将结果拼接起来,这样可以允许模型在不同的表示子空间里学习到相关的信息,在此之前的 A Structured Self-attentive Sentence Embedding 也有着类似的思想
简而言之,就是希望每个注意力头,只关注最终输出序列中一个子空间,互相独立,其核心思想在于,抽取到更加丰富的特征信息
GPT:为何采用单向Transformer
什么是单向Transformer?在Transformer的文章中,提到了Encoder与Decoder使用的Transformer Block是不同的。怎么个不同?通过本文第三部分对Transformer的介绍可得知:
Encoder因为要编码整个句子,所以每个词都需要考虑上下文的关系。所以每个词在计算的过程中都是可以看到句子中所有的词的; 但是Decoder与Seq2Seq中的解码器类似,每个词都只能看到前面词的状态,所以是一个单向的Self-Attention结构 换言之,在解码Decoder Block中,使用了Masked Self-Attention(所谓Masked,即遮蔽的意思),即句子中的每个词,都只能对包括自己在内的前面所有词进行Attention,这就是单向Transformer。
而GPT使用的Transformer结构就是将Encoder中的Self-Attention替换成了Masked Self-Attention,从而每个位置的词看不到后面的词
参考
Transformer通俗笔记:从Word2Vec、Seq2Seq逐步理解到GPT、BERT 国内外已经有很多不错的资料,比如国外作者Jay Alammar的一篇图解Transformer:The Illustrated Transformer,再比如国内张俊林老师的这篇《说说NLP中的预训练技术发展史:从Word Embedding到Bert模型》。
参考
Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer