听课(李宏毅老师的)笔记,方便梳理框架,以作复习之用。本节课主要讲了self-attention的输入输出,内部架构和工作流程计算方法,以及介绍了更高阶的self-attention——muli-head self-attention,还有位置编码,self-attention的应用以及与其他网络的对比。
1. 输入
1.1 复杂的输入
在之前的学习中我们学到的都是一个向量作为输入
但是在自然语言处理中我们的输入可能是很多vector(比如说一句话,那么一个字就是一个vector)
1.2 输入类型
1.2.1 文字
我们可以选择这样的方法:比如有一种语言有十万词汇,那么每个向量长度就是10万,比如下图左侧的编码方法。但是这样就表现不出来语义的相似,比如dog和cat其实是动物一类的,他们的vector表示方法应该有一些相似的地方。
所以我们想出来了一种新的方法,叫做word embedding,这种方法将词汇分类编成向量,将相似语义的词汇编到一起更合理。
1.2.2 语音
25ms作为一个窗口,每次滑动10ms
1.2.3 图
图也可以作为一个输入,一个图有很多节点,每个节点与其他节点相连接形成边,这些边和结点的关系形成图
2. 输出
每个vector都有一个label,e.g.词性标注
一个序列有一个label,e.g.文本情感分析
由模型自己决定输出多长,e.g.翻译
3. 序列标注
3.1 采用Fully Connected?
一开始想的是每个vector都单独丢进一个fc network,但是如果我们在做词性标注问题,很有可能只会输出一种结果,对于多词性的单词,这样的结果是不准确的,我们必须考虑到该单词的语境和所在句子的位置。
进一步的方法是开一个window,每次都将当前的vector前后的vector一起丢入fc network,但是如果要考虑到整个句子怎么办?难道开一个window长度覆盖整个序列吗?
这样做其实也不太好。一是要知道sequence多长,二是参数太多,可能造成over fitting。
所以我们提出了一种新的方法:self-atttention
3.2 Self-attention
结构如下
self-attention可以叠加
self-attention层内部架构
α是用来描述ai与aj之间的相关性的
计算α的两种方式:左边是用dot-product,更加常用,transformer里也是用的这个。q=aWq,k=aWk
q跟k相乘得α
得到α之后需要使用softmax转换成α’
得到α’还没结束,每个α’还需要α’*v,再加起来
b2,b3,b4等如法炮制,最后b1,b2,b3……是同时得出的
用矩阵表示self-attention的计算过程
先计算出q,k
再计算出α,通过soft-max计算出α’
再计算出b
整体回顾
只有Wq,Wk,Wv是需要学习的参数
3.3 Multi-head Self-attention
进阶版self-attention:有可能会有不同种类的相关性
相比起self-attention,multi-head self-attention就有很多的q,以两个q举例,每一个vector都有两个q,两个k,两个v,qi1只跟ki1,kj1相乘,不跟ki2,kj2相乘,相当于有多少个头就有多少套qkv,一套qkv只跟自己一套里面的做运算
最后会算出来两套b,再*Wo就变成一个b了
4. Positional Encoding
ei可以人为设定,但是也可以从数据中学得,比如使用sin和cos函数
计算ei有多种方式,目前尚待研究
5. 应用
self-attention应用于transformer和bert,在NLP中也应用广泛
5.1 语音
当sel-attention用于语音时,会产生很长的vector。考虑到内存和运算速度,提出了truncated self-attention。truncated self-attention只考虑局部范围,不看一整句话。
5.2 图像
5.3 图
6. 对比
6.1 self-attention vs CNN
CNN考虑receptive field里的资讯
self-attention考虑整张图片的资讯
CNN是self-attention的特例
CNN在更小的数据集下表现更好,当数据量增大,CNN没法从更大的资料集中得到好处
Self-attention在数据量更大的数据集下表现更好
6.2 self-attention vs RNN
RNN是串行的,self-attention是并行的,速度会更快