gpt4 book ai didi

python - 在 CNTK 中实现带有注意力的 Seq2Seq 时轴的多个问题

转载 作者:太空宇宙 更新时间:2023-11-04 00:30:03 39 4
gpt4 key购买 nike

我正在尝试在 CNTK 中实现带有注意力的 Seq2Seq 模型,这与 CNTK Tutorial 204 非常相似。 .但是,几个小差异会导致各种问题和错误消息,我不明白。这里有很多问题,它们可能是相互关联的,并且都源于我不明白的某件事。

注意(如果它很重要)。我的输入数据来自 MinibatchSourceFromData,它是从适合 RAM 的 NumPy 数组创建的,我没有将它存储在 CTF 中。

ins = C.sequence.input_variable(input_dim, name="in", sequence_axis=inAxis)
y = C.sequence.input_variable(label_dim, name="y", sequence_axis=outAxis)

因此,形状是[#, *](input_dim)[#, *](label_dim)

问题 1: 当我运行 CNTK 204 Tutorial并使用 cntk.logging.plot 将其图形转储到 .dot 文件中,我看到它的输入形状是 [#](-2,)。这怎么可能?

  • 序列轴(*)在哪里消失了?
  • 维度怎么可能是负数?

问题 2:在同一个教程中,我们有 attention_axis = -3。我不明白这一点。在我的模型中有 2 个动态轴和 1 个静态轴,因此“倒数第三个”轴将是 #,即批处理轴。但是绝对不应该在批处理轴上计算注意力。
我希望查看教程代码中的实际坐标轴可以帮助我理解这一点,但上面的 [#](-2,) 问题使这更加困惑。

attention_axis 设置为 -2 会出现以下错误:

RuntimeError: Times: The left operand 'Placeholder('stab_result', [#, outAxis], [128])'
rank (1) must be >= #axes (2) being reduced over.

在训练时间模型的创建过程中:

def train_model(m):
@C.Function
def model(ins: InputSequence[Tensor[input_dim]],
labels: OutputSequence[Tensor[label_dim]]):
past_labels = Delay(initial_state=C.Constant(seq_start_encoding))(labels)
return m(ins, past_labels) #<<<<<<<<<<<<<< HERE
return model

其中 stab_result 是解码器中最后一个 Dense 层之前的 Stabilizer。我可以在点文件中看到,在 AttentionModel 实现的中间出现了大小为 1 的虚假尾随维度。

attention_axis 设置为 -1 会出现以下错误:

RuntimeError: Binary elementwise operation ElementTimes: Left operand 'Output('Block346442_Output_0', [#, outAxis], [64])'
shape '[64]' is not compatible with right operand
'Output('attention_weights', [#, outAxis], [200])' shape '[200]'.

其中 64 是我的 attention_dim,200 是我的 attention_span。据我了解,注意模型中的元素 * 绝对不应该将这两者混为一谈,因此 -1 绝对不是这里的正确轴。

问题3:我的上述理解是否正确?右轴应该是什么?为什么它会导致上述两个异常之一?

感谢您的解释!

最佳答案

首先,一些好消息:最新 master 中的 AttentionModel 中修复了一些问题(几天后将在 CNTK 2.2 中普遍可用):

  • 您不需要指定 attention_spanattention_axis。如果您不指定它们并将它们保留为默认值,则会在整个序列上计算注意力。事实上,这些论点已被弃用。
  • 如果您执行上述操作,204 笔记本的运行速度将提高 2 倍,因此 204 笔记本不再使用这些参数
  • AttentionModel 中的一个错误已得到修复,它现在忠实地实现了 Bahdanau 等。阿尔。纸。

关于您的问题:

维度不是负数。我们在不同的地方使用某些负数来表示某些事情:-1 是将根据第一个 minibatch 推断一次的维度,-2 是我认为占位符的形状,-3 是将被推断的维度与每个小批量(例如,当您将可变大小的图像提供给卷积时)。我想如果你在第一个小批量之后打印图表,你应该会看到所有的形状都是具体的。

attention_axis 是本应隐藏的实现细节。基本上 attention_axis=-3 将创建一个形状 (1, 1, 200),attention_axis=-4 将创建一个形状 (1, 1, 1, 200)等等。一般来说,任何超过 -3 的值都不能保证有效,任何小于 -3 的值只会增加更多的 1,而没有任何明显的好处。当然,好消息是你可以在最新的 master 中忽略这个参数。

TL;DR:如果您在掌握(或在几天内开始使用 CNTK 2.2),请将 AttentionModel(attention_dim, attention_span=200, attention_axis=-3) 替换为注意力模型(注意力暗淡)。它更快并且不包含令人困惑的参数。从 CNTK 2.2 开始,原始 API 已弃用。

关于python - 在 CNTK 中实现带有注意力的 Seq2Seq 时轴的多个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169811/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com