2016-03-01 15 views
12

Biorąc pod uwagę prosty mini-partyjny gradient zejścia na mnist w tensorflow (jak w tym tutorial), w jaki sposób mogę indywidualnie pobierać gradienty dla każdego przykładu z partii.Niezagregowane gradienty/gradienty na przykład w tensorflow

tf.gradients() wydaje się zwracać gradienty uśrednione dla wszystkich przykładów w grupie. Czy istnieje sposób na pobieranie gradientów przed agregacją?

Edycja: Pierwszym krokiem w kierunku tej odpowiedzi jest ustalenie, w którym momencie tensorflow uśrednia gradienty na przykładach w partii. Myślałem, że stało się to w _AggregatedGrads, ale nie wydaje się, żeby tak było. Jakieś pomysły?

+1

Brzmi to jak chcesz, a nie Jacobiego gradientu. –

Odpowiedz

5

zwraca gradient w odniesieniu do straty. Oznacza to, że jeśli strata jest sumą strat przykładowych, to gradient jest również sumą gradientów strat dla przykładu.

Podsumowanie jest domyślne. Na przykład, jeśli chcesz zminimalizować sumę kwadratów norm z błędów Wx-y, gradient w odniesieniu do W to 2(WX-Y)X', gdzie X to partia obserwacji, a Y to partia etykiet. Nigdy nie tworzysz wyraźnie gradientów "na przykład", które później podsumowałeś, więc nie jest to prostą sprawą usunięcia jakiegoś etapu w potoku gradientowym.

Prostym sposobem uzyskania gradientów strat na przykład jest użycie partii o rozmiarze 1 i wykonanie k. Ian Goodfellow wrote up jak zdobyć wszystkie k gradientów w jednym przejściu, gdyż to należy określić gradienty wyraźnie i nie polegać na tf.gradients metody

+4

Możesz użyć tf.gradients, aby wykonać większość pracy. Powiedzmy, że chcesz, aby gradienty na przykład odnosiły się do X. Wywołujesz tf.gradients na konsumentach X. Powiedz na przykład, że masz zmienną Z, czyli X pomnożoną przez jakąś macierz W. Następnie potrzebujesz własnej logiki, aby zrobić przykładowe różnicowanie poprzez mnożenie macierzy, ale możesz użyć tf.gradients, aby uzyskać pochodne w odniesieniu do Z. –

+0

Dzięki! Aby upewnić się, że rozumiem to poprawnie: to działałoby tylko do pierwszego mnożenia macierzy w tylnym łańcuchu propagacji, prawda?Oznacza to, że obliczanie pochodnych dla ciężarów pierwszej warstwy w MLP wymagałoby wdrożenia prawie wszystkich kroków tylnego śmigła. tak czy inaczej? – Bas

+0

Jeśli strata jest sumą strat przykładowych, to nie ma żadnego problemu, ponieważ gracze obliczają właściwą rzecz, która jest sumą przykładowych gradientów strat. Chodzi o to, że kiedy "utrata" jest funkcją, która zwraca skalar dla każdego przykładu. –

1

częściowo odpowiedzieć na moje własne pytanie po majstrować przy tym za chwilę. Wydaje się, że możliwe jest manipulowanie gradienty na przykład podczas gdy nadal pracuje w partii, wykonując następujące czynności:

  • Utwórz kopię tf.gradients(), która przyjmuje dodatkowy tensorowy/zastępczy z przykładowych specyficznych czynników
  • Utwórz kopię _AggregatedGrads() i dodać niestandardową metodę agregacji, który wykorzystuje przykładowe czynniki specyficzne
  • Zadzwoń do funkcji niestandardowych tf.gradients i dać swoje straty w postaci listy plasterków:

custagg_gradients( ys=[cross_entropy[i] for i in xrange(batch_size)],
xs=variables.trainable_variables(), aggregation_method=CUSTOM, gradient_factors=gradient_factors )

Ale to prawdopodobnie będzie mieć taką samą złożoność jak wykonywanie poszczególnych przejść na przykład, i muszę sprawdzić, czy gradienty są poprawne :-).

Powiązane problemy