Bahdanaus attention in Neural machine translation with attention 关注
Bahdanaus attention in Neural machine translation with attention
我正在尝试使用以下教程来了解 Bahdanaus 的注意力:
https://www.tensorflow.org/tutorials/text/nmt_with_attention
计算如下:
self.attention_units = attention_units
self.W1 = Dense(self.attention_units)
self.W2 = Dense(self.attention_units)
self.V = Dense(1)
score = self.V(tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc)))
我有两个问题:
我无法理解为什么 tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
的形状是 (batch_size,max_len,attention_units) ?
使用矩阵乘法规则得到以下结果:
a) self.W1(last_inp_dec) -> (1,hidden_units_dec) * (hidden_units_dec,attention_units) = (1,attention_units)
b) self.W2(last_inp_enc) -> (max_len,hidden_units_dec) * (hidden_units_dec,attention_units) = ( max_len,attention_units)
然后我们将 a) 和 b) 的数量相加。我们如何最终得到维度 (max_len、attention_units) 或 (batch_size、max_len、attention_units)?我们如何对不同大小的第二维进行加法运算(1 vs max_len)?
为什么要用 tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
乘以 self.V
?因为我们希望 alpha 作为标量?
- ) I cannot understand why the shape of tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc)) is
(batch_size,max_len,attention_units) ?
中代码的注释部分
query_with_time_axis shape = (batch_size, 1, 隐藏大小)
请注意,尺寸 1
是使用 tf.expand_dims
添加的,以使形状与添加的 values
兼容。 1
添加的维度在加法操作期间被广播。否则,传入的形状是(batch_size,隐藏大小),这将不兼容
值形状 = (batch_size, max_len, 隐藏大小)
添加 query_with_time_axis
形状和 values
形状得到 (batch_size, max_len, hidden size)
的形状
- ) Why do we multiply
tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
by self.V? Because we want alphas as scalar?
self.V
是最后一层,它的输出给了我们分数。 self.V
层的随机权重初始化由 keras
在后台处理 self.V = tf.keras.layers.Dense(1)
.
行
我们没有将 tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
乘以 self.V
。
构造 self.V(tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
意味着 --> tanh
操作产生的激活 tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
形成 单输出 的输入矩阵输出层由 self.V
.
表示
形状与您提供的略有不同。也许最好用一个直接的例子来理解?
假设对齐层有 10 个单元,解码器有 128 个嵌入维度,编码器有 256 个维度和 19 个时间步长,那么:
last_inp_dec 和 input_enc 形状将是 (?,128) 和 (?,19,256)。我们现在需要在时间轴上扩展 last_inp_dec 使其成为 (?,1,128) 以便可以进行加法。
w1,w2,v 的图层权重分别为 (?,128,10)、(?,256,10) 和 (?,10,1)。注意 self.w1(last_inp_dec) 是如何计算出 (?,1,10) 的。这被添加到每个 self.w2(input_enc) 以给出 (?,19,10) 的形状。结果被馈送到 self.v 并且输出是 (?,19,1) 这是我们想要的形状 - 一组 19 个权重。 Softmaxing 这给出了注意力权重。
将此注意力权重乘以每个编码器隐藏状态并总结 returns 上下文。
关于为什么需要 'v' 的问题,这是必需的,因为 Bahdanau 提供了在对齐层中使用 'n' 单位的选项(以确定 w1、w2),而我们需要一个在顶部添加更多层以将张量按摩回我们想要的形状 - 一组注意力权重..每个时间步一个。
我刚刚在 Understanding Bahdanau's Attention Linear Algebra 发布了一个答案
所有形状都涉及张量和权重。
我正在尝试使用以下教程来了解 Bahdanaus 的注意力: https://www.tensorflow.org/tutorials/text/nmt_with_attention
计算如下:
self.attention_units = attention_units
self.W1 = Dense(self.attention_units)
self.W2 = Dense(self.attention_units)
self.V = Dense(1)
score = self.V(tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc)))
我有两个问题:
我无法理解为什么
tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
的形状是 (batch_size,max_len,attention_units) ?使用矩阵乘法规则得到以下结果:
a) self.W1(last_inp_dec) -> (1,hidden_units_dec) * (hidden_units_dec,attention_units) = (1,attention_units)
b) self.W2(last_inp_enc) -> (max_len,hidden_units_dec) * (hidden_units_dec,attention_units) = ( max_len,attention_units)
然后我们将 a) 和 b) 的数量相加。我们如何最终得到维度 (max_len、attention_units) 或 (batch_size、max_len、attention_units)?我们如何对不同大小的第二维进行加法运算(1 vs max_len)?
为什么要用
tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
乘以self.V
?因为我们希望 alpha 作为标量?
中代码的注释部分
- ) I cannot understand why the shape of tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc)) is (batch_size,max_len,attention_units) ?
query_with_time_axis shape = (batch_size, 1, 隐藏大小)
请注意,尺寸 1
是使用 tf.expand_dims
添加的,以使形状与添加的 values
兼容。 1
添加的维度在加法操作期间被广播。否则,传入的形状是(batch_size,隐藏大小),这将不兼容
值形状 = (batch_size, max_len, 隐藏大小)
添加 query_with_time_axis
形状和 values
形状得到 (batch_size, max_len, hidden size)
- ) Why do we multiply
tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
by self.V? Because we want alphas as scalar?
self.V
是最后一层,它的输出给了我们分数。 self.V
层的随机权重初始化由 keras
在后台处理 self.V = tf.keras.layers.Dense(1)
.
我们没有将 tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
乘以 self.V
。
构造 self.V(tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
意味着 --> tanh
操作产生的激活 tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc))
形成 单输出 的输入矩阵输出层由 self.V
.
形状与您提供的略有不同。也许最好用一个直接的例子来理解?
假设对齐层有 10 个单元,解码器有 128 个嵌入维度,编码器有 256 个维度和 19 个时间步长,那么:
last_inp_dec 和 input_enc 形状将是 (?,128) 和 (?,19,256)。我们现在需要在时间轴上扩展 last_inp_dec 使其成为 (?,1,128) 以便可以进行加法。
w1,w2,v 的图层权重分别为 (?,128,10)、(?,256,10) 和 (?,10,1)。注意 self.w1(last_inp_dec) 是如何计算出 (?,1,10) 的。这被添加到每个 self.w2(input_enc) 以给出 (?,19,10) 的形状。结果被馈送到 self.v 并且输出是 (?,19,1) 这是我们想要的形状 - 一组 19 个权重。 Softmaxing 这给出了注意力权重。
将此注意力权重乘以每个编码器隐藏状态并总结 returns 上下文。
关于为什么需要 'v' 的问题,这是必需的,因为 Bahdanau 提供了在对齐层中使用 'n' 单位的选项(以确定 w1、w2),而我们需要一个在顶部添加更多层以将张量按摩回我们想要的形状 - 一组注意力权重..每个时间步一个。
我刚刚在 Understanding Bahdanau's Attention Linear Algebra 发布了一个答案 所有形状都涉及张量和权重。