tensorflow - 使用解码器隐藏状态和编码器输出计算张量流中 Bahdanau 注意力的注意力分数
问题描述
这个问题与此处显示的神经机器翻译有关:神经机器翻译
self.W1
并在函数的self.W2
第 4 行和第 5 行中初始化为每个 10 个单元的密集神经层__init__
class BahdanauAttention
在随附的代码图像中,我不确定我是否理解在第 17 行和第 18 行中设置的前馈神经网络。所以,我将这个公式分解成几个部分。见第 23 行和第 24 行。
query_with_time_axis
是 的输入张量self.W1
,values
是 的输入self.W2
。并且每个计算函数Z = WX + b
,并将 Z 加在一起。加在一起的张量的维度是(64, 1, 10)
和(64, 16, 10)
。我假设两者都是随机的权重初始化,self.W1
并由幕后self.W2
处理。Keras
问题:
将 Z 加在一起之后,tanh
应用非线性 (self.V
score
对于最后一步,我们不对 的结果应用激活函数(tanh 等)self.V(tf.nn.tanh(self.W1(query_with_time_axis) + self.W2(values)))
,以从最后一个神经网络层获得单个输出。
最后一步没有使用激活函数有什么原因吗?
解决方案
注意力的输出形成所谓的注意力能量,即每个编码器输出的一个标量。这些数字被堆叠成一个向量,这个向量使用 softmax 进行归一化,产生注意力分布。
所以,实际上,在下一步中应用了非线性,这就是softmax。如果你在 softmax 之前使用激活函数,你只会减少 softmax 可以做的分布空间。
推荐阅读
- c++ - C++ 并发队列按引用或值推送
- php - 将数组转换为普通数组
- javascript - TypeScript 参数定义覆盖
- xml - 在 Android Studio 上将 apk 安装到虚拟设备时出错
- azure - 功能不像我的控制台应用程序那样读取服务总线队列
- reactjs - Webpack 4 错误 - 模块解析失败:意外字符“@”
- python - Python Matplotlib X轴标签双轴与数据框
- java - 如何通过关键字从字符串数组中删除对象,或在数组长度上搜索特定对象?
- java - OverflowStrategy 没有考虑到?
- python - Python 没有调用这个函数,我不知道为什么