エンコーダーとデコーダーを備えた seq2seq モデルでは、各生成ステップでソフトマックス層が語彙全体の分布を出力します。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
ただし、各ステップで、最大の確率でトークンを出力したくありません。代わりに、ボキャブラリの確率分布に従ってトークンを生成するランダム デコーダーが必要です。
どうやってやるの?どんな助けでも大歓迎です。ありがとう。