Alamäkeen: Gradient Descent ja kaksi askelta, jotka kaikki ohittavat
Laske oppimisnopeuden tarkka yläraja ja katso, miten 3 600 suunnan raakavoimahaku löytää gradientin ilman vihjettä.
Tällä sivulla
Edellinen luku päättyi laaksoon.
Ei vertauskuvalliseen: ihan oikeaan käyrään, jossa häviö oli piirretty yhden parametrin funktiona, painui alas ja nousi takaisin ylös. Eikä sen alla olevaa häviötä valittu siksi, että se oli siisti — se johdettiin mittausten kohinaa koskevasta väitteestä, ja neliövirhe tuli ulos seurauksena eikä konventiona.
Meillä on siis maisema, jolla on pohja, ja syy uskoa, että pohja on oikea paikka olla. Meiltä puuttuu tapa päästä sinne.
Tässä luvussa rakennetaan sellainen, ja kyseessä on algoritmi, joka kouluttaa jokaisen mallin tämän kurssin loppuosassa — aivan jokaisen, poikkeuksetta, aina satojen miljardien parametrien malleihin asti. Se mahtuu noin kahteenkymmeneen riviin. Kaksi vaikeaa kohtaa eivät ole noissa kahdessakymmenessä rivissä, ja ne ovat kaksi asiaa, jotka melkein jokainen selitys ohittaa:
- Miksi miinusmerkki. Päivitys vähentää gradientin. Jokainen opas kirjoittaa sen; hyvin harva sanoo, miksi gradientti on suunta, joka menee ylös, mikä on ainoa fakta, joka tekee miinusmerkistä jotain muuta kuin uskonvaraisen teon.
- Miten suuri askel. ”Liian suuri hajaantuu, liian pieni on hidas” on totta ja hyödytöntä. On olemassa tarkka luku, se voidaan laskea häviöstä, ja tämä luku laskee sen kahdesti — kerran leluesimerkin paraabelille ja kerran oikealle datalle.
Asetelma ja miksi et voi vain hakea
Linkki osioon: Asetelma ja miksi et voi vain hakeaKerrataan niin, että tämä luku seisoo omillaan: luvun 1 liukuhihnan kahdeksan osaa, mutta kysytään eri kysymys. Ei hyväksy vai hylkää — se palaa myöhemmin — vaan ennusta osan paino sen leveyden perusteella.
import numpy as np
WIDTH = np.array([18.0, 19.5, 20.2, 21.0, 24.0, 25.5, 23.0, 26.0])
WEIGHT = np.array([47.0, 52.0, 49.0, 55.0, 61.0, 66.0, 70.0, 58.0])
x = WIDTH - WIDTH.mean() # 22.15 mm
y = WEIGHT - WEIGHT.mean() # 57.25 gMittaukset on keskitetty, täsmälleen kuten luvussa 1 ja syystä, joka palaa korkojen kanssa ennen tämän luvun loppua. Malli on suora, , ja häviö on edellisessä luvussa johdettu mean squared error:
Kaksi parametria. Miksei vain kokeilla paljon arvoja? Tehdään se oikeasti — ruudukko väliltä – ja –, askelin :
grid 501 x 1001 = 501,501 evaluations in 3.67 s
best found: a = 2.1000, b = -0.0000, L = 24.592450Puoli miljoonaa arviointia kahden luvun paikantamiseen kahden desimaalin tarkkuudella — ja tuo sekunti on seinäkelloaikaa yhdellä koneella, joten uusi ajo osuu minne tahansa kolmen ja kuuden välille; arviointien määrä ja minimi ovat se osa, joka toistuu. Gradient descent saa tämän luvun lopussa neljä desimaalia kahdeksassa askeleessa ja koko float64-vastauksen kolmessakymmenessäkuudessa.
Mutta nopeus ei ole argumentti, ja juuri tämä kohta ratkaisee koko kurssin. Ruudukkohaku maksaa arviointia, kun parametreja on ja arvoja kullakin . Tuhannella arvolla akselia kohti:
| malli | parametrit | ruudukkoarvioinnit |
|---|---|---|
| tämä suora | 2 | |
| luvun 5 XOR-verkko | 9 | |
| pieni monikerroksinen verkko | 20 000 |
Kolmas rivi ei ole suuri luku, vaan merkityksetön — havaittavassa maailmankaikkeudessa on karkeasti atomia. Haku ei hidastu mallien kasvaessa; se lakkaa olemasta. Kaikki seuraava on olemassa tuon taulukon takia.
Derivaatta on mittaus, jonka voit tehdä
Linkki osioon: Derivaatta on mittaus, jonka voit tehdäKiinnitä hetkeksi , jotta jäljellä on yksi parametri ja yksi käyrä, eli juuri se kuva, johon edellinen luku jätti sinut. Ota siltä piste, , ja kysy: jos tönäisen :tä pienellä määrällä , kuinka paljon häviö liikkuu tönäisyn yksikköä kohti?
Tuo suhde on nousu jaettuna etenemällä — käyrän kahden pisteen kautta kulkevan suoran kulmakerroin. Kun kutistuu, pisteet liukuvat yhteen ja suorasta tulee tangentti. Sen kulmakerroin on derivaatta : nopeus, jolla häviö muuttuu, kun muuttuu yhden yksikön. Ei minkään approksimaatio eikä äärettömän pieni suure. Tavallisten suhteiden raja-arvo.
Tämä kannattaa ajaa, koska luvut kertovat jotain, mitä määritelmä ei kerro:
def loss1(a):
return np.mean((a * x - y) ** 2)
for h in [1.0, 1e-2, 1e-4, 1e-6, 1e-8, 1e-10, 1e-12, 1e-14]:
q = (loss1(1.0 + h) - loss1(1.0)) / h
print(f"h = {h:<8.0e} slope estimate = {q:.10f} error = {abs(q + 16.385):.3e}")h = 1e+00 slope estimate = -8.9400000000 error = 7.445e+00
h = 1e-02 slope estimate = -16.3105500000 error = 7.445e-02
h = 1e-04 slope estimate = -16.3842555001 error = 7.445e-04
h = 1e-06 slope estimate = -16.3849925556 error = 7.444e-06
h = 1e-08 slope estimate = -16.3850003787 error = 3.787e-07
h = 1e-10 slope estimate = -16.3850444324 error = 4.443e-05
h = 1e-12 slope estimate = -16.3851154866 error = 1.155e-04
h = 1e-14 slope estimate = -17.0530256582 error = 6.680e-01Tässä tapahtuu kaksi asiaa, ja molemmat kantavat rakennetta.
Virhe ei ole epämääräisesti verrannollinen :ään — se on täsmälleen . Jaa sadalla, virhe jakautuu sadalla, neljän merkitsevän numeron tarkkuudella joka kerta. Tuo vakio ei ole koriste: se on puolet häviön toisesta derivaatasta, ja se on ensiesiintyminen ajatukselle, johon tullaan kahden osion päästä — että käyrä pisteen lähellä näyttää suoralta plus korjaukselta, joka on verrannollinen :ään.
Ja sitten kuvio rikkoutuu. Alle arvionti muuttuu huonommaksi, ja kohdassa se on väärin jo toisessa numerossa. Matematiikassa ei tapahtunut mitään; edellisen luvun liukulukulaatikko tapahtui. ja ovat samaa mieltä ensimmäisistä kymmenestä numerostaan, niiden vähentäminen tuhoaa nuo numerot, ja raunioiden jakaminen pienellä luvulla vahvistaa sen, mitä jäi jäljelle. On olemassa paras — tässä noin , suunnilleen kone-epsilonin neliöjuuri — ja pienemmäksi meneminen ei ole huolellisempaa vaan vähemmän huolellista. Muista tämä; tämän luvun lopussa oleva funktio riippuu siitä.
Tarkka kulmakerroin, laskennasta mittauksen sijaan, on . Voimme siis lopettaa mittaamisen ja aloittaa johtamisen.
Kompositio ja ketjusääntö
Linkki osioon: Kompositio ja ketjusääntöTässä on ajatus, jonka varaan loppukurssi rakentuu, kerran ja selvästi sanottuna.
Kahden funktion kompositio tarkoittaa, että syötät toisen toiseen: . Ei muuta.
Syvä verkko ei ole kuin kompositio. Se on sellainen. Kerros on funktio; kerrosten pinoaminen on niiden komponointia; ”syvyys” on funktioiden määrä ketjussa. Kun luvussa 5 rakennetaan verkko, rakennetaan eikä mitään muuta. Tämä tarkoittaa, että meidän tarkoituksiimme laskennan tärkein yksittäinen sääntö on se, joka derivoi komposition:
Nopeudet kertautuvat. Jos muuttuu kolme kertaa niin nopeasti kuin , ja muuttuu kaksi kertaa niin nopeasti kuin , silloin muuttuu kuusi kertaa niin nopeasti kuin . Siinä on koko sisältö, ja siksi kymmenen kerroksen läpi takaisin kulkeva signaali kerrotaan kymmenellä luvulla — minkä vuoksi luku 6 käyttää yhden osion siihen, mitä tapahtuu, kun nuo luvut ovat kaikki hieman alle yhden.
Käytä sitä häviöömme. Kirjoita residuaali , jolloin . Jokainen riippuu :sta sisäfunktion kautta, jonka derivaatta on . Ketjusääntö termi termiltä:
Nuo kaarevat -symbolit merkitsevät osittaisderivaattaa: derivoi yhden muuttujan suhteen ja käsittele kaikkia muita vakioina. Mitään uutta ei tapahdu — se on sama raja-arvo kuin aiemmin, otettuna yhtä akselia pitkin. Kerää osittaisderivaatat vektoriksi ja sinulla on gradientti:
Pisteessä tuo vektori on . Kaksi lukua. Kysymys on, mitä ne tarkoittavat, ja tämä on ensimmäinen askel, jonka kaikki ohittavat.
Miksi gradientti osoittaa ylämäkeen
Linkki osioon: Miksi gradientti osoittaa ylämäkeenGradientti on akselien suuntaisten kulmakertoimien vektori. Siinä kaikki, mitä olemme todistaneet. Ei ole ilmeistä — eikä sen pidäkään olla ilmeistä — että niiden kokoaminen vektoriksi tuottaisi jotain, joka osoittaa mihinkään erityiseen.
Määritellään siis se, mitä oikeasti haluamme. Valitse yksikkövektori , suunta. Suuntaderivaatta on nopeus, jolla häviö muuttuu, kun kävelet siihen suuntaan:
Ketjusääntö muuttaa tämän laskettavaksi. Käveleminen :n suuntaan muuttaa :tä nopeudella ja :ta nopeudella , ja vaikutukset lasketaan yhteen:
Muutosnopeus missä tahansa suunnassa on gradientin ja tuon suunnan pistetulo. Ja nyt loppuhuipennus, joka on yksi rivi geometriaa. Kun pistetulo kirjoitetaan vektorien välisen kulman avulla,
koska :n pituus on 1. Ainoa asia, jota hallitset, on , joka on suurin kohdassa ja pienin puolen kierroksen päässä, asteessa. Siis:
- Jyrkin nousu on itse :n suuntainen, ja kulmakerroin siellä on täsmälleen .
- Jyrkin lasku on :n suuntainen, ja kulmakerroin siellä on .
- Gradienttiin nähden kohtisuorassa häviö ei muutu lainkaan. Siksi korkeuskäyrät leikkaavat gradientin suorassa kulmassa.
Siinä on miinusmerkki. Ei konventio, ei jonkun valitsema merkinvaihto: nopeimman pienenemisen suunta on negatiivinen gradientti, koska minimoituu puolen kierroksen päässä, eikä mistään muusta syystä.
Koska tämä on väite kaikista suunnista, testataan sitä kaikilla suunnilla. Otetaan 3 600 näytettä, yksi joka kymmenenneltä asteelta, ja mitataan jokainen tönäisemällä:
theta = np.array([1.0, 4.0])
g = grad(theta)
print("gradient ", g)
print("its length ", np.linalg.norm(g))
print("its angle ", np.degrees(np.arctan2(g[1], g[0])) % 360, "degrees")
best = max(
((loss(theta + 1e-6 * u) - loss(theta - 1e-6 * u)) / 2e-6, np.degrees(ang))
for ang, u in (
(a, np.array([np.cos(a), np.sin(a)])) for a in np.arange(3600) * 2 * np.pi / 3600
)
)
print("steepest slope", best[0], "at", best[1], "degrees")gradient [-16.385 8. ]
its length 18.23371122399386
its angle 153.97598928042032 degrees
steepest slope 18.233709624837502 at 154.0 degreesHaku, joka ei tiedä gradienteista mitään, löytää 3 600 suunnan joukosta jyrkimmän nousunsa 154,0 asteesta — gradientin omasta suunnasta, haun 0,1 asteen resoluution rajoissa. Ja sen löytämä kulmakerroin, 18,2337, on gradientin pituus kuuden merkitsevän numeron tarkkuudella. Lause ei ole tarina siitä, mitä gradientit merkitsevät; se on mitattava fakta, ja tuo on mittaus.
Miksi pieni askel alamäkeen oikeasti auttaa
Linkki osioon: Miksi pieni askel alamäkeen oikeasti auttaaNyt toinen ohitettu askel. Tiedämme, mikä suunta on alas. Siitä ei seuraa, että siihen suuntaan käveleminen pienentää häviötä, koska ”alas” on väite infinitesimaalisesta tönäisystä, eikä askel ole infinitesimaalinen.
Silta on linearisointi. Pisteen lähellä sileä funktio on tangenttinsa plus korjaus:
Se on ensimmäisen kertaluvun Taylorin kehitelmä. Pois jätetty on kaarevuus — sama termi, joka teki kulmakerrointaulukon arviosta väärän täsmälleen :n verran. Sijoita siihen askel, jonka aiomme ottaa, :
Häviö putoaa . Jokainen osa siitä on epänegatiivinen, joten lupaus on todellinen — riittävän pienelle :lle, koska laiminlyöty termi kasvaa kuten ja syö sen lopulta. Siinä koko teoria. Tässä lupaus pidetään ja sitten rikotaan:
eta = 0.2 promised 66.49364500 delivered -16.01619240 ratio -0.240868
eta = 0.1 promised 33.24682250 delivered 12.61936315 ratio 0.379566
eta = 0.01 promised 3.32468225 delivered 3.11840766 ratio 0.937957
eta = 0.001 promised 0.33246822 delivered 0.33040548 ratio 0.993796
eta = 0.0001 promised 0.03324682 delivered 0.03322620 ratio 0.999380
eta = 1e-05 promised 0.00332468 delivered 0.00332448 ratio 0.999938Lue alhaalta. Kun kutistuu, toteutunut pudotus lähestyy luvattua — suhde 0,99938, sitten 0,99994 — eli Taylorin lause on oikeassa. Lue ylhäältä ja kohdassa toteutunut ”pudotus” on negatiivinen kuusitoista. Askel meni alamäkeen ja häviö nousi.
Päivityssääntö on siis
ja siihen liittyy ehto, jota kukaan ei sano ääneen: on riittävän pieni. Riittävän pieni verrattuna mihin, täsmälleen, on seuraavan osion aihe.
Oppimisnopeudella on yläraja, ja se voidaan laskea
Linkki osioon: Oppimisnopeudella on yläraja, ja se voidaan laskeaAloita yksinkertaisimmasta mahdollisesta laaksosta, , jossa . Yksi gradient descent -askel on
Sijainti kerrotaan luvulla joka askeleella. Se on geometrinen jono, ja geometrisilla jonoilla on tasan yksi sääntö: ne kutistuvat, kun kerroin on itseisarvoltaan pienempi kuin 1, ja kasvavat muuten. Siis , eli .
Raja on täsmälleen kohdassa . Ei ”noin 1”, ei ”1 on yleensä liian iso”. Kohdassa kerroin on ja piste pomppii ikuisesti :n ja :n välillä, ei lähestyen eikä paeten. Sen alapuolella konvergoi; sen yläpuolella hajaantuu. Väli jakautuu uudelleen kohdassa , jossa kerroin vaihtaa merkkiä: sen alapuolella lähestyminen on monotonista, sen yläpuolella piste ylittää pohjan ja vuorottelee puolilla, ja täsmälleen kohdassa kerroin on 0 ja yksi ainoa askel laskeutuu minimiin.
Neljä regiimiä neljästä algebrarivistä. Mene ja ylitä rajat itse:
Ja nyt kiinnostava tapaus:
Nyt yleinen sääntö, joka putoaa ulos samasta argumentista. Kerroin oli oikeasti , ja minimin lähellä moniparametrisella häviöllä on yksi tällainen luku jokaista suuntaa kohti — toisten derivaattojen matriisin ominaisarvot. Jokaisen suunnan täytyy olla vakaa yhtä aikaa, joten ylärajan asettaa suurin:
Kun , , yläraja on 1, mikä on juuri se, minkä johdimme. Hihnallemme toisen derivaatan matriisi on , jossa on syötteiden kaksisarakkeinen matriisi, ja sen ominaisarvot ovat 2 ja 14,89, joten yläraja on . Se on ennuste viiden merkitsevän numeron tarkkuudella. Testataan se:
lr=0.1343 -> L = 24.5924
lr=0.13431 -> L = 24.5924
lr=0.13432 -> L = 4707.8 BLEW UP
lr=0.13433 -> L = 4.00452e+16 BLEW UP
lr=0.1344 -> L = 1.18229e+107 BLEW UPViisi desimaalia yhteensopivuutta yhden lineaarialgebrarivin ja for-silmukan sadantuhannen iteraation välillä.
Ja tässä luku 1 palaa. Kaikki edellä käytti keskitettyjä mittauksia. Aja identtinen koodi raaoilla millimetreillä ja grammoilla, ja ominaisarvot ovat 0,0298 ja 998,1 eivätkä 2 ja 14,89. Yläraja romahtaa 0,134:stä arvoon 0,002004 — yhtä täsmällisesti, konvergoiden kohdassa lr=0.002003 ja räjähtäen kohdassa lr=0.002004.
Ylärajaa pahempi on ominaisarvojen välinen suhde. Kuntoluku mittaa, kuinka kaukana pyöreästä laakso on: pitkä kapea uoma pakottaa nopeuden riittävän pieneksi jyrkille seinämille, ja sitten uoman pohjaa kävellään samalla matelevalla vauhdilla. Meillä se muuttuu keskitetyn datan 7,44:stä raa'an datan 33 452:een. Parhaalla nopeudella, jonka kumpikin versio voi ottaa:
| piirteet | kuntoluku | paras nopeus | askeleet 1 %:n päähän optimista |
|---|---|---|---|
| keskitetty | 7,44 | 0,1184 | 10 |
| raa'at millimetrit ja grammat | 33 452 | 0,0020037 | 79 513 |
Sama data, sama koodi, sama vastaus lopussa — ja kahdeksantuhatta kertaa työ, koska kukaan ei vähentänyt keskiarvoa. Luvussa 1 sama poisjättö maksoi perceptronille kuudentuhannen kertoimen epookeissa, ja diagnoosi oli siellä geometrinen: data leijui kaukana origosta. Tässä se on sama geometria optimoinnin asussa, ja siksi syötteen normalisointi ei ole hygieniaohje vaan aritmetiikkaa.1
Kaksikymmentä riviä
Linkki osioon: Kaksikymmentä riviäMikään edellä ei tarvinnut kirjastoa. Tässä on koko optimoija.
def loss(theta):
a, b = theta
return np.mean((a * x + b - y) ** 2)
def grad(theta):
a, b = theta
residual = a * x + b - y
return np.array([np.mean(2 * residual * x), np.mean(2 * residual)])
def descend(theta, lr, steps):
theta = np.array(theta, dtype=float)
for _ in range(steps):
theta = theta - lr * grad(theta)
return theta
theta = descend([0.0, 0.0], lr=0.05, steps=60)
print(theta, loss(theta))[ 2.10040296e+00 -2.76445533e-15] 24.592448791134984Suljetun muodon least-squares-vastaus näille kahdeksalle pisteelle on , , häviöllä . Silmukka löysi sen kahdeksan merkitsevän numeron tarkkuudella tietämättä, että suljettu muoto on olemassa — millä on väliä, koska luvusta 5 eteenpäin sellaista ei ole.
Trajektori, koska sen katsominen on asian ydin:
0 a=0.000000 b=0.000000 L=57.437500
1 a=1.563750 b=0.000000 L=26.736582
2 a=1.963288 b=-0.000000 L=24.732418
5 a=2.098116 b=-0.000000 L=24.592488
10 a=2.100400 b=-0.000000 L=24.592449
60 a=2.100403 b=-0.000000 L=24.592449Suurin osa matkasta taittuu kahdessa ensimmäisessä askeleessa, koska gradientti on suurin silloin, kun olet kauimpana pohjasta, ja kutistuu lähestyessäsi. Gradient descent hidastuu automaattisesti minimin lähellä. Se on ominaisuus, ja luvussa 6 se on myös ongelma.
Missä muualla kulmakerroin on nolla
Linkki osioon: Missä muualla kulmakerroin on nollaTähänastisessa argumentissa on aukko. Askel pysähtyy, kun , ja olemme kutsuneet sitä ”minimiksi”. Piste, jossa gradientti on nolla, on kriittinen piste, ja miniminä oleminen on vain yksi tapa olla sellainen:
- paikallinen minimi: ylämäkeä joka suuntaan, mutta mahdollisesti ei matalin tällainen piste missään;
- paikallinen maksimi: alamäkeä joka suuntaan;
- satulapiste: ylämäkeä joihinkin suuntiin ja alamäkeä toisiin. Pinta saa , joka on nolla origossa, jossa funktiolla on minimi -akselin suunnassa ja maksimi -akselin suunnassa samaan aikaan.
Gradient descent ei voi erottaa näitä toisistaan, koska se katsoo aina vain gradienttia, ja gradientti on kaikissa kolmessa nolla.
Suorallamme on yksi kriittinen piste ja se on vastaus — lineaarisen mallin squared-error-häviö on konveksi, yksi kulho, eikä descent voi epäonnistua löytämään sen globaalia minimiä. Tämä ominaisuus ei selviä kosketuksesta tähän kurssiin. Neuroverkon häviö ei ole konveksi, ja luvusta 5 eteenpäin ”minimi” ei ole asia, joka olisi olemassa: niitä on monta, eri syvyisiä, ja se, minkä saat, riippuu siitä, mistä aloitit. Tämä on yksi virke ja pysyy yhtenä virkkeenä, koska teoria on suuri ja käytännön seuraus pieni.
Näet koko seurauksen yhdellä käyrällä. Ota , jolla on kaksi eri syvyistä laaksoa:
x = -1.046681 f(x) = -0.352386 minimum
x = 0.101031 f(x) = 0.005026 maximum
x = 0.945649 f(x) = -0.152639 minimumMatalaan laaksoon laskeutuminen on häviössä 56,7 % huonompi, eikä algoritmilla ole tapaa tietää sitä, koska laakson sisältä jokainen suunta on ylämäkeä. Gradient descent ei tarjoa tähän korjausta, eikä sellaista ole tulossa. Käytännössä on sen sijaan havainto, että asialla on paljon vähemmän väliä kuin tämä kuva antaa ymmärtää — oikean verkon hyvin korkeissa dimensioissa useimmat kriittiset pisteet osoittautuvat satuloiksi eivätkä ansoiksi,2 ja luku 5 mittaa, kuinka usein pieni verkko oikeasti jää jumiin.
Halvemmat askeleet: stokastinen, minibatch, momentum
Linkki osioon: Halvemmat askeleet: stokastinen, minibatch, momentumYhden asian yllä olevassa grad:ssa pitäisi häiritä sinua: se summaa koko datasetin yli jokaista askelta varten. Kahdeksan osaa ei ole mitään. Miljoona on miljoona gradienttilaskua, jotta parametrit liikkuvat kerran.
Pakotie on se, että gradientti on keskiarvo, ja keskiarvo voidaan arvioida otoksesta. Laske se satunnaisella kourallisella — minibatch — ja astu sen mukaan. Arvio on kohinainen; se on myös harhaton, ja sadat halvat kohinaiset askeleet voittavat yhden kalliin tarkan. Sadallatuhannella synteettisellä osalla, laskien esimerkkikohtaisia gradientteja askelten sijaan:
| menetelmä | askeleet 0,1 %:n päähän optimista | esimerkkikohtaiset gradientit |
|---|---|---|
| full batch | 7 | 700 000 |
| minibatch, 32 | 100 | 3 200 |
| yksi esimerkki kerrallaan | 17 580 | 17 580 |
Kaksisataayhdeksäntoista kertaa vähemmän aritmetiikkaa samaan paikkaan pääsemiseksi. Ja ääripää — yksi esimerkki kerrallaan, Robbinsin ja Monron alkuperäinen stokastinen approksimaatio3 — ei ole voittaja: se on viisi kertaa huonompi kuin 32:n batchit, koska 32 esimerkkiä ei maksa juuri mitään enempää kuin yksi laitteistolla, joka kertoo matriiseja, samalla kun kohina pienenee batch-koon neliöjuuren mukaan. Tämä vaihtokauppa on syy, miksi jokaisessa koskaan lukemassasi koulutusskriptissä on batch_size.
Momentum on toinen halpa korjaus, ja se tähtää suoraan uomaan. Huonosti ehdollistetussa laaksossa askeleet siksakkaavat kapean suunnan yli samalla kun ne ryömivät pitkää suuntaa pitkin. Momentum pitää liukuvaa keskiarvoa menneistä gradienteista, jolloin värähtelevät komponentit kumoavat toisensa ja johdonmukainen komponentti kasautuu:4
Kaksi lisäriviä. Raa'alla keskittämättömällä hihnalla — kuntoluku 33 452, pahin tapauksemme — parhaalla nopeudella, jonka tavallinen descent kestää:
momentum beta=0.0 -> 79,513 steps to 1%
momentum beta=0.9 -> 1,609 steps to 1%
momentum beta=0.99 -> 461 steps to 1%Kerroin 172 kahdella koodirivillä. Luku 6 muuttaa tämän Adamiksi; mekanismi on jo tässä.
Tarkistus, jota tarvitset luvussa 5
Linkki osioon: Tarkistus, jota tarvitset luvussa 5Jokainen tämän luvun gradientti johdettiin käsin ja voi siksi olla väärin. Korjaus on alun kulmakerrointaulukko: mittaa derivaatta numeerisesti ja vertaa. Käytä central difference -menetelmää, , joka kumoaa johtavan virhetermin ja on samalla :lla paljon tarkempi.
def numeric_grad(f, theta, h=1e-5):
theta = np.asarray(theta, dtype=float)
out = np.zeros_like(theta)
for i in range(theta.size):
bump = np.zeros_like(theta)
bump[i] = h
out[i] = (f(theta + bump) - f(theta - bump)) / (2 * h)
return out
def gradcheck(f, df, theta, h=1e-5):
analytic = np.asarray(df(theta), dtype=float)
numeric = numeric_grad(f, theta, h)
return np.max(np.abs(analytic - numeric) / np.maximum(1e-8, np.abs(analytic) + np.abs(numeric)))Vertailun suhteellisella muodolla on väliä: absoluuttinen ero on katastrofi gradientilla, jonka koko on , ja merkityksetön sellaisella, jonka koko on .
relative error: 1.8929136036763527e-11
with 2 dropped: 0.33333333331650744Ensimmäinen rivi on yllä käsin johdettu gradientti. Toinen on sama funktio, josta yhden komponentin kerroin 2 on jätetty pois — yhden merkin kirjoitusvirhe — ja tarkistus nappaa sen heti. Kaikki alle noin on yhteensopivuutta; kaikki yli on bugi. Säilytä tämä funktio: luku 5 käyttää sitä automaattisen differentiointimoottorin debuggaukseen, ja se on ainoa syy, miksi väärä gradientti on ylipäätään löydettävissä.
Mihin tämä johtaa seuraavaksi
Linkki osioon: Mihin tämä johtaa seuraavaksiKaikki tässä luvussa nojasi yhteen oletukseen, jota ei koskaan sanottu ääneen: että voit kirjoittaa ylös.
Suoralle, jolla on kaksi parametria, se oli yksi rivi algebraa. Se lakkaa olemasta sitä melkein heti. Pyydä symbolisen algebran järjestelmältä verkon häviön derivaattaa yhden ensimmäisen kerroksen painon suhteen, yhdelle esimerkille, ja laske vastauksen aritmeettiset operaatiot:
| verkko | operaatiot yhdessä osittaisderivaatassa |
|---|---|
| neljä piiloyksikköä, yksi kerros | 40 |
| neljä piiloyksikköä, kaksi kerrosta | 301 |
| neljä piiloyksikköä, kolme kerrosta | 1 717 |
Kolmas rivi on verkko, jossa on 57 parametria — niin pieni verkko, että se olisi alaviite luvussa 6 — ja sen gradientin kirjoittaminen käsin tarkoittaa noin 97 869 operaatiota yhdelle koulutusesimerkille. Mikään notaatio ei pelasta tätä. Pelastuksen tuo havainto, että kompositioon sovelletussa ketjusäännössä on valtava rakenne, että samat välisuureet esiintyvät uudelleen ja uudelleen, ja että niiden laskeminen oikeassa järjestyksessä antaa kaikki derivaatat suunnilleen yhden forward passin hinnalla. Se on luku 5.
Mutta ensin on pienempi ongelma, ja se odottaa heti.
Meillä on nyt kone, joka vierii alamäkeen millä tahansa derivoituvalla häviöllä. Osoita se hihnan alkuperäiseen kysymykseen — hyväksy vai hylkää, tavoite joka on 1 tai 0 — laita ulostuloon sigmoid, jotta se ennustaa todennäköisyyttä, ja minimoi squared error. Se toimii. Se myös liikkuu tuskin lainkaan silloin, kun se on eniten väärässä, ja gradientti kertoo miksi:
| ulostulo | ennuste | totuus | gradientti squared errorilla | gradientti cross-entropylla |
|---|---|---|---|---|
| 0.5000 | 1 | |||
| 0.1192 | 1 | |||
| 0.0025 | 1 | |||
| 1 |
Malli, joka on itsevarmasti, katastrofaalisesti väärässä — ennustaa 0,0000454, kun vastaus on 1 — tuottaa squared-error-gradientin . Sillä ei ole aavistustakaan, että se on pulassa. Toinen sarake, häviöstä jota emme ole vielä johtaneet, ilmoittaa 1,0: maksimaalinen kiireellisyys täsmälleen siellä, missä se ansaitaan.
Tästä nousee kysymys, jolla seuraava luku avaa. Edellinen luku sanoi, että häviö on oletus kohinasta, ja squared error olettaa Gaussisen kohinan. Millainen kohinamalli kyllä-tai-ei-vastauksella on — ja mikä häviö tulee ulos, kun ajat saman johdon sille?
Lähteet ja menetelmä
Linkki osioon: Lähteet ja menetelmäMenetelmä on näitä kaikkia vanhempi: Cauchy kuvasi sen Académie des Sciencesille lähettämässään muistiossa vuonna 1847 tapana ratkaista yhtälöryhmiä kävelemällä alamäkeen niiden neliöityjen residuaalien summalla. Tämän luvun rinnalla kannattaa lukea myös Sebastian Ruderin An overview of gradient descent optimization algorithms (arXiv:1609.04747), joka kattaa momentumin Adamista lähtien neljässätoista luettavassa sivussa; Nocedalin ja Wrightin Numerical Optimization -teoksen (2. painos, Springer, 2006) luku 3, jonka lause 3.3 antaa jyrkimmän descentin konvergenssinopeuden neliömuodolla kuntoluvun avulla — se on teoria sen takana, miksi ehdollisuus ratkaisee askelmäärän, vaikka se käsittelee line searchia eikä yllä mitattua kiinteän askeleen -ylärajaa; tai Deisenrothin, Faisalin ja Ongin Mathematics for Machine Learning -teoksen §5.8 ja §7.1 samasta aiheesta vähemmällä koneistolla; Princen Understanding Deep Learning -teoksen §6.1 ja Goodfellow’n, Bengion ja Courvillen Deep Learning -teoksen §4.3; Dive into Deep Learning §12.1–12.3, jossa on minibatch-analyysiä useammilla mittauksilla kuin tänne mahtuu; sekä Géronin Hands-On Machine Learning -teoksen (3. painos) luku 4, käytännöllisin käsittely oppimisnopeudesta asiana, jota säädetään eikä johdeta. MIT 6.390 -muistiinpanot laittavat gradient descentin ennen luokittelua, kuten tämä kurssi tekee ja samasta syystä.
Viitteet
Linkki osioon: Viitteet-
LeCun, Y., Bottou, L., Orr, G. B. ja Müller, K.-R. Efficient BackProp, teoksessa Neural Networks: Tricks of the Trade (Springer, 1998), s. 9–50. Osio 4.3 antaa suosituksen ja osio 5.1 yllä olevan tietolaatikon argumentin: syötteiden keskittäminen ja skaalaaminen muuttaa toisen derivaatan matriisin ominaisarvoja ja siten askelten määrää, ei vain numeerista mukavuutta. ↩
-
Dauphin, Y. N., Pascanu, R., Gulcehre, C., Cho, K., Ganguli, S. ja Bengio, Y. Identifying and attacking the saddle point problem in high-dimensional non-convex optimization, arXiv:1406.2572 (2014). Argumentti siitä, että korkeissa dimensioissa kriittiset pisteet ovat ylivoimaisesti useammin satuloita kuin paikallisia minimejä, koska minimi vaatii jokaisen tuhansista suunnista kaartuvan ylöspäin yhtä aikaa. ↩
-
Robbins, H. ja Monro, S. A Stochastic Approximation Method. Annals of Mathematical Statistics 22(3), s. 400–407 (1951). Artikkeli, joka osoitti, että kohinainen gradientin arvio riittää, kun askelkoko pienenee oikealla tavalla. ↩
-
Polyak, B. T. Some methods of speeding up the convergence of iteration methods. USSR Computational Mathematics and Mathematical Physics 4(5), s. 1–17 (1964). Heavy-ball-menetelmä, joka on yllä oleva momentum-päivitys, kaksikymmentäkaksi vuotta ennen kuin backpropagation saavutti tämän alan. ↩