应用场景
输入
输入是a sequence of vectors,且长度可变
- 传统的全连接神经网络:无法处理可变长的sequence
- 如果做变换,例如每个vector输入给一个FC,会丢失全局信息
- 如果考虑一定window,由于输入的sequence不定长,除非选一个极大的window - 影响算力 & 可能导致overfitting
- 因此,考虑self-attention机制:不定长sequence + 全局信息
- 实际上,CNN和RNN也可以处理不定长的问题,具体的比较见全文最后。
- sentence:如何将词汇表示成vector
- one-hot encoding:假设了每个词汇之间独立
- word embedding:www.youtube.com/watch?v=X7P…
- audio:每个frame视作一个向量
- attention各个vector之间的相关性,不必靠模型找,可以作为输入(哪些edge无需考虑)
- graph:每个节点视作一个向量
输出
针对不同的输出,在self-attention后面加不同的模块,例如sequence-labeling,经过self-attetion之后,再经过N个全连接网络即可。也可以多层叠加:self-attention处理整个sequence的信息,fully-connected network处理单个vector的信息,交替进行。
- Each vector has a label - sequence labeling: POS tagging, labeling potential customers, etc.
- The whole sentence has a label: sentiment analysis
- Model decides the number of labels itself - seq2seq : 翻译,语音辨识等
self-attention
具体机制
为了避免采用一个大的window考虑整个sequence,self-attention机制会找出和每个向量相关的向量,即计算向量两两之间关联的程度。
常见计算方式包括dot-product(最常用)和additive等。
具体流程:
- step1:用每个query去找相关的key
- step2:用softmax做normalization
- step3
Positional encoding
在self-attetion中,不同位置的输入没有区别,因为做了sum。所以在每个位置i,在的基础上,加上一个vector 。
Multi-head self-attention
“相关性”有很多形式,因此可能一个query不够,需要多个query去负责不同的相关性。相应地,也需要不同的key和value。
truncated self-attention
输入过长 & 不需考虑全局信息时,可以简化计算
self-attention vs CNN
CNN相当于简化版的self-attention,固定了窗口,丢失了部分全局信息。
self-attention vs RNN
- 两者都是处理sequence
- 如果是双向RNN,可以认为也考虑了整个sequence,和self-attention一样。但是,对于每个vector而言,在RNN中考虑距离较远的vector更难。 - 梯度消失
- 同时,RNN无法并行处理所有vector。