Gradienttimenetelmä: askelpituus muuttaa kulkureittiä
Gradienttimenetelmä (gradient descent) päivittää parametreja vähentämällä niistä oppimisnopeudella kerrotun gradientin. Toistaminen voi pienentää derivoituvaa tavoitetta, mutta askelpituus ratkaisee, pysyykö paikallinen suunta hyödyllisenä.
Kapea laakso selittää, miksi suurempi askel voi epäonnistua. Tavoite voi muuttua yhdessä suunnassa loivasti ja toisessa jyrkästi.
Yksi tavoite, kaksi reittiä
NumPy-esimerkki minimoi lausekkeen w[0]**2 + 10*w[1]**2. Toisessa suunnassa kaarevuus on kymmenkertainen.
import numpy as np
def descend(rate, steps=40):
weights = np.array([1., 1.])
losses = []
for _ in range(steps):
losses.append(weights[0]**2 + 10 * weights[1]**2)
gradient = np.array([2 * weights[0], 20 * weights[1]])
weights -= rate * gradient
return np.array(losses)
stable = descend(0.05)
unstable = descend(0.12)
Pienempi oppimisnopeus lähestyy nollaa. Suurempi ylittää laakson jyrkässä suunnassa ja erkanee minimistä, vaikka gradientti on joka kerta täsmällinen.
Neuroverkkoja koulutettaessa gradientti arvioidaan tavallisesti eristä koko aineiston sijaan. Liikemäärä ja adaptiiviset optimoijat muokkaavat päivityssääntöä, mutta tarvitsevat silti sopivan oppimisnopeuden. Kasvava häviö voi johtua epävakaasta päivityksestä, ei vain huonosta aineistosta tai liian pienestä mallista.