W jaki sposób Tensorflow `tf.train.Optimizer` oblicza gradienty?

10

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?

limscoder
źródło

Odpowiedzi:

16

To nie jest numeryczne różnicowanie, to automatyczne różnicowanie . Jest to jeden z głównych powodów istnienia tensorflow: określając operacje na wykresie tensorflow (z operacjami na Tensors itd.), Może on automatycznie podążać za regułą łańcucha przez wykres i, ponieważ zna pochodne każdej pojedynczej operacji określ, może łączyć je automatycznie.

Jeśli z jakiegoś powodu chcesz to zastąpić, możesz to zrobić za pomocą gradient_override_map.

Dougal
źródło
Czy automatyczne różnicowanie nie wykorzystuje różnicowania numerycznego?
Aerin
@BYOR No; sprawdź link do Wikipedii powyżej. Jednak to, co robi tensorflow, jest gdzieś pomiędzy „prawdziwą” autodiffem w odwrotnym trybie a różnicowaniem symbolicznym.
Dougal
@Dougal używam trybu chętnego bez wykresu, bez dekoratora funkcji tf., W jaki sposób automatyczne różnicowanie zna relację między tensorami?
datdinhquoc
1
@datdinhquoc To ten sam podstawowy algorytm, tylko trochę bardziej skomplikowany z implementacji.
Dougal
9

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 wprowadź opis zdjęcia tutaj

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.

Shamane Siriwardhana
źródło
1
im używam trybu chętnego bez wykresu, bez dekoratora funkcji tf., w jaki sposób automatyczne różnicowanie zna zależność między tensorami?
datdinhquoc