-
袁源是微软推荐系统的主管
-
深度学习流行不代表机器学习就没用了,因为no free lunch。
-
能不能不用RNN来做NLP呢?Transformer就是答案:可以利用attention代替RNN,效果比RNN还要好。
-
在Transformer之前用的最多的是基于RNN的encoder-decoder模型
-
BERT是基于DAE来的,可以先了解一下Auto-Encoder
-
弄明白ELMO,弄明白GPT很简单
![](https://img.haomeiwen.com/i4463968/a1bfd939a379a634.png)
流程如下:
![](https://img.haomeiwen.com/i4463968/2e9c82939e244e8a.png)
-
RNN因为用递归的方式,所以会有梯度消失、梯度爆炸的问题。LSTM和GRU只能缓解,不能完全消除这个问题。
-
Transformer分为两块,左面是encode右面是decode。Nx表示这个结构可以循环很多次。decode中间使用了cross-attention。
self-attention是训练出来的吗
如图:
![](https://img.haomeiwen.com/i4463968/09a9c254d4b8e6da.png)
Transformer中Encoder的一个模块:
![](https://img.haomeiwen.com/i4463968/463f556d2b5356d0.png)
但右面不同单词之间的强弱是怎么计算出来的呢,下面用一页将Self-attention的计算机制解释出来。(其实是解释了一遍Self-attention的计算流程)
![](https://img.haomeiwen.com/i4463968/044c6f4828faf252.png)
我们有了x1,x2,目的是转化为z1,z2。wq,wk,wv是随机初始化的,首先计算q1,k1,v1:
q1 = x1 × wq
k1 = x1 × wk
v1 = x1 × wv
现在我们就有了x1,q1,k1,v1
???疑问:他么只是相乘了同一个矩阵,并没有发生信息交换。
目标:z1 = v1θ1+v2θ2
score1 = q1点积k1;score2 = q2点积k2
求值softmax,得出θ:
![](https://img.haomeiwen.com/i4463968/86913f0d31d50547.png)
更新v1,v2:
![](https://img.haomeiwen.com/i4463968/bf7634d6a9ab2d82.png)
因为 z1 = v1θ1+v2θ2,z1已经得出
要求z2时,要将q1.k1 q1.k2换成q2.k1 q2.k2
![](https://img.haomeiwen.com/i4463968/6830573cdfe89449.png)
???为什么x1和下一个单词计算,x2和上一个单词计算。那x3x4是和哪个单词一起计算?
???self attention 和 全连接有何不同
qkv的方式来自于信息检索:
![](https://img.haomeiwen.com/i4463968/dae1ed8da5b752dc.png)
如果x1,x2,x3这样逐个计算会增加GPU开销,可以将x1x2合并为一个矩阵进行计算可以优化计算效率,将矩阵乘法的计算量缩减为二分之一:
![](https://img.haomeiwen.com/i4463968/020ded9cf10ee21e.png)
multi-headed即产生多个不同的Wq,Wk,Wv,这样使得attention有更丰富的层次:
![](https://img.haomeiwen.com/i4463968/f8aa646207b7963a.png)
问:如何将多个版本的z合成一个独立的z?(为什么要合成一个独立的z?)
答案:通过全连接(即✖️一个W矩阵)合成一个z
![](https://img.haomeiwen.com/i4463968/bd9ccf7f546ac6bb.png)
![](https://img.haomeiwen.com/i4463968/7ad34e06045489a3.png)
Z1经过两层全连接网络变成R1,R1变为下一个encoder的X1:
![](https://img.haomeiwen.com/i4463968/bf6b8f5d9582b41f.png)
不同head对it的理解不同,有的关注指代关系(关注the animal),有的关注状态关系(tired):
![](https://img.haomeiwen.com/i4463968/3b127e899dd84efa.png)
在encoder0输入之前,不止做embedding,还要做positional encoding。 但这个讲师对positional encoding的计算讲的非常不清楚。
positional encoding的计算方法不是唯一的,可以不用作者的那种方式。
![](https://img.haomeiwen.com/i4463968/7acda65dd63f8806.png)
这里也借鉴了跳跃连接:
![](https://img.haomeiwen.com/i4463968/51f387d600eef0b4.png)
层正则化的介绍,对t层进行的操作:
![](https://img.haomeiwen.com/i4463968/036663190953e18f.png)
Layer norm只考虑每一批数据自己,这样就和batch size解耦:
![](https://img.haomeiwen.com/i4463968/bfefab21210285ca.png)
encoder部分全景概览:
![](https://img.haomeiwen.com/i4463968/e0299a5cc67e0d17.png)
Decoder层与Encoder层的区别在于添加了Encoder-Decoder Attention层,利用到了Encoder中的输出作为Decoder的输入:
![](https://img.haomeiwen.com/i4463968/1fcb82ac2a4b421a.png)
Decoder工作过程:
![](https://img.haomeiwen.com/i4463968/f8f3a0ba60817013.png)
先生成一个与词表长度对应的长向量,再用softmax归一化:
![](https://img.haomeiwen.com/i4463968/2f9d96a3ccbbdedb.png)
使用交叉熵计算输出
![](https://img.haomeiwen.com/i4463968/b7da2b0895208601.png)
优缺点:
![](https://img.haomeiwen.com/i4463968/ab6424dc7dd18b41.png)
Encoder和Decoder的结合方式:
![](https://img.haomeiwen.com/i4463968/1df7081e12798d56.png)
网友评论