在具有编码器和解码器的seq2seq模型中,在每个生成步骤,softmax层输出整个词汇表的分布。在CNTK中,通过使用C.hardmax函数可以很容易地实现贪婪的解码器。它看起来像这样。使用CNTK通过在每个生成步骤采样生成序列
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
但是,在每一步我都不想以最大概率输出令牌。相反,我想要一个随机解码器,根据词汇表的概率分布生成一个标记。
我该怎么做?任何帮助表示赞赏。谢谢。
WOWWWWWWW,令人惊叹!非常感谢。你是如此的乐于助人! – meijiesky
那么你怎么upvote我的答案呢? –
我没有15这个新帐户的声望...我现在在中国,我无法登录到我的Gmail帐户或使用Facebook帐户。一回到美国,我会尽快回复您的答案。再次感谢你。 – meijiesky