27

Non riesco a capire perché l'interruzione funzioni come questo in tensorflow. Il blog di CS231n dice che, "dropout is implemented by only keeping a neuron active with some probability p (a hyperparameter), or setting it to zero otherwise." Inoltre è possibile vedere questo dall'immagine (Tratto da stesso sito) enter image description herePerché l'input è ridimensionato in tf.nn.dropout in tensorflow?

Dal sito tensorflow, With probability keep_prob, outputs the input element scaled up by 1/keep_prob, otherwise outputs 0.

Ora, il motivo per cui l'elemento di input viene scalato da 1/keep_prob? Perché non mantenere l'elemento di input così com'è con probabilità e non scalarlo con 1/keep_prob?

risposta

40

Questo ridimensionamento consente di utilizzare la stessa rete per l'allenamento (con keep_prob < 1.0) e la valutazione (con keep_prob == 1.0). Da Dropout paper:

L'idea è di utilizzare una singola rete neurale in fase di test senza interruzione. I pesi di questa rete sono versioni ridotte dei pesi addestrati. Se un'unità viene mantenuto con probabilità p durante la formazione, i pesi uscita di tale unità sono moltiplicati per p in fase di prova come mostrato in figura 2.

Invece di aggiungere op a ridimensionare i pesi da keep_prob al momento del test, l'implementazione TensorFlow aggiunge un'opzione per aumentare i pesi di 1./keep_prob al momento dell'allenamento. L'effetto sulle prestazioni è trascurabile e il codice è più semplice (poiché utilizziamo lo stesso grafico e trattiamo lo keep_prob come tf.placeholder() che viene alimentato con un valore diverso a seconda che stiamo formando o valutando la rete).

+0

Mi dispiace, sono nuovo in questo concetto. Forse mi manca qualcosa di ovvio. Puoi dare una spiegazione più semplice? Intendo perché 1/keep_prob? Quale sarà la differenza se uso keep_prob vs 1/keep_prob. A proposito, capisco dalla tua spiegazione perché il codice diventa più semplice. –

+10

L'obiettivo è di mantenere la somma prevista dei pesi lo stesso — e quindi il valore atteso delle attivazioni lo stesso — indipendentemente da 'keep_prob'. Se (quando si fa il dropout) disabilitiamo un neurone con probabilità 'keep_prob', dobbiamo moltiplicare gli altri pesi di' 1./keep_prob' per mantenere questo valore lo stesso (in attesa). Altrimenti, ad esempio, la non-linearità produrrebbe un risultato completamente diverso a seconda del valore di 'keep_prob'. – mrry

1

Diciamo che la rete aveva n neuroni e abbiamo applicato tasso di abbandono 1/2

Fase di formazione, saremmo partiti con n/2 neuroni. Quindi se ti aspettavi l'uscita x con tutti i neuroni, ora andrai su x/2. Così, per ogni lotto, i pesi della rete sono addestrati in base a questo x/2

test/Inference/convalida fase, noi non applicare qualsiasi dropout così l'uscita è x. Quindi, in questo caso, l'output sarebbe con x e non x/2, il che darebbe il risultato errato. Quindi quello che puoi fare è ridimensionarlo a x/2 durante il test.

Piuttosto che il ridimensionamento sopra specificato per la fase di test. Quello che fa il layer di dropout di Tensorflow è che sia con dropout o senza (Training o testing), ridimensiona l'output in modo che la somma sia costante.

Problemi correlati