文章目录
前言
复杂的输入
目前的学习输入都可以看成一个向量,大小一样,无论是Youtube预测观看人数,还是影像处理。
如果我们的输入是一排向量(序列),而且向量的数目还是可以改变的呢?
Example1:文字处理
向量集作为输入
句子的长度不一样,你的向量集大小就不一样。
怎么把词变成向量呢?
- one-hot encoding,最简单的
但存在一个严重的问题,他假设所有词汇彼此之间都没有关系 - word embedding
Example2:语音处理
创建window(长度通常25ms),把window映射成向量,为了描述一整段声音信号,我们移动window(步长通常为10ms)。
window映射成向量常见方法:
Example3:图
图也是一堆向量,把每个点看成向量。
输出是什么样的?
输入每一个向量都有一个标签(Sequence Labeling)
- Example1:POS tagging(词性标注)
- Example2:根据已有音频材料预测音位
- Example3:是否购买
输入一整个序列对应一个标签
- Example1:情感分析
- Example2:语音辨认是谁讲的
- Example3:分子的亲水性
模型自己决定标签数目(Seq2Seq)
一、Sequence Labeling的方法
全连接(fully-connected)
但是fully-connected network对于前后一样的saw无法输出一个是动词,一个是名词不一样的结果。
那有没有可能让fully-connected network考虑上下文信息呢?
那这个向量与前后两个向量都串起来,构成一个向量,丢到fully-connected network就结束了。
但是现在如果某个任务不是考虑window就能解决,而是要考虑整个序列怎么办?
那么我开一个window把整理序列都盖住,但序列有长有短,你就要统计最长的序列长度,那么fully-connected network参数很多,就容易Overfitting
二、Self-Attention
self-Attention可以叠加多层
下面看如何产生
b
1
b_1
b1这个向量:
根据
a
1
a_1
a1在序列中找出与
a
1
a_1
a1相关的向量
那么如何确定两个向量的关联性
α
\alpha
α呢?
那么就需要两个计算Attention的模组
那么就需要两个向量做输入,输出
α
\alpha
α,当做两个向量的关联程度。
-
Dot-product
-
Additive
α \alpha α,两个向量的关联程度的计算方法有很多,我们只讨论Transformer里面也是最常见的计算方法,就是Dot-product。
下面讨论怎么把Dot-product用在self-Attention里面呢?
计算
a
1
a_1
a1与其他的关联性
做normalization比如Softmax
基于attention score抽取信息
如果说
a
1
a_1
a1与
a
2
a_2
a2的关联性很强,那么
b
1
b_1
b1就会很接近
v
2
v_2
v2
那么就完成了从输入到
b
1
b_1
b1.
矩阵表述:
多头注意力
多头的原因是相关性的定义是多样的,每个头自己做运算在拼一起
Position Encoding – self-attention是缺少位置信息的
给每个位置都有唯一的位置向量
每一列都表示一个位置向量:
一些对Position Encoding的研究
https://arxiv.org/abs/2003.09229
self-attention被广泛应用:
- 如NLP
- 当然他也可以用在语音处理:
由于语言是非常长的序列,变成向量会非常长,所以我们要做变动。
如果序列非常长,矩阵维度高,占内存大。
所以我们可以采用截断自注意力(Truncated Self-attention)
- 图片处理
图片也可看成一系列向量
Self-Attention v.s. CNN
CNN可以被看成简化版的self-attention
用数学的方式说明CNN是self-attention的特例 – https://arxiv.org/abs/1911.03584
Self-Attention v.s. RNN
- Self-Attention 考虑了整个序列的信息,RNN只考虑了前面已经输入序列的信息。
当然我们使用双向RNN也可以考虑到右侧部分的信息,但是需要把最左面的信息存在memory里面,不能忘记,带到最右边才能在最后一个时间点被考虑。但是self-attention即使很远,也可以容易抽取信息。
- RNN没办法平行化
各种研究,减少计算量是研究的重点。