计算机领域热知识【1】Transformer与attention

请添加图片描述

要说近些年来最火的深度学习模型,十个人中会有九个人说是Transformer。Transformer的通用性与易训性使得其在自然语言处理领域大方异彩。自2017年提出以来,近5年来大量NLP领域的创新均是基于transformer进行的,例如我们熟知的BERT,GPT2等,均取得良好的实验效果。本篇博客介绍transformer的结构,并提出自己对模型结构的看法。

transformer结构

transformer最初被应用在文本翻译中,即输入一段文本sequence,输出其翻译文本sequence。一个sequence由多个token组成,每个token本身就是一个向量,一个sequence可以理解成是一个向量序列,其中每个元素是向量,元素之间有顺序关系。transformer有2个最核心的模块:encoder和decoder,二者均使用了attention机制残差神经网络结构

请添加图片描述
上面这张图你从各种各样讲解transformer的博客中都能看见,它就是transformer的完整结构。事实上encoder和decoder的框架设计并不是transforme的创新点,在transformer之前的GAN和a utoencoder均有encoder+decoder的设计。transformer最核心的创新点在于:只使用attention机制,避免使用循环神经网络和卷积网络,从而增加并行性,提升速度。1

encoder

encoder即是一个编码器,其作用是获得一个输入的中间表示。其有3个核心要点:

  1. multi-head attention机制
  2. add & Norm 归一化
  3. add & Norm 残差结构

multi-head attention

这个模块是transformer摆脱RNN的关键,在整个transformer中应用广泛,不仅在encoder中使用,也在decoder中有使用。在介绍multi-head attention之前,我们先要了解self-attention机制。self-attention机制最核心的想法是通过计算相关性(也可以理解成相似性)来获得每个value的权重,进而得到一个加权平均的表示。聪明的你一定猜到了,这里的相关性即是attention的由来,哪个元素的相关性大,则其获得的attention则越多。multi-head attention是在self-attention基础上的变形。self-attention可以用公式表示成:
a t t e n t i o n = s o f t m a x ( Q K T / ( d k ) ) V attention=softmax(QK^T/\sqrt(d_k))V attention=softmax(QKT/( dk))V
这里的 Q Q Q K K K V V V是矩阵,举例来说如果 Q Q Q K K K V V V是2 * 3的矩阵,那么 Q K T QK^T QKT的矩阵代表每个 q q q (1 * 3) 和 k k k(1 * 3)之间的相似度,其规模为2 * 2,其 i , j i,j i,j元代表第 i i i q q q与第 j j j k k k的相关性。softmax层使得2 * 2矩阵的每一行求和为1,从而在与V矩阵相乘时得到的结果矩阵Z中每一行是 v v v (1 * 3)的加权平均。

multi-head attention即将多个attention的的结果矩阵拼接在一起,得到一个基于不同attention模型的结果拼接。
m u t l i _ a t t e n t i o n = c o n c a t ( a t t e n t i o n 1 ( Q , K , V ) , a t t e n t i o n 2 ( Q , K , V ) , . . . a t t e n t i o n h ( Q , K , V ) mutli\_attention=concat(attention_1(Q,K,V), attention_2(Q,K,V),...attention_h(Q,K,V) mutli_attention=concat(attention1(Q,K,V),attention2(Q,K,V),...attentionh(Q,K,V)
当然上述表示与论文中的表示等价:
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O MultiHead(Q, K, V ) = Concat(head1, ..., headh)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO
h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) headi = Attention(QW_i^Q , KW_i^K , VW_i^V ) headi=Attention(QWiQ,KWiK,VWiV)

add&Norm归一化

add&Norm层的主要功能有2个:一个是add代表的残差结构,一个是Norm代表的归一化。我将分成2个部分介绍。

一提到归一化我们可以想到的种类有至少2种:BatchNormalization和LayerNormalization,在encoder中使用的是LayerNormalization而非BatchNormalization。LN是在同一个样本中不同神经元之间进行归一化,而BN是在同一个batch中不同样本之间的同一位置的神经元之间进行归一化。attention机制得到的中间表示的信息体现在完整的向量中,而非每个单独的维度,因而使用BN将每个维度进行归一化并无意义2

add&Norm残差结构

add代表残差结构,引入残差结构可以有效防止深度神经网络在训练中发生退化问题。直观上,模型越复杂则表达能力越好,但同时训练难度也增加。随着模型复杂度从0增加,增加到一定程度,模型所达到的最佳损失loss会逐渐减小,但随着模型复杂过度,模型的损失函数反而会增加。

如何理解退化的产生?举例来说,当一个模型最佳层数是10层,但我们在设计模型的时候并不知道应该设计多少层,我们设计了20层,这就比最佳层数多了10层,我们要想训练出好结果,必然要训练出来恒等映射,这无疑增加了训练难度。引入残差层后输出结果是模型结果和输入的结果之和(这也解释了为什么残差网络结构的简称是add,这里的add就是指残差网络的结构由2部分相加而成)通过引入残差网络,我们只需要训练出来一个参数全为0的模型即可使得这层网络在功能上与恒等映射等价。在实践层面,网络参数的最初初始化就是全0,我们不需要训练这层即可达到这层是恒等映射的效果3

decoder

decoder与encoder结构中的不同在于masked multi-head attention,这个结构与encoder中的multi-head attention进一步做了改变,引入了mask机制,用于隐藏信息。

masked multi-head attention

mask一共有2种:padding mask和sequence mask,它们有不同的设计目的。

padding mask的设计考虑到不同的sequence长度不同,但为了进入模型必须对齐成一样长度,对于规模小于模型要求的输入,尾部进行的填充是无意义的,我们需要一个信息位来告知模型这些位是填充的并没有实际意义,以防止模型受填充信息扰乱。在encoder和decoder中均使用了padding mask。

sequence mask仅使用在decoder中,这点与padding mask有所不同。decoder模型的输入仅仅是部分结果,而非全部,通过引入sequence mask可以将未来信息隐藏起来。

feed forward

feed forward是指全连接层,即MLP。Transformer将这里设计成,先通过线性变换将输入扩大维度,然后使用maxpool进行过滤,最后进行线性变化获得与输入同样维度的结果,使用的激活函数是ReLU。论文中给出的公式如下:
F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x) = max(0, xW1 + b1 )W2 + b2 FFN(x)=max(0,xW1+b1)W2+b2

训练方法

除了encoder和decoder这两个重要的模块外,transformer还有一个输出层用于输出翻译的结果。训练过程中,encoder得到input的中间表示,decoder得到完整翻译结果的中间表示,输出层根据完整翻译结果的中间表示,得到输出结果的概率分布,从而最终得到概率最大的结果作为翻译结果。损失函数为decoder的输入和输出层的结果之间的差异,整个模型的训练目标是得到损失函数最小的模型参数4
请添加图片描述
这张图详细给出了transformer中的数据流动情况,可以看到decoder的输入是encoder的输出(Enc-2 Out)和output的编码结果(Dec-1 Out),二者进入Decoder-2后得到的Dec-2 Out进入后面的输出层,得到每个单词的概率,然后根据概率得到最终的输出6。

模型响应

现在我们已经有一个训练好的Transformer模型,我们将如何从input的sequence得到其翻译的结果?请添加图片描述
看上图右下角3代表开始进行翻译,start token输入到decoder中与encoder输出的Enc-2 Out一同进入Decoder-2得到一个已有信息的编码Dec-2 Out,其进入输出层,得到概率得到第一个翻译的结果De,这个翻译的结果与start token一同作为下一个单词预测的输入。下一轮预测Nada时,3的内容即为start De这两个token。

响应过程的特点是,其decoder模型的输入会随着预测结果而得到扩充但Enc-2 Out并不会改变,只有deco der模型会在响应过程中得到使用。

参考

[1] Transformer详解
[2] 十分钟理解Transformer
[3] 史上最小白之Attention详解
[4] 史上最小白之transformer详解
[5] 详解transformer
[6] 碎碎念:Transformer的细枝末节


  1. 1 传统的翻译模型均基于RNN,无法并行,并且encoder的输出结果受近的元素影响大于较远的 ↩︎

  2. 2这里参考了博客:史上最小白之Transformer详解 ↩︎

  3. 3参考了博客:史上最小白之Transformer详解 ↩︎

  4. 4见博客:Transformer详解 ↩︎

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值