论文Transformer的解析

Transformer论文的地址:https://arxiv.org/pdf/1706.03762.pdf

Transformer代码的地址:personal/transformer · GitHub

左侧的是输入,包含有N个编码器Encoder(这N个编码器的结构都是相同的,参数不同,解码器也是一样的道理,但是编码器和解码器是不一样的)

右侧的是输出,包含N个解码器Decoder

输入    

1、输入部分

1.1Embedding:

将词语或句子表示为高维空间中的向量,用这个向量来表示这个词或句子

1.2 Position Encoding:

RNN:循环神经网络(RNN)的 timesteps 共享一套参数,可以使网络可以学习捕捉序列中的模式,并在不同的时间步上应用相同的规律。RNN 把上一时刻的输出 作为下一个时刻的输入。是串行的。 

而transform利用多头注意力机制可以并行化,比RNN会快很多,但是失去了单词之间的序列关系(这个序列关系很重要),故而在RNN输入的时候将词向量和位置编码相加来作为输入,位置编码具有与嵌入相同的维度,因此两者可以相加。Position Encoding保存了单词在序列中的相对位置或者绝对位置。

pos:表示单词在句子中的位置

d:表示PE的维度

2i是偶数的维度,2i+1是奇数的维度​

这么做的好处:可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。

2、注意力机制

2.1、Q、K、V的计算

Q:表示将当前时间步的输入(或上一层的输出)

K:表示输入的另一个线性变换,生成用于计算注意力权重的键向量

V:表示模型关注的实际信息

X1和W^{Q}W^{K}W^{V}相乘得到q1、k1、v1

2.2、Self-Attention 的输出

d_{k}较大时,即Q和K的维度较大时,QK^{T}的值比较大,使 softmax 函数的输出值接近于 0 或 1,从而导致模型的梯度接近于 0,为了抵消这种效果,就除以d_{k}的平方根。得到QK^{T}矩阵之后,对其矩阵的每一行进行softmax,即让每一行的和都变为1

之后再和V矩阵相乘就得到了Z矩阵

2.3、Multi-Head Attention

这是论文中的Multi-Head Attention,由h个Scaled Self-Attention组成的。通过输入X传递到h个不同的Self-Attention中,计算得出h个Z矩阵,假如h=8

将h个Z矩阵通过线性变化得到最终的Z矩阵

3、Encoder

Encoder包含了2个模块,模块之间是并行的,模块内部是串行的

第一个模块是多头自注意机制,第二个模块是一个简单的、位置全连接的前馈网络。我们在每个模块周围采用残差连接(先)和层规范化(后)。也就是说,每个模块的输出都是LayerNorm(x+Sublayer(x)),其中Sublayer(x)是子层本身实现的函数。

放大如下图:

通过Multi-Head Attention得到Z,再和X相加,(残差网络)

3.1、Feed Forward:

两层的全连接层网络,第一层的激活函数为 Relu,第二层不使用激活函数,对应的公式如下:

3.2、Add & Norm

Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:

X是Multi-Head Attention的输入,这里用到了残差网络,Add指的是:将Multi-Head Attention的输出和X进行相加,残差网络如下图所示:

Norm指的是:Layer-norm(可以单独对一个样本的所有的单词做缩放),将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。

输出

4、Decoder

Decoder和Encoder的区别:

1、Decoder有包含两个 Multi-Head Attention 层。

2、第一个Multi-Head Attention 层采用了 Masked 操作。

3、第二个 Multi-Head Attention 层所输入的Q、K、V矩阵,K、V矩阵是通过Enconder得到,Q矩阵是上一个 Decoder 模块的输出

4.1、 第一个 Multi-Head Attention

在自注意力机制(Self-Attention)中,在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。为了防止每个位置关注到未来的信息,可以使用掩码来将未来的位置的注意力权重设为负无穷,这样的掩码确保每个位置只能关注到当前位置及之前的信息。下面以 "我有一只猫" 翻译成 "I have a cat" 为例

根据输入 "<Begin>" 预测出第一个单词为 "I",然后根据输入 "<Begin> I" 预测下一个单词 "have"。

第一步:Decoder 的输入矩阵和 Mask 矩阵,输入矩阵包含 "<Begin> I have a cat" (0, 1, 2, 3, 4) 五个单词的表示向量,而Mask 是一个 5×5 的矩阵。在Mask矩阵中,单词1只能使用单词0、1的信息

第二步:接下来的操作和之前的 Self-Attention 一样,通过输入矩阵X计算得到Q,K,V矩阵。然后计算QK^{T} 的乘积 QK^{T}

第三步:在得到 QK^{T}之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:

被遮住的部分的值都为0

第四步:Mask QK^{T}和矩阵V相乘得到矩阵矩阵Z,通过 Multi-Head Attention 拼接多个输出Z

4.2、 第二个 Multi-Head Attention

第二个 Multi-Head Attention 层所输入的Q、K、V矩阵,K、V矩阵是通过Enconder得到,Q矩阵是上一个 Decoder 模块的输出;这么做的好处是:每一位单词都可以利用到Encoder所有单词的信息。

5、softmax预测

根据输出矩阵的每一行来预测下一个单词

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值