gpt4 book ai didi

python - 使用 CNTK 通过在每个生成步骤进行采样来生成序列

转载 作者:行者123 更新时间:2023-11-30 22:31:53 25 4
gpt4 key购买 nike

在具有编码器和解码器的 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

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

我怎样才能做到这一点?任何帮助表示赞赏。谢谢。

最佳答案

您可以在采用 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

关于python - 使用 CNTK 通过在每个生成步骤进行采样来生成序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45671038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com