Próbuję obliczyć pochodną funkcji aktywacji dla softmax. Znalazłem to: https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function nikt nie wydaje właściwego wyprowadzenia dla tego, jak uzyskalibyśmy odpowiedzi dla i = j i i! = J. Czy ktoś mógłby to wyjaśnić! Mylę się z pochodnymi, gdy sumowanie jest zaangażowane jak w mianowniku funkcji aktywacji softmax.Pochodna wyjaśnienia funkcji softmax
Odpowiedz
Pochodna sumy jest sumą pochodnych, tj:
d(f1 + f2 + f3 + f4)/dx = df1/dx + df2/dx + df3/dx + df4/dx
do uzyskania pochodnych p_j
względem o_i
zaczynamy:
d_i(p_j) = d_i(exp(o_j)/Sum_k(exp(o_k)))
postanowiłem wykorzystać d_i
dla pochodnej w odniesieniu do o_i
, aby ułatwić czytanie. Stosując regułę produktów otrzymujemy:
d_i(exp(o_j))/Sum_k(exp(o_k)) + exp(o_j) * d_i(1/Sum_k(exp(o_k)))
Patrząc na pierwszą kadencję, pochodna będzie 0
jeśli i != j
, może być reprezentowany z delta function które wezwę D_ij. Daje to (w pierwszym okresie):
= D_ij * exp(o_j)/Sum_k(exp(o_k))
który jest po prostu nasza pierwotna funkcja mnoży się przez D_ij
= D_ij * p_j
na drugą kadencję, gdy czerpiemy każdy element sumy indywidualnie, tylko non -ZERO termin będzie, gdy , to daje nam (nie zapominając o zasadę zasilania, ponieważ suma jest w mianowniku)
= -exp(o_j) * Sum_k(d_i(exp(o_k))/Sum_k(exp(o_k))^2
= -exp(o_j) * exp(o_i)/Sum_k(exp(o_k))^2
= -(exp(o_j)/Sum_k(exp(o_k))) * (exp(o_j)/Sum_k(exp(o_k)))
= -p_j * p_i
Umieszczenie dwóch t ogether otrzymamy zaskakująco prosty wzór:
D_ij * p_j - p_j * p_i
Jeśli naprawdę chcesz, możemy podzielić ją na i = j
i i != j
przypadkach:
i = j: D_ii * p_i - p_i * p_i = p_i - p_i * p_i = p_i * (1 - p_i)
i != j: D_ij * p_i - p_i * p_j = -p_i * p_j
Który jest naszą odpowiedzią.
Za to, co jest warte, oto moje pochodzenie oparte na odpowiedzi SirGuy: (Zapraszam do wskazywania błędów, jeśli znajdziesz jakieś).
dzięki bardzo za to! Mam tylko jedną wątpliwość: dlaczego 'Σ_k ((d e^{o_k})/do_i) ocenia na' e^{o_i} 'z kroku 4 do 5? Byłbym bardzo wdzięczny za wszelkie spostrzeżenia, jakie możesz wnieść na to pytanie. – duhaime
@duhaime Dobre pytanie. Pomyśl o wszystkich warunkach tej sumy jeden po drugim i zobacz, co dzieje się z każdym terminem. Widzisz, że masz dwa przypadki: Kiedy i = k, terminem jest 'd/do_i e^o_i', który jest' e^o_i'. Kiedy i! = K, dostajesz garść zer. –
Fantastyczny, bardzo dziękuję! – duhaime
- 1. pochodna funkcji
- 2. Jak zaimplementować pochodną Softmax niezależnie od funkcji straty?
- 3. CS231n: Jak obliczyć gradient dla funkcji utraty Softmax?
- 4. semantyczny segmentacja z tensorflow - ValueError w funkcji straty (rzadki-Softmax)
- 5. numpy druga pochodna wielowymiarowej tablicy
- 6. Potrzebuję wyjaśnienia, jak działają wskaźniki podczas przekazywania funkcji jako argumenty
- 7. Potrzebujesz wyjaśnienia CGPointMake?
- 8. Klasa pochodna z Generic T
- 9. Widok macierzy XNA - szukam wyjaśnienia
- 10. Publiczna funkcja wirtualna pochodna prywatna w C++
- 11. Potrzebujesz wyjaśnienia na temat UIApplicationState
- 12. FILESTREAM/FILETABLE Wyjaśnienia dotyczące implementacji
- 13. Potrzebuję wyjaśnienia na temat Distribution.TestSuite
- 14. Sterownik a model - Potrzebuję wyjaśnienia
- 15. Dziwny kod perla - szukam wyjaśnienia
- 16. Szukam wyjaśnienia na temat chomp
- 17. Szukam wyjaśnienia błędu korupcji stosu
- 18. Potrzebujesz wyjaśnienia opcji kompilatora celu i lib
- 19. Lista niestandardowa (pochodna) <T>
- 20. Klasa pochodna od podstawy do podstawy
- 21. Autonomiczna deklaracja pochodna w szablonie Haskell quotation
- 22. G ++ CAS (__sync_val_compare_and_swap) Problem wymaga wyjaśnienia
- 23. Observable.Defer - potrzebuję wyjaśnienia, co dokładnie robi
- 24. Szukałem laymans wyjaśnienia oczekującej koncepcji intencji
- 25. Potrzebujesz wyjaśnienia co do definicji typu literalnego
- 26. Szukasz dobrego wyjaśnienia idiomu generowania tabeli
- 27. Przechodząc Klasa pochodna sposobu, który musi zastąpić oczekując klasy bazowej
- 28. Określanie, czy klasa pochodna zastępuje metodę z klasy bazowej
- 29. Nowe słowo kluczowe: dlaczego metoda pochodna nie jest wywoływana?
- 30. C++: Czy mogę rzucić wektor <klasa pochodna> do wektora <base_class> podczas wywołania funkcji?
Dziękuję bardzo! To jest takie jasne. Nie mogłem prosić o lepsze wyjaśnienie! :) Cieszę się, że rozumiem teraz wyprowadzenie. Zamierzam to odnieść do osoby, która nie otrzymała odpowiedzi w sprawie wymiany math.stack! – Roshini
@SirGuy nie powinno być twoim trzecim wyrażeniem: 'd_i (exp (o_j))/Sum_k (exp (o_k)) + exp (o_j) * d_i (1/Sum_k (exp (o_k)))'? Brakujące exp przed ostatnim "o_k" –
@BenjaminCrouzier Dzięki, naprawiono to – SirGuy