Programmering

Maskinlæring for Java-utviklere, Del 1: Algoritmer for maskinlæring

Selvkjørende biler, ansiktsgjenkjenningsprogram og stemmestyrte høyttalere er alle bygget på maskinlæringsteknologier og rammer - og dette er bare den første bølgen. I løpet av det neste tiåret vil en ny generasjon produkter transformere verden vår, og initiere nye tilnærminger til programvareutvikling og applikasjonene og produktene vi lager og bruker.

Som Java-utvikler vil du komme foran denne kurven, spesielt fordi teknologibedrifter begynner å investere seriøst i maskinlæring. Det du lærer i dag, kan du bygge videre de neste fem årene, men du må begynne et sted.

Denne artikkelen kommer i gang. Du vil begynne med et førsteinntrykk av hvordan maskinlæring fungerer, etterfulgt av en kort guide til implementering og opplæring av en maskinlæringsalgoritme. Etter å ha studert det indre av læringsalgoritmen og funksjonene du kan bruke til å trene, score og velge den best passende prediksjonsfunksjonen, får du en oversikt over å bruke et JVM-rammeverk, Weka, til å bygge maskinlæringsløsninger. Denne artikkelen fokuserer på veiledet maskinlæring, som er den vanligste tilnærmingen til utvikling av intelligente applikasjoner.

Maskinlæring for Java-utviklere, del 2

Er du klar for neste trinn? Andre halvdel av denne veiledningen viser deg hvordan du utvikler og distribuerer maskinlæringsdatarørledningen.

Maskinlæring og kunstig intelligens

Maskinlæring har utviklet seg fra feltet kunstig intelligens, som søker å produsere maskiner som er i stand til å etterligne menneskelig intelligens. Selv om maskinlæring er en fremvoksende trend innen informatikk, er ikke kunstig intelligens et nytt vitenskapelig felt. Turing-testen, utviklet av Alan Turing tidlig på 1950-tallet, var en av de første testene som ble opprettet for å avgjøre om en datamaskin kunne ha reell intelligens. I følge Turing-testen kunne en datamaskin bevise menneskelig intelligens ved å lure et menneske til å tro at det også var menneske.

Mange moderne maskinlæringsmetoder er basert på tiår gamle konsepter. Det som har endret seg det siste tiåret er at datamaskiner (og distribuerte databehandlingsplattformer) nå har prosessorkraften som kreves for maskinlæringsalgoritmer. De fleste maskinlæringsalgoritmer krever et stort antall matrisemultiplikasjoner og andre matematiske operasjoner å behandle. Beregningsteknologien for å håndtere disse beregningene eksisterte ikke engang for to tiår siden, men den gjør det i dag.

Maskinlæring gjør det mulig for programmer å utføre kvalitetsforbedringsprosesser og utvide deres evner uten menneskelig involvering. Et program bygget med maskinlæring er i stand til å oppdatere eller utvide sin egen kode.

Overvåket læring kontra uten tilsyn læring

Overvåket læring og tilsyn uten læring er de mest populære tilnærmingene til maskinlæring. Begge krever at maskinen mates et stort antall dataposter for å korrelere og lære av. Slike innsamlede dataposter er ofte kjent som en funksjonvektorer. Når det gjelder et individuelt hus, kan en funksjonsvektor bestå av funksjoner som total husstørrelse, antall rom og alderen på huset.

I veiledet læring, er en maskinlæringsalgoritme trent til å svare riktig på spørsmål relatert til funksjonsvektorer. For å trene en algoritme mates maskinen med et sett med funksjonsvektorer og en tilhørende etikett. Etiketter blir vanligvis levert av en menneskelig kommentator, og representerer det riktige "svaret" på et gitt spørsmål. Læringsalgoritmeanalysene har vektorer og deres korrekte etiketter for å finne interne strukturer og forhold mellom dem. Dermed lærer maskinen å svare riktig på spørsmål.

Som et eksempel kan en intelligent eiendomsapplikasjon opplæres med funksjonsvektorer inkludert størrelse, antall rom og respektive alder for en rekke hus. En menneskelig merkelapper vil merke hvert hus med riktig huspris basert på disse faktorene. Ved å analysere disse dataene ville eiendomsapplikasjonen bli trent til å svare på spørsmålet: "Hvor mye penger kunne jeg få for dette huset?"

Etter at opplæringsprosessen er over, blir ikke nye inngangsdata merket. Maskinen vil være i stand til å svare riktig på spørsmål, selv for usynlige, umerkede funksjonsvektorer.

I uten tilsyn læring, er algoritmen programmert til å forutsi svar uten menneskelig merking, eller til og med spørsmål. I stedet for forhåndsbestemte etiketter eller hva resultatene skal være, bruker ikke tilsynet læring massive datasett og prosessorkraft for å oppdage tidligere ukjente sammenhenger. I markedsføring av forbrukerprodukter kan for eksempel læring uten tilsyn brukes til å identifisere skjulte relasjoner eller forbrukergruppering, og til slutt føre til nye eller forbedrede markedsføringsstrategier.

Denne artikkelen fokuserer på veiledet maskinlæring, som er den vanligste tilnærmingen til maskinlæring i dag.

Overvåket maskinlæring

All maskinlæring er basert på data. For et veiledet maskinlæringsprosjekt, må du merke dataene på en meningsfull måte for resultatet du søker. Merk deg i tabell 1 at hver rad i husposten inneholder en merkelapp for "huspris." Ved å korrelere raddata til husprisetiketten, vil algoritmen til slutt kunne forutsi markedspris for et hus som ikke er i datasettet (merk at husstørrelsen er basert på kvadratmeter, og boligprisen er basert på euro).

Tabell 1. Husjournaler

TREKKTREKKTREKKMERKELAPP
Husets størrelseAntall romHusets alderAnslåtte huskostnader
90 m2 / 295 fot2 rom23 år249,000 €
101 m2 / 331 fot3 romikke relevant338,000 €
1330 m2 / 4363 fot11 rom12 år6,500,000 €

I tidlige stadier vil du sannsynligvis merke dataposter for hånd, men du kan til slutt trene programmet ditt for å automatisere denne prosessen. Du har sannsynligvis sett dette med e-postprogrammer, hvor flytting av e-post til søppelpostmappen din resulterer i spørsmålet "Er dette søppelpost?" Når du svarer, trener du programmet for å gjenkjenne e-post du ikke vil se. Applikasjonens nettsøppelfilter lærer å merke fremtidig e-post fra samme kilde, eller med lignende innhold, og avhende den.

Merkede datasett er kun nødvendig for opplæring og testing. Etter at denne fasen er over, fungerer maskinlæringsalgoritmen på umerkede datainstanser. For eksempel kan du mate prediksjonsalgoritmen til en ny, umerket husrekord, og den vil automatisk forutsi forventet huspris basert på treningsdata.

Hvordan maskiner lærer å forutsi

Utfordringen med tilsyn med maskinlæring er å finne riktig prediksjonsfunksjon for et spesifikt spørsmål. Matematisk er utfordringen å finne input-output-funksjonen som tar input-variablene x og returnerer prediksjonsverdien y. Dette hypotesefunksjon (hθ) er resultatet av opplæringsprosessen. Ofte kalles hypotesefunksjonen også mål eller prediksjon funksjon.

Gregor Roth

I de fleste tilfeller, x representerer et flere datapunkt. I vårt eksempel kan dette være et todimensjonalt datapunkt for et individuelt hus definert av husstørrelse verdi og antall rom verdi. Matrisen med disse verdiene blir referert til som funksjonvektor. Gitt en konkret målfunksjon, kan funksjonen brukes til å lage en prediksjon for hver funksjonsvektor x. For å forutsi prisen på et enkelt hus, kan du ringe målfunksjonen ved å bruke funksjonsvektoren {101.0, 3.0} som inneholder husstørrelsen og antall rom:

 // målfunksjon h (som er utdata fra læringsprosessen) Funksjon h = ...; // sett funksjonsvektoren med husstørrelse = 101 og antall rom = 3 Dobbel [] x = ny Dobbelt [] {101.0, 3.0}; // og spådde husprisen (etikett) dobbelt y = h. søk (x); 

I oppføring 1 er matrixvariabelen x verdien representerer husets funksjonsvektor. De y verdien som returneres av målfunksjonen er den forventede boligprisen.

Utfordringen med maskinlæring er å definere en målfunksjon som vil fungere så nøyaktig som mulig for ukjente, usynlige dataforekomster. I maskinlæring er målfunksjonen (hθ) kalles noen ganger a modell. Denne modellen er resultatet av læringsprosessen.

Gregor Roth

Basert på merkede treningseksempler, ser læringsalgoritmen etter strukturer eller mønstre i treningsdataene. Fra disse produserer den en modell som generaliserer godt fra disse dataene.

Vanligvis er læringsprosessen utforskende. I de fleste tilfeller vil prosessen bli utført flere ganger ved å bruke forskjellige varianter av læringsalgoritmer og konfigurasjoner.

Til slutt vil alle modellene bli evaluert basert på ytelsesberegninger, og den beste vil bli valgt. Denne modellen vil da bli brukt til å beregne spådommer for fremtidige umerkede datainstanser.

Lineær regresjon

For å trene en maskin til å tenke, er det første trinnet å velge læringsalgoritmen du vil bruke. Lineær regresjon er en av de enkleste og mest populære overvåkede læringsalgoritmene. Denne algoritmen antar at forholdet mellom inngangsfunksjoner og den utgitte etiketten er lineær. Den generiske lineære regresjonsfunksjonen nedenfor returnerer den forutsagte verdien ved å oppsummere hvert element i funksjonvektor ganget med a theta-parameter (θ). Theta-parametrene brukes i treningsprosessen for å tilpasse eller "tune" regresjonsfunksjonen basert på treningsdataene.

Gregor Roth

I den lineære regresjonsfunksjonen blir theta-parametere og funksjonsparametere oppregnet av et abonnementsnummer. Abonnementsnummeret indikerer posisjonen til theta-parametere (θ) og funksjonsparametere (x) i vektoren. Merk at funksjonen x0 er en konstant forskjøvet term satt med verdien 1 for beregningsformål. Som et resultat vil indeksen til en domenespesifikk funksjon som husstørrelse begynne med x1. Som et eksempel, hvis x1 er satt til den første verdien av husfunksjonvektoren, husstørrelse og deretter x2 vil bli satt til neste verdi, antall rom og så videre.

Oppføring 2 viser en Java-implementering av denne lineære regresjonsfunksjonen, vist matematisk som hθ(x). For enkelhets skyld gjøres beregningen ved hjelp av datatypen dobbelt. Innen søke om() metode, forventes det at det første elementet i matrisen er satt med en verdi på 1,0 utenfor denne funksjonen.

Oppføring 2. Lineær regresjon i Java

 public class LinearRegressionFunction implementerer Funksjon {private final double [] thetaVector; LinearRegressionFunction (double [] thetaVector) {this.thetaVector = Arrays.copyOf (thetaVector, thetaVector.length); } public Double Apply (Double [] featureVector) {// av beregningsmessige grunner må det første elementet være 1.0 assert featureVector [0] == 1.0; // enkel, sekvensiell implementering dobbel prediksjon = 0; for (int j = 0; j <thetaVector.length; j ++) {prediksjon + = thetaVector [j] * featureVector [j]; } returnere spådommer; } offentlig dobbel [] getThetas () {return Arrays.copyOf (thetaVector, thetaVector.length); }} 

For å opprette en ny forekomst av LineærRegresjonsFunksjon, må du angi theta-parameteren. Theta-parameteren, eller vektoren, brukes til å tilpasse den generiske regresjonsfunksjonen til de underliggende treningsdataene. Programmets theta-parametere vil bli innstilt under læringsprosessen, basert på opplæringseksempler. Kvaliteten på den trente målfunksjonen kan bare være like god som kvaliteten på de gitte treningsdataene.

I eksemplet nedenfor LineærRegresjonsFunksjon vil bli instansiert for å forutsi boligprisen basert på husstørrelse. Tatt i betraktning at x0 må være en konstant verdi på 1.0, blir målfunksjonen instansert ved hjelp av to theta-parametere. Theta-parametrene er resultatet av en læringsprosess. Etter å ha opprettet den nye forekomsten, vil prisen på et hus med en størrelse på 1330 kvadratmeter bli spådd som følger:

 // theta-vektoren som ble brukt her, ble sendt ut av en togprosess dobbelt [] thetaVector = new double [] {1.004579, 5.286822}; LinearRegressionFunction targetFunction = ny LinearRegressionFunction (thetaVector); // lage funksjonsvektorfunksjonen med x0 = 1 (av beregningsmessige årsaker) og x1 = husstørrelse Double [] featureVector = new Double [] {1.0, 1330.0}; // gjør prediksjonen dobbelt predictedPrice = targetFunction.apply (featureVector); 

Målfunksjonens prediksjonslinje vises som en blå linje i diagrammet nedenfor. Linjen er beregnet ved å utføre målfunksjonen for alle husstørrelsesverdiene. Diagrammet inkluderer også prisstørrelsesparene som brukes til trening.

Gregor Roth

Så langt ser prediksjonsgrafen ut til å passe godt nok. Grafkoordinatene (skjæringspunktet og hellingen) er definert av theta-vektoren { 1.004579, 5.286822 }. Men hvordan vet du at denne thetavektoren passer best for applikasjonen din? Vil funksjonen passe bedre hvis du endrer den første eller andre theta-parameteren? For å identifisere den best passende theta-parametervektoren, trenger du en verktøyfunksjon, som vil evaluere hvor godt målfunksjonen utfører.

Scorer målfunksjonen

I maskinlæring, a kostnadsfunksjon (J (θ)) brukes til å beregne gjennomsnittsfeilen, eller "kostnaden" for en gitt målfunksjon.

Gregor Roth
$config[zx-auto] not found$config[zx-overlay] not found