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)))

我有两个问题:

  1. 我无法理解为什么 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)?

  2. 为什么要用 tf.nn.tanh(self.W1(last_inp_dec) + self.W2(input_enc)) 乘以 self.V?因为我们希望 alpha 作为标量?

  1. ) 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) ?

来自class BahdanauAttention

中代码的注释部分

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)

的形状
  1. ) 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 发布了一个答案 所有形状都涉及张量和权重。