深入理解Transformer

本文先对Transformer的模型结构做一个概述,然后再列举一下相对之前模型的创新点/优势,最后针对模型细节以QA的形式做深入介绍。

模型概述

原始论文的Transformer是用于解决seq2seq问题的,由encoder和decoder组成。
Encoder和Decoder的输入:都是wordEmbedding+positionalEmbedding(把句子输入decoder时,需要做右移)。
Attention(包括self-attention和encoder与decoder之间的attention,transformer共包含3类attention):是用的multi-head attention,其中单头的公式为: s o f t m a x ( Q K T d k ) V softmax(\frac{QK^T}{\sqrt d_k})V softmax(d kQKT)V
Encoder:由6个相同结构的layer组成,每个layer由两个sublayer(self-attention和FFN)组成。每个sublayer被残差连接和layer normalization包围,也就是每个sublayer输出为 L a y e r N o r m a l i z e ( x + s u b l a y e r ( x ) ) LayerNormalize(x+sublayer(x)) LayerNormalize(x+sublayer(x))
Decoder:和Encoder不同的地方有2个,一个是decoder的self-attention是masked-self-attention(每个位置只能attend它以及它左边的位置),另一个是中间插入了一个传统seq2seq的attention层(Q是decoder上一层的输出向量,K和V是encoder的输出向量)。

模型特点

1 Transformer最大特点就是使用self-attention替代了recurrence和convolution。recurrence和convolution天然对顺序敏感(所谓模型对顺序敏感,是指输入同一个序列,改变token顺序后,输出也随之变化);而self-attention则是对顺序不敏感(同一个序列,无论token顺序如何,输出都不变),它只能对句子中两个token的dependency建模,但不能建模每个token的绝对位置或者两个token间的相对位置(依赖和位置是不同的概念,别弄混),所以才需要引入位置的embedding。
2 相比以往的单头attention,模型引入了multi-head (masked) (self) attention。
3 从query、key、value的角度阐述了attention的模型。
4 从总体计算量、 并行度(需要串行计算的数量)、长距离依赖的建模能力(token间的最大路径长度),self-attention相比recurrence和convolution都有优势,详情见paper。

模型细节

0 描述一下scaled dot-product attention和multi-head attention?
(1)输入是query、keys和values,输出是values的加权和。而权重计算方法是,先计算query和每个key的相似度(doc product),然后除以 d k {\sqrt d_k} d k,最后用softmax做归一化。
用公式描述就是: s o f t m a x ( Q K T d k ) V softmax(\frac{QK^T}{\sqrt d_k})V softmax(d kQKT)V
(2)将Q、K、V分别映射为多组不同子空间下的Q、K、V(维度缩小为原始维度的 1 / h 1/h 1/h,目的是为了减少计算量,尽量和单头的一样),然后并行的对每组Q、K、V进行attention计算,最终将每组输出的向量连接起来再线性映射一下。
1 模型选择的是哪种attention函数?为什么?
常见的attention函数有3种:dot-product attention、multiplicative attention和additive attention。
dot-product attention: s c o r e = q T k score=q^Tk score=qTk
multiplicative attention: s c o r e = q T W k score=q^TWk score=qTWk
additive attention: s c o r e = v T t a n h ( W 1 q + W 2 k ) score=v^Ttanh(W_1q+W_2k) score=vTtanh(W1q+W2k),说白了就是,输入是q和k的连接,中间一个隐层,只有一个输出的FFN。
因为q和k本来就是对原始的向量做了线性变换,所以multiplicative attention中的线性变换矩阵W完全没有必要。而additive attention相对另外2个,速度和显存都不占优势,因此论文中选择使用dot-product attention。
2 计算attention过程中,在使用attention函数计算分数之后、送入softmax之前,为什么要做scale(除以 d k \sqrt {d_k} dk )?
有一个现象,当 d k d_k dk比较小的时候,additive attention和dot-product attention的表现差不多,但是当 d k d_k dk比较大的时候,前者就比没有scale的后者要强了。
原因是,当 d k d_k dk比较大的时候,dot product的绝对值也会很大,从而进入softmax的饱和区(梯度接近0的区域)。
注:假设q和k的分量是相互独立、mean为0、variance为1的随机变量,那么 q T k q^Tk qTk的mean是0,variance是 d k d_k dk
3 多头attention相比单头attention的优势在哪?
不同的头可以关注到不同的子空间的信息,从而捕捉更加丰富的信息。
但本质上还是实验验证,多头优于单头。
这个机制把模型变得更复杂了,并且这种复杂是符合文本的先验知识——句中某个单词根据角色不同可能会有不同的侧重。
举例来说,“他吃了一个苹果”,“吃”在不同语义空间下,侧重可能就不同,比如一个空间下,侧重吃了什么,那么“吃”与”苹果“的attention score就比较大,另一个空间下,侧重谁吃的,就与“他”相似度分数就比较高。
4 为什么使用不同矩阵对输入向量QKV做线性变换?
可以保证QKV是在不同空间进行投影,增强了表达能力。
举例来说,一个模型,输入是句子,中间是一个self-attention层。如果不变换,每个单词关注谁,就取决于词向量之间相似度,大概率就是主要关注自己,attention矩阵也是对称的,这样表达能力显然受限;如果映射到了不同的空间,就可以关注不同的方面,更灵活。
5 为什么要使用self-attention代替convolution和recurrence?
总体计算量(存疑)、并行度、长距离依赖(两个位置的最短路径的长度)。
6 为什么要加残差?
残差连接可以缓解梯度消失问题(x+F(x)的梯度比F(x)的梯度大1),让信息传播更顺畅
(直接将输入x传过去了),从而可以构造更深的网络。
7 FFN用的什么激活函数?
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
8 介绍一下位置编码
分为绝对和相对两种。
绝对的包括训练式和三角式。前者简单灵活,让模型自己去学每个位置的参数,但是没有外推性,一方面如果训练集中没有某个长度的数据,那么该长度对应的embedding就是随机初始化的;另一方面,碰到更长的句子无法处理。此外,没有引入位置之间的先验信息,只是单纯寄希望于模型通过数据学到位置之间的关系。
三角式,原理应该是sin(a+b)与cos(a+b)可以由sin(a)、sin(b)、cos(a)、cos(b)表示,因此可以用来表示位置间的关系。
相对的,比如transformer-xl所用到的,在attention计算中,公式展开后,将2个pi替换为u和v,将pj替换为Rij。
具体参考:让研究人员绞尽脑汁的Transformer位置编码

参考
【1】万字长文帮你彻底搞定Transformer-不要错过!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值