Staram się zrozumieć rolę pochodnej funkcji sigmoidalnej w sieciach neuronowych.
Najpierw wykreślam funkcję sigmoidalną i pochodną wszystkich punktów z definicji za pomocą pytona. Jaka jest dokładnie rola tej pochodnej?
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def derivative(x, step):
return (sigmoid(x+step) - sigmoid(x)) / step
x = np.linspace(-10, 10, 1000)
y1 = sigmoid(x)
y2 = derivative(x, 0.0000000000001)
plt.plot(x, y1, label='sigmoid')
plt.plot(x, y2, label='derivative')
plt.legend(loc='upper left')
plt.show()
machine-learning
neural-network
lukassz
źródło
źródło
Odpowiedzi:
Wykorzystanie pochodnych w sieciach neuronowych służy do procesu szkoleniowego zwanego propagacją wsteczną . Ta technika wykorzystuje opadanie gradientu w celu znalezienia optymalnego zestawu parametrów modelu w celu zminimalizowania funkcji utraty. W twoim przykładzie musisz użyć pochodnej sigmoidu, ponieważ jest to aktywacja, której używają twoje poszczególne neurony.
Funkcja straty
Istotą uczenia maszynowego jest optymalizacja funkcji kosztów, tak abyśmy mogli zminimalizować lub zmaksymalizować niektóre funkcje docelowe. Zazwyczaj nazywa się to funkcją straty lub kosztu. Zazwyczaj chcemy zminimalizować tę funkcję. Funkcja kosztu, , wiąże pewną karę na podstawie błędów wynikowych podczas przesyłania danych przez model jako funkcję parametrów modelu.C
Spójrzmy na przykład, w którym próbujemy oznaczyć, czy obraz zawiera kota czy psa. Jeśli mamy idealny model, możemy dać modelowi zdjęcie i powie nam, czy jest to kot czy pies. Jednak żaden model nie jest idealny i popełni błędy.
Kiedy trenujemy nasz model, aby móc wywnioskować znaczenie z danych wejściowych, chcemy zminimalizować liczbę popełnianych przez niego błędów. Używamy więc zestawu treningowego, dane te zawierają wiele zdjęć psów i kotów i mamy przypisaną do tego etykietę naziemną prawdę. Za każdym razem, gdy przeprowadzamy iterację treningową modelu, obliczamy koszt (liczbę błędów) modelu. Będziemy chcieli zminimalizować ten koszt.
Istnieje wiele funkcji kosztów, z których każda służy swojemu celowi. Często stosowaną funkcją kosztu jest koszt kwadratowy, który jest zdefiniowany jako
.C=1N∑Ni=0(y^−y)2
Jest to kwadrat różnicy między etykietą przewidywaną a etykietą prawdziwej ziemi dla obrazów , nad którymi trenowaliśmy. Będziemy chcieli jakoś to zminimalizować.N
Minimalizowanie funkcji utraty
Rzeczywiście większość uczenia maszynowego to po prostu rodzina platform, które są w stanie określić rozkład poprzez minimalizację niektórych funkcji kosztów. Pytanie, które możemy zadać, brzmi „w jaki sposób możemy zminimalizować funkcję”?
Zminimalizujmy następującą funkcję
.y=x2−4x+6
Jeśli wykreślimy to, zobaczymy, że jest minimum przy . Aby to zrobić analitycznie, możemy przyjąć pochodną tej funkcji jakox=2
.x=2
Często jednak analityczne znalezienie globalnego minimum nie jest możliwe. Zamiast tego używamy niektórych technik optymalizacji. Tutaj również istnieje wiele różnych sposobów, takich jak: Newton-Raphson, wyszukiwanie siatki itp. Wśród nich jest opadanie gradientu . Jest to technika stosowana przez sieci neuronowe.
Spadek gradientu
Użyjmy znanej analogii, aby to zrozumieć. Wyobraź sobie problem minimalizacji 2D. Jest to równoważne z górską wędrówką po pustyni. Chcesz wrócić do wioski, o której wiesz, że jest w najniższym punkcie. Nawet jeśli nie znasz głównych kierunków wioski. Wszystko, co musisz zrobić, to stale schodzić stromo w dół, aż w końcu dotrzesz do wioski. Zejdziemy więc po powierzchni w oparciu o nachylenie zbocza.
Weźmy naszą funkcję
określimy dla którego y jest zminimalizowane. Algorytm spadku gradientu najpierw mówi, że wybierzemy losową wartość dla x . Zainicjujmy przy x = 8 . Następnie algorytm wykona następujące czynności iteracyjnie, aż do osiągnięcia konwergencji.x y x x=8
gdzie jest współczynnikiem uczenia się, możemy ustawić tę wartość na dowolną wartość, jaką chcemy. Istnieje jednak sprytny sposób na wybranie tego. Za duży i nigdy nie osiągniemy naszej minimalnej wartości, a za duży zmarnujemy tak dużo czasu, zanim tam dotrzemy. Jest to analogiczne do wielkości kroków, które chcesz zjechać ze stromego zbocza. Małe kroki, a umrzesz na górze, nigdy nie zejdziesz. Zbyt duży krok i ryzykujesz nadestrzeleniem wioski i wylądowaniem po drugiej stronie góry. Pochodna to sposób, w jaki podróżujemy w dół tego zbocza w kierunku naszego minimum.ν
Iteracja 1:
x n e w = 6,8 - 0,1 ( 2 ∗ 6,8 - 4 ) = 5,84 x n e w = 5,84 - 0,1 ( 2 ∗ 5,84 - 4 ) = 5,07 x n e w = 5,07 - 0,1xnew=8−0.1(2∗8−4)=6.8
xnew=6.8−0.1(2∗6.8−4)=5.84
xnew=5.84−0.1(2∗5.84−4)=5.07 xnew=5.07−0.1(2∗5.07−4)=4.45
xnew=4.45−0.1(2∗4.45−4)=3.96
xnew=3.96−0.1(2∗3.96−4)=3.57 xnew=3.57−0.1(2∗3.57−4)=3.25
xnew=3.25−0.1(2∗3.25−4)=3.00
xnew=3.00−0.1(2∗3.00−4)=2.80
xnew=2.80−0.1(2∗2.80−4)=2.64 xnew=2.64−0.1(2∗2.64−4)=2.51
xnew=2.51−0.1(2∗2.51−4)=2.41
xnew=2.41−0.1(2∗2.41−4)=2.32 xnew=2.32−0.1(2∗2.32−4)=2.26
xnew=2.26−0.1(2∗2.26−4)=2.21
xnew=2.21−0.1(2∗2.21−4)=2.16
xnew=2.16−0.1(2∗2.16−4)=2.13 xnew=2.13−0.1(2∗2.13−4)=2.10
xnew=2.10−0.1(2∗2.10−4)=2.08
xnew=2.08−0.1(2∗2.08−4)=2.06 xnew=2.06−0.1(2∗2.06−4)=2.05
xnew=2.05−0.1(2∗2.05−4)=2.04
xnew=2.04−0.1(2∗2.04−4)=2.03 xnew=2.03−0.1(2∗2.03−4)=2.02
xnew=2.02−0.1(2∗2.02−4)=2.02
xnew=2.02−0.1(2∗2.02−4)=2.01
xnew=2.01−0.1(2∗2.01−4)=2.01 xnew=2.01−0.1(2∗2.01−4)=2.01
xnew=2.01−0.1(2∗2.01−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00 xnew=2.00−0.1(2∗2.00−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00
x n e w = 4,45 - 0,1 ( 2 ∗ 4,45 - 4 ) = 3,96 x n e w = 3,96 - 0,1 ( 2 ∗ 3,96 - 4 ) = 3,57 x n e w = 3,57 - 0,1 ( 2 ∗ 3,57 - 4 )
x n e w = 3,25 - 0,1 ( 2 ∗ 3,25 - 4 ) = 3,00 x n e w = 3,00 - 0,1 ( 2 ∗ 3,00 - 4 ) = 2,80 x n e w = 2,80 - 0,1 ( 2 ∗ 2,80 - 4 ) = 2,64 x n e w =
x n e w = 2,51 - 0,1 ( 2 ∗ 2,51 - 4 ) = 2,41 x n e w = 2,41 - 0,1 ( 2 ∗ 2,41 - 4 ) = 2,32 x n e w = 2,32 - 0,1 ( 2 ∗ 2,32
x n e w = 2,26 - 0,1 ( 2 ∗ 2,26 - 4 ) = 2,21 x n e w = 2,21 - 0,1 ( 2 ∗ 2,21 - 4 ) = 2,16 x n e w = 2,16 - 0,1 ( 2 ∗ 2,16 - 4 ) = 2,13 x n
x n e w =2,10-0,1(2∗2,10-4)=2,08 x n e w =2,08-0,1(2∗2,08-4)=2,06 x n e w =2,06-0,1(
x n e w = 2,05 - 0,1 ( 2 ∗ 2,05 - 4 ) = 2,04 x n e w = 2,04 - 0,1 ( 2 ∗ 2,04 - 4 ) = 2,03 x n e w = 2,03 - 0,1 ( 2 ∗ 2,03 - 4 ) =
x n e w = 2,02 - 0,1 ( 2 ∗ 2,02 - 4 ) = 2,02 x n e w = 2,02 - 0,1 ( 2 ∗ 2,02 - 4 ) = 2,01 x n e w = 2,01 - 0,1 ( 2 ∗ 2,01 - 4 ) = 2,01 x n e w = 2,01
x n e w = 2,01 - 0,1 ( 2 ∗ 2,01 - 4 ) = 2,00 x n e w = 2,00 - 0,1 ( 2 ∗ 2,00 - 4 ) = 2,00 x n e w = 2,00 - 0,1 ( 2 ∗ 2,00 -
x n e w = 2,00 - 0,1 ( 2 ∗ 2,00 - 4 ) = 2,00 x n e w = 2,00 - 0,1 ( 2 ∗ 2,00 - 4 ) = 2,00
Widzimy, że algorytm jest zbieżny przy ! Znaleźliśmy minimum.x=2
Stosowany do sieci neuronowych
Pierwsze sieci neuronowe miał tylko jeden neuron która miała wejść w pewnych , a następnie dostarczania sygnału wyjściowego y . Często stosowaną funkcją jest funkcja sigmoidalnax y^
gdzie jest powiązaną wagą dla każdego wejścia x, a my mamy odchylenie b . Następnie chcemy zminimalizować naszą funkcję kosztóww x b
.C=12N∑Ni=0(y^−y)2
Jak trenować sieć neuronową?
Użyjemy metoda gradientu prostego trenować wagi oparte na wyjściu funkcji esicy i będziemy korzystać z niektórych funkcji kosztu i pociągu na partiach danych o rozmiarze N .C N
jest przewidywany klasa uzyskane z funkcji esicy iYjest etykieta ziemia prawda. Wykorzystamy gradient opadający, aby zminimalizować funkcję kosztów w odniesieniu do wagw. Aby ułatwić życie, podzielimy pochodną w następujący sposóby^ y w
.∂C∂w=∂C∂y^∂y^∂w
Możemy więc zaktualizować wagi poprzez opadanie gradientu jako
źródło
Jednym z powodów popularności funkcji sigmoidalnej w sieciach neuronowych jest to, że jej pochodna jest łatwa do obliczenia .
źródło
W prostych słowach:
Na przykład, jeśli dane wejściowe wynoszą 0 lub 1 lub -2 , pochodna („zdolność uczenia się”) jest wysoka, a propagacja wsteczna znacznie poprawi masy neuronów dla tej próbki.
Z drugiej strony, jeśli wartość wejściowa wynosi 20 , pochodna będzie bardzo bliska 0 . Oznacza to, że rozmnażanie wsteczne na tej próbce nie „nauczy” tego neuronu, aby uzyskać lepszy wynik.
Powyższe rzeczy dotyczą jednej próbki.
Spójrzmy na większy obraz dla wszystkich próbek w zestawie treningowym. Oto kilka sytuacji:
Jeśli pochodna wynosi 0 dla wszystkich próbek w zestawie treningowym ORAZ neuron zawsze daje prawidłowe wyniki - oznacza to, że neuron studiował naprawdę dobrze i już tak inteligentny, jak mógł (uwaga: ten przypadek jest dobry, ale może wskazywać na potencjalne przeregulowanie, co może nie jest dobra)
Jeśli pochodna ma wartość 0 w niektórych próbkach, wartość inna niż 0 w innych próbkach ORAZ neuron daje mieszane wyniki - oznacza to, że ten neuron wykonuje dobrą robotę i potencjalnie może ulec poprawie po dalszym treningu (choć niekoniecznie, ponieważ zależy to od innych neuronów i danych treningowych) mieć)
Tak więc, kiedy patrzysz na wykres pochodny, możesz zobaczyć, ile neuron przygotował się do uczenia się i wchłaniania nowej wiedzy, biorąc pod uwagę konkretny wkład.
źródło
Pochodna, którą tu widzisz, jest ważna w sieciach neuronowych. To jest powód, dla którego ludzie zazwyczaj wolą coś innego, na przykład rektyfikowaną jednostkę liniową .
Czy widzisz spadek pochodnej dla dwóch końców? Co się stanie, jeśli sieć znajduje się po lewej stronie, ale musi przejść na prawą stronę? Wyobraź sobie, że masz 10.0, ale chcesz 10.0. Gradient będzie zbyt mały, aby twoja sieć szybko się zbiegała. Nie chcemy czekać, chcemy szybszej konwergencji. RLU nie ma tego problemu.
Nazywamy ten problem „ nasyceniem sieci neuronowej ”.
Proszę zobaczyć https://www.quora.com/What-is-special-about-rectifier-neural-units-used-in-NN-learning
źródło