目录
- 一、RNN和LSTM
- 二、Self-attention
- 三、Self-attention与CNN RNN GNN对比
一、RNN和LSTM
RNN
1.1 slot filling任务
- 让机器读一个句子:I would like to arrive Hainan on March 2nd.
1.2 RNN的基本结构是什么?
如果用Feedforward network解决slot filling, 会是什么样呢?首先要把Hainan表示成一个vector,可以用one-of-N encoding,也可用word hashing来表示,假设现在用one-of-N encoding,那么这个network的输出就是Hainan属于每一个slot的概率。
但是这样会存在一个问题,testing时遇到另一个句子:I would like to leave Hainan on March 2nd. Hainan在这个句子中是place of departure,可在RNN中输入Hainan它的输出依旧是destination的几率最高。这说明神经网络需要有memory,这就引出了RNN。
在RNN中,hidden layer的output会存在memory中,下一次在input vector进去之后会八之前存在memory的信息拿出来看,memory可以看作是另一个输入。
下图中红线代表存储信息,蓝色代表读取memory。
通过重复使用同一个网络,RNN依次读取一个句子,每都一个单词就产生一次输出。如果改变输入单词的顺序,输出也会随之改变。
如果输入的单词不一样,存在memory的信息也就不一样,那么下一次输出也不一样,可以参考下图的例子。
然RNN可以是deep的,可以有很多个hidden layer,上述例子中假设只有一层hidden layer
1.3不同种类的RNN
- 把the output of hidden layer存在memory的叫做Elman Network(4.2的例子) ,把the output of output layer存在memory的叫做Jordan Network在Jordan中, the output of output layer是有target的,所以Jordan的performance会更好。
- 双向训练
1.4 什么是LSTM (Long short-term memory)?
-
RNN有什么关系
-
目前为止讲的RNN是最简单的版本,实际上的memory是长成LSTM这样的,一般来说LSTM和RNN这两个名词可以互相代替。
LSTM可以看成一个有4个inputs,1个output的特殊neuron。4个inputs分别是
- 待处理数据输入
- 控制input gate的数值输入(控制新数据是否被叠加)
- 控制 forget gate 的数值输入(控制memory中的值是否被更新)
- 控制output gate的数值输入 (控制memory中的值是否被输出)
*
- 那么实作上这个neuron是如何工作的呢?假设我们现在有一个最简单的LSTM,每个gate的input都是一样的vector,那么我们这边在做的时候就是每一个input乘以每个gate的matrix,然后通过active function进行计算。这里做一个最简单的人肉LSTM。假设我们有一个序列是:
工作流程
简化的LSTM是
真正的LSTM还是更复杂的!LSTM会把上一个输出 ℎ^t 作为下一个输入的一部分, 也会把memory cell的值 c^t 作为下一个输入的一部分。c^t 也被叫做peephole。
二 Self-attention
1应用情境
输入任意长度个向量进行处理。
从输入看:
-
文字处理(自然语言处理)
-
将word表示为向量
- one-hot
- word-embedding
-
-
声音信号处理
- 每个时间窗口(Window, 25ms)视为帧(Frame),视为向量
-
图
-
每个节点视为一个向量
- Social graph(社交网络图)
- 分子式【one-hot】
-
从输出看
-
√ 输入输出数量相等【每个向量都有一个标签】⇒sequence Labeling
- 词性标注(POS tagging)
- 语音辨识(每个vector对应phoneme)
- 社交网络(每个节点(人)进行标注【是否推送商品】)
-
整个输入序列只有一个输出
- 文本情感分析
- 语者辨认
- 分子的疏水性
-
由模型决定输出的数目【seq2seq】
- 翻译
- 语音辨识
2基本原理
1. 特点
输出对每一个向量处理后的带黑框的向量(考虑整个序列 sequence 和 单个向量个体 的 信息)。将这些向量再连接一个 FC 全连接层,输出标签,得到对应结果
其中,self-attention 的功能是处理整个 sequence 的信息,而 FC 则是处理某一个位置的信息,Self-attention + FC 可以交替使用,知名文章:Attention is all you need ⇒Transformer
输入:一串的 Vector,这个 Vector 可能是整个 Network 的 Input,也可能是某个 Hidden Layer 的 Output
输出:处理 Input 以后,每一个 bi 都是考虑了所有的 ai 以后才生成出来的
- 计算相关性:有 点积 和 additive 两种方法计算相关性,我们主要讨论 点积 这个方法。输入的两个向量分别乘不同的矩阵,左边这个向量乘上矩阵 Wq 得到矩阵 q(query),右边这个向量乘上矩阵 Wk 得到矩阵 k(key),再把 q 跟 k 做 dot product(点积),逐元素相乘后累加得到一个 scalar 就是 相关性 α
把 a1 乘上 Wq 得到 q,叫做 Query(就像是搜寻相关文章的关键字,所以叫做 Query)
然后将 ai 都要乘 Wq 得到 k,叫做 Key,把这个Query q1 和 Key ki 进行 点积操作 就得到 相关性 α( α 叫做 Attention Score,表示 Attention计算出的 vector 之间的相关性)
attention score 还要经过一层 softmax 才能用于后续处理,其中 softmax 也可以换成其他的 activation function
分别抽取重要信息,根据关联性作加权求和得到 bi (一次性并行计算出 bi ,不需要依次先后得出)
优点: bi 是并行计算得出
3. 矩阵的角度表示 Self-attention 计算过程
① 计算 k,q,v (其中 Wq 、Wk 和 Wv 都是要学习的网络参数矩阵)
② 计算 α 并 Normalization
③ 计算 b
其中,
- I 是 Self-attention 的 input(一排 vector),每个 vector 拼起来当作矩阵的 column
- 这个 input 分别乘上三个矩阵, 得到 Q K V
- 接下来 Q 乘上 K 的 transpose,得到 A 。可能会做一些处理,得到 A' ,叫做Attention Matrix ,生成 Q 矩阵就是为了得到 Attention 的 score
- A' 再乘上 V,就得到 O,O 就是 Self-attention 这个 layer 的输出
二、Multi-head Self-attention
1. 特点
使用多个 q k v 组合,不同的 q k v 负责不同种类的相关性 例如在下图中,一共有2类, 1类的放在一起算,2类的放在一起算。相关性变多了,所以参数也增加了,原来只需要三个 W 矩阵,现在需要六个 W 矩阵
2. 计算步骤
- 先把 a 乘上一个矩阵得到 q
- 再把 q 乘上另外两个矩阵,分别得到 q1 跟 q2,代表有两个 head;同理可以得到 k1, k2,v1, v2
- 同一个 head 里的 k q v 计算 b.
- 将各个 head 计算得到的 bi 拼接,通过一个 transform得到 bi,然后再送到下一层去
3. Positional Encoding
每个向量所处的“位置”需要被编码
方法:每个位置用一个 vector ei 来表示它是 sequence 的第 i 个。加和到原向量中。
三 Self-attention与CNN RNN GNN对比
1. 和CNN的对比
CNN 可以看成简化版的 self-attention,CNN 就是只计算感受域中的相关性的self-attention。
- CNN:感知域(receptive field)是人为设定的,只考虑范围内的信息
- Self-attention:考虑一个像素和整张图片的信息 ⇒ 自己学出“感知域”的形状和大小
结论:
CNN 就是 Self-attention 的特例,Self-attention 只要设定合适的参数,就可以做到跟 CNN 一模一样的事情
self attention 是更 flexible 的 CNN
⇒ self-attention需要 更多的数据 进行训练,否则会 欠拟合;否则CNN的性能更好
- Self-attention 它弹性比较大,所以需要比较多的训练资料,训练资料少的时候,就会 overfitting
- 而 CNN 它弹性比较小,在训练资料少的时候,结果比较好,但训练资料多的时候,它没有办法从更大量的训练资料得到好处
2. 和 RNN 的对比
- 对 RNN 来说,最终的输出要考虑最左边一开始的输入 vector,意味着必须要把最左边的输入存到 memory 里面并且在计算过程中一直都不能够忘掉 , 一路带到最右边,才能够在最后一个时间点被考虑 (依次按顺序输出)
- 对 Self-attention 可以在整个 sequence 上非常远的 vector之间 轻易地抽取信息(并行输出,速度更快,效率更高)
3. 和 GNN 的对比
-
在 Graph 上面,每一个 node 可以表示成一个向量
-
node 之间是有相连的,每一个 edge 标志着 node 跟 node 之间的关联性
-
比如:在做Attention Matrix 计算的时候,只需计算有 edge 相连的 node
-
因為这个 Graph 往往是人為根据某些 domain knowledge 建出来的,已知这两个向量彼此之间没有关联(图矩阵中对应结点 i 与 结点 j 之间没有数值),就没有必要再用机器去学习这件事情
MORE
冷知识:有人说广义的 Transformer,指的就是 Self-attention
Self-attention 有非常非常多的变形,Self-attention 它最大的问题就是,它的运算量非常地大
paper:Long Range Arena比较了各种不同的 Self-attention 的变形
Efficient Transformers: A Survey 这篇 paper,介绍各式各样 Self-attention 的变形