注意力机制----transformer中注意力机制

初步印象:

  • 目的: 使用q在k中找到v的值
  • 总体形式: 里面: 矩阵相乘+归一化+外面: 和向量相乘(解释: 向量的行数应该就是要用注意力分配权重的id数)

 

 

注意力机制的计算:

方式一: 以句子翻译+q,k,v理解:

  • 最初的embedding: 文本向量+位置向量
  • 矩阵的行数: 字数
  • batch_size: 句子个数 

  • 三个需要通过参数学习的矩阵: q,k,v.      大小: 行和列都是embedding的大小 

  • 初始的embedding通过  三个权重矩阵 之后 得到三个  attention中最为重要的要素:  q,k,v

  • 将q,k,v分割, 得到multi-head:  将embedding的那个方向给切了

  • multi-head到底有什么作用?  : 相当于CNN中的卷积核, 提取多重语义
  • Q*K: 让每个词 和 其它各个词相乘: 得到 : 一个词对应其它词的权重表(当然,肯定是自己和自己关系最密切)
  • 因为它是矩阵, 所以实现了并行, 寻找一个词和其它的词的关系, 不用像RNN那样先处理一个词, 再处理一个词

  • 按行归一化
  • 和v  相乘(每一行代表一个字,  即给每一个字赋权重)\
  • 每个字向量都含有当前句子中所有字向量的信息

  • 处理多头attention: 将每个头的输出直接 拼接起来 经全连接层(线性变换, 改变矩阵形状), 得到最终输出

  • attention mask: 有些部分为0, 但是在归一化的时候, 直接弄成0分子会成1, 所以会设置成负无穷, 分子就会是0???

方式二: 以q, a, c, s理解:

  • 要计算s_j就要先计算c_j, 要计算c_j就要先计算a_j:  

  • 将decoder当前状态s_j与m个h_i做运算得到权重向量(权重的具体计算见下)

  • h_i,s_j 各自乘以权重矩阵W_K,W_Q

  • k,q进行内积

  • 经softmax

  • 一共有三个“权重矩阵”:

  • 在seq2seq版本注意力机制中,c的更新依靠: a和h(encoder状态)

  • 在transformer版本的注意力机制中,c的更新依靠:a和v









 

去掉RNN层,只保留attention层:

  • transformer的组成:attention层 + self attention层 + 全连接层

  • 目标是得到去掉RNN只留有attention的模型

    • encoder输入:x_i

    • decoder输入:通过所有x_i + x'_i得到下一个x'_i

  • 对于encoder输入向量X:分别乘以权重矩阵W_K和W_V:得到k,v

  • 对于decoder输入值x':乘以权重矩阵W_Q : 得到q 

  • 用一个q和每个k可以得到:a

  • a和v做向量内积可以得到c

  • 对接下来的decoder输入都是同理

  • 所以,就会得到每一个decoder输入的c,作为attention层的输出

  • 整体看来:就是用k,q,v得到了c

  • 即,c是x和x'的函数

  • 可以在输出的基础上加softmax,加分类器

  • 将上一个输出作为下一个输入

  • 可以将attention网络看成一个C=Attn(X,X‘)函数

  • 接下来说明self-attention

  • attention和self-attention的区别就是:

    • attention用于seq2seq模型,是encoder-decoder的结构,有两方面输入

    • self-attention用于单个模型,只有一方面输入

  • self-attention网络,对于输入x有分别乘以三个权重矩阵之后,得到三个输出

  • 所以,对于每一个x都有三个输出

  • a1:一个q+所有k

  • 同理,算出所有的a

  • a,v点成得到c

  • 同理,算出其它c

  • self-attention的输出就是c

  • 同样地,可以将self-attention网络看成是一个C=Attn(X,X)函数

  • 15:attention

  • 16: self-attention

  • 17:transformer

 

 

猜你喜欢

转载自blog.csdn.net/weiwei935707936/article/details/109561136