深度学习——transformer

前言

前些时间DDL很多,一鸽就是七个月,目前transformer在计算机视觉中非常火热,在面试过程中,也被面试官询问过相应内容,在此做一个简单的总结

self attention

Transformer中的self attention和CV中的attention机制非常近似,都是通过建立一组输入数据之间的联系,来决定哪部分数据更为重要。本节将介绍self attention的具体流程

首先,self attention中存在三个非常重要的vector,分别是key vector、query vector、value vector。针对每个词向量,存在三个矩阵 W K 、 W Q 、 W V W^K、W^Q、W^V WKWQWV,将输入数据转换为对应的key vector、query vector、value vector,所有的词向量共用一组矩阵 W K 、 W Q 、 W V W^K、W^Q、W^V WKWQWV,流程如下图所示:
在这里插入图片描述
上图中,X的每一行表示一个词向量,Q、K、V每一行表示对应的key vector、query vector、value vector。

接着,计算self attention map,具体计算公式为
A = s o f t m a x ( Q K T d k ) A=softmax(\frac{QK^T}{\sqrt{d_k}}) A=softmax(dk QKT)
即每个query vector都与所有的key vector做点乘,印象中点乘前所有的query vector、key vector都需要做L2归一化,此时点乘结果等价于余弦相似度,越趋近于1,相似度越高, d k \sqrt{d_k} dk 为缩放因子,以此防止进行softmax计算时数值太大,需注意缩放因子不会导致数值之间的相对大小发生改变。接着在行方向做一个softmax计算,即矩阵的每一行的和均为1。
在矩阵A中,第 i i i行表示第 i i i个词向量的self attention map,数值 a i j a_{ij} aij表示第 i i i个词向量对应的query vector与第 j j j个词向量对应的key vector之间的相似度,越接近于1,相似度越大。这里有一个问题,余项相似度已经可以度量第 i i i个query vector与第 j j j个key vector之间的相似度了,为什么还要在进行softmax计算?softmax并不会改变数值之间的相对大小,这么做可能是引入归一化,从而加速训练拟合速度.

最后,将词向量的self attention map与所有词向量的value vector加权(包括自己)求和,对于词向量A而言,这个步骤相当于依据其他词向量,更好理解词向量A的含义,比如小明喜欢乒乓球,上述步骤可以让模型综合“小明”、“乒乓球”这两个词来更好理解“喜欢”这个词的含义,计算公式如下
s o f t m a x ( Q K T d k ) V softmax(\frac{QK^T}{\sqrt{d_k}})V softmax(dk QKT)V

上述过程为矩阵运算,可能较难理解,我们把它拆解为单个词向量,具体流程如下:
在这里插入图片描述
上述流程为

  1. x 1 x_1 x1 x 2 x_2 x2为两个词向量,通过矩阵 W Q 、 W K 、 W V W^Q、W^K、W^V WQWKWV转换为对应的query vector、key vector、value vector
  2. x 1 x_1 x1为例,对应的query vector、key value称为 q 1 、 k 1 q_1、k_1 q1k1 x 2 x_2 x2同理,计算 q 1 q_1 q1 k 1 k_1 k1 k 2 k_2 k2的余弦相似度,接着做一个softmax变换,得到 x 1 x_1 x1的self attention map,即[0.88,0.12]
  3. 接着将self attention map与 v 1 v_1 v1 v 2 v_2 v2做一个加权求和,即 z 1 = 0.88 v 1 + 0.12 v 2 z_1=0.88v_1+0.12v_2 z1=0.88v1+0.12v2

Mutil-Head Attention

Mutil-Head Attention即针对同一组输入,平行进行多次self attention操作,接着将结果进行concat,乘以一个矩阵 W O W^O WO,如下图所示
在这里插入图片描述

Transformer的结构

transformer由Encoder和Decoder组成,Encoder结构如下
在这里插入图片描述
Encoder由N个Encoder Cell堆叠而成,Encoder Cell采用残差结构,上图已经画的很清楚了,在此不做介绍,多个Encoder Cell堆叠可以提高模型的容量,从而构建更复杂的函数映射,这在深度学习中是常见的思路,Encoder的输出会通过两个线性映射,变为K、V两个矩阵,用于decoder解码使用。

Decoder由N个Decoder Cell堆叠组成,结构如下
在这里插入图片描述
Decoder由N个Decoder Cell组成,Decoder Cell的结构如上,具体处理步骤为

  1. 对输入施加Multi-Head Attention
  2. 对步骤一的输出施加Mutil-Head Attention,此时的value vector和key vector来源于Encoder输出的K、V矩阵
  3. 步骤二的输出经过一个两层前馈神经网络(激活函数为ReLU)处理

Decoder的输入为已经翻译的词向量,但是在初始状态,Decoder不存在已经翻译的词向量,此时的输入为一个训练时学习到的词向量

为什么要施加两个Multi-Head Attention?第一个Mutil-Head Attention的K、V矩阵不来源于Encoder,个人认为这是让模型理解已经翻译的词语的含义是什么,第二个Mutil-Head Attention的K、V矩阵来源于Eecoder,个人认为这是让模型理解已经翻译的词语与原文的对应关系是什么,结合目前已翻译词语的含义以及已翻译词语与原文的对应关系来决定下一个应该翻译的内容

Transformer的总体结构如下
在这里插入图片描述
翻译的本质就是一个分类任务,即从翻译词字典中选出一个词,所以Decoder的输出经过一个Linear层后,通过softmax输出

Positional Encoding

由于文本是序列数据,而Transformer不像RNN、LSTM等序列模型,天生具备序列能力(数据的输入是按顺序的),所以Transformer引入了Positional Encoding,Positional Encoding即对每个词向量都给一个位置编码,位置编码为一个vector,其数值特点为:

  • 奇数位数值为 c o s ( p o s / 1000 0 2 i / d m o d e l ) cos(pos/10000^{2i/d_{model}}) cos(pos/100002i/dmodel)
  • 偶数位数值为 s i n ( p o s / 1000 0 2 i / d m o d e l ) sin(pos/10000^{2i/d_{model}}) sin(pos/100002i/dmodel)

其中pos表示词语在句子中的位置, d m o d e l d_{model} dmodel为Encoder输出的vector的维度,i为位数,比如512维的vector,i=2表示512维vector的第二位的数值。
为什么如此设计Positional Encoding?作者假设这么设计,可以让模型学会词语之间的相对位置,因为
c o s ( ( p o s + k ) / 1000 0 2 i / d m o d e l ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) c o s ( k / 1000 0 2 i / d m o d e l ) − s i n ( p o s / 1000 0 2 i / d m o d e l ) s i n ( k / 1000 0 2 i / d m o d e l ) s i n ( ( p o s + k ) / 1000 0 2 i / d m o d e l ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) c o s ( k / 1000 0 2 i / d m o d e l ) + c o s ( p o s / 1000 0 2 i / d m o d e l ) s i n ( k / 1000 0 2 i / d m o d e l ) \begin{aligned} cos((pos+k)/10000^{2i/d_{model}})=cos(pos/10000^{2i/d_{model}})cos(k/10000^{2i/d_{model}})-sin(pos/10000^{2i/d_{model}})sin(k/10000^{2i/d_{model}})\\ sin((pos+k)/10000^{2i/d_{model}})=sin(pos/10000^{2i/d_{model}})cos(k/10000^{2i/d_{model}})+cos(pos/10000^{2i/d_{model}})sin(k/10000^{2i/d_{model}})\\ \end{aligned} cos((pos+k)/100002i/dmodel)=cos(pos/100002i/dmodel)cos(k/100002i/dmodel)sin(pos/100002i/dmodel)sin(k/100002i/dmodel)sin((pos+k)/100002i/dmodel)=sin(pos/100002i/dmodel)cos(k/100002i/dmodel)+cos(pos/100002i/dmodel)sin(k/100002i/dmodel)
其中k即为词语之间的相对位置,可能隐藏在Q、K、V矩阵中,这仅仅是一个假设,此外,该位置编码也满足一个特点,即可以体现词语的先后顺序,该位置编码的可视化结果如下:
在这里插入图片描述
上图中,横轴表示vector的维度,纵轴表示词向量的位置,上图和二进制编码非常像,而二进制编码也可以用于表示词语的先后顺序,如下所示
在这里插入图片描述

Transformer中Q、K、V的含义

从式子的物理含义来解释,Q表示query、K表示key、V表示value,query相当于我们往词库搜索引擎中输入关键字,词库搜索引擎的所有词语都编码成了key-value对,key表示用于检索的关键字,value表示词语的含义,将query与key作比较(做余弦相似度),相似度高,我们就认为query与key对应的词语语义相近或相关(即value近似),self attention最后将self attention map与value做加权求和,其实就是判断当前词向量与其他词向量的相关度或语义近似度是多少

参考文献

[1] The Illustrated Transformer
[2] transfomer里面self-attention的Q, K, V的含义
[3] Attention Is All You Need
[4] Transformer中的Positional Encoding

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值