代码之家  ›  专栏  ›  技术社区  ›  Skiminok

在CNTK中注意实现Seq2Seq时,轴存在多个问题

  •  2
  • Skiminok  · 技术社区  · 7 年前

    我正试图在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 .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 Stabilizer 就在决赛之前 Dense 解码器中的层。我可以在点文件中看到,有大小为1的虚假尾随尺寸出现在 AttentionModel

    注意力_轴 -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 attention_span . 据我所知 * 在注意力模型内部,绝对不应该将这两者混为一谈,因此 绝对不是这里的右轴。

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Nikos Karampatziakis    7 年前

    首先,有一些好消息:在最新的master中,AttentionModel中已经修复了几个问题(CNTK 2.2将在几天内正式提供):

    • attention_span 或者 attention_axis . 如果不指定它们并将其保留为默认值,则会在整个序列中计算注意力。事实上,这些论点已被弃用。

    关于您的问题:

    注意力_轴 attention_axis=-3 将创建(1,1200)的形状, attention_axis=-4 将创建(1,1,1200)的形状,依此类推。一般来说,大于-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。