在CNTK中实现引起注意的SEQ2SEQ时,轴有多个问题



我正在尝试在CNTK中引起注意的SEQ2SEQ模型,这与CNTK教程非常相似。但是,几个小的差异导致了各种问题和错误消息,我对此我不'理解。这里有很多问题,可能是相互联系的,所有这些都源于我不了解的一件事情。

注意(如果很重要)。我的输入数据来自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教程并使用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

,在解码器中最终的Dense层之前,stab_resultStabilizer。我可以在点文件中看到,在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:我上述理解正确吗?什么应该是正确的轴,为什么会导致上面的两个例外之一?

感谢您的解释!

首先,一些好消息:最新主人的注意力模型中的几件事已固定在几天之内使用CNTK 2.2):

  • 您无需指定attention_spanattention_axis。如果您不指定它们并将其留下默认值,则注意力是通过整个顺序计算的。实际上,这些论点已被弃用。
  • 如果您执行上述204笔记本电脑的运行速度快2倍,因此204笔记本不再使用这些参数
  • 注意力模型中已经固定了一个错误,现在它忠实地实现了Bahdanau等。al。纸。

关于您的问题:

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

attention_axis是应该隐藏的实现细节。基本上attention_axis=-3将创建(1、1、200)的形状,attention_axis=-4将创建(1、1、1、200)的形状,等等。总的来说,任何超过-3的东西都不能保证工作,而少于-3的任何东西只会增加1秒,而没有任何明显的好处。当然,好消息是,您可以在最新的大师中忽略这一论点。

tl; dr:如果您在Master中(或几天内用CNTK 2.2开始)将AttentionModel(attention_dim, attention_span=200, attention_axis=-3)替换为 AttentionModel(attention_dim)。它更快,不包含令人困惑的论点。从CNTK 2.2开始,原始API被弃用。

相关内容

  • 没有找到相关文章