Postępuję zgodnie z samouczkiem mens Tensorflow ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py ).
Samouczek używa tf.train.Optimizer.minimize
(konkretnie tf.train.GradientDescentOptimizer
). Nigdzie nie widzę żadnych argumentów do zdefiniowania gradientów.
Czy przepływ Tensor jest domyślnie domyślnie różnicowany numerycznie?
Czy istnieje sposób, aby przejść w gradienty, jak można z scipy.optimize.minimize
?
źródło
Wykorzystuje automatyczne różnicowanie. Tam, gdzie wykorzystuje regułę łańcucha i przejdź do słowa na wykresie, przypisując gradienty.
Powiedzmy, że mamy tensor C Ten tensor C wykonał po serii operacji Powiedzmy, dodając, mnożąc, przechodząc przez pewną nieliniowość itp.
Więc jeśli to C zależy od jakiegoś zestawu tensorów zwanych Xk, musimy uzyskać gradienty
Tensorflow zawsze śledzi ścieżkę operacji. Mam na myśli sekwencyjne zachowanie węzłów i przepływ danych między nimi. Odbywa się to za pomocą wykresu
Jeśli potrzebujemy uzyskać pochodne danych wejściowych kosztu X, to najpierw zrobi to ładowanie ścieżki od wejścia x do kosztu poprzez rozszerzenie wykresu.
Potem zaczyna się w kolejności rzek. Następnie rozłóż gradienty za pomocą reguły łańcucha. (Taki sam jak propagacja wsteczna)
W każdym razie, jeśli czytasz kody źródłowe należące do tf.gradients (), możesz stwierdzić, że tensorflow wykonał tę część rozkładu gradientu w przyjemny sposób.
Podczas gdy backtracking tf wchodzi w interakcję z wykresem, w hasle backword TF spotka różne węzły Wewnątrz tych węzłów są operacje, które nazywamy (ops) matmal, softmax, relu, batch_normalization itp. Więc to, co robimy, to automatycznie ładuje te operacje do wykres
Ten nowy węzeł składa się z częściowej pochodnej operacji. get_gradient ()
Porozmawiajmy trochę o tych nowo dodanych węzłach
Wewnątrz tych węzłów dodajemy 2 rzeczy 1. Pochodną, którą obliczyliśmy wcześniej) 2. Również dane wejściowe dla odpowiadającego przeciwieństwa w podaniu do przodu
Możemy więc obliczyć regułę łańcucha
To jest tak samo jak API backword
Dlatego tensorflow zawsze myśli o kolejności wykresu, aby wykonać automatyczne różnicowanie
Ponieważ wiemy, że potrzebujemy zmiennych przekazywania do przodu, aby obliczyć gradienty, musimy przechowywać wartości pośrednie również w tensorach, co może zmniejszyć pamięć. W przypadku wielu operacji wiedza na temat obliczania gradientów i ich dystrybucji.
źródło