2016-05-16 280 views
8

我目前正试图重现以下文章的结果。
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
我使用keano和theano后端。在文章中他谈到了控制最终softmax层的温度以提供不同的输出。如何更改Keras中softmax输出的温度

温度。我们也可以在采样过程中使用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新手。

回答

7

好吧,它看起来像温度是你对softmax图层的输出做的。我找到了这个例子。

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)) 
+1

最后一个与'np.random.choice(len(a),p = a)'有什么不同? – danijar

+0

这不是标准温度的softmax,如下所示:https://en.wikipedia.org/wiki/Softmax_function(在强化学习部分)。为什么在除以温度之前是否应用了日志? –

0

从@ chasep255的答案工作正常,但你会因为日志(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)) 

希望它有帮助!

+1

我认为你的意思是e ^(log(a)/ T)= a ^(1/T) – Visionscaper

+1

@Visionscaper是的,谢谢!刚纠正它 – Julian