2017-09-12 42 views
2

我试图在CNTK中实现一个注意力集中的Seq2Seq模型,这与CNTK Tutorial 204非常相似。然而,一些小的差异导致了各种问题和错误信息,我不明白。这里有很多问题,这些问题可能是相互关联的,都来自我不理解的单一事物。在CNTK中执行Seq2Seq时出现多个轴问题

注意(万一它很重要)。我的输入数据来自MinibatchSourceFromData,由适合内存的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并抛售其图形转换为.dot文件中使用cntk.logging.plot,我看到它的输入形状是[#](-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:我上面的理解是否正确?什么应该是正确的轴,为什么会导致上述两个例外之一?

感谢您的解释!

回答

3

首先,一些好消息:一对夫妇的事情已经固定在最新掌握AttentionModel(一般将可用CNTK 2.2在几天之内):

  • 你并不需要指定attention_spanattention_axis。如果您没有指定它们并将它们保留为默认值,则会在整个序列中计算注意力。实际上这些论点已被弃用。
  • 如果你这样做了,204笔记本的运行速度提高了2倍,所以204笔记本不再使用这些参数
  • AttentionModel中的一个bug已经修复,现在它忠实地实现了Bahdanau et。人。纸。

关于你的问题:

尺寸不是消极的。我们在各个地方使用某些负数来表示某些事情:-1是基于第一个小标签推断一次的尺寸,-2是我认为占位符的形状,-3是将推断的尺寸与每个小批次(例如,当您将可变大小的图像送入卷积时)。我想如果你在第一个小批次后打印图表,你应该看到所有的形状都是具体的。

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

TL; DR:如果您是主人(或几天内以CNTK 2.2开头),请将AttentionModel(attention_dim, attention_span=200, attention_axis=-3)替换为 AttentionModel(attention_dim)。它速度更快,不含混淆的论据。从CNTK 2.2开始,不推荐使用原始API。

+0

感谢您的澄清,Nikos!快速提问:如果我现在想试试这个,并且我不想从源代码构建CNTK,那么复制新的AttentionModel Python实现就足够了,还是需要在本机中最近修复一些码? – Skiminok

+0

本机代码中存在一些错误修复。这不足以复制新的实现。 –