Ohjelmointi

Koneoppiminen Java-kehittäjille, osa 1: Koneoppimisen algoritmit

Itse ajavat autot, kasvojentunnistusohjelmistot ja ääniohjatut kaiuttimet on rakennettu koneoppimisen tekniikoille ja kehyksille - ja nämä ovat vasta ensimmäinen aalto. Seuraavan vuosikymmenen aikana uuden sukupolven tuotteet muuttavat maailmaa, käynnistämällä uudet lähestymistavat ohjelmistokehitykseen sekä luomiin ja käyttämiimme sovelluksiin ja tuotteisiin.

Java-kehittäjänä haluat päästä tämän käyrän eteen, varsinkin kun teknologiayritykset alkavat investoida vakavasti koneoppimiseen. Mitä opit tänään, voit rakentaa seuraavan viiden vuoden aikana, mutta sinun on aloitettava jostakin.

Tästä artikkelista pääset alkuun. Aloitat ensivaikutelmalla koneoppimisen toiminnasta, jota seuraa lyhyt opas koneoppimisalgoritmin toteuttamiseen ja kouluttamiseen. Tutkittuasi oppimisalgoritmin sisäosat ja ominaisuudet, joiden avulla voit kouluttaa, pisteyttää ja valita parhaiten sopivan ennustusfunktion, saat yleiskuvan JVM-kehyksen (Weka) käytöstä koneoppimisratkaisujen rakentamiseen. Tämä artikkeli keskittyy valvottuun koneoppimiseen, joka on yleisin tapa kehittää älykkäitä sovelluksia.

Koneoppiminen Java-kehittäjille, osa 2

Oletko valmis seuraavaan vaiheeseen? Tämän opetusohjelman toinen puoli näyttää, kuinka voit kehittää ja ottaa käyttöön koneoppimisen dataputken.

Koneoppiminen ja tekoäly

Koneoppiminen on kehittynyt tekoälyn kentältä, jolla pyritään tuottamaan koneita, jotka kykenevät jäljittelemään ihmisen älykkyyttä. Vaikka koneoppiminen on nouseva suuntaus tietojenkäsittelytieteessä, tekoäly ei ole uusi tieteenala. Alan Turingin 1950-luvun alussa kehittämä Turing-testi oli yksi ensimmäisistä testeistä, jotka luotiin sen määrittämiseksi, voisiko tietokoneella olla todellista älykkyyttä. Turingin testin mukaan tietokone voi todistaa ihmisen älykkyyden huijaamalla ihmisen uskomaan, että se on myös ihminen.

Monet uusimmat koneoppimisen lähestymistavat perustuvat vuosikymmeniä vanhoihin käsitteisiin. Viime vuosikymmenen aikana on muuttunut se, että tietokoneilla (ja hajautetuilla tietokonealustoilla) on nyt koneoppimisalgoritmien edellyttämä prosessointiteho. Suurin osa koneoppimisalgoritmeista vaatii prosessoimiseksi valtavan määrän matriisikertoja ja muita matemaattisia operaatioita. Laskennan tekniikkaa näiden laskelmien hallitsemiseksi ei ollut olemassa edes kaksi vuosikymmentä sitten, mutta se on nykyäänkin.

Koneoppiminen antaa ohjelmille mahdollisuuden toteuttaa laadunparannusprosesseja ja laajentaa valmiuksiaan ilman ihmisen osallistumista. Koneoppimisen avulla rakennettu ohjelma pystyy päivittämään tai laajentamaan omaa koodiaan.

Ohjattu oppiminen vs. valvomaton oppiminen

Ohjattu oppiminen ja valvomaton oppiminen ovat suosituimpia lähestymistapoja koneoppimiseen. Molemmat vaativat koneen syöttämistä valtavaan määrään tietueita korreloimiseksi ja oppimiseksi. Tällaiset kerätyt tietueet tunnetaan yleisesti nimellä a ominaisuusvektorit. Yksittäisen talon kohdalla ominaisuusvektori voi koostua ominaisuuksista, kuten talon koko, huoneiden lukumäärä ja talon ikä.

Sisään ohjattu oppiminen, koneoppimisalgoritmi on koulutettu vastaamaan oikein ominaisuusvektoreihin liittyviin kysymyksiin. Algoritmin kouluttamiseksi koneelle syötetään joukko ominaisuusvektoreita ja niihin liittyvä etiketti. Etiketit toimittaa tyypillisesti ihmisen merkitsijä ja ne edustavat oikeaa "vastausta" annettuun kysymykseen. Oppimisalgoritmi analysoi ominaisuusvektoreita ja niiden oikeita tarroja sisäisten rakenteiden ja suhteiden löytämiseksi niiden välillä. Täten kone oppii vastaamaan oikein kyselyihin.

Esimerkiksi älykäs kiinteistösovellus voidaan kouluttaa ominaisuusvektoreilla, mukaan lukien koko, huoneiden lukumäärä ja vastaava ikä useille taloille. Ihmisen etiketti merkitsisi jokaiselle talolle oikean talon hinnan näiden tekijöiden perusteella. Analysoimalla näitä tietoja kiinteistösovellus koulutettaisiin vastaamaan kysymykseen: "Kuinka paljon rahaa voisin saada tästä talosta?"

Kun harjoitus on ohi, uusia syötetietoja ei merkitä. Kone pystyy vastaamaan oikein kyselyihin, myös näkymättömiin, leimaamattomiin ominaisuusvektoreihin.

Sisään valvomaton oppiminen, algoritmi on ohjelmoitu ennustamaan vastauksia ilman ihmisen merkintöjä tai edes kysymyksiä. Ennalta määrittelemättömien tunnisteiden tai tulosten pitäisi olla valvomaton oppiminen hyödyntää valtavia aineistoja ja prosessointitehoa aiemmin tuntemattomien korrelaatioiden löytämiseksi. Esimerkiksi kulutustuotemarkkinoinnissa valvomatonta oppimista voidaan käyttää piilotettujen suhteiden tai kuluttajaryhmittymien tunnistamiseen, mikä johtaa lopulta uusiin tai parannettuihin markkinointistrategioihin.

Tämä artikkeli keskittyy valvottuun koneoppimiseen, joka on nykyään yleisin tapa koneoppimiseen.

Ohjattu koneoppiminen

Kaikki koneoppiminen perustuu tietoihin. Valvottua koneoppimishanketta varten sinun on merkittävä tiedot mielekkäällä tavalla haluamallesi lopputulokselle. Huomaa taulukossa 1, että talotietueen jokaisella rivillä on etiketti "talon hinta". Yhdistämällä rivitiedot asuntojen hintamerkintöihin algoritmi pystyy lopulta ennustamaan markkinahinnan talolle, jota ei ole tietojoukossaan (huomaa, että talon koko perustuu neliömetreihin ja talon hinta perustuu euroihin).

Taulukko 1. Talon tiedot

OMINAISUUSOMINAISUUSOMINAISUUSLABEL
Talon kokoHuoneiden määräTalon ikäArvioidut talon kustannukset
90 m2 / 295 jalkaa2 huonetta23 vuotta249,000 €
101 m2 / 331 jalkaa3 huonettan / a338,000 €
1330 m2 / 4363 jalkaa11 huonetta12 vuotta6,500,000 €

Alkuvaiheessa todennäköisesti merkitset tietueet käsin, mutta voit lopulta kouluttaa ohjelmasi automatisoimaan tämän prosessin. Olet todennäköisesti nähnyt tämän sähköpostisovellusten kanssa, joissa sähköpostin siirtäminen roskapostikansioon johtaa kyselyyn "Onko tämä roskapostia?" Kun vastaat, harjoittelet ohjelmaa tunnistamaan postit, joita et halua nähdä. Sovelluksen roskapostisuodatin oppii merkitsemään tulevat lähteet samasta lähteestä tai sisältävät samanlaista sisältöä ja hävittämään sen.

Merkittyjä tietojoukkoja tarvitaan vain koulutusta ja testausta varten. Kun tämä vaihe on ohi, koneoppimisalgoritmi toimii leimaamattomilla tietokokonaisuuksilla. Voit esimerkiksi syöttää ennustusalgoritmille uuden, etiketöimättömän talotietueen, ja se ennustaa odotetun asuntohinnan automaattisesti koulutustietojen perusteella.

Kuinka koneet oppivat ennustamaan

Valvotun koneoppimisen haasteena on löytää oikea ennakointitoiminto tietylle kysymykselle. Matemaattisesti haasteena on löytää panos-lähtö-funktio, joka ottaa syötemuuttujat x ja palauttaa ennustusarvon y. Tämä hypoteesitoiminto (hθ) on koulutusprosessin tulos. Usein kutsutaan myös hypoteesitoimintoa kohde tai ennustus toiminto.

Gregor Roth

Useimmissa tapauksissa, x edustaa usean datan pistettä. Esimerkissämme tämä voi olla yksittäisen talon kaksiulotteinen datapiste, jonka määrittelee talon kokoinen arvo ja Huoneiden määrä arvo. Näiden arvojen taulukkoa kutsutaan ominaisuusvektori. Kun otetaan huomioon konkreettinen kohdefunktio, funktiota voidaan käyttää ennusteen tekemiseen jokaiselle ominaisuusvektorille x. Voit ennustaa yksittäisen talon hinnan kutsumalla kohdefunktion käyttämällä ominaisuusvektoria {101.0, 3.0}, joka sisältää talon koon ja huoneiden lukumäärän:

 // kohdefunktio h (joka on oppimisprosessin tulos) Toiminto h = ...; // aseta ominaisuusvektori, jonka talon koko = 101 ja huoneiden lukumäärä = 3 Tupla [] x = Uusi Kaksinkertainen [] {101,0, 3,0}; // ja ennusti asunnon hinnan (etiketti) kaksinkertainen y = h. soveltaa (x); 

Luettelossa 1 taulukon muuttuja x arvo edustaa talon ominaisvektoria. y kohdefunktion palauttama arvo on ennustettu talon hinta.

Koneoppimisen haasteena on määritellä kohdetoiminto, joka toimii mahdollisimman tarkasti tuntemattomille, näkymättömille tietotilanteille. Koneoppimisessa kohdetoiminto (hθ) kutsutaan joskus a malli-. Tämä malli on oppimisprosessin tulos.

Gregor Roth

Oppimisalgoritmi etsii leimattujen harjoitusesimerkkien perusteella rakenteita tai malleja harjoitustiedoista. Näistä se tuottaa mallin, joka yleistyy hyvin kyseisistä tiedoista.

Tyypillisesti oppimisprosessi on tutkiva. Useimmissa tapauksissa prosessi suoritetaan useita kertoja käyttämällä erilaisia ​​muunnelmia oppimisalgoritmeista ja kokoonpanoista.

Lopulta kaikki mallit arvioidaan suorituskykymittareiden perusteella ja valitaan paras. Tätä mallia käytetään sitten ennusteiden laskemiseen tuleville tunnisteettomille tietokokonaisuuksille.

Lineaarinen regressio

Koneen kouluttamiseksi ajattelemaan on ensin valittava käyttämäsi oppimisalgoritmi. Lineaarinen regressio on yksi yksinkertaisimmista ja suosituimmista valvotuista oppimisalgoritmeista. Tämä algoritmi olettaa, että syöttöominaisuuksien ja syötetyn tarran suhde on lineaarinen. Alla oleva yleinen lineaarinen regressiofunktio palauttaa ennustetun arvon yhteenvetona kunkin elementin ominaisuusvektori kerrottuna a: lla theta-parametri (θ). Teeta-parametreja käytetään harjoitusprosessissa regressiotoiminnon mukauttamiseen tai "virittämiseen" harjoitustietojen perusteella.

Gregor Roth

Lineaarisessa regressiofunktiossa teeta- ja ominaisuusparametrit luetellaan tilausnumerolla. Tilausnumero osoittaa theta-parametrien (θ) ja ominaisuusparametrien (x) sijainnin vektorissa. Huomaa, että ominaisuus x0 on vakio offset-termi asetettuna arvolla 1 laskennallisiin tarkoituksiin. Tämän seurauksena verkkotunnuskohtaisen ominaisuuden, kuten talon koon, hakemisto alkaa x: llä1. Esimerkiksi, jos x1 asetetaan talon ominaisuusvektorin ensimmäiselle arvolle, talon koko, sitten x2 asetetaan seuraavalle arvolle, huoneiden lukumäärälle ja niin edelleen.

Luettelossa 2 on esitetty tämän lineaarisen regressiofunktion Java-toteutus, joka on esitetty matemaattisesti muodossa hθ(x). Yksinkertaisuuden vuoksi laskenta tehdään tietotyypillä kaksinkertainen. Sisällä Käytä() Menetelmän ensimmäisen osan odotetaan olevan asetettu arvoon 1,0 tämän toiminnon ulkopuolella.

Listaus 2. Lineaarinen regressio Javalla

 julkinen luokka LinearRegressionFunction toteuttaa funktion {yksityinen lopullinen kaksinkertainen [] thetaVector; LinearRegressionFunction (kaksinkertainen [] thetaVector) {this.thetaVector = Arrays.copyOf (thetaVector, thetaVector.length); } public Double apply (Double [] featureVector) {// laskennallisista syistä ensimmäisen elementin on oltava 1.0 assert featureVector [0] == 1.0; // yksinkertainen, peräkkäinen toteutus kaksoisennuste = 0; for (int j = 0; j <thetaVector.pituus; j ++) {ennustus + = thetaVector [j] * featureVector [j]; } paluuennuste; } public double [] getThetas () {return Arrays.copyOf (thetaVector, thetaVector.length); }} 

Uuden instanssin luomiseksi LinearRegressionFunction, sinun on asetettava theta-parametri. Teeta-parametria tai vektoria käytetään yleisen regressiofunktion mukauttamiseen taustalla oleviin harjoitustietoihin. Ohjelman teeta-parametrit viritetään oppimisprosessin aikana esimerkkien perusteella. Koulutetun kohdetoiminnon laatu voi olla vain yhtä hyvä kuin annettujen harjoitustietojen laatu.

Alla olevassa esimerkissä LinearRegressionFunction ennakoidaan ennakoimaan talon hinta talon koon perusteella. Ottaen huomioon, että x0 on oltava vakioarvo 1,0, kohdefunktio saadaan aikaan kahdella teeta-parametrilla. Teeta-parametrit ovat oppimisprosessin tulos. Uuden instanssin luomisen jälkeen 1330 neliömetrin kokoisen talon hinta ennustetaan seuraavasti:

 // tässä käytetty teeta-vektori tuotettiin junaprosessin tuplasta [] thetaVector = new double [] {1.004579, 5.286822}; LinearRegressionFunction targetFunction = uusi LinearRegressionFunction (thetaVector); // luoda ominaisuusvektorifunktio, jossa x0 = 1 (laskennallisista syistä) ja x1 = talon kokoinen kaksinkertainen [] featureVector = uusi kaksinkertainen [] {1.0, 1330.0}; // tee ennustus kaksinkertaiseksi predictedPrice = targetFunction.apply (featureVector); 

Kohdefunktion ennustusviiva näkyy sinisenä viivana alla olevassa kaaviossa. Rivi on laskettu suorittamalla kohdetoiminto kaikille talon kokoisille arvoille. Kaavio sisältää myös harjoitteluun käytetyt hinta-koko-parit.

Gregor Roth

Toistaiseksi ennustekaavio näyttää sopivan tarpeeksi hyvin. Graafikoordinaatit (leikkauspiste ja kaltevuus) määritetään teeta-vektorilla { 1.004579, 5.286822 }. Mutta mistä tiedät, että tämä teeta-vektori sopii parhaiten sovellukseesi? Sopisiko toiminto paremmin, jos muutat ensimmäisen tai toisen teeta-parametrin? Parhaiten sopivan theta-parametrivektorin tunnistamiseksi tarvitset a apuohjelma-toiminto, joka arvioi kuinka hyvin kohdetoiminto toimii.

Pisteytetään kohdetoiminto

Koneoppimisessa a kustannustoiminto (J (θ)) käytetään tietyn kohdefunktion keskimääräisen virheen tai "kustannuksen" laskemiseen.

Gregor Roth