私は現在、次の記事の結果を再現しようとしています。
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
theanoバックエンドでKerasを使用しています。この記事では、最終的なソフトマックス層の温度を制御してさまざまな出力を得る方法について説明しています。
温度。サンプリング中のSoftmaxの温度で遊ぶこともできます。温度を1からいくつかの低い数値(たとえば0.5)に下げると、RNNの信頼性が高まりますが、サンプルの保守性も高まります。逆に、温度が高くなると多様性が増しますが、ミスが多くなります(スペルミスなど)。特に、温度をゼロに非常に近く設定すると、ポール・グレアムが言う可能性が最も高いことがわかります。
私のモデルは次のとおりです。
model = Sequential()
model.add(LSTM(128, batch_input_shape = (batch_size, 1, 256), stateful = True, return_sequences = True))
model.add(LSTM(128, stateful = True))
model.add(Dropout(0.1))
model.add(Dense(256, activation = 'softmax'))
model.compile(optimizer = Adam(),
loss = 'categorical_crossentropy',
metrics = ['accuracy'])
最終的な高密度層の温度を調整するために私が考えることができる唯一の方法は、重み行列を取得し、それを温度で乗算することです。誰かがそれを行うためのより良い方法を知っていますか?また、私がRNNを初めて使用するので、モデルのセットアップ方法に問題がある場合はお知らせください。
さて、温度はソフトマックス層の出力に対して行うことのようです。私はこの例を見つけました。
https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py
彼は次の関数を適用して、ソフトマックス出力をサンプリングします。
def sample(a, temperature=1.0):
# helper function to sample an index from a probability array
a = np.log(a) / temperature
a = np.exp(a) / np.sum(np.exp(a))
return np.argmax(np.random.multinomial(1, a, 1))
@ chasep255からの回答は問題なく機能しますが、log(0)のために警告が表示されます。操作e ^ log(a)/ T = a ^(1/T)を簡略化して、ログを取り除くことができます
def sample(a, temperature=1.0):
a = np.array(a)**(1/temperature)
p_sum = a.sum()
sample_temp = a/p_sum
return np.argmax(np.random.multinomial(1, sample_temp, 1))
それが役に立てば幸い!