Como o Tensorflow `tf.train.Optimizer` calcula gradientes?

10

Estou seguindo o tutorial do Tensorflow mnist ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py ).

O tutorial usa tf.train.Optimizer.minimize(especificamente tf.train.GradientDescentOptimizer). Não vejo nenhum argumento sendo passado em lugar algum para definir gradientes.

O fluxo tensor está usando diferenciação numérica por padrão?

Existe uma maneira de passar em gradientes como você pode scipy.optimize.minimize?

limscoder
fonte

Respostas:

16

Não é diferenciação numérica, é diferenciação automática . Essa é uma das principais razões para a existência do tensorflow: ao especificar operações em um gráfico de tensorflow (com operações em se Tensorassim por diante), ele pode seguir automaticamente a regra da cadeia através do gráfico e, pois conhece as derivadas de cada operação individual. especificar, pode combiná-los automaticamente.

Se, por algum motivo, você deseja substituir por partes, é possível com gradient_override_map.

Dougal
fonte
A diferenciação automática não está usando diferenciação numérica?
precisa
@BYOR Não; confira o link da Wikipedia acima. O que o tensorflow faz é, na verdade, algo entre a diferenciação automática "real" do modo reverso e a diferenciação simbólica.
Dougal 21/06
@Dougal estou usando o modo ansioso, sem gráfico, sem decorador tf.function, como a diferenciação automática conhece a relação entre os tensores?
datdinhquoc
11
@datdinhquoc É o mesmo algoritmo fundamental, apenas um pouco mais complicado de uma implementação.
Dougal
9

Ele usa diferenciação automática. Onde ele usa a regra da cadeia e retorna ao gráfico de atribuição de gradientes.

Digamos que temos um tensor C Este tensor C foi feito após uma série de operações Digamos adicionando, multiplicando, passando por alguma não linearidade, etc.

Portanto, se esse C depende de algum conjunto de tensores chamado Xk, precisamos obter os gradientes

O fluxo tensor sempre rastreia o caminho das operações. Quero dizer o comportamento seqüencial dos nós e como os dados fluem entre eles. Isso é feito pelo gráfico insira a descrição da imagem aqui

Se precisarmos obter as derivações dos custos com entradas X, o que isso fará primeiro é carregar o caminho da entrada x para o custo, estendendo o gráfico.

Então começa na ordem dos rios. Em seguida, distribua os gradientes com a regra da cadeia. (Igual à retropropagação)

De qualquer forma, se você ler os códigos-fonte pertencentes a tf.gradients (), poderá descobrir que o tensorflow fez essa parte da distribuição de gradiente de uma maneira agradável.

Enquanto o backtracking tf interage com o gráfico, no backword pass, o TF encontrará diferentes nós. Dentro desses nós, existem operações que chamamos de operações matmal, softmax, relu, batch_normalization etc. Então, o que fazemos é carregar automaticamente essas operações no gráfico

Esse novo nó compõe a derivada parcial das operações. get_gradient ()

Vamos falar um pouco sobre esses nós adicionados recentemente

Dentro desses nós, adicionamos 2 itens 1. Derivativos calculamos mais detalhadamente) 2.Também as entradas para o opesp correspondente na passagem direta

Então, pela regra da cadeia, podemos calcular

Então isso é o mesmo que uma API de backword

Portanto, o tensorflow sempre pensa na ordem do gráfico para fazer a diferenciação automática

Portanto, como sabemos que precisamos de variáveis ​​de passagem direta para calcular os gradientes, precisamos armazenar valores intermediários também em tensores, o que pode reduzir a memória. Para muitas operações, sabemos como calcular gradientes e distribuí-los.

Shamane Siriwardhana
fonte
11
Estou usando o modo ansioso, sem gráfico, sem decorador tf.function, como a diferenciação automática conhece a relação entre os tensores?
datdinhquoc