Main Content

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

Data fitting con un rete neurale superficiale

Le reti neurali sono efficaci nelle funzioni di fitting. Anzi, è dimostrato che una rete neurale piuttosto semplice è in grado di eseguire il fitting su qualsiasi funzione pratica.

Supponiamo, ad esempio, di avere i dati di una clinica. Vuoi progettare una rete in grado di prevedere la percentuale di grasso corporeo di un soggetto sulla base di 13 misure anatomiche. Hai un totale di 252 soggetti campione di cui conosci questi 13 dati e le percentuali di grasso corporeo associate.

Esistono due modi per risolvere questo problema:

Generalmente è meglio iniziare con l’app e quindi utilizzarla per generare automaticamente gli script della riga di comando. Prima di utilizzare uno dei metodi, definisci il problema selezionando un set di dati. Ciascuna delle app per reti neurali ha accesso a numerosi set di dati campione che si possono utilizzare per sperimentare con il toolbox (vedere Set di dati campione per reti neurali superficiali). Se è presente un problema specifico da risolvere, è possibile caricare i propri dati nel workspace. Il prossimo capitolo descrive il formato dei dati.

Suggerimento

Per costruire e addestrare reti profonde in modo interattivo, usa Deep Network Designer.

Definizione di un problema

Per definire un problema di fitting (regressione) per il toolbox, disponi un insieme di vettori di input (predittori) come colonne all’interno di una matrice. Quindi, disponi un insieme di risposte (i vettori di output corretti per ciascuno dei vettori di input) in una seconda matrice. Ad esempio, è possibile definire un problema di regressione con quattro osservazioni, ciascuna con due feature di input e una sola risposta, come segue:

predictors = [0 1 0 1; 0 0 1 1];
responses = [0 0 0 1];

La prossima sezione mostra come addestrare una rete al fitting di un set di dati utilizzando l’app Neural Net Fitting. Questo esempio si basa su un set di dati esemplificativo fornito in dotazione al toolbox.

Data fitting con l’app Neural Net Fitting

Questo esempio mostra come addestrare una rete neurale superficiale al data fitting con l’app Neural Net Fitting.

Apri l’app Neural Net Fitting tramite nftool.

nftool

Selezione dei dati

L’app Neural Net Fitting contiene dei dati esemplificativi che ti aiuteranno ad iniziare ad addestrare una rete neurale.

Per importare i dati esemplificativi sul grasso corporeo, seleziona Import > Import Body Fat Data Set (Importare > Importare set di dati grasso corporeo). È possibile utilizzare questi dati per addestrare una rete neurale a eseguire la stima del grasso corporeo di un soggetto a partire da una serie di misure. Se si importano dati propri da un file o da workspace, occorre specificare i predittori e le risposte, e se le osservazioni siano distribuite in righe o colonne.

Le informazioni sui dati importati compaiono nel Model Summary (Riepilogo modello). Questo set di dati contiene 252 osservazioni, con 13 feature ciascuna. Le risposte contengono la percentuale di grasso corporeo per ogni osservazione.

Suddividi i dati in set di addestramento, convalida e prova. Mantieni le impostazioni predefinite. I dati si suddividono in:

  • 70% per l’addestramento.

  • 15% per convalidare che la rete stia generalizzando e per interrompere l’addestramento prima di un overfitting.

  • 15% per testare in maniera indipendente la generalizzazione della rete.

Per ulteriori informazioni sulla suddivisione dei dati, vedere Divide Data for Optimal Neural Network Training.

Creazione della rete

La rete è una rete feed-forward a due livelli con funzione di trasferimento sigmoidale nel livello nascosto e una funzione di trasferimento lineare nel livello di output. Il valore delle Layer size (Dimensioni del livello) definisce il numero di neuroni nascosti. Mantieni le dimensioni di livello predefinite, 10. È possibile vedere l’architettura di rete nel pannello Network. Il grafico della rete si aggiorna in base ai dati di input. In questo esempio, i dati contengono 13 input (feature) e un output.

Addestramento della rete

Per addestrare la rete, seleziona Train > Train with Levenberg-Marquardt (Addestrare > Addestrare con Levenberg-Marquardt). Questo è l’algoritmo di addestramento predefinito ed equivale alla pressione del tasto Train (Addestrare).

L’addestramento con il metodo di Levenberg-Marquardt (trainlm) è consigliato per la maggior parte dei problemi. Per problemi piccoli o in presenza di rumore, la regolarizzazione bayesiana (trainbr) può ottenere una soluzione migliore, anche se richiede tempi maggiori. Per problemi più grandi si consiglia l’impostazione Gradiente coniugato scalato (trainscg) in quanto utilizza i calcoli dei gradienti che sono più efficienti sotto il profilo della memoria rispetto ai calcoli jacobiani utilizzati dagli altri due algoritmi.

Nel pannello Training (Addestramento) si possono vedere i progressi dell’addestramento. L’addestramento continua fino al raggiungimento di uno dei criteri di arresto. In questo esempio, l’addestramento continua fino a quando l’errore di convalida aumenta per sei iterazioni consecutive (“Criterio di convalida soddisfatto”).

Analisi dei risultati

Il Model Summary (Riepilogo modello) contiene informazioni sull’algoritmo di addestramento e i risultati dell’addestramento per ogni set di dati.

È possibile analizzare ulteriormente i risultati generando dei grafici. Per tracciare la regressione lineare, nella sezione Plots (Grafici), fai clic su Regression (Regressione). Il grafico della regressione mostra le previsioni della rete (output) rispetto alle risposte (target) per i set di addestramento, convalida e test.

Per un fit perfetto, i dati dovrebbero ricadere sulla linea a 45 gradi, in cui gli output della rete sono uguali alle risposte. Per questo problema il fit è ragionevolmente buono per tutti i set di dati. Nel caso siano necessari risultati più accurati, è possibile riaddestrare la rete facendo nuovamente clic su Train (Addestrare). Ogni addestramento ha pesi e bias iniziali della rete diversi e può produrre una rete migliore a seguito del riaddestramento.

Visualizza l’istogramma degli errori per una ulteriore verifica della prestazione della rete. Nella sezione Plots (Grafici), fai clic su Error Histogram (Istogramma errori).

Le barre blu rappresentano i dati di addestramento, le barre verdi i dati di convalida e le barre rosse rappresentano i dati di test. L’istogramma fornisce un’indicazione degli outlier, ovvero punti di dati in cui il fit è notevolmente peggiore rispetto alla maggioranza dei dati. Conviene verificare gli outlier per stabilire se i dati siano di scarsa qualità o se i punti di dati siano diversi dal resto del set di dati. Se gli outlier sono punti di dati validi, ma sono diversi dal resto dei dati, significa che la rete sta estrapolando questi punti. È opportuno raccogliere più dati simili agli outlier e riaddestrare la rete.

Se non si è soddisfatti delle prestazioni della rete, si può procedere in uno dei seguenti modi:

  • Addestrare nuovamente la rete.

  • Aumentare il numero di neuroni nascosti.

  • Usare un set più ampio di dati di addestramento.

Se la performance sul set di addestramento è buona ma la performance sul set di test è scarsa, questo può indicare un overfitting del modello. Ridurre il numero di neuroni può ridurre l’overfitting.

Si può anche valutare la performance della rete su un ulteriore set di test. Per caricare ulteriori dati di test con cui valutare la rete, nella sezione Test, fai clic su Test. Il Model Summary (Riepilogo modello) mostra i risultati di test aggiuntivi. È possibile generare anche dei grafici per analizzare i risultati dei dati di test aggiuntivi.

Generazione di codice

Seleziona Generate Code > Generate Simple Training Script (Generare codice > Generare script di addestramento semplice) per creare un codice MATLAB in grado di riprodurre le fasi precedenti dalla riga di comando. La creazione di codice MATLAB può essere utile se si desidera imparare come utilizzare la funzionalità della riga di comando del toolbox per personalizzare il processo di addestramento. In Data fitting con le funzioni della riga di comando, potrai esaminare più dettagliatamente gli script generati.

Esportazione della rete

Una volta addestrata, la rete può essere esportata nel workspace o in Simulink®. È anche possibile distribuire la rete con gli strumenti di MATLAB Compiler™ e altri strumenti di generazione di codice MATLAB. Per esportare la rete addestrata e i risultati, seleziona Export Model > Esport to Workspace (Esportare modello > Esportare in Workspace).

Data fitting con le funzioni della riga di comando

Il modo più semplice per scoprire come utilizzare la funzionalità della riga di comando del toolbox consiste nel generare degli script dalle app e poi modificarli per personalizzare l’addestramento della rete. Ad esempio, osserva il semplice script creato nella sezione precedente con l’uso dell’app Neural Net Fitting.

% Solve an Input-Output Fitting problem with a Neural Network
% Script generated by Neural Fitting app
% Created 15-Mar-2021 10:48:13
%
% This script assumes these variables are defined:
%
%   bodyfatInputs - input data.
%   bodyfatTargets - target data.

x = bodyfatInputs;
t = bodyfatTargets;

% Choose a Training Function
% For a list of all training functions type: help nntrain
% 'trainlm' is usually fastest.
% 'trainbr' takes longer but may be better for challenging problems.
% 'trainscg' uses less memory. Suitable in low memory situations.
trainFcn = 'trainlm';  % Levenberg-Marquardt backpropagation.

% Create a Fitting Network
hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize,trainFcn);

% Setup Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

% Train the Network
[net,tr] = train(net,x,t);

% Test the Network
y = net(x);
e = gsubtract(t,y);
performance = perform(net,t,y)

% View the Network
view(net)

% Plots
% Uncomment these lines to enable various plots.
%figure, plotperform(tr)
%figure, plottrainstate(tr)
%figure, ploterrhist(e)
%figure, plotregression(t,y)
%figure, plotfit(net,x,t)

È possibile salvare lo script ed eseguirlo successivamente dalla riga di comando per riprodurre i risultati della precedente sessione di addestramento. Si può anche modificare lo script per personalizzare il processo di addestramento. In questo caso, segui ogni passaggio all’interno dello script.

Selezione dei dati

Lo script presuppone che i vettori di previsione e di risposta siano già caricati nel workspace. Se i dati non sono caricati, li si può caricare nel seguente modo:

load bodyfat_dataset

Questo comando carica i predittori bodyfatInputs e le risposte bodyfatTargets nel workspace.

Questo set di dati è uno dei set di dati campione inclusi nel toolbox. Per informazioni sui set di dati disponibili, vedere Set di dati campione per reti neurali superficiali. Inoltre, è possibile vedere un elenco di tutti i set di dati disponibili immettendo il comando help nndatasets. È possibile caricare le variabili da uno qualunque di questi set di dati utilizzando i propri nomi di variabile. Ad esempio, il comando

[x,t] = bodyfat_dataset;

caricherà i predittori per il grasso corporeo nell’array x e le risposte per il grasso corporeo nell’array t.

Scelta dell’algoritmo di addestramento

Scegli l’algoritmo di addestramento. La rete utilizza l’algoritmo di Levenberg-Marquardt predefinito (trainlm) per l’addestramento.

trainFcn = 'trainlm';  % Levenberg-Marquardt backpropagation. 

Per problemi in cui il metodo di Levenberg-Marquardt non produce risultati sufficientemente accurati, o per problemi di dati più grandi, considerare di impostare la funzione di addestramento della rete rispettivamente su Regolarizzazione bayesiana (trainbr) o su Gradiente coniugato scalato (trainscg), con

net.trainFcn = 'trainbr';
net.trainFcn = 'trainscg';

Creazione della rete

Crea una rete. La rete predefinita per problemi di fitting (o regressione) delle funzioni, fitnet, è una rete feed-forward con la funzione di trasferimento tan-sigmoidale predefinita nel livello nascosto e la funzione di trasferimento lineare nel livello di output. La rete ha un solo livello nascosto con dieci neuroni (default). La rete ha un solo neurone di output perché è presente solo un valore di risposta associato ad ogni vettore di input.

hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize,trainFcn);

Nota

Più neuroni richiedono più calcolo, e tendono all’overfitting dei dati quando il numero è impostato su un valore troppo alto, ma permettono alla rete di risolvere problemi più complicati. Più livelli richiedono più calcolo, ma il loro utilizzo potrebbe consentire alla rete di risolvere problemi più complessi in modo più efficiente. Per utilizzare più di un livello nascosto, inserisci le dimensioni dei livelli nascosti come elementi di un array nel comando fitnet.

Suddivisione dei dati

Imposta la suddivisione dei dati.

net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

Con queste impostazioni, i vettori di previsione e i vettori di risposta vengono suddivisi su base casuale, con il 70% per l’addestramento, il 15% per la convalida e il 15% per le attività di test. Per ulteriori informazioni sulla procedura di suddivisione dei dati, vedere Divide Data for Optimal Neural Network Training.

Addestramento della rete

Addestra la rete.

[net,tr] = train(net,x,t);

Durante l’addestramento si apre la finestra di avanzamento dell’addestramento. È possibile interrompere l’addestramento in qualunque momento facendo clic sul pulsante di stop .

Neural network training progress window

L’addestramento è terminato quando l’errore di convalida è aumentato per sei iterazioni consecutive. Facendo clic su Performance nella finestra di addestramento, compare un grafico degli errori di addestramento, degli errori di convalida e degli errori di test, come si può osservare nella figura che segue. In questo esempio, il risultato è ragionevole tenendo conto delle seguenti considerazioni:

  • L’errore quadratico medio finale è piccolo.

  • L’errore del set di test e l’errore del set di convalida hanno caratteristiche simili.

  • Non si è verificato un overfitting significativo entro l’epoca 13 (in cui si osserva la migliore performance di convalida).

    Mean squared error against number of epochs for the training, validation, and test data. The best validation performance is 18.5252 at epoch 13.

Test della rete

Esegui il test della rete. Una volta addestrata la rete è possibile utilizzarla per calcolare gli output della rete. Il seguente codice calcola gli output, gli errori e la performance complessiva della rete.

y = net(x);
e = gsubtract(t,y);
performance = perform(net,t,y)
performance =

   16.2815

È possibile calcolare la performance della rete anche solamente sulla base del set di test, utilizzando gli indici di test che si trovano nel registro dell’addestramento. Per ulteriori informazioni, vedere Analyze Shallow Neural Network Performance After Training.

tInd = tr.testInd;
tstOutputs = net(x(:,tInd));
tstPerform = perform(net,t(tInd),tstOutputs)
tstPerform =

   20.1698

Visualizzazione della rete

Visualizza il diagramma della rete.

view(net)

Graphical representation of the function fitting network. The network has input size 13, output size 1, and a single hidden layer of size 10.

Analisi dei risultati

Analizza i risultati. Per eseguire la regressione lineare tra le previsioni (output) della rete e le risposte corrispondenti (target), fai clic su Regression nella finestra di addestramento.

Output values against target values for the training, validation, test, and combined data.

L’output tiene traccia delle risposte per i set di addestramento, test e convalida, e il valore R è maggiore di 0,87 per il set di dati totale. Nel caso in cui siano richiesti risultati ancora più accurati, si potrebbe tentare uno dei seguenti approcci:

  • Reimpostare i pesi e i bias iniziali della rete su nuovi valori con init e ripetere l’addestramento.

  • Aumentare il numero di neuroni nascosti.

  • Usare un set più ampio di dati di addestramento.

  • Aumentare il numero di valori di input, se sono disponibili informazioni più pertinenti.

  • Provare un algoritmo di addestramento diverso (vedere Training Algorithms).

In questo caso, la risposta della rete è soddisfacente e a questo punto si può utilizzare la rete su nuovi dati.

Fasi successive

Per acquisire maggiore esperienza nelle operazioni legate alla riga di comando, prova alcune delle seguenti attività:

  • Durante l’addestramento, apri una finestra con un grafico (ad esempio il grafico della regressione) e osserva come si anima.

  • Crea dei grafici dalla riga di comando con funzioni come plotfit, plotregression, plottrainstate e plotperform.

Vedi anche lo script avanzato per ulteriori opzioni durante l’addestramento dalla riga di comando.

Ogni volta che una rete neurale viene addestrata può arrivare a una soluzione diversa a causa dei valori casuali dei pesi e dei bias iniziali e delle diverse suddivisioni dei dati tra set di addestramento, convalida e test. Di conseguenza, diverse reti neurali addestrate sullo stesso problema possono avere output diversi per lo stesso input. Per assicurarsi di riscontrare una precisione soddisfacente nella rete, occorre ripetere l’addestramento varie volte.

Esistono varie altre tecniche per migliorare le soluzioni iniziali qualora si desideri una precisione maggiore. Per ulteriori informazioni, vedere Improve Shallow Neural Network Generalization and Avoid Overfitting.

Vedi anche

| | | | |

Argomenti complementari