Selvkørende biler, software til ansigtsgenkendelse og stemmestyrede højttalere er alle bygget på maskinlæringsteknologier og rammer - og disse er bare den første bølge. I løbet af det næste årti vil en ny generation af produkter transformere vores verden og indlede nye tilgange til softwareudvikling og de applikationer og produkter, vi opretter og bruger.
Som Java-udvikler ønsker du at komme foran denne kurve, især fordi teknologivirksomheder begynder seriøst at investere i maskinlæring. Hvad du lærer i dag, kan du bygge videre i de næste fem år, men du skal starte et sted.
Denne artikel vil komme i gang. Du begynder med et første indtryk af, hvordan maskinindlæring fungerer, efterfulgt af en kort guide til implementering og træning af en maskinlæringsalgoritme. Efter at have studeret internerne i læringsalgoritmen og funktioner, som du kan bruge til at træne, score og vælge den bedst passende forudsigelsesfunktion, får du et overblik over at bruge en JVM-ramme, Weka, til at opbygge maskinlæringsløsninger. Denne artikel fokuserer på overvåget maskinindlæring, som er den mest almindelige tilgang til udvikling af intelligente applikationer.
Maskinindlæring for Java-udviklere, del 2
Er du klar til næste trin? Anden halvdel af denne vejledning viser dig, hvordan du udvikler og implementerer din dataledning til maskinindlæring.
Maskinindlæring og kunstig intelligens
Maskinindlæring har udviklet sig fra området kunstig intelligens, der søger at producere maskiner, der er i stand til at efterligne menneskelig intelligens. Selvom maskinlæring er en voksende tendens inden for datalogi, er kunstig intelligens ikke et nyt videnskabeligt felt. Turing-testen, udviklet af Alan Turing i begyndelsen af 1950'erne, var en af de første tests, der blev oprettet for at afgøre, om en computer kunne have reel intelligens. Ifølge Turing-testen kunne en computer bevise menneskelig intelligens ved at narre et menneske til at tro, at det også var menneske.
Mange avancerede maskinlæringsmetoder er baseret på årtier gamle begreber. Hvad der har ændret sig i løbet af det sidste årti er, at computere (og distribuerede computerplatforme) nu har den krævede processorkraft til maskinindlæringsalgoritmer. De fleste maskinindlæringsalgoritmer kræver et stort antal matrixmultiplikationer og andre matematiske operationer at behandle. Beregningsteknologien til at styre disse beregninger eksisterede ikke engang for to årtier siden, men den gør den i dag.
Maskinindlæring gør det muligt for programmer at udføre kvalitetsforbedringsprocesser og udvide deres kapaciteter uden menneskelig involvering. Et program bygget med maskinlæring er i stand til at opdatere eller udvide sin egen kode.
Overvåget læring versus ikke-overvåget læring
Overvåget læring og ikke-overvåget læring er de mest populære tilgange til maskinindlæring. Begge kræver, at maskinen fodrer et massivt antal dataposter for at korrelere og lære af. Sådanne indsamlede dataposter er almindeligt kendt som en funktionsvektorer. I tilfælde af et individuelt hus kan en funktionsvektor bestå af funktioner såsom den samlede husstørrelse, antal værelser og husets alder.
I overvåget læring, er en maskinlæringsalgoritme uddannet til korrekt at svare på spørgsmål relateret til funktionsvektorer. For at træne en algoritme tilføres maskinen et sæt funktionsvektorer og en tilknyttet etiket. Etiketter leveres typisk af en menneskelig annotator og repræsenterer det rigtige "svar" på et givet spørgsmål. Læringsalgoritmeanalyserne har vektorer og deres korrekte etiketter for at finde interne strukturer og relationer mellem dem. Således lærer maskinen at reagere korrekt på spørgsmål.
Som et eksempel kan en intelligent ejendomsapplikation trænes med funktionsvektorer inklusive størrelse, antal værelser og respektive alder for en række huse. En menneskelig mærker markerer hvert hus med den korrekte huspris baseret på disse faktorer. Ved at analysere disse data vil ejendomssøgningen blive uddannet til at besvare spørgsmålet: "Hvor mange penge kunne jeg få til dette hus?"
Efter træningsprocessen er nye inputdata ikke mærket. Maskinen vil være i stand til korrekt at svare på forespørgsler, selv for usete, umærkede funktionsvektorer.
I uden opsyn læring, er algoritmen programmeret til at forudsige svar uden menneskelig mærkning eller endda spørgsmål. I stedet for forudbestemte etiketter, eller hvad resultaterne skal være, udnytter uovervåget læring massive datasæt og processorkraft til at opdage tidligere ukendte sammenhænge. I forbrugermarkedsføring kan f.eks. Ikke-overvåget læring bruges til at identificere skjulte relationer eller forbrugergruppering, hvilket til sidst fører til nye eller forbedrede marketingstrategier.
Denne artikel fokuserer på overvåget maskinindlæring, som er den mest almindelige tilgang til maskinindlæring i dag.
Overvåget maskinindlæring
Al maskinindlæring er baseret på data. For et overvåget maskinindlæringsprojekt skal du mærke dataene på en meningsfuld måde for det resultat, du søger. I tabel 1 skal du bemærke, at hver række i husprotokollen inkluderer en etiket til "huspris". Ved at korrelere rækkeoplysninger til husprismærket vil algoritmen i sidste ende være i stand til at forudsige markedsprisen for et hus, der ikke er i datasættet (bemærk, at husstørrelsen er baseret på kvadratmeter, og husprisen er baseret på euro).
Tabel 1. Husregistre
FUNKTION | FUNKTION | FUNKTION | ETIKET |
---|---|---|---|
Husets størrelse | Antal værelser | Husets alder | Anslåede husomkostninger |
90 m2 / 295 fod | 2 værelser | 23 år | 249,000 € |
101 m2 / 331 fod | 3 værelser | ikke relevant | 338,000 € |
1330 m2 / 4363 fod | 11 værelser | 12 år | 6,500,000 € |
I de tidlige stadier vil du sandsynligvis mærke dataposter i hånden, men du kan til sidst træne dit program til at automatisere denne proces. Du har sandsynligvis set dette med e-mail-applikationer, hvor flytning af e-mail til din spam-mappe resulterer i forespørgslen "Er dette spam?" Når du svarer, træner du programmet til at genkende e-mails, som du ikke vil se. Applikationens spamfilter lærer at mærke fremtidig mail fra den samme kilde eller med lignende indhold og bortskaffe den.
Mærkede datasæt er kun nødvendige til trænings- og testformål. Efter denne fase er slut, fungerer maskinlæringsalgoritmen på umærkede dataforekomster. For eksempel kan du give forudsigelsesalgoritmen en ny, umærket husrekord, og den forudsiger automatisk den forventede huspris baseret på træningsdata.
Hvordan maskiner lærer at forudsige
Udfordringen ved overvåget maskinindlæring er at finde den korrekte forudsigelsesfunktion til et specifikt spørgsmål. Matematisk er udfordringen at finde input-output-funktionen, der tager inputvariablerne x og returnerer forudsigelsesværdien y. Det her hypotesefunktion (hθ) er resultatet af træningsprocessen. Ofte kaldes hypotesefunktionen også mål eller forudsigelse fungere.

I de fleste tilfælde, x repræsenterer et multiple-datapunkt. I vores eksempel kan dette være et todimensionalt datapunkt for et individuelt hus defineret af husstørrelse værdi og antal værelser værdi. Matrixen med disse værdier kaldes funktion vektor. Med en konkret målfunktion kan funktionen bruges til at forudsige hver funktionsvektor x. For at forudsige prisen på et enkelt hus kan du ringe til målfunktionen ved hjælp af funktionsvektoren {101.0, 3.0} indeholdende husstørrelsen og antallet af værelser:
// målfunktion h (som er output fra læringsprocessen) Funktion h = ...; // indstil funktionsvektoren med husstørrelse = 101 og antal værelser = 3 Dobbelt [] x = ny Dobbelt [] {101.0, 3.0}; // og forudsagde husprisen (etiket) dobbelt y = h. anvend (x);
I liste 1 er arrayvariablen x værdi repræsenterer husets funktionsvektor. Det y værdi returneret af målfunktionen er den forudsagte huspris.
Udfordringen ved maskinlæring er at definere en målfunktion, der fungerer så nøjagtigt som muligt for ukendte, usynlige datainstanser. I maskinindlæring er målfunktionen (hθ) kaldes undertiden a model. Denne model er resultatet af læringsprocessen.

Baseret på mærkede træningseksempler ser læringsalgoritmen efter strukturer eller mønstre i træningsdataene. Fra disse producerer den en model, der generaliserer godt ud fra disse data.
Typisk er læringsprocessen udforskende. I de fleste tilfælde udføres processen flere gange ved hjælp af forskellige variationer af indlæringsalgoritmer og konfigurationer.
Til sidst evalueres alle modeller baseret på præstationsmålinger, og den bedste vælges. Denne model vil derefter blive brugt til at beregne forudsigelser for fremtidige umærkede datainstanser.
Lineær regression
For at træne en maskine til at tænke er det første trin at vælge den læringsalgoritme, du vil bruge. Lineær regression er en af de enkleste og mest populære overvågede læringsalgoritmer. Denne algoritme antager, at forholdet mellem inputfunktioner og den udgivne etiket er lineær. Den generiske lineære regressionsfunktion nedenfor returnerer den forudsagte værdi ved at opsummere hvert element i funktion vektor ganget med a theta-parameter (θ). Theta-parametrene bruges i træningsprocessen til at tilpasse eller "tune" regressionsfunktionen baseret på træningsdataene.

I den lineære regressionsfunktion tælles theta-parametre og funktionsparametre af et abonnementsnummer. Abonnementsnummeret angiver placeringen af theta-parametre (θ) og funktionsparametre (x) i vektoren. Bemærk, at funktionen x0 er et konstant forskudt udtryk indstillet med værdien 1 til beregningsformål. Som et resultat begynder indekset for en domænespecifik funktion som husstørrelse med x1. Som et eksempel, hvis x1 er indstillet til den første værdi af husfunktionsvektoren, husstørrelse og derefter x2 vil blive indstillet til den næste værdi, antal rum osv.
Liste 2 viser en Java-implementering af denne lineære regressionsfunktion, vist matematisk som hθ(x). For enkelheds skyld foretages beregningen ved hjælp af datatypen dobbelt
. Indenfor ansøge()
metode forventes det, at det første element i arrayet er indstillet med en værdi på 1,0 uden for denne funktion.
Notering 2. Lineær regression i Java
public class LinearRegressionFunction implementerer Funktion {privat endelig dobbelt [] thetaVector; LinearRegressionFunction (double [] thetaVector) {this.thetaVector = Arrays.copyOf (thetaVector, thetaVector.length); } offentlig Double Apply (Double [] featureVector) {// af beregningsmæssige årsager skal det første element være 1.0 assert featureVector [0] == 1.0; // enkel, sekventiel implementering dobbelt forudsigelse = 0; for (int j = 0; j <thetaVector.length; j ++) {forudsigelse + = thetaVector [j] * featureVector [j]; } returnere forudsigelse; } offentlig dobbelt [] getThetas () {return Arrays.copyOf (thetaVector, thetaVector.length); }}
For at oprette en ny forekomst af LineærRegressionFunction
, skal du indstille theta-parameteren. Theta-parameteren eller vektoren bruges til at tilpasse den generiske regressionsfunktion til de underliggende træningsdata. Programmets theta-parametre vil blive indstillet under indlæringsprocessen, baseret på træningseksempler. Kvaliteten af den uddannede målfunktion kan kun være lige så god som kvaliteten af de givne træningsdata.
I eksemplet nedenfor vises LineærRegressionFunction
vil blive instantieret til at forudsige husprisen baseret på husstørrelsen. I betragtning af at x0 skal være en konstant værdi på 1.0, målfunktionen instantieres ved hjælp af to theta-parametre. Theta-parametrene er output fra en læringsproces. Efter oprettelsen af den nye instans forudsiges prisen på et hus med en størrelse på 1330 kvadratmeter som følger:
// den anvendte theta-vektor her var output af en togproces dobbelt [] thetaVector = ny dobbelt [] {1.004579, 5.286822}; LinearRegressionFunction targetFunction = ny LineærRegressionFunction (thetaVector); // opret funktionsvektorfunktionen med x0 = 1 (af beregningsmæssige årsager) og x1 = husstørrelse Double [] featureVector = new Double [] {1.0, 1330.0}; // gør forudsigelsen dobbelt predictedPrice = targetFunction.apply (featureVector);
Målfunktionens forudsigelseslinje vises som en blå linje i nedenstående skema. Linjen er beregnet ved at udføre målfunktionen for alle husstørrelsesværdier. Diagrammet inkluderer også de prisstørrelsespar, der bruges til træning.

Indtil videre ser forudsigelsesgrafen ud til at passe godt nok. Grafkoordinaterne (skæringspunktet og hældningen) er defineret af theta-vektoren { 1.004579, 5.286822 }
. Men hvordan ved du, at denne theta-vektor passer bedst til din applikation? Ville funktionen passe bedre, hvis du ændrede den første eller anden theta-parameter? For at identificere den bedst passende theta-parametervektor skal du bruge en hjælpefunktion, som vil evaluere, hvor godt målfunktionen fungerer.
Scorer målfunktionen
I maskinindlæring er en omkostningsfunktion (J (θ)) bruges til at beregne den gennemsnitlige fejl eller "omkostning" for en given målfunktion.
