请选择 进入手机版 | 继续访问电脑版
*多图*
最近阅读会在讨论attention is all you need 一系列的论文,对transformer这个模型不是很理解。之后翻阅了很多知乎笔记,博客还是没懂Q,K,V是怎么来的。最后幸运的发现了哈佛nlp组用pytorch实现的代码才明白了一半(
The Annotated Transformer​nlp.seas.harvard.edu Attention is all you need模型笔记-1.jpg )。前几天又发现了一篇刚出的博客(
The Illustrated Transformer​jalammar.github.io Attention is all you need模型笔记-2.jpg )详细地用图片展示了transformer模型的细节。所以准备把两篇干货合二为一,把一些当时理解上的难点在知乎里记录一下,但不会注重于nlp一些任务的细节。注:哈佛nlp组的代码适用于pytorch0.3版本,如果要在0.4版本上运行还需小改一下。

Attention is all you need模型笔记-3.jpg

1. 大框架

大框架很容易理解,但看上图又很复杂,简化一下左边一个encoder把输入读进去,右边一个decoder得到输出:
Attention is all you need模型笔记-4.jpg
当时第一个问题就是左边encoder的输出是怎么和右边decoder结合的。因为decoder里面是有N层的。再画张图直观的看就是这样:
Attention is all you need模型笔记-5.jpg
也就是说encoder的输出,会和每一层的decoder进行结合。
Encoder和Decoder的内部结构:
Attention is all you need模型笔记-6.jpg
2. 细节:  Multi-Head Attention 与 Scaled Dot-Product Attention

Attention is all you need模型笔记-7.jpg
先理解Scaled Dot-Product Attention里的Q,K,V从哪里来:
按照我的理解就是给我一个输入X, 通过3个线性转换把X转换为Q,K,V。
原博主的图示就展示的非常清晰好懂,由于画格子很困难我就直接截图了:
Attention is all you need模型笔记-8.jpg
输入:两个单词,Thinking, Machines. 通过嵌入变换会X1,X2两个向量[1 x 4]。分别与Wq,Wk,Wv三个矩阵[4x3]想做点乘得到,{q1,q2},{k1,k2},{v1,v2} 6个向量[1x3]。
Attention is all you need模型笔记-9.jpg
向量{q1,k1}做点乘得到得分(Score) 112, {q1,k2}做点乘得到得分96。
Attention is all you need模型笔记-10.jpg
对该得分进行规范,除以8。这个在论文中的解释是为了使得梯度更稳定。工程问题没什么好解释的。之后对得分『14,12』做softmax得到比例『0.88,0.12』。
Attention is all you need模型笔记-11.jpg
用得分比例「0.88,0.12」乘以[v1,v2]值(Values)得到一个加权后的值。将这些值加起来得到z1。这就是这一层的输出。仔细感受一下,用Q,K去计算一个thinking对与thinking, machine的权重,用权重乘以thinking,machine的V得到加权后的thinking,machine的V,最后求和得到针对各单词的输出Z。
Attention is all you need模型笔记-12.jpg
之前的例子是单个向量的运算例子。这张图展示的是矩阵运算的例子。输入是一个[2x4]的矩阵(单词嵌入),每个运算是[4x3]的矩阵,求得Q,K,V。
Attention is all you need模型笔记-13.jpg
Q对K转制做点乘,除以dk的平方根。做一个softmax得到合为1的比例,对V做点乘得到输出Z。那么这个Z就是一个考虑过thinking周围单词(machine)的输出。

注意看这个公式, 其实就会组成一个word2word的attention map!(加了softmax之后就是一个合为1的权重了)。比如说你的输入是一句话 "i have a dream" 总共4个单词, 这里就会形成一张4x4的注意力机制的图
Attention is all you need模型笔记-16.jpg
这样一来,每一个单词就对应每一个单词有一个权重
注意encoder里面是叫self-attention,decoder里面是叫masked self-attention。
这里的masked就是要在做language modelling(或者像翻译)的时候,不给模型看到未来的信息。
Attention is all you need模型笔记-17.jpg
mask就是沿着对角线把灰色的区域用0覆盖掉,不给模型看到未来的信息。
就别说,i作为第一个单词,只能有和i自己的attention。have作为第二个单词,有和i, have 两个attention。 a 作为第三个单词,有和i,have,a 前面三个单词的attention。到了最后一个单词dream的时候,才有对整个句子4个单词的attention。
Attention is all you need模型笔记-18.jpg
做完softmax后就像这样,横轴合为1

self-attention这里就出现一个问题,如果输入的句子特别长,那就为形成一个 NxN的attention map,这就会导致内存爆炸...所以要么减少batch size多gpu训练,要么剪断输入的长度,还有一个方法是用conv对K,V做卷积减少长度。
Attention is all you need模型笔记-19.jpg
对K,V做卷机和stride(stride的话(n,1)是对seq_len单边进行跳跃),会减少seq_len的长度而不会减少hid_dim的长度。所以最后的结果Z还是和原先一样(因为Q没有改变)。mask的话比较麻烦了,作者用的是local attention。

Multi-Head Attention就是把上面的过程做H次,然后把输出Z合起来。
Attention is all you need模型笔记-20.jpg
Attention is all you need模型笔记-21.jpg
(1)得到8个输出Z后将8个Z合在一起。(2)为了使得输出与输入结构对标 乘以一个线性W0 得到(3) Z。
Pytorch 代码:

在实现的时候在很多地方用了pytorch的view功能。
  1. [/code] 明白了这个细节后接下来就是
  2. [list=1]Transformer的结构:由一个encoder, 一个decoder,一个decoder后的输出层(generator),外加2个嵌入层(embed)组成。
  3. [/list][code]
复制代码
2. Encoder层的结构:Encoder总共有N层,每一层的结构为(输入进来通过multi-head attention,进入add&norm,进入前向网络再进入add&norm)。add&norm就是一个简单的layer normalization外加残差网络的结合。
Attention is all you need模型笔记-22.jpg
  1. [/code]3. Decoder: Decoder也总共有N层,每一层的结构为(输出进入第一层masked-multi-head attention后进入add&norm,再进入第二层multi-head attention后进入add&norm,再进入第三层的前向网络再进入add&norm得到输出。)
  2. Attention is all you need模型笔记-23.jpg
  3. [code]
复制代码
4. Generator:输出层就是简单的一个前向网络(Linear)外加一个softmax
Attention is all you need模型笔记-24.jpg
  1. [/code]
  2. [b]运行代码:[/b]
  3. 由于哈佛组的代码是基于0.3版本的pytorch的,在稍作修改后就可以在0.4版本的pytorch上运行了。之后用4块gpu并行运算试了一下效果跑了10轮,大概2个小时不到,每秒大概是22000左右个tokens 
  4. [code]
复制代码
总结:

别的一些细节例如对位置做嵌入
Attention is all you need模型笔记-25.jpg
,优化器的预热,学习率的调整等我觉得比较直观就不写了。该笔记主要针对transformer的模型理解。google之后在此之上应用在很多任务上,例如用这个生成wikipedia的总结,还有生成预训练。当然之后的模型都是丢掉了encoder,单独用decoder部分。

更新:  Language modeling 用transformer的公式

问题:

Model architecture:

where    is the context vector of tokens(one hot encodings), is the number of layers,    is the token embedding matrix, and    is the position embedding matrix. Let   be the length of the input and   be the dimension of the embedding.    and   . So   .
Transformer block:

where   .  is the length of the input and    is the dimension of the model (e.g., embedding dimension). LayerNorm is layer normalization.
MultiHead Attention:

where    is the number of heads,  is the input, the , and $ The output of the Attention is    and the output of the MultiHead is   .
Self-Attention:

where the    and   .
Position-wise Feed Forward Neural Network

where   ,   , and   .

卷积后的Attention
Attention is all you need模型笔记-55.jpg
作者非常友好啊... 代码链接:
https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/layers/common_attention.py#L4448​github.com
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|翁笔

Powered by Discuz! X3.3 © 2001-2018 Comsenz Inc.

返回顶部