Transformer 学习

一、Transformer 介绍

        Transformer(变形金刚网络)是一种基于自注意力机制的神经网络模型,最早由Vaswani等人在2017年提出,主要用于处理序列到序列的任务,如机器翻译、文本生成等。相比于传统的循环神经网络(RNN)和卷积神经网络(CNN),Transformer在处理序列数据时具有更好的并行性和全局信息的感知能力。

二、Transformer的结构和原理

        Transformer由编码器(Encoder)栈和解码器(Decoder)栈两个部分组成,常用于序列到序列的任务,如机器翻译和文本摘要等。

编码器栈:编码器负责将输入序列转化为连续的向量表示。它由多个相同结构的编码器堆叠而成,每个编码器都包含自注意力层和前馈神经网络层。编码器可以同时处理整个输入序列,充分利用了序列中各个位置的信息。

解码器栈:解码器栈负责根据编码器栈的输出和目标序列生成对应的输出序列。它也由多个相同结构的解码器堆叠而成,每个解码器都包含自注意力层、编码-解码注意力层和前馈神经网络层。解码器通过自注意力机制捕捉输入序列中的上下文信息,并通过编码-解码注意力机制与编码器的输出进行关联。

每个编码器、解码器内部的结构如下图所示,Nx=6。

输入:Transformer 的输入和输出取决于其应用的任务,但一般来说,Transformer 主要用于处理序列到序列的任务,如机器翻译、文本生成等。输入序列经过以下顺序处理后,被转换为 Transformer 的输入:
1) 嵌入层(Embedding Layer):将输入序列中的每个单词转换为对应的向量表示。这些向量称为词向量。
2)位置编码(Positional Encoding):为了引入单词的位置信息,使用正弦和余弦函数计算位置编码,并将其与嵌入向量相加(位置编码也可通过训练得到)。要知道Transformer是完全基于Self-Attention的,而Self-Attention不能获取到词语的位置信息。就算打乱一句话中词语的位置,每个词还是能与其他词之间计算联系,就相当于是一个功能强大的词袋模型,对结果没有任何影响。所以我们在输入的时候需要给每一个词向量添加位置编码,使得Transformer可以更好地考虑位置信息。计算位置编码的正余弦函数为:

PE(pos,2i)=sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}})

PE(pos,2i+1)=cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}})
3) 掩码(Masking):在训练过程中,为了防止模型关注序列中不必要的部分,如填充(Padding)后的位置,使用掩码对输入序列进行处理。

自注意力机制:Transformer的核心是自注意力机制(Self-Attention)。自注意力机制可以根据输入序列中不同位置的关联性,动态地对不同位置的信息进行加权融合,从而更好地捕捉序列中的上下文信息。通过自注意力机制,Transformer能够将每个位置的信息与其他位置的信息进行关联和交互。

多头注意力:为了增加模型的表达能力,Transformer引入了多头注意力机制(Multi-Head Attention)。多头注意力可以同时学习不同的注意力权重,从而捕捉更多不同方面的语义信息。多头注意力机制通过将输入进行线性变换,分别计算若干个注意力权重,最后再将它们进行融合。

Add & Norm:Add指的是添加一个残差块X,添加残差块X的目的是防止在深度神经网络训练中发生退化问题。退化的意思就是深度神经网络通过增加网络的层数,Loss逐渐减小,然后趋于稳定达到饱和,然后再增加网络层数,Loss反而增大。为什么残差块能够防止退化问题,残差块又是什么?这就牵扯到ResNet残差网络相关知识。

        假如某个神经网络的最优网络层数是18层,但是在设计时并不知道多少层是最优解。本着层数越深越好的理念设计了32层,那么32层中其实有14层是多余的。若想要达到18层神经网络的最优效果,就要保证多出来的14层网络进行恒等映射(输出与输入相等),可以理解为f(x)=x这样的函数,这样多出来的14层网络才不会影响最优效果。但现实中神经网络的参数都是训练出来的,要保证训练出来的参数能够很精确地完成f(x)=x的恒等映射其实是很困难的。多余的层数较少还好,对效果不会有很大影响,但多余的层数一多,可能结果就不是很理想了。RseNet残差神经网络可以解决神经网络退化的问题。残差块的结构如下图所示。

上图就是构造的一个残差块,x是这个残差块的输入,F(x)是经过第一层线性变化并激活后的输出,也称作残差。在第二层进行线性变化之后激活之前,F(x)加上了这一层输入值x然后再激活后进行输出。在第二层输出值激活前加入x,这条路径称作shortcut连接。

回到上述问题,为什么添加残差块能防止神经网络退化问题呢?

        添加残差块后,之前要完成恒等映射的函数变成h(x)=F(x)+x,我们要让h(x)=x,那么相当于让F(x)=0就行,巧妙之处就在这里。神经网络通过训练变成0比变成x容易很多。因为一般在初始化神经网络参数时就是设置为[0,1]之间的随机数,所以经过网络变换后很容易接近于0。

以上图为例。假设网络只经过线性变换,没有bias也没有激活函数。我们发现因随机初始化权重一般偏向于0,那么经过该网络的输出值为[0.6,0.6],很明显会更接近于[0,0],而不是[2,1]。相比于学习h(x)=x,模型可以更快学习到F(x)=0。并且ReLu函数能够将负数激活为0,过滤了负数的线性变化,也能够更快地使F(x)=0。

       这样当网络自己确定哪些网络层为冗余层时,使用ResNet的网络很大程度上解决了学习恒等映射的问题,用学习残差F(x)=0更新冗余层的参数来代替学习h(x)=x更新冗余层的参数,最终使得有这些冗余层的网络效果与没有这些冗余层的网络效果相同,这样很大程度上解决了网络退化的问题。

综上所述,添加残差块能够使冗余层更容易地完成恒等映射效果,从而防止神经网络退化。

而 Normalize 的主要作用就是提高训练的稳定性以及加快训练速度。

前馈神经网络:在自注意力层之后,Transformer还包含了前馈神经网络(Feed-Forward Network)。前馈神经网络通过多层感知机对每个位置的表示进行非线性变换,进一步提升了模型的表达能力。

参数共享:Transformer 中的所有编码器和解码器都使用相同的权重矩阵,从而实现了参数共享,降低了模型的复杂度。

序列解码:在解码过程中,模型从起始符开始,逐步生成输出序列。在训练过程中,解码器的输入是完整的标注序列,并进行掩码处理,以模拟预测时的场景。而在预测时,解码器的输入是上一时刻的输出,通过不断迭代生成最终的输出序列。

        从上段可以看出Decoder的输入分为两类,一种是训练时的输入,一种是预测时的输入。具体来说,训练时的输入就是已经准备好对应的target数据。例如翻译任务,Encoder输入“Tom chase Jerry”,Decoder输入“汤姆追逐杰瑞”。而预测时的输入,一开始输入是起始符,然后每次输入是上一时刻Transformer的输出。例如输入“ ”,输出“汤姆”;输入“汤姆”,输出“汤姆追逐”;输入“汤姆追逐”,输出“汤姆追逐杰瑞”;输入“汤姆追逐杰瑞”,输出“汤姆追逐杰瑞”结束。

Masked Multi-Head Attention:与Encoder中的Multi-Head Attention计算原理一样,只是在mask上有点区别。mask表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer模型里面涉及两种mask,分别是padding mask 和 sequence mask。Encoder中只需要padding mask,而Decoder中两种都需要。

1)padding mask。

因每个批次的输入序列长度是不一致的,所以要对输入序列进行对齐。具体来说,就是给较短序列的后面填充0,对过长序列截取左边的内容,舍弃多余的内容。因填充的位置其实没什么意义,attention机制不应该把注意力放在这些位置上,所以需要进行处理。具体来说就是把这些位置的值加上一个非常大的负数(负无穷)。这样经过softmax变换,这些位置的概率就会接近0!

2)sequence mask。

sequence mask是为了使Decoder屏蔽未来的信息。对于一个序列,在time_step为t时刻的解码输出应该只能依赖于t时刻前的输出,而不能依赖t时刻后的输出,因此需要把t时刻后的信息给隐藏起来。这在训练时有效,因训练时都是将target数据完整地输入进decoder中;而在预测时不需要,预测时我们只能得到前一时刻预测出的输出。具体做法为产生一个上三角矩阵,上三角的值全为0,然后把这个矩阵作用到每一个序列上,就可以达到我们的目的。

#注意:编码器中的Multi-Head Attention是基于Self-attention的,Decoder中的第二个Multi-Head Attention就是只基于Attention,它的输入Query来自Masked Multi-Head Attention的输出,Keys和Values来自于Encoder中最后一层的输出。

那么Decoder中为什么有两个Multi-Head Attention呢?

原文博主的理解是第一个是为了求解当前时刻输入之间的联系信息的意思。第二个是为了求解当前的输入与经过Encoder提取过的特征向量之间的关系信息来预测输出。

三、Transformer 的优缺点

 - 优点:

(1)可以并行训练,速度快、效果好。与 RNN 不同,Transformer 的计算过程可以完全并行化。在训练过程中,模型可以同时处理序列中的所有元素,从而大大提高了计算效率。

(2)Transformer 通过自注意力机制可以直接捕捉到序列中任意两个位置之间的依赖关系,有效地解决了长距离依赖问题。

- 缺点:

完全基于Self-Attention,对词语位置之间的信息有一定的丢失。虽然加入了Positional Encoding来解决这个问题,但是还存在可优化的地方。                                                                                                            

四、Transformer在NLP领域的应用

Transformer在NLP领域取得了巨大成功,并在多个任务上取得了最先进的结果。

(1)机器翻译:通过将源语言句子编码为连续的向量表示,并利用解码器生成目标语言句子,能够实现高质量的自动翻译。

(2)文本摘要:通过将原始文本编码为连续的向量表示,并利用解码器生成摘要文本,Transformer能够自动提取关键信息,生成准确且具有概括性的摘要。

(3)问答系统:通过将问题和文本编码为向量表示,并利用解码器生成答案,Transformer能够根据上下文信息准确回答用户提出的问题。

        综上所述,Transformer作为一种基于自注意力机制的神经网络模型,在自然语言处理领域取得了巨大成功。它通过将自然语言文本转化为连续的向量表示,并利用多层神经网络进行处理和学习,极大地提升了NLP任务的性能和效果。后来,在Transformer的基础上又衍生出来了BERT和GPT这两个NLP神器。随着深度学习技术的不断发展,我们相信Transformer在NLP领域将继续发挥重要的作用,并为人们带来更多的创新和进步。

# 个人推荐的手推transformer视频,用实例进行手动推算,讲的很详细:手推transformer

参考博文:史上最小白之transformer详解

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值