文章目录
- 0x00、先导知识
- 0x01.第一层境界
- 0x02、第二层境界
-
- 由浅入深,由表及里,渐入佳境
-
- 宏观视角(A High-Level Look)
- 将张量引入图片(Bringing The Tensors Into The Picture)
- 开始“编码”(Now We’re Encoding! )
- 从宏观视角看自注意力机制(Self-Attention at a High Level)
- 从微观视角看自注意力机制(Self-Attention in Detail)
- 通过矩阵运算实现自注意力机制(Matrix Calculation of Self-Attention)
- “多头怪”(The Beast With Many Heads)
- 使用位置编码表示序列的顺序( Representing The Order of The Sequence Using Positional Encoding)
- 残差模块 (The Residuals)
- 解码侧(The Decoder Side)
- 最终的线性变换和Softmax层(The Final Linear and Softmax Layer)
- 训练部分总结(Recap Of Training)
- 损失函数(The Loss Function)
- 再进一步(Go Forth And Transform)
- 0x03.第三层境界
- 参考文章:
@author by xubing
0x00、先导知识
0.1 Seq2Seq
0.2 Attention
0x01.第一层境界
高屋建瓴,会当凌绝顶
- 文章题目:《Attention is all you need》
- 发表时间:2017.06
- 作者:Google(几位作者全部是一作)
- 传统的编码器解码器一般使用RNN,这也是在机器翻译中最经典的模型。但RNN难以处理长序列的句子,无法实现并行,并且面临对齐问题。
- Attention模型就是在Encoder和Decoder之间增加了Attention层,解决了长距离依赖的问题。
(长距离依赖信息”可以这么来理解:[1]一个词其实是一个可以表达多样性语义信息的符号(歧义问题)。[2]一个词的语义确定,要依赖其所在的上下文环境。(根据上下文消岐)[3]有的词可能需要一个范围较小的上下文环境就能确定其语义(短距离依赖现象),有的词可能需要一个范围较大的上下文环境才能确定其语义(长距离依赖现象)。)
- 而本文提出的Transformer抛弃了传统的CNN和RNN,只使用Attention 机制。
- 并且在Attention的基础增加了位置向量,保留了单词序列信息。
- 还提出了两个新的Attention机制,Sacled Dot-Product Attention和Multi-head Attention。
- Attention是Seq2Seq的升级版,Transformer是Attention的升级版。
总结
- 本文的创新点:抛弃了之前传统的Encoder-Decoder模型必须结合CNN或RNN的固有模式,只用了Attention。提出了两个新的attention 机制,分别叫做Scaled Dot-Product Attention和Multi-head Attention。
- 与之前的模型的对比: 减少了计算量、提高了并行效率、任务效果提升。
- 模型的应用:机器翻译、文档摘要、对话系统…
0x02、第二层境界
由浅入深,由表及里,渐入佳境
宏观视角(A High-Level Look)
我们先把Transformer想象成一个黑盒子,在机器翻译的领域中,这个黑盒子的功能就是输入一种语言然后将它翻译成其他语言。如下图:
打开这个黑盒子,可以看到,这个黑盒子由两个部分组成:Encoders和Decoders。(注意结尾加s)
再进行进一步的剖析,可以看到Encoders由6个Encoder组成,Decoders由6个Decoder组成。
打破砂锅拆到底,每一个Encoder由两部分组成,每一个Decoder由三部分组成。
还可以再细分吗? - 可以,不过这里我们先解释一下每个层的功能。
- 每个Encoder的输入首先会通过一个self-attention层,通过self-attention层帮助Endcoder在编码单词的过程中查看输入序列中的其他单词。
- Self-attention的输出会被传入一个全连接的前馈神经网络,每个encoder的前馈神经网络参数个数都是相同的,但是他们的作用是独立的。
- 每个Decoder也同样具有这样的层级结构,但是在这之间有一个Attention层,帮助Decoder专注于与输入句子中对应的那个单词(类似与seq2seq models的结构)
将张量引入图片(Bringing The Tensors Into The Picture)
用一个具体的例子来解释,观察从输入到输出的过程中这些数据在各个网络结构中的流动。
首先,进行embedding
每个单词被映射到一个512维的向量。词嵌入(embedding)的过程只发生在最底层的一个Encoder。
在每个单词进入Self-Attention层后都会有一个对应的输出。Self-Attention层中的输入和输出是存在依赖关系的,而前馈层则没有依赖,所以在前馈层,我们可以用到并行化来提升速率。(重点:并行在前馈层)
开始“编码”(Now We’re Encoding! )
如上图所示,每个位置的单词首先会经过一个self attention层,然后每个单词都通过一个独立的前馈神经网络(这些神经网络结构完全相同)。
从宏观视角看自注意力机制(Self-Attention at a High Level)
Self Attention是本文提出的新的概念,假设下面的句子就是我们需要翻译的输入句:
The animal didn't cross the street because it was too tired.
- 这句话中的"it"指的是什么?它指的是“animal”还是“street”?对于人来说,这其实是一个很简单的问题,但是对于一个算法来说,处理这个问题其实并不容易。self attention的出现就是为了解决这个问题,通过self attention,我们能将 “it” 与 “animal” 联系起来。
- 当模型处理单词的时候,self attention层可以通过当前单词去查看其输入序列中的其他单词,以此来寻找编码这个单词更好的线索.
- self-attention正是transformer中设计的一种通过其上下文来理解当前词的一种办法。你会很容易发现…相较于RNNs,transformer具有更好的并行性。
如上图,是我们第五层Encoder针对单词’it’的图示,可以发现,我们的Encoder在编码单词‘it’时,部分注意力机制集中在了‘animl’上,这部分的注意力会通过权值传递的方式影响到’it’的编码。
从微观视角看自注意力机制(Self-Attention in Detail)
计算self attention的第一步是从每个Encoder的输入向量上创建3个向量(在这个情况下,对每个单词做词嵌入)。所以,对于每个单词,我们创建一个Query向量,一个Key向量和一个Value向量。
如何产生QKV:这些向量是通过词嵌入乘以我们训练过程中创建的3个训练矩阵而产生的。(矩阵最开始是随机的)
以下是两个词的演示:
- 第1步:为每个单词生成qkv
q 1 = X 1 ∗ W Q , q 2 = X 2 ∗ W Q , q_1 = X_1 * W^Q,q_2 = X_2 * W^Q, q1=X1∗WQ,q2