Transformer简单笔记
主要来自于李宏毅老师的视频,在此之上进行了重点信息的总结。
Self-attention
对于神经网络的输入,可能是一个vector或者一组vector,例如输入是一句话,可以将每个词处理后作为一组vector输入到网络中。
- 上图是简单版本Self-attention的使用
- 有几个vector输入就有几个vector输出
- Self-attention的输出考虑到了整个sequence
self-attention要做的事情简单来说,输入一组vector,根据vector之间的相关联程度,计算并输出一组output vector。
Self-attention输出的计算流程(以为例)
- 第一步,计算输入向量和其他向量相关程度
- 如何计算任意两两vector之间的
- 常用方法如下,一般采用Dot-product
- 以计算为例,首先拿矩阵和输入向量相乘获得中间矩阵
- 再拿矩阵分别和其他输入向量相乘获得中间矩阵
- 和进行Dot-product获得
- 将通过Softmax获得最后的相关性输出
- Note: 不是一定需要Softmax,可以替换其他方法
- 如何计算任意两两vector之间的
- 第二步,基于上面得到的attention scores来抽取sequence里面的重要信息
- 将每个vector乘上wv矩阵得到中间矩阵
- 使用先前计算的乘上,最后累加得到最后的
- 其余的计算方法类似
从矩阵角度来进行操作
简化版
- 只有 需要学习
Attention和Self-attention的区别?
-
以Encoder-Decoder框架为例,输入Source和输出Target内容是不一样的,比如对于英-中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子,Attention发生在Target的元素Query和Source中的所有元素之间。
-
Self-attention,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的Attention。
-
两者具体计算过程是一样的,只是计算对象发生了变化。
Multi-head Self-attention
为什么需要Multi-head Attention?
- 可以让Attention有更丰富的层次。有多个QKV的话,可以分别从多个不同角度来看待Attention。这样的话,输入a,对于不同的multi-headed Attention,就会产生不同的b
- 从直觉上理解为什么需要multi-headed Attention
- 首先观察上面左图,每个单词对应八个attention,八个attention分别用蓝色到灰色表示,首先确定一个单词it,可以从左图中看到其他单词与it的相关性
- 提取出橙色和绿色的色块,可以看到单词it对应橙色色块最深的是animal,绿色色块最深的是tire,橙色的注意力主要表明it是个什么东西,从东西的角度说明它是一种动物,而不是苹果或者香蕉。如果我们从状态这个层面来看,it这个动物现在是在怎么样的一个状态,它的状态是tired,而不是兴奋。所以不同的Self-Attention Head是不同方面的理解。
Positional Encoding
通过前面的内容可以发现,Self-attention缺少了非常重要的位置信息。
处理方法
- 为每一个位置设定一个位置vector ei,每一个不同位置都有自己的一个位置vector
- ei如何设定?
- hand-crafted
- learn from data
- 尚待研究
Transformer
transformer本质上是一个Sequence-to-sequence(Seq2seq) model,即输入一个sequence,输出一个sequence,输出长度由model自己决定。
应用场景
- 语音识别
- 机器翻译
- 语音翻译
- Chatbot
Seq2seq Model
Seq2seq model主要有Encoder和Decoder构成。
Encoder
黄色为输出的中间vector
- 左边为第一步,将Self-attention的结果做residual处理,再经过一层layerNormalization,将输出作为右边第二步的输入
- 右边为第二步,将输入经过一次FC layer的结果继续做一次residual处理,再经过一层layerNormalization,最后再输出
思考:为什么需要用layerNormalization?阅读论文
总览
- 上述为原始论文的结构,该变layerNormalization的位置可能会有更好的结果
- 这里Input Embedding输入的三个箭头可以看做计算的Q,K,V矩阵
Decoder
- 在Encoder计算完成后,输入作为Decode的参数
- 开始时,输入为一个BEGIN vector,Decoder计算出初始输出
- 后续Decoder将自己的输出又作为输入继续计算
- 直到Decoder输出end标志为止
总览
什么是Masked Multi-head Attention?
- 可以看到在原来的Self-attention中,计算需要考虑到全部的输入vector ,但是decoder只能接受来自于自己前面序列的信息,因此变为下面的形态
- 具体计算的变化(以为例)
- 可以看到的计算不再需要,的参与
Cross attention如何运行?
可以看到encoder输出的两个箭头分别表示K, V矩阵,与Masked Sell-attention输出的Q矩阵进行对应操作得到中间变量进行输出。
在原始网络中,Decoder有许多Block,Encoder最后的输出需要分别发送到这些Block中,但是也有许多的变体。
Autoregressive(AT) VS Non-autoregressive(NAT)
- AT是根据输入每次只产生一个输出vector
- NAT不是一次只产生一个vector,而是一次将整个句子进行输出
- 如何确定NAT的输出长度?
- 使用另外一个predictor进行预测
- 输出一个非常长的sequence,忽略掉第一个END之后的内容
- NAT的优点
- 可并行性
- 可以控制输出的长度
- NAT通常比AT表现差(Multi-modality问题)
Training
- Decoder每一次的输出,需要和Ground truth计算一次cross entropy,相当于做分类问题,我们需要最小化所有cross entropy的总和
- 每次的输入为标准答案,而不是上一次decoder的输出(Teacher Forcing)
- 问题: 训练过程中学习的是正确答案,但是test过程中不一定保证每一次的输出都是正确答案,如果输出错误答案,会大大影响后续的计算,如何合理解决?(exposure bias)
- 训练过程中给decoder的输入增加一些错误项(Scheduled sampling)
Others
- Beam search
- BLEU score