Modello di neurone BACKPROPAGATION Backpropagation in MATLAB Prof. Beatrice Lazzerini Dipartimento di Ingegneria dell Informazione Via Diotisalvi 2, 56122 Pisa La funzione di trasferimento, che deve essere derivabile, è tipicamente una delle seguenti: 1 2
Creazione di una rete backpropagation Una rete backpropagation si crea con la funzione newff: >> net= newff(pr,[s1 s2...snl],{tf1 tf2...tfnl},btf,blf,pf) La figura seguente mostra una rete con un solo strato di S neuroni logsig. dove: pr = matrice Rx2 dei valori minimi e massimi per gli R elementi di ingresso si (i=1..n1) = numero di neuroni dell i-mo strato tfi (i=1..n1) = transfer function dell i-mo strato, default = 'tansig' btf = backprop network training function, default = 'trainlm' blf = backprop weight/bias learning function, default = 'learngdm' pf = performance function, default = 'mse'. Ad esempio: >> net=newff([-1 2; 0 5], [3,1], {'tansig','purelin'},'traingd'); crea una rete a due strati. Il vettore di ingresso ha due elementi i cui valori variano, rispettivamente, in [-1 2] e [0 5]. Ci sono tre neuroni nello strato nascosto e uno nello strato di uscita. La funzione di trasferimento nello strato nascosto è tansig mentre nello strato di uscita è lineare. La funzione di addestramento è traingd (algoritmo di backpropagation standard). Le reti feedforward hanno spesso uno o piú strati nascosti di neuroni con funzione di trasferimento sigmoidale ed uno strato di uscita composto da neuroni lineari. Strati di neuroni con funzione di trasferimento non lineare permettono alla rete di imparare relazioni non lineari tra input ed output. Lo strato di uscita lineare permette alla rete di produrre valori all esterno del range [-1 1]. D altra parte, se si vogliono limitare le uscite della rete, ad esempio, tra 0 e 1, lo strato di uscita deve usare una funzione di trasferimento sigmoidale (ad esempio, logsig). 3 La funzione newff, oltre a creare la rete, inizializza anche i pesi e i bias. È possibile, comunque, cambiare l inizializzazione dei pesi: >> net=init(net) >> p=[1;2]; >> a=sim(net,p); Simulazione Addestramento Una rete backpropagation può essere addestrata per eseguire approssimazione di funzioni, associazione di pattern o classificazione di pattern. 4
Durante l addestramento i pesi sono modificati iterativamente allo scopo di minimizzare la funzione di performance net.performfcn. La funzione di default per le reti feedforward è l errore quadratico medio mse. È possibile utilizzare diversi algoritmi di addestramento per reti feedforward. L algoritmo di backpropagation standard (gradient descent) sposta i pesi nella direzione del gradiente negativo, cioè nella direzione in cui la funzione di performance diminuisce piú rapidamente. Esistono alcune varianti dell algoritmo standard. Nel seguito presentiamo alcuni algoritmi di addestramento. Algoritmo backpropagation (traingd) La funzione traingd (gradient descent) ha sette parametri di addestramento: epochs: maximum number of epochs to train (default 10) show: epochs between displays (default 25) goal: performance goal (default 0) time: maximum time to train in seconds (default inf) min_grad: minimum performance gradient (default 1e-10) max_fail: maximum validation failures (default 5) lr: learning rate (default 0.01). Durante l addestramento si possono usare dei vettori di validazione per terminare l addestramento prematuramente, e precisamente quando le prestazioni della rete sui vettori di validazione non migliorano per max_fail epoche di seguito. 5) la performance di validazione è aumentata piú di max_fail volte dall ultima volta in cui è diminuita (quando si usa la validazione). Il codice seguente addestra una rete con l algoritmo di backpropagation in modalità batch (tale modalità richiede che i vettori di input siano posti in una matrice): p=[-1-1 2 2; 0 5 0 5]; t=[-1-1 1 1]; net=newff(minmax(p),[3,1],{'tansig','purelin'},'traingd'); net.trainparam.show=50; net.trainparam.lr=0.05; net.trainparam.epochs=300; net.trainparam.goal=1e-5; [net,tr]=train(net,p,t); % tr (training record) contiene informazioni su come % procede l'addestramento a=sim(net,p) Durante l addestramento sono visualizzate le seguenti informazioni: TRAINGD, Epoch 0/300, MSE 1.59423/1e-005, Gradient 2.76799/1e-010 TRAINGD, Epoch 50/300, MSE 0.00236382/1e-005, Gradient 0.0495292/1e-010 TRAINGD, Epoch 100/300, MSE 0.000435947/1e-005, Gradient 0.0161202/1e-010 TRAINGD, Epoch 150/300, MSE 8.68462e-005/1e-005, Gradient 0.00769588/1e-010 TRAINGD, Epoch 200/300, MSE 1.45042e-005/1e-005, Gradient 0.00325667/1e-010 TRAINGD, Epoch 211/300, MSE 9.64816e-006/1e-005, Gradient 0.00266775/1e-010 TRAINGD, Performance goal met. e viene prodotto il seguente grafico: Vettori di test possono essere utilizzati come ulteriore controllo della capacità di corretta generalizzazione della rete, comunque questi vettori non hanno alcun effetto sul training. L addestramento termina quando si verifica una delle seguenti condizioni: 1) si raggiunge il numero massimo di epoche; 2) si supera il massimo ammontare di tempo; 3) la performance raggiunge un valore minore di goal; 4) il gradiente della performance è inferiore a min_grad; 5 6
Ricreaiamo la rete precedente ed addestriamola con il metodo del momentum: p=[-1-1 2 2; 0 5 0 5]; t=[-1-1 1 1]; net=newff(minmax(p),[3,1],{'tansig','purelin'},'traingdm'); net.trainparam.show=50; net.trainparam.lr=0.05; net.trainparam.mc=0.9; net.trainparam.epochs=300; net.trainparam.goal=1e-5; [net,tr]=train(net,p,t); a=sim(net,p) I due algoritmi di addestramento precedenti (traingd e traingdm) risultano spesso troppo lenti. Esistono varianti dell algoritmo di backpropagation che convergono molto piú velocemente. Vediamo alcune di tali varianti. Algoritmo traingda La simulazione produce: a = -0.9988-1.0007 0.9951 1.0035 Osserviamo che, a causa dell inizializzazione casuale dei pesi, esecuzioni diverse dello stesso codice possono produrre risultati diversi. Tornando al parametro di uscita tr (training record), esso contiene le seguenti informazioni: tr.epoch: tr.perf: tr.vperf: tr.tperf: epoch number training performance validation performance test performance. Algoritmo backpropagation con momentum (traingdm) Vediamo la funzione traingdm (gradient descent with momentum). 7 La funzione traingda (gradient descent with adaptive learning rate) si comporta in modo simile a traingd con il piú il fatto che adotta un learning rate variabile. Algoritmo traingdx La funzione di addestramento traingdx combina learning rate variabile e momentum. Algoritmo Levenberg-Marquardt (trainlm) Questo algoritmo fa uso di tecniche di ottimizzazione numerica ed è il metodo piú veloce per addestrare reti neurali feedforward di dimensioni moderate (cioè contenenti fino a parecchie centinaia di pesi). È particolarmente efficiente in termini temporali in problemi di approssimazione di funzioni quando la rete ha un numero di pesi di alcune centinaia ed è richiesta un approssimazione molto accurata. All aumentare del numero di pesi della rete di solito l algoritmo trainlm non risulta essere il migliore. Inoltre, le prestazioni di trainlm tendono a calare in problemi di riconoscimento di pattern. 8
È opportuno osservare, comunque, che non esiste un algoritmo di addestramento che è in assoluto migliore degli altri in ogni problema, anche perchè le prestazioni di un algoritmo di addestramento dipendono, ad esempio, da fattori quali l accuratezza richiesta all approssimazione della rete. Quando si crea una rete con la funzione newff il valore di default dell algoritmo di addestramento è trainlm. Tipicamente, prima di addestrare una rete con questo algoritmo si settano parametri quali epochs, show e goal. Generalizzazione e overfitting Uno dei problemi che si possono verificare durante l addestramento di una rete neurale è il cosiddetto overfitting: l errore sul training set è estremamente basso, ma quando alla rete si presenta un nuovo ingresso (non incluso nel training set), l errore commesso è molto grande. In questo caso, la rete ha memorizzato gli esempi di addestramento, ma non ha imparato a generalizzare. Osserviamo che se il numero di parametri della rete è molto piú piccolo del numero di esempi di addestramento la possibilità di overfitting è scarsa o addirittura nulla. Quindi, se è possibile dimensionare il training set in maniera opportuna si riesce a prevenire il problema. Nei casi in cui il training set è invece non adeguato alle dimensioni della rete (e non è possibile raccogliere altri dati per qualche motivo) si puó, ad esempio, usare un metodo, detto early stopping, descritto di seguito. Early stopping Questo metodo prevede di suddividere i dati a disposizione in tre sottoinsiemi: training set, validation set e test set. Il training set è usato per calcolare il gradiente e aggiornare pesi e bias. Durante il processo di addestramento si calcola l errore sul validation set. Di solito sia l errore sul validation set che l errore sul training set decrescono durante la prima fase di addestramento. Quando comincia l overfitting, l errore sul validation set tipicamente comincia a salire. Quando l errore sul validation set continua a salire per un determinato numero di epoche, l addestramento viene interrotto e vengono restituiti i pesi e i bias corrispondenti al minimo dell errore di validazione. 9 Osserviamo che l errore sul test set non viene utilizzato durante la fase di addestramento. Tale errore viene invece usato per confrontare tra loro reti diverse. Puó comunque essere utile visualizzare l errore sul test set durante l addestramento: infatti, se l errore sul test set e l errore sul validation set raggiungono minimi in epoche sostanzialmente diverse, possiamo sospettare di non aver effettuato una suddivisione appropriata in tre sottoinsiemi dell insieme iniziale dei dati. Questa tecnica puó essere utilizzata con tutte le funzioni di addestramento viste precedentemente. È sufficiente passare il validation set alla funzione di addestramento. Esempio Addestriamo una rete 1-20-1 (un input, 20 neuroni nascosti, un output) ad approssimare una funzione seno con rumore. % generiamo il training set p=[-1:0.05:1]; t=sin(2*pi*p) + 0.1*randn(size(p)); % aggiungiamo rumore al seno % (sommando numeri casuali con distribuzione normale) % generiamo il validation set; gli input variano in [-1 1] come nel training % set, ma sono traslati leggermente. Inoltre aggiungiamo un rumore % diverso alla funzione seno. % Il validation set è contenuto in una struttura che comprende sia gli % ingressi che le uscite desiderate. val.p=[-0.975:0.05:0.975]; val.t=sin(2*pi*val.p) + 0.1*randn(size(val.p)); net=newff([-1 1],[20 1],{'tansig','purelin'},'traingdx'); net.trainparam.show=25; net.trainparam.epochs=300; net=init(net); [net,tr]=train(net,p,t,[],[],val); Sul video compare, ad esempio : TRAINGDX, Epoch 0/300, MSE 8.42881/0, Gradient 14.0376/1e-006 TRAINGDX, Epoch 25/300, MSE 1.53024/0, Gradient 2.03697/1e-006 TRAINGDX, Epoch 50/300, MSE 0.391605/0, Gradient 0.576193/1e-006 10
TRAINGDX, Epoch 75/300, MSE 0.0857572/0, Gradient 0.152822/1e-006 TRAINGDX, Epoch 100/300, MSE 0.0225605/0, Gradient 0.0504764/1e-006 TRAINGDX, Epoch 123/300, MSE 0.00512998/0, Gradient 0.0295261/1e-006 TRAINGDX, Validation stop. Appare il seguente grafico: La funzione seno (senza rumore) è rappresentata dalla linea tratteggiata, le misure rumorose (training set) sono indicate dal simbolo + e la risposta della rete è rappresentata dalla linea continua. Come possiamo osservare dal grafico, non c è overfitting. (la linea superiore è l errore sul validation set mentre quella inferiore è l errore sul training set) % simuliamo la rete y=sim(net,p); % grafichiamo la funzione da approssimare, il training set e % la risposta della rete plot(p,sin(2*pi*p),':',p,t,'+',p,y); 11 12