Pochodna roli funkcji sigmoidalnej w sieciach neuronowych

18

Staram się zrozumieć rolę pochodnej funkcji sigmoidalnej w sieciach neuronowych. wprowadź opis zdjęcia tutaj

Najpierw wykreślam funkcję sigmoidalną i pochodną wszystkich punktów z definicji za pomocą pytona. Jaka jest dokładnie rola tej pochodnej? wprowadź opis zdjęcia tutaj

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()
lukassz
źródło
2
Jeśli masz więcej pytań, nie wahaj się zadać
JahKnows

Odpowiedzi:

23

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=1Ni=0N(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=x24x+6

Jeśli wykreślimy to, zobaczymy, że jest minimum przy . Aby to zrobić analitycznie, możemy przyjąć pochodną tej funkcji jakox=2

dydx=2x4=0

.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ę

y=x24x+6

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.xyxx=8

xnew=xoldνdydx

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.ν

dydx=2x4

ν=0.1

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=80.1(284)=6.8
xnew=6.80.1(26.84)=5.84
xnew=5.840.1(25.844)=5.07
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 )xnew=5.070.1(25.074)=4.45
xnew=4.450.1(24.454)=3.96
xnew=3.960.1(23.964)=3.57
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 =xnew=3.570.1(23.574)=3.25
xnew=3.250.1(23.254)=3.00
xnew=3.000.1(23.004)=2.80
xnew=2.800.1(22.804)=2.64
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,32xnew=2.640.1(22.644)=2.51
xnew=2.510.1(22.514)=2.41
xnew=2.410.1(22.414)=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 nxnew=2.320.1(22.324)=2.26
xnew=2.260.1(22.264)=2.21
xnew=2.210.1(22.214)=2.16
xnew=2.160.1(22.164)=2.13
x n e w =2,10-0,1(22,10-4)=2,08 x n e w =2,08-0,1(22,08-4)=2,06 x n e w =2,06-0,1(xnew=2.130.1(22.134)=2.10
xnew=2.100.1(22.104)=2.08
xnew=2.080.1(22.084)=2.06
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 ) =xnew=2.060.1(22.064)=2.05
xnew=2.050.1(22.054)=2.04
xnew=2.040.1(22.044)=2.03
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,01xnew=2.030.1(22.034)=2.02
xnew=2.020.1(22.024)=2.02
xnew=2.020.1(22.024)=2.01
xnew=2.010.1(22.014)=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 -xnew=2.010.1(22.014)=2.01
xnew=2.010.1(22.014)=2.00
xnew=2.000.1(22.004)=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,00xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=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 sigmoidalnaxy^

σ(z)=11+exp(z)

y^(wTx)=11+exp(wTx+b)

gdzie jest powiązaną wagą dla każdego wejścia x, a my mamy odchylenie b . Następnie chcemy zminimalizować naszą funkcję kosztówwxb

.C=12Ni=0N(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 .CN

C=12NiN(y^y)2

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^yw

.Cw=Cy^y^w

Cy^=y^y

y^=σ(wTx)σ(z)z=σ(z)(1σ(z))

y^w=11+exp(wTx+b)(111+exp(wTx+b))

Możemy więc zaktualizować wagi poprzez opadanie gradientu jako

wnew=woldηCw

η

JahKnows
źródło
2
powiedz mi, dlaczego ten proces nie jest tak dobrze opisany w książkach? Czy masz bloga? Jakie materiały do ​​nauki sieci neuronowych polecasz? Mam dane testowe i chcę je trenować. Czy mogę narysować funkcję, którą zminimalizuję? Chciałbym wizualizować ten proces, aby lepiej go zrozumieć.
lukassz
Czy możesz wyjaśnić backpropagację w ten prosty sposób?
lukassz
1
Niesamowita odpowiedź ... (+ 1)
Aditya
1
Backprop jest również podobny do tego, co JahKnows wyjaśnił powyżej ... Jego gradient jest przenoszony aż do danych wejściowych bezpośrednio z wyjść. Szybkie wyszukiwanie w Google wyjaśni to .. To samo dotyczy wszystkich innych funkcji aktywacyjnych również ..
Aditya
1
Cw=(y^y)derivative of sigmoidy^yy^y
2

XWX+bσ(WX+b)

y^y L(y,y^)=L(y,σ(WX+b))Wb

Wb

Jednym z powodów popularności funkcji sigmoidalnej w sieciach neuronowych jest to, że jej pochodna jest łatwa do obliczenia .

M Sef
źródło
1

W prostych słowach:

Pochodna pokazuje zdolność neuronu do uczenia się na określonych danych wejściowych.

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 nieprawidłowe wyniki - oznacza to, że neuron jest nasycony (głupi) i nie poprawi się.
  • 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.

VeganHunter
źródło
0

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

Witaj świecie
źródło