2021李宏毅机器学习笔记--17 transformer
摘要
Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。更准确地讲,Transformer由且仅由self-Attenion和Feed Forward Neural Network组成。一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建。采用Attention机制的原因是考虑到RNN(或者LSTM,GRU等)的计算限制为是顺序的,也就是说RNN相关算法只能从左向右依次计算或者从右向左依次计算。Transformer使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量,它不是类似RNN的顺序结构,因此具有更好的并行性。
一、transformer
Transformer的知名应用——BERT——无监督的训练的Transformer。
Transformer是BERT的核心模块
Transformer是一个seq2seq模型,并且大量用到了"Self-attention",接下来就要讲解一下"Self-attention"用到了什么东西
Sequence就会想到RNN,单方向或者双向的RNN。
RNN输入是一串sequence,输出是另外一串sequence。
RNN常被用于输出是一个序列的情况,但是有一个问题——不容易被平行化(并行)。
单向RNN的时候,想要算出b4,必须先把a1,a2,a3都看过才可以算出a4。双向则得全部看完才会有输出。
于是有人提出用CNN取代RNN
一个三角形是一个filter,输入为sequence中的一段,此刻是将三个vector作为一个输入,输出一个数值。
将三个vector的内容与filter内部的参数做内积,得到一个数值,将filter扫过sequence,产生一排不同的数值。
有多个filter,产生另外一排不同的数值
我们可以看到,用CNN也可以做到和RNN类似的效果:输入一个sequence,输出一个sequence。
表面上CNN和RNN都可以有同样的输入输出。
但是每个CNN只能考虑很有限的内容(三个vector),而RNN是考虑了整个句子再决定输出。
CNN也可以考虑更长的信息,只要叠加多层CNN,上层的filter就可以考虑更加多的信息。
eg:先叠了第一层CNN后,叠加第二层CNN。第二层的filter会把第一层的output当作输入,相当于看了更多的内容。
CNN的好处在于可以并行化。
CNN的缺点在于必须叠加多层,才可以看到长时间的信息,如果要在第一层filter就要看到长时间的信息,那是无法做到的。所以有Self-Attention。
二、Self-Attention
Self-Attention做的事情就是取代RNN原本要做的事情。
关键: 有一种新的layer—— Self-Attention,输入输出与RNN一样,都是sequence。
特别的地方在于,和双向RNN有同样的能力,每一个输出都是看过整个input sequence,只不过b1 b2 b3 b4是可以同时算出来的,可以并行计算!
输入sequence x1~x4,通过乘上一个W matrix来得到embedding a1~a4,丢入Self-attention,每一个输入都分别乘上三个不同的transformation matrix,产生三个不同的vector q,k,v。
q代表query,用来match其他人
k代表key,用来被匹配的
v代表要被抽取出来的信息
拿每个query q去对每个key k做attention,我们这里用到的计算attention的方法是scaled dot-product。
attention本质就是输入两个向量,输出一个分数。
除以 √d的一个原因是:d是q和k的维度,q和k做inner product,所以q和k的维度是一样的为d。
除以 √d的直观解释为q和k做内积/点积的数值会随着维度增大 他的variance越大,所以除以来 √d平衡。
不除以d会梯度爆炸,不收敛,推一推梯度就能的到结果
通过一个softmax函数