In che modo Tensorflow `tf.train.Optimizer` calcola i gradienti?


10

Sto seguendo il tutorial mnist di Tensorflow ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py ).

Il tutorial usa tf.train.Optimizer.minimize(specificamente tf.train.GradientDescentOptimizer). Non vedo argomenti passati da nessuna parte per definire i gradienti.

Il flusso del tensore utilizza la differenziazione numerica per impostazione predefinita?

C'è un modo per passare in pendenze come puoi con scipy.optimize.minimize?

Risposte:


16

Non è una differenziazione numerica, è una differenziazione automatica . Questo è uno dei motivi principali dell'esistenza di tensorflow: specificando le operazioni in un grafico tensorflow (con operazioni su se Tensorcosì via), può seguire automaticamente la regola della catena attraverso il grafico e, poiché conosce le derivate di ogni singola operazione specificare, può combinarli automaticamente.

Se per qualche motivo vuoi sovrascriverlo a tratti, è possibile con gradient_override_map.


La differenziazione automatica non utilizza la differenziazione numerica?
Aerin,

@BYOR No; controlla il link Wikipedia sopra. Quello che fa Tensorflow è in realtà un punto tra l'autodiff "reale" in modalità inversa e la differenziazione simbolica.
Dougal,

@Dougal sto usando la modalità eager senza grafico, nessun decoratore di funzioni, come fa la differenziazione automatica a conoscere la relazione tra i tensori?
datdinhquoc,

1
@datdinhquoc È lo stesso algoritmo fondamentale, solo un po 'più complicato di un'implementazione.
Dougal,

9

Utilizza la differenziazione automatica. Dove utilizza la regola della catena e andare indietro nel grafico assegnando i gradienti.

Diciamo che abbiamo un tensore C Questo tensore ha fatto dopo serie di operazioni Diciamo aggiungendo, moltiplicando, passando attraverso una non linearità ecc.

Quindi se questa C dipende da un insieme di tensori chiamati Xk, dobbiamo ottenere i gradienti

Tensorflow segue sempre il percorso delle operazioni. Intendo il comportamento sequenziale dei nodi e il modo in cui i dati scorrono tra loro. Questo è fatto dal grafico inserisci qui la descrizione dell'immagine

Se abbiamo bisogno di ottenere le derivate del costo rispetto agli input X, ciò che farà prima è caricare il percorso dall'input x al costo estendendo il grafico.

Quindi inizia nell'ordine dei fiumi. Quindi distribuire i gradienti con la regola della catena. (Come per la backpropagation)

Ad ogni modo se leggi i codici sorgente appartengono a tf.gradients () puoi scoprire che tensorflow ha fatto questa parte di distribuzione del gradiente in un modo carino.

Mentre il backtracking tf interagisce con il grafico, nel backword pass TF incontrerà diversi nodi All'interno di questi nodi ci sono operazioni che chiamiamo (ops) matmal, softmax, relu, batch_normalization ecc. Quindi ciò che facciamo fa caricare automaticamente queste operazioni nel grafico

Questo nuovo nodo compone la derivata parziale delle operazioni. get_gradient ()

Parliamo un po 'di questi nodi appena aggiunti

All'interno di questi nodi aggiungeremo 2 cose 1. Derivata calcolata più facilmente) 2.Inoltre gli input all'opp di codifica nel passaggio in avanti

Quindi, secondo la regola della catena, possiamo calcolare

Quindi è così come un'API di backword

Quindi tensorflow pensa sempre all'ordine del grafico per fare una differenziazione automatica

Quindi, come sappiamo, abbiamo bisogno di variabili forward pass per calcolare i gradienti, quindi abbiamo bisogno di memorizzare valori intermedi anche nei tensori, questo può ridurre la memoria. Per molte operazioni, so come calcolare i gradienti e distribuirli.


1
sto usando la modalità eager senza grafico, senza decoratore di funzioni, come fa la differenziazione automatica a conoscere la relazione tra i tensori?
datdinhquoc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.