Strojno učenje za programere Java, 1. dio: Algoritmi za strojno učenje

Samovozeći automobili, softver za otkrivanje lica i zvučnici kojima se upravlja glasom izgrađeni su na tehnologijama i okvirima za strojno učenje - i to je samo prvi val. Tijekom sljedećeg desetljeća nova generacija proizvoda transformirat će naš svijet, pokrećući nove pristupe razvoju softvera i aplikacijama i proizvodima koje stvaramo i koristimo.

Kao Java programer, želite ići ispred ove krivulje, pogotovo jer tehnološke tvrtke počinju ozbiljno ulagati u strojno učenje. Ono što danas naučite možete nadograditi tijekom sljedećih pet godina, ali morate negdje započeti.

Ovaj će vas članak započeti. Započet ćete s prvim dojmom kako funkcionira strojno učenje, nakon čega slijedi kratki vodič za implementaciju i obuku algoritma strojnog učenja. Nakon proučavanja unutrašnjosti algoritma učenja i značajki pomoću kojih možete trenirati, ocjenjivati ​​i odabrati najprikladniju funkciju predviđanja, dobit ćete pregled korištenja JVM okvira, Weka, za izgradnju rješenja za strojno učenje. Ovaj se članak usredotočuje na nadzirano strojno učenje, koje je najčešći pristup razvoju inteligentnih aplikacija.

Strojno učenje za programere Java, 2. dio

Jeste li spremni za sljedeći korak? Druga polovica ovog vodiča pokazuje vam kako razviti i primijeniti svoj cjevovod podataka strojnog učenja.

Strojno učenje i umjetna inteligencija

Strojno učenje evoluiralo je iz područja umjetne inteligencije, koja nastoji proizvesti strojeve koji mogu oponašati ljudsku inteligenciju. Iako je strojno učenje rastući trend u računalnoj znanosti, umjetna inteligencija nije novo znanstveno područje. Turingov test, koji je razvio Alan Turing ranih 1950-ih, bio je jedan od prvih testova stvorenih kako bi se utvrdilo može li računalo imati stvarnu inteligenciju. Prema Turingovom testu, računalo bi moglo dokazati ljudsku inteligenciju prevarajući čovjeka da vjeruje da je i čovjek.

Mnogi se najsuvremeniji pristupi strojnom učenju temelje na desetljećima starim konceptima. Ono što se promijenilo tijekom posljednjeg desetljeća jest da računala (i distribuirane računalne platforme) sada imaju procesorsku snagu potrebnu za algoritme strojnog učenja. Većina algoritama strojnog učenja zahtijeva ogroman broj umnožavanja matrica i drugih matematičkih operacija za obradu. Računalna tehnologija za upravljanje tim proračunima nije postojala ni prije dva desetljeća, ali postoji danas.

Strojno učenje omogućuje programima izvršavanje procesa poboljšanja kvalitete i proširivanje njihovih mogućnosti bez ljudskog sudjelovanja. Program izgrađen pomoću strojnog učenja sposoban je ažurirati ili proširiti vlastiti kôd.

Nadzirano učenje nasuprot nenadgledanom učenju

Nadzirano učenje i nenadgledano učenje najpopularniji su pristupi strojnom učenju. Oboje trebaju hraniti stroj ogromnim brojem zapisa podataka kako bi mogli korelirati i iz njih učiti. Takvi prikupljeni zapisi podataka obično su poznati kao vektori obilježja. U slučaju pojedinačne kuće, vektor značajki može se sastojati od značajki kao što su ukupna veličina kuće, broj soba i starost kuće.

U nadgledanom učenju algoritam strojnog učenja osposobljen je za ispravno odgovaranje na pitanja u vezi s vektorima značajki. Da bi se istrenirao algoritam, stroj dobiva skup vektora značajki i pripadajuću naljepnicu. Oznake obično daje ljudski bilježnik i predstavljaju pravi "odgovor" na dano pitanje. Algoritam učenja analizira vektore značajki i njihove ispravne oznake kako bi pronašao unutarnje strukture i odnose među njima. Dakle, stroj uči ispravno odgovarati na upite.

Kao primjer, inteligentna aplikacija za nekretnine može se obučiti s vektorima značajki, uključujući veličinu, broj soba i odgovarajuću dob za niz kuća. Ljudski etiketa bi svaku kuću označio ispravnom cijenom kuće na temelju ovih čimbenika. Analizom tih podataka aplikacija za nekretnine bila bi osposobljena odgovoriti na pitanje: " Koliko novca mogu dobiti za ovu kuću? "

Nakon završetka procesa obuke novi ulazni podaci neće biti označeni. Stroj će moći ispravno odgovoriti na upite, čak i za neviđene, neoznačene vektore značajki.

U učenju bez nadzora algoritam je programiran za predviđanje odgovora bez ljudskog označavanja ili čak pitanja. Umjesto da unaprijed odrede oznake ili kakvi bi trebali biti rezultati, nenadzirano učenje koristi ogromne skupove podataka i procesorsku snagu kako bi otkrio ranije nepoznate korelacije. Na primjer, u marketingu potrošačkih proizvoda, nenadzirano učenje moglo bi se koristiti za prepoznavanje skrivenih odnosa ili grupiranje potrošača, što bi na kraju moglo dovesti do novih ili poboljšanih marketinških strategija.

Ovaj se članak usredotočuje na nadzirano strojno učenje, koje je danas najčešći pristup strojnom učenju.

Nadzirano strojno učenje

Sve se strojno učenje temelji na podacima. Za nadzirani projekt strojnog učenja morat ćete podatke označiti na značajan način za ishod koji tražite. U tablici 1. imajte na umu da svaki red kućnog zapisa sadrži oznaku "cijena kuće". Koreliranjem podataka redaka s oznakom cijene kuće, algoritam će na kraju moći predvidjeti tržišnu cijenu kuće koja nije u njenom skupu podataka (imajte na umu da se veličina kuće temelji na kvadratnim metrima, a cijena kuće na eurima).

Tablica 1. Kućni zapisi

OSOBINA OSOBINA OSOBINA OZNAČITI
Veličina kuće Broj soba Starost kuće Procijenjeni trošak kuće
90 m2 / 295 ft 2 sobe 23 godine 249.000 €
101 m2 / 331 ft 3 sobe n / a 338.000 €
1330 m2 / 4363 ft 11 soba 12 godina 6.500.000 €

U ranim fazama vjerojatno ćete ručno označavati zapise podataka, ali na kraju biste mogli osposobiti svoj program za automatizaciju ovog postupka. To ste vjerojatno vidjeli kod aplikacija za e-poštu, gdje premještanje e-pošte u mapu s neželjenom poštom rezultira upitom "Je li ovo neželjena pošta?" Kada odgovorite, vježbate program za prepoznavanje pošte koju ne želite vidjeti. Filtar za neželjenu poštu aplikacije uči označavati buduću poštu iz istog izvora ili sa sličnim sadržajem i zbrinjavati je.

Označeni skupovi podataka potrebni su samo za obuku i testiranje. Nakon završetka ove faze algoritam strojnog učenja radi na neobilježenim instancama podataka. Na primjer, algoritam predviđanja možete nahraniti novim, neobilježenim kućnim zapisom i on će automatski predvidjeti očekivanu cijenu kuće na temelju podataka o obuci.

Kako strojevi uče predvidjeti

Izazov nadziranog strojnog učenja je pronaći odgovarajuću funkciju predviđanja za određeno pitanje. Matematički je izazov pronaći ulazno-izlaznu funkciju koja uzima ulazne varijable x i vraća vrijednost predviđanja y . Ova funkcija hipoteze (h θ ) je rezultat procesa treninga. Funkcija hipoteze često se naziva i ciljna ili funkcija predviđanja .

Gregor Roth

U većini slučajeva x predstavlja točku s više podataka. U našem primjeru ovo bi mogla biti dvodimenzionalna podatkovna točka pojedinačne kuće definirana vrijednošću veličine kuće i vrijednošću broja soba . Niz ovih vrijednosti naziva se vektor obilježja . S obzirom na konkretnu ciljnu funkciju, funkcija se može koristiti za predviđanje svakog vektora obilježja x . Da biste predvidjeli cijenu pojedine kuće, možete pozvati ciljanu funkciju pomoću vektora značajke {101.0, 3.0} koji sadrži veličinu kuće i broj soba:

 // target function h (which is the output of the learn process) Function h = ...; // set the feature vector with house size=101 and number-of-rooms=3 Double[] x = new Double[] { 101.0, 3.0 }; // and predicted the house price (label) double y = h.apply(x); 

Na popisu 1, varijabla polja x vrijednost predstavlja vektor obilježja kuće. Vrijednost y koju vraća ciljna funkcija predviđena je cijena kuće.

Izazov strojnog učenja je definirati ciljanu funkciju koja će raditi što preciznije za nepoznate, nevidljive instance podataka. U strojnom učenju ciljna funkcija (h θ ) ponekad se naziva modelom . Ovaj model rezultat je procesa učenja.

Gregor Roth

Na temelju označenih primjera treninga, algoritam učenja traži strukture ili obrasce u podacima treninga. Iz njih se dobiva model koji dobro generalizira iz tih podataka.

Tipično je proces učenja istraživački . U većini slučajeva postupak će se izvoditi više puta korištenjem različitih varijacija algoritama i konfiguracija učenja.

Na kraju će se svi modeli ocjenjivati ​​na temelju mjernih podataka, a odabrat će se najbolji. Taj će se model tada koristiti za izračunavanje predviđanja za buduće neobilježene instance podataka.

Linearna regresija

Da biste uvježbali stroj za razmišljanje, prvi je korak odabrati algoritam učenja koji ćete koristiti. Linearna regresija jedan je od najjednostavnijih i najpopularnijih nadziranih algoritama učenja. Ovaj algoritam pretpostavlja da je odnos između ulaznih značajki i izlazne oznake linearan. Generička funkcija linearne regresije u nastavku vraća predviđenu vrijednost sažimanjem svakog elementa vektora obilježja pomnoženog s theta parametrom (θ) . Theta parametri koriste se u procesu vježbanja za prilagodbu ili "podešavanje" funkcije regresije na temelju podataka o treningu.

Gregor Roth

In the linear regression function, theta parameters and feature parameters are enumerated by a subscription number. The subscription number indicates the position of theta parameters (θ) and feature parameters (x) within the vector. Note that feature x0 is a constant offset term set with the value 1 for computational purposes. As a result, the index of a domain-specific feature such as house-size will start with x1. As an example, if x1 is set for the first value of the House feature vector, house size, then x2 will be set for the next value, number-of-rooms, and so forth.

Listing 2 shows a Java implementation of this linear regression function, shown mathematically as hθ(x). For simplicity, the calculation is done using the data type double. Within the apply() method, it is expected that the first element of the array has been set with a value of 1.0 outside of this function.

Listing 2. Linear regression in Java

 public class LinearRegressionFunction implements Function { private final double[] thetaVector; LinearRegressionFunction(double[] thetaVector) { this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length); } public Double apply(Double[] featureVector) { // for computational reasons the first element has to be 1.0 assert featureVector[0] == 1.0; // simple, sequential implementation double prediction = 0; for (int j = 0; j < thetaVector.length; j++) { prediction += thetaVector[j] * featureVector[j]; } return prediction; } public double[] getThetas() { return Arrays.copyOf(thetaVector, thetaVector.length); } } 

In order to create a new instance of the LinearRegressionFunction, you must set the theta parameter. The theta parameter, or vector, is used to adapt the generic regression function to the underlying training data. The program's theta parameters will be tuned during the learning process, based on training examples. The quality of the trained target function can only be as good as the quality of the given training data.

U primjeru ispod LinearRegressionFunctionbit će pokrenut slučaj predviđanja cijene kuće na temelju veličine kuće. Uzimajući u obzir da x 0 mora biti konstantna vrijednost 1,0, ciljna funkcija se uspostavlja pomoću dva theta parametra. Theta parametri su rezultat procesa učenja. Nakon izrade nove instance cijena kuće veličine 1330 četvornih metara predviđa se na sljedeći način:

 // the theta vector used here was output of a train process double[] thetaVector = new double[] { 1.004579, 5.286822 }; LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector); // create the feature vector function with x0=1 (for computational reasons) and x1=house-size Double[] featureVector = new Double[] { 1.0, 1330.0 }; // make the prediction double predictedPrice = targetFunction.apply(featureVector); 

Linija predviđanja ciljne funkcije prikazana je plavom linijom na donjem grafikonu. Linija je izračunata izvršavanjem ciljne funkcije za sve vrijednosti veličine kuće. Grafikon također uključuje parove cijene i veličine koji se koriste za trening.

Gregor Roth

Zasad se čini da graf predviđanja odgovara dovoljno dobro. Koordinate grafa (presjek i nagib) definirane su theta vektorom { 1.004579, 5.286822 }. Ali kako znati da je ovaj theta vektor najprikladniji za vašu aplikaciju? Bi li funkcija bolje odgovarala ako biste promijenili prvi ili drugi theta parametar? Da biste prepoznali najprikladniji vektor theta parametara, trebate uslužnu funkciju koja će procijeniti koliko dobro funkcionira ciljana funkcija.

Bodovanje ciljne funkcije

U strojnom učenju, funkcija troška (J (θ)) koristi se za izračunavanje srednje pogreške ili "troška" zadane ciljne funkcije.

Gregor Roth