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
?
fonte
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
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.
fonte