2

Windows 10 で Python 2.7 Anaconda を使用する

keras を使用して言語モデルを構築するために、GRU ニューラル ネットワークをトレーニングしました。

print('Build model...')
model = Sequential()
model.add(GRU(512, return_sequences=True, input_shape=(maxlen, len(chars))))
model.add(Dropout(0.2))
model.add(GRU(512, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(len(chars)))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

この言語モデルの複雑さを計算するにはどうすればよいですか? たとえば、NLTK はそのモデルのパープレキシティ計算機能を提供します。

4

1 に答える 1

5

言語モデルに関する Keras チュートリアルにも従っていることがわかりましたが、これは私の理解では完全に正しくありません。これは、言語モデルがすべてのサブシーケンスの確率を推定する必要があるためです。たとえば、P(c_1,c_2..c_N)=P(c_1)P(c_2 | c_1)..P(c_N | c_N-1. ..c_1) ただし、入力が sequence_length X #characters の形状の行列であり、ターゲットがシーケンスに続く文字であると仮定すると、モデルの出力は最後の項 P(c_N | c_N-1...c_1 のみを生成します。 )

perplexity が P(c_1,c_2..c_N)^{-1/N} であることから、すべての項を取得することはできません。これが、TimeDistributedDense レイヤーの使用をお勧めする理由です。それはあなたにsequence_length X #charactersの行列を与えます.ここで、すべての行は文字に対する確率分布です.probaと呼びます.

proba のすべての行から、正しい文字の予測を含む列が必要です。

correct_proba = proba[np.arange(maxlen),yTest],

yTest が各タイム ステップで正しい文字のインデックスを含むベクトルであると仮定します。

次に、シーケンスの困惑(そして、すべてのトレーニングシーケンスを平均する必要があります)

np.power(2,-np.sum(np.log(correct_proba),axis=1)/maxlen)

PS。ラテックスで説明を書いたほうがよかった

于 2016-05-15T19:51:36.667 に答える