Optimointialgoritmit: gradientti ei vielä ole päivitys
Optimointialgoritmi (optimizer) päättää, miten parametreja muutetaan gradienttien perusteella. Tavallinen stokastinen gradienttimenetelmä skaalaa nykyisen gradientin oppimisnopeudella. Mukautuvat menetelmät käyttävät lisäksi aiemmista askelista kertynyttä tilaa.
Adam ylläpitää gradienttien ja niiden neliöiden eksponentiaalisesti painotettuja keskiarvoja. Ensimmäinen kuljettaa suuntaa kohinaisten päivitysten läpi; toinen säätää kunkin parametrin päivityksen mittakaavaa. Harhakorjaus kompensoi keskiarvojen alustamista nolliksi.
AdamW erottaa painojen vaimennuksen
Tämä NumPy-askel päivittää painotaulukkoa ja kahta tilataulukkoa suoraan. Alusta moment ja square nolliksi, aloita step arvosta 1 ja kasvata sitä jokaisen päivityksen jälkeen. Oletukset käyttävät Adamin tuttuja vaimennuskertoimia.
import numpy as np
def adamw(weight, gradient, moment, square, step, rate, decay=0.01):
beta1, beta2 = 0.9, 0.999
moment *= beta1
moment += (1 - beta1) * gradient
square *= beta2
square += (1 - beta2) * gradient * gradient
corrected_moment = moment / (1 - beta1 ** step)
corrected_square = square / (1 - beta2 ** step)
weight *= 1 - rate * decay
weight -= rate * corrected_moment / (np.sqrt(corrected_square) + 1e-8)
Painojen vaimennusrivi (weight decay) pienentää parametria suoraan. Se ei lisää rangaistusta gradienttien tilasuureisiin. Tämä erottaminen erottaa AdamW:n tavallisesta L2-rangaistuksen lisäämisestä Adamin häviöön.
Tila kuluttaa muistia
Parametri voi tarvita koulutuksessa painonsa, gradientin ja optimointitilan. Adamin kaksi tilataulukkoa selittävät osaltaan, miksi koulutuksen muistitarve ylittää lopullisen mallin tallennuskoon. Sekatarkkuus ja hajautus muuttavat taulukoiden sijaintia ja esitystapaa.
Optimointialgoritmi ei valitse, mikä on hyvä vastaus. Häviö antaa tavoitteen, vastavirta-algoritmi derivaatat ja oppimisnopeuden aikataulu peräkkäisten askelten mittakaavan.