动漫视频网站模板,苏州设置网站建设,域名空间商界面,建筑装饰公司做网站的作用注意力机制 为什么需要注意力机制attention机制的架构总体设计一、attention本身实现评分函数 attention在网络模型的应用-Bahdanau 注意力加性注意力代码实现 为什么需要注意力机制 这是一个普通的seq2seq结构#xff0c;用以实现机器对话#xff0c;Encoder需要把一个输入的… 注意力机制 为什么需要注意力机制attention机制的架构总体设计一、attention本身实现评分函数 attention在网络模型的应用-Bahdanau 注意力加性注意力代码实现 为什么需要注意力机制 这是一个普通的seq2seq结构用以实现机器对话Encoder需要把一个输入的一个句子转化为一个最终的输出上下文context vector然后在Decoder中使用但这里有些问题
如果句子很长这个向量很难包含sequence中最早输入的哪些词的信息那么decoder的处理必然也缺失了这一部分。对话的过程中大部分情况下decoder第一个的输出应该关心的权重更应该是encoder的前半部分的输入比如这里Yes其实应该是对are you这样一个疑问的输出但是这就要求decoder的预测的时候有区别的针对sequence的输入做输出现在这个结构没办法实现这个功能。
你可能会想到LSTM或者GRU也是有memory记忆功能的解决方案 LSTM中的memory没有办法很大假设它的memory的大小时K的话就需要有一个K*K的矩阵如果太大的memory不仅计算量大参数太多还会容易过拟合因此不可行
attention机制就是用来解决这个问题attention里面memory增加的话参数并不会增加一句话总结就是attention就是来解决长输入在decoder时能够找到应该关注的输入部分的问题它最初时从机器翻译发展的后续也扩展到了其他领域
attention机制的架构总体设计 这就是总体的架构设计输入a1…an输出b1…bn 对应注意这里的b考虑了所有的输入这个输出带有对于每个输入的attention scorescore越大证明这个输入越重要a在这里可以是输入也可以是输入解码器后hidden layer的输出那么中间蓝色框部分就是attention主体实现它用来生成的b1到bn 。 举个例子输入are you free tomorrow? 输出的时候Yes更关注的是are you那这个的attention score就需要高一些
普通的seq2seq结构 带有注意力的seq2seq
在普通的seq2seq相比解码器使用的上下文变量C’不再仅仅是编码器的输出而是 注意力的输出
与普通的seq2seq模型对比下带有注意力模型的修改就分为了两部分 1.attention本身的实现 2.attention应用到模型部分 以下详述这了两部分
一、attention本身实现
先不介绍内部的一些数学处理attention的输出实际上是对某种输入的选择倾向 输入就是要被选择的数据和对应的查询线索 输出对要选择数据的权重 举个例子 输入the dog is running across the grass 翻译这个小狗正在穿越草地 解码翻译这 个 小 狗 这些词的时候注意力应该放在the dog上这时候我们给与the dog这些词更多的权重这时候对于输入可能的权重就是0.5 0.5 0 0 0 0 在数学模型方面 键key 查询Query 值 Value
要实现的是根据键和查询生成的线索去计算对于值Value的倾向选择数学表达是这样的 这里的a(q, ki) 一般是经过一个评分函数映射成标量和然后一个softmax操作
这里可以形象的理解一下,比如下面三组数据
id体重-Q身高-K年龄- V150160502651652336017521
当输入体重K 63, 身高V 170问现在的年龄大概是多少呢 看到表中的信息人脑会自然猜测年龄在23和21之间也就是在id 2和3上权重比较高0.6* 23 0.4* 21,这个也接近于注意力的实质其实是根据Q和V 做评分用以对V加权取值这些权重值就是注意力。 a(q, k1) v1 a(q, k2)v2
评分函数
评分函数实际有很多种tanh, 经过一个线性变换或者sin cos 、加 等等目前业内没有最好的实践
attention在网络模型的应用-Bahdanau 注意力
很多的论文都涉及注意力的使用这块的依据是比较早和出名的Bahdanau注意力讲解。 上文seq2se模型中讲过解码器的输入是编码器的输出上下文变量以及解码器输入而在有注意力的网络模型中这个上下文变成了注意力的输出解码器示意 其中的at,i 就是注意力权重的输出 时间步t’-1 解码器的隐状态是St’-1也是所谓的查询 ht编码器隐状态是键也是值
加性注意力代码实现
class AdditiveAttention(nn.Module):加性注意力实现def __init__(self, key_size, query_size, num_hiddens, dropout, **kwargs):super(AdditiveAttention, self).__init__(**kwargs)self.W_k nn.Linear(key_size, num_hiddens, biasFalse)self.W_q nn.Linear(query_size, num_hiddens, biasFalse)self.w_v nn.Linear(num_hiddens, 1, biasFalse)self.dropout nn.Dropout(dropout)def forward(self, queries, keys, values, valid_lens):queries, keys self.W_q(queries), self.W_k(keys)# 在维度扩展后# queries的形状(batch_size查询的个数1num_hidden)# key的形状(batch_size1“键值”对的个数num_hiddens)# 使用广播方式进行求和features queries.unsqueeze(2) keys.unsqueeze(1)features torch.tanh(features)# self.w_v仅有一个输出因此从形状中移除最后那个维度。# scores的形状(batch_size查询的个数“键-值”对的个数)scores self.w_v(features).squeeze(-1)# 这部分主要是为了遮蔽填充项理解注意力上的时候可以先忽略它self.attention_weights masked_softmax(scores, valid_lens)# values的形状(batch_size“键值”对的个数值的维度)return torch.bmm(self.dropout(self.attention_weights), values)