BERT 就是 UNsupervised trained Transformer
Bert 只用到了 Transformer 结构中的 Encoder 部分,训练的时候不需要标注序列。
比如训练一个中英翻译模型,只收集中文语料就可以了,并不需要输入对应翻译之后的英文文本。
Transformer 就是 用到了大量 Self-attention layer 的 Seq2seq model
下面来看看 Self-attention layer 都做了哪些事情
因为传统的RNN不容易并行化 parallel ,一种解决办法是 用CNN来取代RNN。
用CNN也可以做到RNN的那种效果:输入一个seq,输出也是一个seq
但是这样存在的问题是 每一个CNN只能考虑非常有限的内容,比如上面的一个filter 可能只和3个vector相乘,而RNN可以考虑整个输入序列来决定输出。这里使 CNN可以考虑更长的序列的一个做法是multi-layer,上层的filter就可以考虑更长的序列信息。
但是要叠很多层,才能看到较长的序列信息,这是CNN处理序列信息的一个缺点。
于是,Self-attention 闪亮登场~ ^_^
可以把 self-attention 看做是一个新的 layer,它也是输入一个seq,输出一个seq。
self-attention的特别之处是:它和 bidirectional-RNN有同样的能力,每一个输出向量能看到所有输入向量(input seq ,整个序列信息),但是 self-attention 可以并行计算每一个output vector。
-
Attention is all you need : 意思是只用Attention就可以,不需要再用RNN 或者 CNN
Attention有很多种计算方法:基本原理是 根据两个向量(输入两个向量),返回这两个向量的“相关”程度(衡量指标可以是一个 - 分数),Paper中用的是下面的 attention 计算方法。
然后经 Soft-max 层 处理,注意这里的α1,1 - α1,4 都是scalar 常数
然后把soft-max 之后的结果(常数)与对应的v向量相乘,并累加求和,就的到了一个输出变量(output vector) b1
同理 求b2
下面看看 Self-Attention 是怎么做到 parallel 的
其实主要也是用矩阵乘法来实现的并行
然后计算α时也可以用矩阵来处理,见下下张
整体拼接起来
注意:
Attention 矩阵中的每一个 element
表示 input sequence 中每一个位置序列两两之间的 Attention
计算输出vector组成的矩阵
总览:
Self-attention 的变形 Multi-head Self-attention
然后乘以Wo矩阵 降维
Multi-head 中每一个head关注的点可以是不一样的,比如有一个head 关注的是local input seq 短距离的输入序列,有的head关注的是global 长距离的输入序列,不同的head 各司其职,共同实现输出序列的计算。
Positional Encoding - 位置编码
上面的计算可以发现,self-attention 没有考虑到位置信息,而位置信息一般在序列中还是蛮重要的,比如You go first,一般翻译成你先走,而不是你走先;
再比如:我喜欢苹果,因为它比较好吃。/ 我习惯苹果,因为它比安卓稳定。显然对句子的理解都是需要位置信息的。
所以可以想办法把位置信息加进去。
下面看看 Seq2seq 中怎么使用Attention
可以用self-attention 替换RNN
Transformer 架构 -- 这里以机器翻译为例:
注意力权重的分布
下面的结果表明:
当句子中的指代关系发生变化时,Attention 的值也会相应发生变化。
比如:
这只动物没有穿过马路,因为它太累了。 (动物累)
这只动物没有穿过马路,因为它太宽了。(马路宽)
Multi-head Attention 特点
应用:输入 文档的集合,输出类似Wikipedia的结果
比较令人amazing的地方是 输入序列长度 高达10的6次方
并列多个Transformer
Transformer 还可以用在图像上