小熊科技|PyTorch文本:01.聊天机器人教程( 七 )
4.3 解码器解码器RNN以token-by-token的方式生成响应语句 。 它使用编码器的上下文向量和内部隐藏状态来生成序列中的下一个单词 。 它持续生成单词 ,直到输出是EOS_token , 这个表示句子的结尾 。 一个 vanilla seq2seq 解码器的常见问题是 , 如果我们只依赖于上下文向量来编码整个输入 序列的含义 , 那么我们很可能会丢失信息 。尤其是在处理长输入序列时 , 这极大地限制了我们的解码器的能力 。
为了解决这个问题 , Bahdanau et al.等人创建了一种“attention mechanism” , 允许解码器关注 输入序列的某些部分 , 而不是在每一步都使用完全固定的上下文 。
在一个高的层级中 , 用解码器的当前隐藏状态和编码器输出来计算注意力 。 输出注意力的权重与输入序列具有相同的大小 , 允许我们将它们乘 以编码器输出 , 给出一个加权和 , 表示要注意的编码器输出部分 。 Sean Robertson的图片很好地描述了这一点:
Luong et al.通过创造“Global attention” , 改善了Bahdanau et al. 的基础工作 。 关键的区别在于 , 对于“Global attention” , 我们考虑所有编码器的隐藏状态 , 而不是 Bahdanau 等人的“Local attention” ,它只考虑当前步中编码器的隐藏状态 。 另一个区别在于 , 通过“Global attention” , 我们仅使用当前步的解码器的隐藏状态来计算注意力权重 (或者能量) 。 Bahdanau 等人的注意力计算需要知道前一步中解码器的状态 。此外 , Luong等人提供各种方法来计算编码器输出和解码器输出 之间的注意权重(能量) , 称之为“score functions”:
总体而言 , Global attention机制可以通过下图进行总结 。 请注意 , 我们将“Attention Layer”用一个名为Attn的nn.Module来单独实现 。该模块的输出是经过softmax标准化后权重张量的大小*(batch_size , 1 , max_length)* 。
# Luong的attention layerclass Attn(torch.nn.Module):def __init__(self, method, hidden_size):super(Attn, self).__init__()self.method = methodif self.method not in ['dot', 'general', 'concat']:raise ValueError(self.method, "is not an appropriate attention method.")self.hidden_size = hidden_sizeif self.method == 'general':self.attn = torch.nn.Linear(self.hidden_size, hidden_size)elif self.method == 'concat':self.attn = torch.nn.Linear(self.hidden_size * 2, hidden_size)self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size))def dot_score(self, hidden, encoder_output):return torch.sum(hidden * encoder_output, dim=2)def general_score(self, hidden, encoder_output):energy = self.attn(encoder_output)return torch.sum(hidden * energy, dim=2)def concat_score(self, hidden, encoder_output):energy = self.attn(torch.cat((hidden.expand(encoder_output.size(0), -1, -1), encoder_output), 2)).tanh()return torch.sum(self.v * energy, dim=2)def forward(self, hidden, encoder_outputs):# 根据给定的方法计算注意力(能量)if self.method == 'general':attn_energies = self.general_score(hidden, encoder_outputs)elif self.method == 'concat':attn_energies = self.concat_score(hidden, encoder_outputs)elif self.method == 'dot':attn_energies = self.dot_score(hidden, encoder_outputs)# Transpose max_length and batch_size dimensionsattn_energies = attn_energies.t()# Return the softmax normalized probability scores (with added dimension)return F.softmax(attn_energies, dim=1).unsqueeze(1)
推荐阅读
- 所持股份|万兴科技:公司控股股东、实际控制人吴太兵质押150万股
- 发布公告|数量过半!博创科技:天通股份累计减持约150万股
- 英雄科技聊数码|蔡崇信有实力买下篮网,那身价3200亿的马云,能买下几支NBA球队
- 科技前沿阵地|涨疯了!海思安防芯片遭哄抬“围剿”
- 月影浓|吴亦凡机械造型走秀 垫肩披风搭银框眼镜科技感足
- 中国历史发展过程|中国历史发展过程.中国的科技史界过去半个多世纪
- 天津|桂发祥:不再持有昆汀科技股份
- 消费|减持!天通股份:减持博创科技约32万股
- 处罚|老周侃股:吉鑫科技大股东应补偿踩雷投资者
- 华中科技大学|杯具!超本科线95分,本科有路不走,却梦幻般碰瓷,撞开专科的门
