2016-05-16 49 views
8

Attualmente sto cercando di riprodurre i risultati del seguente articolo.
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
Sto utilizzando Keras con il backend theano. Nell'articolo parla del controllo della temperatura dello strato di softmax finale per dare risultati diversi.Come modificare la temperatura di un'uscita softmax in Keras

Temperatura. Possiamo anche giocare con la temperatura di Softmax durante il campionamento. Riducendo la temperatura da 1 ad un numero inferiore (ad esempio 0,5), l'RNN è più sicuro, ma anche più conservativo nei suoi campioni. conservativo. Viceversa, temperature più elevate daranno maggiore diversità a ma al costo di più errori (ad esempio errori di ortografia, ecc.). In particolare, la temperatura ambiente molto vicino allo zero darà la più probabile cosa che Paul Graham potrebbe dire:

Il mio modello è il seguente.

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']) 

L'unico modo che posso pensare di regolare la temperatura dello strato denso finale sarebbe quella di ottenere la matrice peso e moltiplicarlo per la temperatura. Qualcuno sa di un modo migliore per farlo? Inoltre, se qualcuno vede qualcosa di sbagliato nel modo in cui ho impostato il modello, fammi sapere poiché sono nuovo per gli RNN.

risposta

7

Bene, sembra che la temperatura sia qualcosa che si ottiene dall'output del layer Softmax. Ho trovato questo esempio.

https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py

Egli applica la seguente funzione di assaggiare l'uscita soft-max.

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

L'ultimo è diverso da 'np.random.choice (len (a), p = a)'? – danijar

+0

Questo non è il softmax standard con la temperatura come definito qui: https: //en.wikipedia.org/wiki/Softmax_function (nella sezione di apprendimento di rinforzo). Perché viene applicato un log prima di dividere per temperatura? –

0

La risposta da @ chasep255 funziona correttamente ma si otterranno avvisi a causa del registro (0). È possibile semplificare l'operazione e^log (a)/T = a^(1/T) e sbarazzarsi di registro

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

Speranza che aiuta!

+1

Penso che tu intenda e^(log (a)/T) = a^(1/T) – Visionscaper

+1

@Visionscaper si, grazie! L'ho appena corretto – Julian