自注意力机制 self-attention

34 阅读2分钟

应用场景

输入

输入是a sequence of vectors,且长度可变

  • 传统的全连接神经网络:无法处理可变长的sequence
  • 如果做变换,例如每个vector输入给一个FC,会丢失全局信息
  • 如果考虑一定window,由于输入的sequence不定长,除非选一个极大的window - 影响算力 & 可能导致overfitting
  • 因此,考虑self-attention机制:不定长sequence + 全局信息
  • 实际上,CNN和RNN也可以处理不定长的问题,具体的比较见全文最后。

image.png

  • sentence:如何将词汇表示成vector
  • 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 : 翻译,语音辨识等

image.png

self-attention

具体机制

image.png

为了避免采用一个大的window考虑整个sequence,self-attention机制会找出和每个向量相关的向量,即计算向量两两之间关联的程度。 常见计算方式包括dot-product(最常用)和additive等。 image.png

具体流程:

  • step1:用每个query去找相关的key image.png
  • step2:用softmax做normalization image.png
  • step3 image.png

Positional encoding

在self-attetion中,不同位置的输入没有区别,因为做了sum。所以在每个位置i,在aia_i的基础上,加上一个vector eie_i

Multi-head self-attention

“相关性”有很多形式,因此可能一个query不够,需要多个query去负责不同的相关性。相应地,也需要不同的key和value。

image.png

truncated self-attention

输入过长 & 不需考虑全局信息时,可以简化计算

self-attention vs CNN

CNN相当于简化版的self-attention,固定了窗口,丢失了部分全局信息。

image.png

image.png

self-attention vs RNN

image.png

  • 两者都是处理sequence
  • 如果是双向RNN,可以认为也考虑了整个sequence,和self-attention一样。但是,对于每个vector而言,在RNN中考虑距离较远的vector更难。 - 梯度消失
  • 同时,RNN无法并行处理所有vector。