自注意力机制

1. 背景

当输入的input 是一系列的vectors(而且长度会发生变化)。
如果把我们句子里面的每一个词汇都用一个model来描述的话,那么我们model的输入,就会是一个vector set,长度每次根据句子的长度不一样而不一样。
如何对词汇进行编码呢?

  1. 独热编码(One-hot 编码)
    对每一个词汇都设置一个位置,比如:
    apple=[1 0 0 0 0 0...]
    bag  =[0 1 0 0 0 0...]
    cat=[0 0 1 0 0...]
    dog=[0 0 0 1 0...]
    ...
    
    但是无法判断cat 和dog同样都是一个种类的,这个向量里面没有任何的语义讯息。
  2. word embedding
    把它给画出来,发现同一类的都会聚集在一起。

对于output:

  1. 每一种长度的vector 都有一个label:
    比如输入N长度的,输出N长度的。应用:词性标注
  2. 整个序列输出一个label,比如:情感分析
  3. 模型自己决定输出序列的长度,因为不知道到底要输出多长的,比如翻译就是seq2seq

2 输入和输出一样多的情况

2.0 背景

又叫做 sequence labeling。
序列里面的每一个向量都给一个label。

  • 把每一个向量输入到fully connected network里面,每一个都产生一个输出。
    但是存在很大的问题,比如:输入一个句子I saw a saw,你期待第一个saw标识出为动词,第二个saw标识为名词。
    有没有可能让fully-connected网络考虑上下文的资讯呢?开一个window把句子的长度给盖住,但是不好,你要统计数据集最长的长度是多少,而且参数也多。

2.1 self-attention

你可以把FC层和self-attention进行交替使用,self-attention考虑上下文,FC层考虑局部信息。
它是怎么运作的呢?

  • self attention的input是一串的vector,这个图里面是a^{i}
  • 它的output是一排的b^{i},是考虑了所有的a之后生成出来的

开始工作咯!举例:如何生成b1?

  1. 根据a1来找到和a1相关的其他向量,每一个向量和a1的相关程度,我们用一个数值叫做\alpha来进行表示。
  2. 如何来给出两个数值之间的\alpha呢?需要一个计算Attention的模组,拿两个向量作为输入,直接输出\alpha这个数值。有各种不同的做法,比较常见的做法呢,叫做dot-product。
    • dot-prodoct:把输入的两个向量,分别乘上两个不同的矩阵,左边那个向量乘上W’{q}得到q,右边那个向量乘上W’{k}这个向量来得到k。然后a=q*k。它是最常见的方法,这个文档里面只使用这种方法。
    • additive:a=W(tanh(W^q+W^k)),大概是这个意思这个外面的W是一个transform。
    • 还有很多其他的方法
  3. 接下来怎么套用呢?a1和其他向量分别进行这样的操作,举例:a1和a2:a_{1,2}=q1*k2。在实战的时候,a1也和自己算关联性,a_{1,1}=q1*k1
  4. 然后a_{1,1}…a_{1,n}经过一个softmax进行输出,分别得到a’{1,1}…a’{1,n}。这里不一定用softmax(但是是最常见的),比如relu。
  5. 下面抽取重要的资讯,我们把每一个a{i}向量乘以W^v,来得到新的向量,例如:v1=W^{v}a{1}v2=W^{v}a{2}…。把每个v{i}分别乘以对应的attention的分数,都去乘上自己的\alpha,再全部求和,得到b1。
    b 1 = ∑ i α 1 , i ′ v i b^1=\sum_i \alpha'_{1,i}v^i b1=iα1,ivi

b1到b_{n}是同时被计算出来的,如何计算出来的?
自注意力机制_第1张图片

计算attention的分数:
自注意力机制_第2张图片

抽取重要的资讯(矩阵形式)

自注意力机制_第3张图片

2.2 总结

只有Wq,Wk,Wv是未知的,需要透过训练资料,把它找出来
自注意力机制_第4张图片

你可能感兴趣的:(人工智能,深度学习,算法)