Gradientový zostup v Jave

1. Úvod

V tomto výučbe sa dozvieme o algoritme gradientného klesania. Implementujeme algoritmus v Jave a krok za krokom ho ilustrujeme.

2. Čo je to gradientový zostup?

Gradient Descent je optimalizačný algoritmus používaný na nájdenie lokálneho minima danej funkcie. Je široko používaný v rámci algoritmov strojového učenia na vysokej úrovni na minimalizáciu strát.

Gradient je ďalšie slovo pre svah a zostup znamená zjazd. Ako už názov napovedá, gradientový zostup klesá po svahu funkcie, kým sa nedostane na koniec.

3. Vlastnosti klesania

Gradient Descent nájde miestne minimum, ktoré sa môže líšiť od globálneho minima. Počiatočný miestny bod je daný ako parameter algoritmu.

Je to iteračný algoritmus, a v každom kroku sa snaží pohybovať dolu svahom a priblížiť sa k miestnemu minimu.

V praxi je algoritmus spätný. V tomto výučbe si ukážeme a implementujeme spätné sledovanie gradientného klesania.

4. Ilustrácia krok za krokom

Gradient Descent potrebuje ako vstup funkciu a východiskový bod. Poďme definovať a vykresliť funkciu:

Môžeme začať v ktoromkoľvek želanom bode. Začnime na X=1:

V prvom kroku stúpanie klesá po svahu s preddefinovanou veľkosťou kroku:

Ďalej to ide ďalej s rovnakou veľkosťou kroku. Tentokrát to však skončí na väčšej r ako posledný krok:

To naznačuje, že algoritmus prešiel miestnym minimom, takže sa vráti dozadu so zníženou veľkosťou kroku:

Následne kedykoľvek prúd r je väčšie ako predchádzajúce r, je veľkosť kroku znížená a potlačená. Iterácia pokračuje, kým sa nedosiahne požadovaná presnosť.

Ako vidíme, Gradient Descent tu našiel lokálne minimum, ale nejde o globálne minimum. Ak začneme o X= -1 namiesto X= 1, bude nájdené globálne minimum.

5. Implementácia v Jave

Existuje niekoľko spôsobov, ako implementovať gradientný zostup. Tu nepočítame deriváciu funkcie na nájdenie smeru svahu, takže naša implementácia funguje aj pre nediferencovateľné funkcie.

Poďme definovať presnosť a krokový koeficient a dajte im počiatočné hodnoty:

dvojnásobná presnosť = 0,000001; dvojitý krokový koeficient = 0,1;

V prvom kroku nemáme predchádzajúci r na porovnanie. Môžeme buď zvýšiť alebo znížiť hodnotu X či r znižuje alebo zvyšuje. Pozitívum krokový koeficient znamená, že zvyšujeme hodnotu X.

Teraz urobme prvý krok:

dvojité predchádzajúce X = počiatočné X; dvojnásobok predchádzajúciY = f.apply (previousX); currentX + = stepCoefficient * previousY;

Vo vyššie uvedenom kóde f je a Funkciaa initialX je a dvojitý, obidve sú poskytované ako vstup.

Ďalším kľúčovým bodom, ktorý je potrebné vziať do úvahy, je skutočnosť, že gradientné klesanie nie je zaručené. Aby sme sa vyhli uviaznutiu v slučke, vytvorme limit počtu iterácií:

int iter = 100;

Neskôr znížime iter o jednu pri každej iterácii. Následne sa zo slučky dostaneme pri maximálne 100 iteráciách.

Teraz, keď máme predošléX, môžeme nastaviť našu slučku:

while (previousStep> precision && iter> 0) {iter--; dvojitý prúdY = f.apply (currentX); if (currentY> previousY) {stepCoefficient = -stepCoefficient / 2; } predchadzajuceX = aktualneX; currentX + = stepCoefficient * previousY; previousY = currentY; previousStep = StrictMath.abs (currentX - previousX); }

V každej iterácii vypočítame novú r a porovnaj to s predchádzajúcim r. Ak aktuálnyY je väčší ako predošlýY, zmeníme smer a zmenšíme veľkosť kroku.

Smyčka pokračuje, kým veľkosť nášho kroku nie je menšia ako požadovaná presnosť. Nakoniec sa môžeme vrátiť currentX ako miestne minimum:

spätný prúd X;

6. Záver

V tomto článku sme prešli algoritmom Gradient Descent s podrobnou ilustráciou.

Taktiež sme implementovali Gradient Descent v Jave. Kód je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found