从字面意思上来理解其实self.attention就是自己和自己做相识度计算,其实就是每个词和句子中其他词计算相识度,利用上下文增强目标词的表达。

self.attention 和attention 有什么区别

Q、K、V三个矩阵来自同一个输梯度怎么求入,首先我们要计算Q和K之间的点乘,然后为了防止其过大,会进行一个缩放,具体操作就是 Q * K / sqrt{ d_k梯度下降 }梯度下降 这里的d_k指的是每个单梯度词embedding的维度 ,然后送入softmax将其结果归一化梯度稀释的目的为概率分布,然后再乘以V得到权重求和的表示,总结下操作可以表示为 Attention(Q,K,V)=so梯度下降ftmax(frac{Q梯度K^T}{sqrt{d_k}})V

简单用torc梯度是什么意思h实现下

#embedding [batch_size, seq, d_model]
query, key, value = embedding, embedding, embedding
self.Q = nn.Linear(d_model, d_model)
self.K = nn.Linear(d_model, d_model)
self.V = nn.Linear(d_model, d_model)
​
Q = self.Q(query).view(batch_size, -1, n_head, d_head).premute(0, 2, 1, 3)
K = self.K(key).view(batch_size, -1, n_head, d_head).premute(0, 2, 1, 3)
V = self.V(value).view(batch_size, -1, n_head, d_head).premute(0, 2, 1, 3)
​
attn = nn.softmax(torch.matmul(Q, K.transpose(2, 3))/math.sqrt(d_model))
​
context = torch.matmul(attn, V).transpose(1, 2)
context = context.contiguous().view(batch_size, -1, self.d_model)

矩阵和行列式的区别统的attention一开始是使用再Seq2Se矩阵q结构上,将encoder读取输入的句子将其转换为一个定长的向量,然后再输入decoder端一个一个的解码,如果句子太长encoder很难将句子的信息转化为定长的向量,而且类矩阵的秩似于rnn这种结构很容易存在长程梯度消失的问题,于是引矩阵的秩入attention注意力机制,结构如下:

self.attention 和attention 有什么区别

  • 首先我们利用RNN结构得到encoder中的hidden s梯度下降法原理tate ,
  • 假设当前decoder的h矩阵idden state 是 ,我们可以计算每矩阵的逆一个输入位置j与当前输出位置的关联性, ,写成相应的向量形式即为 ,其中 是一种相关性的算符,例如常见的有点乘形式 ,加权点乘 ,加和 等等。
  • 对于 进行softmax操作将其normalize得到attention的分布, ,展开形式为
    self.attention 和attention 有什么区别
  • 利用 我们可以进行加权求和得到相应的context vector
    self.attention 和attention 有什么区别
  • 由此,我们可以计算decoder的下一梯度公式个hidden state 以及该位置的输出 。

这里关键的操作是计算encoder与decoder state之间的关联性的权重,得到Attention分布,从而对于当前输出位置得到比较重要的输入位置的权梯度下降重,在预测输出时相应的会占较大矩阵乘法的比重。