2016-05-16 2 views
8

В настоящее время я пытаюсь воспроизвести результаты следующей статьи.
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
Я использую Keras с бэкэндом theano. В статье он рассказывает об управлении температурой конечного слоя softmax, чтобы дать разные результаты.Как изменить температуру выхода softmax в 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.

ответ

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 работает нормально, но вы получите предупреждения из-за log (0). Вы можете упростить операцию х^журнала (а)/T = а^(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

Смежные вопросы