【问题标题】:Using CNTK to generate sequence by sampling at each generation step使用 CNTK 在每个生成步骤通过采样生成序列
【发布时间】:2018-01-22 02:05:02
【问题描述】:

在具有编码器和解码器的 seq2seq 模型中,在每个生成步骤中,softmax 层都会输出整个词汇表的分布。在 CNTK 中,可以使用 C.hardmax 函数轻松实现贪婪解码器。看起来像这样。

def create_model_greedy(s2smodel):
    # model used in (greedy) decoding (history is decoder's own output)
    @C.Function
    @C.layers.Signature(InputSequence[C.layers.Tensor[input_vocab_dim]])
    def model_greedy(input): # (input*) --> (word_sequence*)
        # Decoding is an unfold() operation starting from sentence_start.
        # We must transform s2smodel (history*, input* -> word_logp*) into a generator (history* -> output*)
        # which holds 'input' in its closure.
        unfold = C.layers.UnfoldFrom(lambda history: s2smodel(history, input) >> **C.hardmax**,
                                     # stop once sentence_end_index was max-scoring output
                                     until_predicate=lambda w: w[...,sentence_end_index],
                                     length_increase=length_increase)
        return unfold(initial_state=sentence_start, dynamic_axes_like=input)
    return model_greedy

但是,在每一步我都不想以最大概率输出令牌。相反,我想要一个随机解码器,它根据词汇的概率分布生成一个标记。

我该怎么做?任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: python reinforcement-learning decoder cntk sequence-to-sequence


    【解决方案1】:

    您可以在获取 hardmax 之前向输出添加噪声。特别是,您可以使用C.random.gumbelC.random.gumbel_likeexp(output) 按比例采样。这被称为gumbel-max trickcntk.random 模块也包含其他分布,但如果您有对数概率,您很可能希望在 hardmax 之前添加 gumbel 噪声。一些代码:

    @C.Function
    def randomized_hardmax(x):
        noisy_x = x + C.random.gumbel_like(x)
        return C.hardmax(noisy_x)
    

    然后将您的hardmax 替换为randomized_hardmax

    【讨论】:

    • 我在这个新帐户上没有 15 名声望...我现在在中国,我无法登录我的 gmail 帐户或使用 facebook 帐户。我一回到美国就会支持你的回答。再次感谢您。
    【解决方案2】:

    非常感谢 Nikos Karampatziakis。

    如果您想拥有一个随机采样解码器,该解码器可以生成与您的目标序列长度相同的序列,则可以使用以下代码。

    @C.Function
    def sampling(x):
        noisy_x = x + C.random.gumbel_like(x)
        return C.hardmax(noisy_x)
    
    def create_model_sampling(s2smodel):
        @C.Function
        @C.layers.Signature(input=InputSequence[C.layers.Tensor[input_vocab_dim]],
                            labels=LabelSequence[C.layers.Tensor[label_vocab_dim]])
        def model_sampling(input, labels): # (input*) --> (word_sequence*)
            unfold = C.layers.UnfoldFrom(lambda history: s2smodel(history, input) >> sampling,
                                         length_increase=1)
            return unfold(initial_state=sentence_start, dynamic_axes_like=labels)
        return model_sampling
    

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多