12.1 Optimizavimas ir gilusis mokymasis
Šiame skyrelyje aptarsime optimizavimo ir giliojo mokymosi sąryšį, taip pat optimizavimo taikymo giliajame mokymesi iššūkius. Giliojo mokymosi uždaviniui paprastai pirmiausia apibrėžiame nuostolio funkciją. Turėdami nuostolio funkciją, galime naudoti optimizavimo algoritmą nuostoliui minimizuoti. Optimizavime nuostolio funkcija dažnai vadinama optimizavimo uždavinio tikslo funkcija. Pagal tradiciją ir susitarimą dauguma optimizavimo algoritmų susiję su minimizavimu. Jei kada reikėtų maksimizuoti tikslą, yra paprastas sprendimas: tiesiog pakeiskite tikslo ženklą.
12.1.1 Optimizavimo tikslas
Nors optimizavimas suteikia būdą minimizuoti giliojo mokymosi nuostolio funkciją, iš esmės optimizavimo ir giliojo mokymosi tikslai iš principo skiriasi. Pirmasis daugiausia susijęs su tikslo minimizavimu, o antrasis – su tinkamo modelio radimu, turint ribotą duomenų kiekį. 3.6 skyrelis išsamiai aptarėme šių dviejų tikslų skirtumą. Pavyzdžiui, apmokymo paklaida ir apibendrinimo paklaida paprastai skiriasi: kadangi optimizavimo algoritmo tikslo funkcija dažniausiai yra nuostolio funkcija, pagrįsta apmokymo duomenų rinkiniu, optimizavimo tikslas yra sumažinti apmokymo paklaidą. Tačiau giliojo mokymosi (arba plačiau – statistinės išvados) tikslas yra sumažinti apibendrinimo paklaidą. Kad pasiektume antrąjį, be optimizavimo algoritmo naudojimo apmokymo paklaidai mažinti, turime atkreipti dėmesį ir į persimokymą.
%matplotlib inline
from d2l import mxnet as d2l
from mpl_toolkits import mplot3d
from mxnet import np, npx
npx.set_np()
%matplotlib inline
from d2l import torch as d2l
import numpy as np
from mpl_toolkits import mplot3d
import torch
%matplotlib inline
from d2l import tensorflow as d2l
import numpy as np
from mpl_toolkits import mplot3d
import tensorflow as tf
Kad iliustruotume minėtus skirtingus tikslus,
panagrinėkime
empirinę riziką ir riziką.
Kaip aprašyta
4.7.3.1 skyrelis,
empirinė rizika
yra vidutinis nuostolis
apmokymo duomenų rinkinyje,
o rizika yra tikėtinas nuostolis
visoje duomenų populiacijoje.
Toliau apibrėžiame dvi funkcijas:
rizikos funkciją f
ir empirinės rizikos funkciją g.
Tarkime, kad turime tik ribotą kiekį apmokymo duomenų.
Todėl čia g yra mažiau glotni nei f.
def f(x):
return x * d2l.cos(np.pi * x)
def g(x):
return f(x) + 0.2 * d2l.cos(5 * np.pi * x)
Žemiau pateiktas grafikas iliustruoja, kad empirinės rizikos minimumas apmokymo duomenų rinkinyje gali būti kitoje vietoje nei rizikos (apibendrinimo paklaidos) minimumas.
def annotate(text, xy, xytext): #@save
d2l.plt.gca().annotate(text, xy=xy, xytext=xytext,
arrowprops=dict(arrowstyle='->'))
x = d2l.arange(0.5, 1.5, 0.01)
d2l.set_figsize((4.5, 2.5))
d2l.plot(x, [f(x), g(x)], 'x', 'risk')
annotate('min of\nempirical risk', (1.0, -1.2), (0.5, -1.1))
annotate('min of risk', (1.1, -1.05), (0.95, -0.5))
12.1.2 Optimizavimo iššūkiai giliajame mokymesi
Šiame skyriuje daugiausia dėmesio skirsime optimizavimo algoritmų našumui minimizuojant tikslo funkciją, o ne modelio apibendrinimo paklaidai. 3.1 skyrelis optimizavimo uždaviniuose skyrėme analitinius ir skaitinius sprendinius. Giliajame mokymesi dauguma tikslo funkcijų yra sudėtingos ir neturi analitinių sprendinių. Vietoj to turime naudoti skaitinius optimizavimo algoritmus. Visi šio skyriaus optimizavimo algoritmai patenka į šią kategoriją.
Giliojo mokymosi optimizavime yra daug iššūkių. Vieni erzinančiausių yra lokalieji minimumai, balno taškai ir nykstantys gradientai. Pažvelkime į juos.
12.1.2.1 Lokalieji minimumai
Bet kuriai tikslo funkcijai , jei reikšmė taške yra mažesnė nei reikšmės bet kuriuose kituose taško aplinkos taškuose, tai gali būti lokalusis minimumas. Jei reikšmė taške yra tikslo funkcijos minimumas visoje apibrėžimo srityje, tai yra globalusis minimumas.
Pavyzdžiui, turint funkciją
galime aproksimuoti šios funkcijos lokalųjį ir globalųjį minimumus.
x = d2l.arange(-1.0, 2.0, 0.01)
d2l.plot(x, [f(x), ], 'x', 'f(x)')
annotate('local minimum', (-0.3, -0.25), (-0.77, -1.0))
annotate('global minimum', (1.1, -0.95), (0.6, 0.8))
Giliojo mokymosi modelių tikslo funkcija paprastai turi daug lokaliųjų optimumų. Kai skaitinis optimizavimo uždavinio sprendinys yra arti lokaliojo optimumo, paskutinės iteracijos gautas skaitinis sprendinys gali minimizuoti tikslo funkciją tik lokaliai, o ne globaliai, nes tikslo funkcijos sprendinių gradientas artėja prie nulio arba tampa nuliu. Tik tam tikras triukšmo kiekis gali išstumti parametrą iš lokaliojo minimumo. Iš tiesų tai viena iš naudingų minirinkinių stochastinio gradientinio nusileidimo savybių, kai natūrali gradientų kaita tarp minirinkinių gali išstumti parametrus iš lokaliųjų minimumų.
12.1.2.2 Balno taškai
Be lokaliųjų minimumų, balno taškai yra dar viena gradientų išnykimo priežastis. Balno taškas yra bet kuri vieta, kurioje visi funkcijos gradientai išnyksta, bet kuri nėra nei globalusis, nei lokalusis minimumas. Panagrinėkime funkciją . Jos pirmoji ir antroji išvestinės išnyksta, kai . Optimizavimas gali sustoti šiame taške, nors jis nėra minimumas.
x = d2l.arange(-2.0, 2.0, 0.01)
d2l.plot(x, [x**3], 'x', 'f(x)')
annotate('saddle point', (0, -0.2), (-0.52, -5.0))
Balno taškai aukštesnėse dimensijose yra dar klastingesni, kaip rodo toliau pateiktas pavyzdys. Panagrinėkime funkciją . Jos balno taškas yra . Tai maksimumas atžvilgiu ir minimumas atžvilgiu. Be to, ji atrodo kaip balnas, nuo ko ši matematinė savybė ir gavo pavadinimą.
x, y = d2l.meshgrid(
d2l.linspace(-1.0, 1.0, 101), d2l.linspace(-1.0, 1.0, 101))
z = x**2 - y**2
ax = d2l.plt.figure().add_subplot(111, projection='3d')
ax.plot_wireframe(x.asnumpy(), y.asnumpy(), z.asnumpy(),
**{'rstride': 10, 'cstride': 10})
ax.plot([0], [0], [0], 'rx')
ticks = [-1, 0, 1]
d2l.plt.xticks(ticks)
d2l.plt.yticks(ticks)
ax.set_zticks(ticks)
d2l.plt.xlabel('x')
d2l.plt.ylabel('y');
x, y = d2l.meshgrid(
d2l.linspace(-1.0, 1.0, 101), d2l.linspace(-1.0, 1.0, 101))
z = x**2 - y**2
ax = d2l.plt.figure().add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z, **{'rstride': 10, 'cstride': 10})
ax.plot([0], [0], [0], 'rx')
ticks = [-1, 0, 1]
d2l.plt.xticks(ticks)
d2l.plt.yticks(ticks)
ax.set_zticks(ticks)
d2l.plt.xlabel('x')
d2l.plt.ylabel('y');
Tarkime, kad funkcijos įvestis yra dimensijų vektorius, o išvestis – skaliaras, taigi jos Hesės matrica turės tikrinių reikšmių. Funkcijos sprendinys gali būti lokalusis minimumas, lokalusis maksimumas arba balno taškas toje padėtyje, kur funkcijos gradientas lygus nuliui:
- Kai funkcijos Hesės matricos tikrinės reikšmės nulinio gradiento padėtyje yra visos teigiamos, funkcija turi lokalųjį minimumą.
- Kai funkcijos Hesės matricos tikrinės reikšmės nulinio gradiento padėtyje yra visos neigiamos, funkcija turi lokalųjį maksimumą.
- Kai funkcijos Hesės matricos tikrinės reikšmės nulinio gradiento padėtyje yra ir neigiamos, ir teigiamos, funkcija turi balno tašką.
Aukštos dimensijos uždaviniuose tikimybė, kad bent kai kurios tikrinės reikšmės bus neigiamos, yra gana didelė. Dėl to balno taškai tikėtinesni nei lokalieji minimumai. Kai kurias šios situacijos išimtis aptarsime kitame skyrelyje, pristatydami iškilumą. Trumpai tariant, iškiliosios funkcijos yra tos, kurių Hesės matricos tikrinės reikšmės niekada nėra neigiamos. Deja, dauguma giliojo mokymosi uždavinių nepriklauso šiai kategorijai. Vis dėlto tai puikus įrankis optimizavimo algoritmams tirti.
12.1.2.3 Nykstantys gradientai
Tikriausiai klastingiausia susiduriama problema yra nykstantis gradientas. Prisiminkite dažniausiai naudojamas aktyvacijos funkcijas ir jų išvestines 5.1.2 skyrelis. Pavyzdžiui, tarkime, kad norime minimizuoti funkciją ir atsitiktinai pradedame nuo . Kaip matome, gradientas yra artimas nuliui. Tiksliau, , taigi . Todėl optimizavimas ilgą laiką stringa, kol padarome pažangą. Paaiškėja, kad tai viena iš priežasčių, kodėl giliojo mokymosi modelių apmokymas buvo gana sudėtingas prieš atsirandant ReLU aktyvacijos funkcijai.
x = d2l.arange(-2.0, 5.0, 0.01)
d2l.plot(x, [d2l.tanh(x)], 'x', 'f(x)')
annotate('vanishing gradient', (4, 1), (2, 0.0))
Kaip matėme, giliojo mokymosi optimizavimas kupinas iššūkių. Laimė, yra tvirtas algoritmų rinkinys, kuris veikia gerai ir yra lengvai naudojamas net pradedantiesiems. Be to, iš tikrųjų nebūtina rasti geriausią sprendinį. Lokalieji optimumai ar net jų apytiksliai sprendiniai vis tiek yra labai naudingi.
12.1.3 Santrauka
- Apmokymo paklaidos minimizavimas negarantuoja, kad rasime geriausią parametrų rinkinį apibendrinimo paklaidai minimizuoti.
- Optimizavimo uždaviniai gali turėti daug lokaliųjų minimumų.
- Uždavinys gali turėti dar daugiau balno taškų, nes paprastai uždaviniai nėra iškilieji.
- Nykstantys gradientai gali sustabdyti optimizavimą. Dažnai padeda uždavinio perparametrizavimas. Gerai inicializuoti parametrai taip pat gali būti naudingi.
12.1.4 Pratimai
- Panagrinėkime paprastą MLP su vienu paslėptuoju sluoksniu, kurio paslėptasis sluoksnis turi, tarkime, dimensijų, ir viena išvestimi. Įrodykite, kad bet kuriam lokaliajam minimumui yra bent ekvivalentiškų sprendinių, kurie elgiasi identiškai.
- Tarkime, kad turime simetrinę atsitiktinę matricą , kurios elementai
yra atsitiktinai gaunami iš tam tikro tikimybių skirstinio
. Be to, tarkime, kad , t. y. kad
skirstinys yra simetrinis (išsamiau žr., pvz., (Wigner, 1958)).
- Įrodykite, kad tikrinių reikšmių skirstinys taip pat yra simetrinis. Tai yra, bet kuriam tikriniam vektoriui tikimybė, kad su juo susijusi tikrinė reikšmė tenkina .
- Kodėl aukščiau pateiktas teiginys neįrodo, kad ?
- Kokius kitus su giliojo mokymosi optimizavimu susijusius iššūkius galite įsivaizduoti?
- Tarkime, kad norite išlaikyti (tikrą) rutulį ant (tikro) balno.
- Kodėl tai sunku?
- Ar galite šį efektą išnaudoti ir optimizavimo algoritmams?
