Apprendimento automatico per sviluppatori Java, parte 1: algoritmi per l'apprendimento automatico

Le auto a guida autonoma, il software di rilevamento del volto e gli altoparlanti a comando vocale sono tutti basati su tecnologie e framework di apprendimento automatico, e questi sono solo la prima ondata. Nel prossimo decennio, una nuova generazione di prodotti trasformerà il nostro mondo, avviando nuovi approcci allo sviluppo del software e alle applicazioni e ai prodotti che creiamo e utilizziamo.

Come sviluppatore Java, vuoi anticipare questa curva, soprattutto perché le aziende tecnologiche stanno iniziando a investire seriamente nel machine learning. Quello che impari oggi, puoi svilupparlo nei prossimi cinque anni, ma devi iniziare da qualche parte.

Questo articolo ti consentirà di iniziare. Inizierai con una prima impressione di come funziona l'apprendimento automatico, seguita da una breve guida per implementare e addestrare un algoritmo di apprendimento automatico. Dopo aver studiato le parti interne dell'algoritmo di apprendimento e le funzionalità che puoi utilizzare per addestrare, valutare e selezionare la funzione di previsione più adatta, avrai una panoramica sull'utilizzo di un framework JVM, Weka, per creare soluzioni di machine learning. Questo articolo si concentra sull'apprendimento automatico supervisionato, l'approccio più comune per lo sviluppo di applicazioni intelligenti.

Apprendimento automatico per sviluppatori Java, parte 2

Sei pronto per il prossimo passaggio? La seconda metà di questo tutorial mostra come sviluppare e distribuire la pipeline di dati di machine learning.

Apprendimento automatico e intelligenza artificiale

L'apprendimento automatico si è evoluto dal campo dell'intelligenza artificiale, che cerca di produrre macchine in grado di imitare l'intelligenza umana. Sebbene l'apprendimento automatico sia una tendenza emergente nell'informatica, l'intelligenza artificiale non è un nuovo campo scientifico. Il test di Turing, sviluppato da Alan Turing all'inizio degli anni '50, è stato uno dei primi test creati per determinare se un computer potesse avere una vera intelligenza. Secondo il test di Turing, un computer potrebbe provare l'intelligenza umana inducendo un umano a credere che fosse anche umano.

Molti approcci di apprendimento automatico all'avanguardia si basano su concetti vecchi di decenni. Ciò che è cambiato negli ultimi dieci anni è che i computer (e le piattaforme di elaborazione distribuita) ora hanno la potenza di elaborazione richiesta per gli algoritmi di apprendimento automatico. La maggior parte degli algoritmi di apprendimento automatico richiede un numero enorme di moltiplicazioni di matrici e altre operazioni matematiche da elaborare. La tecnologia computazionale per gestire questi calcoli non esisteva nemmeno due decenni fa, ma esiste oggi.

L'apprendimento automatico consente ai programmi di eseguire processi di miglioramento della qualità ed estendere le proprie capacità senza il coinvolgimento umano. Un programma costruito con l'apprendimento automatico è in grado di aggiornare o estendere il proprio codice.

Apprendimento supervisionato vs. apprendimento non supervisionato

L'apprendimento supervisionato e l'apprendimento non supervisionato sono gli approcci più popolari all'apprendimento automatico. Entrambi richiedono di alimentare la macchina con un numero enorme di record di dati da correlare e da cui apprendere. Tali record di dati raccolti sono comunemente noti come vettori di caratteristiche. Nel caso di una singola casa, un vettore di caratteristiche potrebbe essere costituito da caratteristiche come la dimensione complessiva della casa, il numero di stanze e l'età della casa.

Nell'apprendimento supervisionato , un algoritmo di apprendimento automatico viene addestrato per rispondere correttamente alle domande relative ai vettori di funzionalità. Per addestrare un algoritmo, la macchina riceve un insieme di vettori di caratteristiche e un'etichetta associata. Le etichette sono generalmente fornite da un annotatore umano e rappresentano la giusta "risposta" a una determinata domanda. L'algoritmo di apprendimento analizza i vettori delle caratteristiche e le loro etichette corrette per trovare strutture interne e relazioni tra di loro. Pertanto, la macchina impara a rispondere correttamente alle domande.

Ad esempio, un'applicazione immobiliare intelligente potrebbe essere addestrata con vettori di caratteristiche tra cui le dimensioni, il numero di stanze e la rispettiva età per una serie di case. Un etichettatore umano etichetterebbe ogni casa con il prezzo della casa corretto in base a questi fattori. Analizzando questi dati, l'applicazione immobiliare sarebbe stata addestrata a rispondere alla domanda: " Quanti soldi potrei ottenere per questa casa? "

Al termine del processo di addestramento, i nuovi dati di input non verranno etichettati. La macchina sarà in grado di rispondere correttamente alle domande, anche per vettori di caratteristiche invisibili e senza etichetta.

Nell'apprendimento non supervisionato , l'algoritmo è programmato per prevedere le risposte senza etichettatura umana o persino domande. Piuttosto che predeterminare le etichette o quali dovrebbero essere i risultati, l'apprendimento senza supervisione sfrutta enormi set di dati e potenza di elaborazione per scoprire correlazioni precedentemente sconosciute. Nel marketing dei prodotti di consumo, ad esempio, l'apprendimento senza supervisione potrebbe essere utilizzato per identificare relazioni nascoste o raggruppamenti di consumatori, portando infine a strategie di marketing nuove o migliorate.

Questo articolo si concentra sul machine learning supervisionato, che è l'approccio più comune al machine learning oggi.

Apprendimento automatico supervisionato

Tutto l'apprendimento automatico si basa sui dati. Per un progetto di machine learning supervisionato, dovrai etichettare i dati in modo significativo per il risultato che stai cercando. Nella Tabella 1, nota che ogni riga del record della casa include un'etichetta per "prezzo della casa". Correlando i dati delle righe all'etichetta del prezzo della casa, l'algoritmo sarà infine in grado di prevedere il prezzo di mercato di una casa non presente nel suo set di dati (si noti che la dimensione della casa si basa sui metri quadrati e il prezzo della casa si basa sull'euro).

Tabella 1. Registri della casa

CARATTERISTICA CARATTERISTICA CARATTERISTICA ETICHETTA
Dimensioni della casa Numero di stanze Età della casa Costo stimato della casa
90 m2 / 295 piedi 2 stanze 23 anni 249.000 €
101 m2 / 331 piedi 3 stanze n / A 338.000 €
1330 m2 / 4363 piedi 11 stanze 12 anni 6.500.000 €

Nelle fasi iniziali, è probabile che etichetterai manualmente i record di dati, ma alla fine potresti addestrare il tuo programma ad automatizzare questo processo. Probabilmente lo hai visto con le applicazioni di posta elettronica, dove lo spostamento della posta nella cartella dello spam genera la query "È spam?" Quando rispondi, stai addestrando il programma a riconoscere la posta che non vuoi vedere. Il filtro antispam dell'applicazione impara a etichettare la posta futura proveniente dalla stessa fonte o con contenuto simile e smaltirla.

I set di dati etichettati sono necessari solo per scopi di formazione e test. Al termine di questa fase, l'algoritmo di apprendimento automatico funziona su istanze di dati senza etichetta. Ad esempio, potresti fornire all'algoritmo di previsione un nuovo record della casa senza etichetta e prevedere automaticamente il prezzo della casa previsto in base ai dati di addestramento.

Come le macchine imparano a prevedere

La sfida dell'apprendimento automatico supervisionato è trovare la funzione di previsione appropriata per una domanda specifica. Matematicamente, la sfida è trovare la funzione input-output che prenda le variabili di input x e restituisca il valore di previsione y . Questa funzione di ipotesi (h θ ) è l'output del processo di addestramento. Spesso la funzione di ipotesi è anche chiamata funzione di destinazione o di previsione .

Gregor Roth

Nella maggior parte dei casi, x rappresenta un punto dati multiplo. Nel nostro esempio, questo potrebbe essere un punto dati bidimensionale di una singola casa definita dal valore della dimensione della casa e dal valore del numero di stanze . La matrice di questi valori viene denominata vettore di caratteristiche . Data una funzione target concreta, la funzione può essere utilizzata per fare una previsione per ogni vettore di feature x . Per prevedere il prezzo di una singola casa, puoi chiamare la funzione target utilizzando il vettore di caratteristiche {101.0, 3.0} contenente la dimensione della casa e il numero di stanze:

 // 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); 

Nel Listato 1, il valore x della variabile array rappresenta il vettore della caratteristica della casa. Il valore y restituito dalla funzione target è il prezzo della casa previsto.

La sfida dell'apprendimento automatico è definire una funzione di destinazione che funzionerà nel modo più accurato possibile per istanze di dati sconosciute e invisibili. Nell'apprendimento automatico, la funzione di destinazione (h θ ) è talvolta chiamata modello . Questo modello è il risultato del processo di apprendimento.

Gregor Roth

Sulla base di esempi di addestramento etichettati, l'algoritmo di apprendimento cerca strutture o schemi nei dati di addestramento. Da questi, produce un modello che generalizza bene da quei dati.

In genere, il processo di apprendimento è esplorativo . Nella maggior parte dei casi, il processo verrà eseguito più volte utilizzando diverse varianti di algoritmi e configurazioni di apprendimento.

Alla fine, tutti i modelli verranno valutati in base alle metriche delle prestazioni e verrà selezionato il migliore. Tale modello verrà quindi utilizzato per calcolare previsioni per future istanze di dati senza etichetta.

Regressione lineare

Per addestrare una macchina a pensare, il primo passo è scegliere l'algoritmo di apprendimento che utilizzerai. La regressione lineare è uno degli algoritmi di apprendimento supervisionato più semplici e popolari. Questo algoritmo presuppone che la relazione tra le caratteristiche di input e l'etichetta emessa sia lineare. La funzione di regressione lineare generica riportata di seguito restituisce il valore previsto riassumendo ogni elemento del vettore di caratteristiche moltiplicato per un parametro theta (θ) . I parametri theta vengono utilizzati all'interno del processo di addestramento per adattare o "sintonizzare" la funzione di regressione in base ai dati di addestramento.

Gregor Roth

Nella funzione di regressione lineare, i parametri theta e i parametri delle caratteristiche sono enumerati da un numero di sottoscrizione. Il numero di abbonamento indica la posizione dei parametri theta (θ) e dei parametri delle caratteristiche (x) all'interno del vettore. Si noti che la funzione x 0 è un termine di offset costante impostato con il valore 1 per scopi di calcolo. Di conseguenza, l'indice di una caratteristica specifica del dominio come la dimensione della casa inizierà con x 1 . Ad esempio, se x 1 è impostato per il primo valore del vettore dell'elemento della casa, dimensione della casa, x 2 sarà impostato per il valore successivo, il numero di stanze e così via.

Il Listato 2 mostra un'implementazione Java di questa funzione di regressione lineare, mostrata matematicamente come h θ (x). Per semplicità, il calcolo viene eseguito utilizzando il tipo di dati double. All'interno del apply()metodo, ci si aspetta che il primo elemento dell'array sia stato impostato con un valore di 1.0 al di fuori di questa funzione.

Listato 2. Regressione lineare 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); } } 

Per creare una nuova istanza di LinearRegressionFunction, è necessario impostare il parametro theta. Il parametro theta, o vettore, viene utilizzato per adattare la funzione di regressione generica ai dati di addestramento sottostanti. I parametri theta del programma verranno regolati durante il processo di apprendimento, sulla base di esempi di formazione. La qualità della funzione target addestrata può essere buona quanto la qualità dei dati di addestramento forniti.

Nell'esempio seguente LinearRegressionFunctionverrà creata un'istanza per prevedere il prezzo della casa in base alle dimensioni della casa. Considerando che x 0 deve essere un valore costante di 1.0, la funzione target viene istanziata utilizzando due parametri theta. I parametri theta sono l'output di un processo di apprendimento. Dopo aver creato la nuova istanza, il prezzo di una casa con dimensioni di 1330 metri quadrati sarà previsto come segue:

 // 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); 

La linea di previsione della funzione di destinazione viene visualizzata come una linea blu nel grafico sottostante. La linea è stata calcolata eseguendo la funzione target per tutti i valori della dimensione della casa. Il grafico include anche le coppie prezzo-taglia utilizzate per l'allenamento.

Gregor Roth

Finora il grafico di previsione sembra adattarsi abbastanza bene. Le coordinate del grafico (l'intercetta e la pendenza) sono definite dal vettore theta { 1.004579, 5.286822 }. Ma come fai a sapere che questo vettore theta è la soluzione migliore per la tua applicazione? La funzione si adatterebbe meglio se cambiassi il primo o il secondo parametro theta? Per identificare il vettore del parametro theta più adatto, è necessaria una funzione di utilità , che valuterà il rendimento della funzione target.

Punteggio della funzione di destinazione

Nell'apprendimento automatico, una funzione di costo (J (θ)) viene utilizzata per calcolare l'errore medio, o "costo" di una data funzione di destinazione.

Gregor Roth