Seuraava artikkeli auttaa sinua: Aloittelijan opas stokastisen gradientin laskeutumiseen tyhjästä
Suurin osa valvotuista koneoppimismalleista rakennettaessa tärkein tehtävä on suunnitella funktiokartoitus syöttö- ja lähtömallien välille. On olemassa erilaisia matemaattisia optimointimenetelmiä, jotta tämä kartoitus saadaan mahdollisimman oikeaksi etsimällä optimaalinen parametrijoukko. Gradienttilasku ja stokastinen gradienttilasku ovat joitain näistä matemaattisista käsitteistä, joita käytetään optimointiin. Tässä artikkelissa aiomme keskustella stokastisen gradientin laskeutumisesta ja sen toteuttamisesta tyhjästä, jota käytetään luokittelussa huokoinen. Tärkeimmät artikkelissa käsiteltävät kohdat on lueteltu alla.
Sisällysluettelo
- Mikä on gradienttilasku?
- Stokastinen gradienttilasku
- Käytännön toteutus
- Tietojen valmistelu
- Erän luominen ja toimintojen määrittely
- Määrittelevä malli
- Mallin testaus
Mikä on gradienttilasku?
Lähes kaikki koneoppimisalgoritmit perustuvat matemaattisiin operaatioihin. Samoin koneoppimisen gradienttilaskeutumismenetelmä tulee matematiikasta, jossa sitä voidaan hyödyntää ensiluokkaisessa optimoinnissa. Se toimii periaatteessa minkä tahansa differentiaalifunktion paikallisten minimien löytämiseen. Kun puhutaan gradientin laskeutumisen toiminnasta, huomaamme, että se syntyy toistamalla funktion gradientin vastakkaiseen suuntaan olevia askelia mistä tahansa kohdasta, jossa gradientti on jyrkin. Jos sama asia suoritetaan käänteisesti, sitä voidaan kutsua gradienttinousuksi, joka johtaa meidät paikalliseen maksimiin. voimme sanoa, että koneoppimisessa sitä voidaan käyttää optimointiin, joka parantaa oppimisprosessia.
Stokastinen gradienttilasku
Stokastinen gradienttilasku on myös optimointimenetelmä. Optimoitavassa tavoitefunktiossa on sopivat sileysominaisuudet ja tämä sopiva sileys tekee stokastisen gradienttilaskeutumisen erilaisen kuin gradienttilaskeutuminen. Tasaisuusominaisuuksilla olevan tavoitefunktion optimointia voidaan pitää gradientin laskeutumisen stokastisena approksimaationa. Tämä konsepti on myös matematiikasta ja koneoppimisessa sitä voidaan hyödyntää tavoitefunktion minimoimiseen, mikä tarkoittaa tavoitefunktion paikallisten minimien löytämistä sopivalla sileydellä. Tasaisuusominaisuudet voivat olla differentioituvia tai subifferoituvia.
Oletetaan, että on seuraavanlainen optimointitoiminto:
Tässä funktiossa w on parametri, joka minimoi funktion ja joka on arvioitava. W:n stokastisen gradientin laskeutumisen arvioimiseksi käytetään seuraavia vaiheita:
- Satunnaisten w-termien alustus
- W-termi-algoritmin käyttäminen laskee ennusteet
- Laske reaaliarvojen ja ennusteiden välinen keskineliövirhe
- Parametrin (w) päivitetyn arvon laskeminen käyttämällä parametrin edellistä arvoa ja keskineliövirhettä.
- Toista parametrin ennusteen ja päivitetyn arvon laskenta konvergenssiin asti.
Tarkastellaan kuinka voimme toteuttaa stokastisen gradientin laskeutumisen pythonilla.
Käytännön toteutus
Tietojen valmistelu
Tässä toteutuksessa aloitamme tietojen tuomisesta. Kokeilua varten voimme käyttää iirisdataa, jota voidaan kutsua sklearn-kirjastosta.
osoitteesta sklearn.datasets import load_iris data = load_iris() data.keys()
Lähtö:

Nyt voimme muuntaa tietomme Pandas-tietokehykseksi käyttämällä seuraavia koodirivejä.
tuo pandat muodossa pd dataf = pd.DataFrame(data[‘data’]) dataf[‘Species’] = pd.DataFrame(data[‘target’]) dataf
Lähtö:

Tässä artikkelissa yritämme optimoida binääriluokituksen käyttämällä stokastista gradienttilaskua ja iirisdata tarjoaa 3 luokkaa tietojoukossa. Joten seuraavassa vaiheessa muutamme toisen luokan luokkaan 1.
for i in range(len(dataf[‘Species’])): jos dataf[‘Species’][i] == 0: dataf[‘Species’][i] = 1 muu: dataf[‘Species’][i] = 0 dataf
Lähtö:

Jaetaan tiedot.
kohteesta sklearn.model_selection import train_test_split data_feature = dataf.drop(columns=”Laji”) data_class = dataf[‘Species’]
x_train, x_test, y_train, y_test = train_test_split( data_feature, data_class, test_size = 0,2, random_state = 10 )
Tietojen jakamisen jälkeen meidän on valittava tiedoista muutama satunnainen piste tasaisuuden luomiseksi. Ennen valintaa meidän on lisättävä kohdetiedot junatietoihin.
x_train[‘Species’] = y_juna df = x_juna df
Lähtö:

Tässä saamme lopulliset tietomme. Aloitetaan seuraavasta menettelystä.
Erän luominen ja toimintojen määrittely
Tässä osiossa määrittelemme joitain mallin kanssa vaadittavia toimintoja ja teemme myös erien valinnan tiedoista jokaiselle iteraatiolle. Nyt olemme valmiita suorittamaan valintaprosessin. Voimme tehdä sen käyttämällä seuraavia koodirivejä
def stratified_spl(df): df1 = df[df[‘Species’] == 1]df0 = df[df[‘Species’] == 0]df1_spl = df1.sample(n=4) df0_spl = df0.sample(n=8) return pd.concat([df1_spl, df0_spl])
Yllä olevassa funktiossa olemme valinneet 12 satunnaista pistettä jokaiselle iteraatiolle, jossa 4 datapistettä kerätään luokasta yksi ja 8 datapistettä kerätään toisesta luokasta.
Seuraavien koodirivien avulla voimme määritellä sigmoidifunktion
def sigmoid(X, w): z = np.piste(w, XT) palauttaa 1/(1+np.exp(-(z)))
Seuraavaksi menettelyssä meidän on erotettava ominaisuudet ja kohteet tiedoista 12 valitulla satunnaisnäytteellä. Käyttämällä alla olevaa toimintoa voimme suorittaa tämän.
def sep(df): df_features = df.drop(columns=”Laji”) df_label = df[‘Species’]
df_features[’00’] = [1]*12 palauttaa df_features, df_label
Seuraavaksi menettelyssä vaadimme funktion keskineliövirheelle. Voimme määrittää funktion MSE:lle käyttämällä seuraavia koodirivejä.
def SME(X, y, w): n = len(X) yp = sigmoid(X, w) return np.sum((yp-y)**2)/n
Virhefunktion, erottelun ja sigmoidifunktion määrittämisen jälkeen olemme valmiita tekemään funktion stokastisen gradientin laskeutumisluokittelumallille.
Määrittelevä malli
Nyt olemme valmiita tekemään funktion stokastista gradienttilaskua varten.
def grad_des(df, w, alfa, aikakausi): j = []
w1 = []
w1.lisää(w) i:lle alueella(epookissa): d = stratified_spl(df) X, y = sep(d) n= len(X) yp = sigmoid(X, w) i:lle alueella(4): w[i] -= (alfa/n) * np.sum(-2*X[i]*(y-yp)) w[4] -= (alpha/n) *np.sum(-2*(y-yp)) w1.append(list(w)) j.append(SME(X, y, w)) return j, w1
Tässä yllä olevassa funktiossa voimme nähdä, että keräämme SME:n ja w:n jokaisesta iteraatiosta.
Mallin testaus
Nyt olemme valmiita testaamaan mallia. Määritellään joitakin satunnaislukuja w:n arvoksi.
tuo numpy muodossa np w = np.random.rand(5)
Nyt voimme käyttää näitä arvoja ja kouluttaa tietojoukkoa grad_des-funktiolla.
j, w1 = grad_des(x_train, w, 0,01, 100)
Tässä olemme laskeneet tiedoille päivitetyt painot, nyt näiden avulla voimme laskea keskimääräisen neliövirheen käyttämällä yllä määriteltyä funktiota.
def err_test(X, y, w): er = []
i:lle alueella(len(w1)): er.append(SME(X, y, w[i])) paluu er
Tämän funktion avulla voimme laskea ennustetun y:n jokaiselle painolle ja virheelle. Seuraavien koodirivien avulla voimme piirtää virheet.
tuo matplotlib.pyplot muodossa plt def plot(X, y, w): error = err_test(X, y, w) return plt.scatter(alue(len(error)), error) X = x_train.drop(columns=” Laji”) X[’00’] = [1]*len(X) plot(X, y_train, w1)
Lähtö:

Voimme myös tarkistaa testijoukon virheet lisäämällä harhaa.
x_testi[’00’] = [1]*len(x_test) plot(x_test, y_test, w1)
Lähtö:
Tässä näemme, että keskimääräinen neliövirhe laskee iteraatioiden myötä ja se on melkein lähellä nollaa muutamassa viimeisessä iteraatiossa, mikä tarkoittaa, että mallimme on toiminut hyvin.
Viimeiset sanat
Tässä artikkelissa olemme käsitelleet gradientin laskeutumista ja stokastista gradientin laskeutumista, joita käytetään minkä tahansa funktion parametrien optimointiin. Keskustelun ohessa olemme käyneet läpi myös idean, joka voi auttaa meitä toteuttamaan stokastisen gradienttilaskennan pythonilla.
Viitteet