Addestramento di una rete neurale spiegato in modo semplicissimo

Addestramento rete neurale
Detto così sembra chissà quale complicazione debba essere invece!
In futuro spero di riuscire a pensare a una rete neurale realmente utile che vi invogli ad approfondire l’argomento. Per esempio una rete neurale in grado di identificare dei pezzi difettosi prodotti da una macchina. Oppure se vostro figlio adolescente si è innamorato!
Rete neurale che dimezza l’input ricevuto
Un esempio banale, vogliamo una rete che sappia dimezzare gli input che gli sottoponiamo.
In questo caso è facile creare un set di addestramento, dovremmo usare molte più righe ma ci accontentiamo.

Dati di addestramento

4, 2,
5, 2.5,
18, 9,
7, 3.5,
10, 5,
2, 1,
12, 6,

Il codice python (che mi sono fatto scrivere da GPT) è in fondo, qui vediamo l’esecuzione
La formula è : z=x⋅w+b con w parametro di partenza scelto a caso + un bias.
Ad ogni ciclo (che vengono chiamati epoche) ci si avvicina all’output desiderato.
Loss (perdita) è la differenza fra l’ouput ottenuto e quello atteso.
Il log mostra l’avanzamento ma non i valori di w e b utilizzati.
In fondo viene spiegato perché ogni tanto invece di avvicinarsi si allontana.
Esecuzione:
Epoch 1, Loss: 6.227310998181788
Epoch 2, Loss: 4.2116145943639296e-05
Epoch 3, Loss: 7.195056907187796e-05
Epoch 4, Loss: 6.765318020060395e-05
Epoch 5, Loss: 6.385329050508612e-05
Epoch 6, Loss: 6.026611729702987e-05
Epoch 7, Loss: 5.688046770575314e-05
Epoch 8, Loss: 5.36850182351593e-05
Epoch 9, Loss: 5.0669083767353316e-05
Epoch 10, Loss: 4.7822579449979105e-05
Epoch 11, Loss: 4.5135986980733416e-05
Epoch 12, Loss: 4.260032277964672e-05
Epoch 13, Loss: 4.0207107949257094e-05
Epoch 14, Loss: 3.79483399223227e-05
Epoch 15, Loss: 3.5816465702468136e-05
Epoch 16, Loss: 3.3804356608038865e-05
Epoch 17, Loss: 3.1905284434662266e-05
Epoch 18, Loss: 3.0112898957404222e-05
Epoch 19, Loss: 2.842120669620724e-05
Epoch 20, Loss: 2.6824550874744654e-05
Epoch 21, Loss: 2.531759250485431e-05
Epoch 22, Loss: 2.389529253388356e-05
Epoch 23, Loss: 2.255289499468077e-05

Epoch 80, Loss: 8.354668661494883e-07
Epoch 81, Loss: 7.885317359941818e-07
Epoch 82, Loss: 7.442333428894388e-07
Epoch 83, Loss: 7.024235593629253e-07
Epoch 84, Loss: 6.629625794983267e-07
Epoch 85, Loss: 6.257184514343455e-07
Epoch 86, Loss: 5.905666361434807e-07
Epoch 94, Loss: 3.7186771701331693e-07
Epoch 95, Loss: 3.5097681109486934e-07
Epoch 96, Loss: 3.312595213051599e-07
Epoch 97, Loss: 3.1264991585277926e-07
Epoch 98, Loss: 2.9508576688341076e-07
Epoch 99, Loss: 2.7850834240928134e-07
Epoch 100, Loss: 2.628622098922849e-07

Final weights: [0.49998114], Final bias: 0.0002775894448815529
Predicted output for 1200: 599.9776494067913

Con un set di addestramento più accurato avremmo ottenuto:
Final weights: [0.5], Final bias: 0.0
Predicted output for 1200: 600

La perdita (Loss) che ondeggia può essere un segnale che il tasso di apprendimento è troppo alto (learning_rate = 0.01) . Un tasso di apprendimento troppo alto può causare oscillazioni nella funzione di perdita poiché gli aggiornamenti dei pesi e del bias sono troppo grandi e possono superare il punto ottimale, causando un effetto di “bouncing”.
Si può usare un learning rate più basso ma in questo caso è necessario aumentare le epoche.
Spiegazione del Codice

  1. Inizializzazione: Partiamo con un peso iniziale di 0.3 e un bias di 0.0 per mostrare il miglioramento ad ogni epoca.
  2. Dati di Addestramento: Utilizziamo una serie di coppie di dati per l’addestramento della rete neurale.
  3. Funzione di Attivazione Lineare: Utilizziamo una funzione di attivazione lineare semplice.
  4. Forward Propagation: Calcoliamo l’output della rete neurale per ogni dato di addestramento.
  5. Calcolo della Perdita: Utilizziamo l’errore quadratico medio (MSE) come funzione di perdita.
  6. Backpropagation: Calcoliamo i gradienti della perdita rispetto ai pesi e al bias e li aggiorniamo utilizzando il tasso di apprendimento.
  7. Predizione: Usiamo i pesi e il bias finali per predire un nuovo dato (1200).

Ho riportato lo script python solo per mostrare che bastano poche righe di codice che comunque io mi faccio scrivere da GPT.
dimezzaInput.py
import numpy as np

  • Dati di addestramento
    training_data = [
    (np.array([4]), 2),
    (np.array([5]), 2.5),
    (np.array([18]), 9),
    (np.array([7]), 3.5),
    (np.array([10]), 5),
    (np.array([2]), 1),
    (np.array([12]), 6),
    ]

  • Inizializzazione dei pesi e del bias
    w = np.array([0.3])
    b = 0.0
    learning_rate = 0.01

  • Funzione di attivazione lineare (identità)
    def linear(x):
    return x

  • Derivata della funzione di attivazione lineare
    def linear_derivative(x):
    return 1

  • Addestramento
    for epoch in range(100): # Numero di epoche
    total_loss = 0
    for x, y in training_data:
    * Forward propagation
    z = np.dot(w, x) + b
    a = linear(z)

      * Calcolo della perdita
      loss = 0.5 * (a - y) ** 2
      total_loss += loss
    
      * Backpropagation
      dz = (a - y) * linear_derivative(z)
      dw = dz * x
      db = dz
    
      * Aggiornamento dei pesi e del bias
      w -= learning_rate * dw
      b -= learning_rate * db
    

    print(f’Epoch {epoch+1}, Loss: {total_loss}')

print(f’Final weights: {w}, Final bias: {b}')

  • Funzione per fare predizioni
    def predict(x, w, b):
    z = np.dot(w, x) + b
    a = linear(z)
    return a

  • Nuovo dato
    new_data = np.array([1200])
    prediction = predict(new_data, w, b)
    print(f’Predicted output for {new_data[0]}: {prediction}')

6 Mi Piace

Tutto davvero molto affascinante!!!
Grazie!!!

@poidomani47 io premetto che ci capisco veramente poco ma grazie della condivisione delle tue esperienze in questo campo.

mi dispiace di essere stato poco chiaro, è veramente molto più semplice di quel che sembra. Voglio provare a spiegarmi meglio ma prima devo pensare al come!!! :slightly_smiling_face:

@poidomani47 sei stato chiarissimo invece, sono io che so poco sulle reti neurali e quindi fatico un po’ a capire.

Io ho seguito i corsi di Giuseppe Gullo (in italiano) su https://www.udemy.com/home/my-courses/learning/

2 Mi Piace

Potresti chiedere a un LLM di creare un testo che spieghi il tutto in maniera più semplice :rofl:

Per rispondere a tommaso.simoncini
La spiegazione precedente è di chatGPT.
Ho chiesto anche a Gemini di google, non so se adesso è più chiaro, per capire bene bisognerebbe seguire i corsi di Giuseppe Gullo in italiano: machine learning e deep learning, 12 ore e 13 ore.
DOMANDA
dovrei spiegare in modo semplice a non esperti l’addestramento di una rete neurale a f(x) = a/2, esempio 4 → 2, 5 → 2.5 , 18 → 9, mostrando in dettaglio almeno le prime 3 epoche, iniziando con peso = 0.3 e bias = 0.1. Prima di ciò dovrei far capire cosa sono i pesi e i bias e cos’è la back propagation e spiegare anche perché si usa il modello di Previsione=x×Peso+Bias

GEMINI
Assolutamente! Cerchiamo di rendere questo concetto chiaro e semplice, come se stessi spiegando a un amico.

Cosa sono i pesi e i bias?

Immagina di avere una bilancia. Ogni oggetto che metti su un piatto ha un peso diverso. In una rete neurale, i pesi sono come questi pesi. Ogni informazione che entra nella rete ha un peso diverso, e questo peso determina quanto influirà sul risultato finale.

Il bias, invece, è come un piccolo aggiustamento che puoi fare alla bilancia per farla pendere leggermente da una parte o dall’altra, anche se non ci sono oggetti sui piatti. In una rete neurale, il bias serve a spostare leggermente il risultato finale verso l’alto o verso il basso.

Cos’è la backpropagation?

La backpropagation è un po’ come quando ti sbagli a fare un calcolo e poi torni indietro per capire dove hai sbagliato e correggere. In una rete neurale, la backpropagation serve a confrontare il risultato che la rete ha ottenuto con il risultato corretto (quello che ci aspettavamo). Se c’è una differenza, la rete cerca di capire quali pesi e bias hanno causato l’errore e li aggiusta di conseguenza.

Perché si usa il modello Previsione=x×Peso+Bias?

Questo modello è uno dei più semplici che si possono usare per una rete neurale. È come una formula magica che ci permette di trasformare un numero in ingresso (x) in un numero in uscita (previsione). Il peso e il bias sono i “maghi” che ci aiutano a fare questa trasformazione.

Addestramento di una rete neurale: un esempio pratico

Supponiamo di voler insegnare alla nostra rete neurale a dividere un numero per due. Abbiamo i seguenti esempi:

4 → 2
5 → 2.5
18 → 9
Iniziamo con:

Peso: 0.3
Bias: 0.1
Prima epoca:

Primo esempio (4 → 2):

Previsione = 4 * 0.3 + 0.1 = 1.3 (è sbagliato!)
Calcoliamo l’errore: Errore = 2 - 1.3 = 0.7 (valore atteso - previsione)
Aggiustiamo il peso e il bias (la parte più tecnica, ma l’idea è che li modifichiamo per ridurre l’errore)
Secondo esempio (5 → 2.5):
calcoli simili
Facciamo la stessa cosa del primo esempio.
Terzo esempio (18 → 9):
calcoli simili
Facciamo la stessa cosa del primo esempio.

Aggiornamento dei parametri:

Per aggiornare il peso e il bias, utilizziamo le seguenti formule (basate sulla discesa del gradiente, tecnica per minimizzare l’errore):

  • Aggiornamento del peso: Δpeso = tasso_apprendimento * errore * input
  • Aggiornamento del bias: Δbias = tasso_apprendimento * errore

Dove:

  • Δpeso è la variazione del peso
  • Δbias è la variazione del bias
  • tasso_apprendimento è un valore piccolo (es. 0.01) che determina la velocità di apprendimento
  • errore è l’errore calcolato sopra
  • input è il valore in ingresso (in questo caso, 4)

Calcoli:

  • Δpeso: 0.01 * 0.7 * 4 = 0.028
  • Δbias: 0.01 * 0.7 = 0.007

Nuovi valori:

  • Nuovo peso: 0.3 + 0.028 = 0.328
  • Nuovo bias: 0.1 + 0.007 = 0.107

Cosa significano questi calcoli?

  • Errore positivo: L’errore è positivo, il che significa che la nostra previsione è stata troppo bassa.
  • Aggiornamento del peso: Aumentiamo il peso perché un peso maggiore farà aumentare la previsione.
  • Aggiornamento del bias: Aumentiamo anche il bias per aumentare leggermente la previsione.

Intuizione: Immagina di avere una linea retta (la nostra previsione) che non passa esattamente per i punti dati. L’errore ci dice quanto la linea è lontana dal punto. L’aggiornamento dei pesi e dei bias è come spostare leggermente la linea in modo che si avvicini al punto. Il tasso di apprendimento determina di quanto spostiamo la linea ad ogni passo.

Seconda e terza epoca:

Ripetiamo le stesse operazioni per altre epoche. Ad ogni epoca, la rete diventa sempre più brava a dividere per due, perché i pesi e il bias si avvicinano sempre di più ai valori corretti.

Perché fare più epoche?

Immagina di imparare a guidare. All’inizio farai molti errori, ma con la pratica diventerai sempre più bravo. In una rete neurale è lo stesso: più epoche facciamo, più la rete impara e più diventa accurata.

In conclusione

L’addestramento di una rete neurale è un processo iterativo in cui la rete impara dai suoi errori e si adatta per fornire previsioni sempre più accurate. I pesi e i bias sono gli strumenti che la rete utilizza per fare queste previsioni, e la backpropagation è il meccanismo che permette alla rete di migliorare nel tempo.

Nota: Questo è un esempio molto semplificato. Nelle reti neurali reali, ci sono molti più pesi, bias e strati, e i calcoli sono molto più complessi. Tuttavia, il principio di base è sempre lo stesso: la rete impara dall’esperienza e si adatta per svolgere un compito specifico.

Ho chiesto ancora:
sarebbe più chiaro se tu aggiungessi anche i calcoli delle epoche 2 e 3 in modo che il lettore possa vedere l’errore diminuire, senza ripetere tutto mi aggiungi il dettaglio di epoca 2 e 3?

GEMINI
Certamente! Aggiungiamo i calcoli per la seconda e la terza epoca, considerando che i pesi e i bias vengono aggiornati in base all’errore (anche se non specifichiamo qui l’algoritmo preciso di aggiornamento, come ad esempio la discesa del gradiente).

Assunzioni:

Tasso di apprendimento: Per semplicità, assumiamo un tasso di apprendimento costante e basso (ad esempio, 0.01).
Funzione di attivazione: Per semplicità, non utilizziamo alcuna funzione di attivazione, considerando direttamente l’output della somma pesata come previsione.
Epoca 2
Supponiamo che dopo la prima epoca, il peso sia diventato 0.35 e il bias 0.12.

Primo esempio (4 → 2):
Previsione = 4 * 0.35 + 0.12 = 1.52
Errore = 2 - 1.52 = 0.48
Secondo esempio (5 → 2.5):
… (calcoli simili)
Terzo esempio (18 → 9):
… (calcoli simili)
Epoca 3
Supponiamo che dopo la seconda epoca, il peso sia diventato 0.38 e il bias 0.15.

Primo esempio (4 → 2):
Previsione = 4 * 0.38 + 0.15 = 1.67
Errore = 2 - 1.67 = 0.33
Secondo esempio (5 → 2.5):
… (calcoli simili)
Terzo esempio (18 → 9):
… (calcoli simili)
Osservazioni:

Diminuzione dell’errore: Come si può notare, l’errore diminuisce progressivamente ad ogni epoca. Questo significa che la rete sta imparando e si sta avvicinando alla soluzione desiderata.
Aggiornamento dei pesi e dei bias: Ad ogni epoca, i pesi e i bias vengono aggiornati in base all’errore calcolato. Questo aggiornamento avviene in modo da ridurre l’errore complessivo.
Convergenza: Dopo un numero sufficiente di epoche, la rete convergerà verso una soluzione ottimale, ovvero i pesi e i bias raggiungeranno dei valori tali che l’errore sarà minimo.
Importanza della visualizzazione:
Per una migliore comprensione, sarebbe utile visualizzare graficamente l’andamento dell’errore durante l’addestramento. Questo permetterebbe di vedere chiaramente come l’errore diminuisce ad ogni epoca e di identificare eventuali problemi, come ad esempio l’overfitting (quando la rete si adatta troppo ai dati di training e perde la capacità di generalizzare a nuovi dati).

Considerazioni finali:
Questo esempio è molto semplificato e serve a dare un’idea intuitiva del funzionamento dell’addestramento di una rete neurale. In realtà, le reti neurali moderne sono molto più complesse e utilizzano algoritmi di ottimizzazione più sofisticati, come ad esempio Adam o RMSprop. Inoltre, vengono utilizzate funzioni di attivazione non lineari per permettere alla rete di apprendere rappresentazioni più complesse dei dati.

Aggiungo un’informazione importante:
Se forniamo un grande numero di esempi e utilizziamo 100 epoche (100 cicli) riusciamo ad arrivare al valore esatto
Previsione = 4 * 0.50 + 0 = 2
Faccio notare che la rete non impara risultato = input / 2.
Noi con la nostra intelligenza ci arriviamo rapidamente ma la rete no!
Secondo me siamo alla prima versione di intelligenza artificiale forse fra 100 anni l’intelligenza artificiale ci risponderà input / 2

1 Mi Piace

Molto interessante, grazie.

Vorrei aggiungere che per il nostro lavoro, sviluppo applicazioni, è molto più utile concentrarsi su quello che ci ha mostrato Vittoria. Io sto realizzando un esempio su un caso che conosciamo tutti, la fatturazione. Vorrei raggiungere questi obiettivi (mostrati da Vittoria).
Esempio:


Sulla sinistra l’utente fa le sue richieste in linguaggio naturale e a destra gli vengono mostrati i dati che non può toccare direttamente. Deve poter fare tutto scrivendo o parlando.
Esempi:

  • modifica la riga della mozzarella aumentando la quantità a 5.
  • elimina la riga dei funghi porcini
  • mostra le fatture del 2024 del cliente pizzeria garibaldi
  • inserisci una fattura per la pizzeria “il gusto” coi prodotti sardine in scatola da 1 kg e melanzane arrosto sott’olio da 1 kg.
  • aggiungi il nuovo prodotto peperoni sott’olio confezione da 1 kg, prezzo 23€
  • stampa il grafico dell’utile lordo del mese di maggio 2024 diviso per provincia
  • ecc.
    Per raggiungere questo obiettivo sto creando tutte le web api che serviranno all’assistente.
    In sostanza l’applicazione sarà costituita solo dalla web api e dall’assistente e dalle videate per mostrare i dati.
1 Mi Piace

Gemini 1 : 0 ChatGPT

1 Mi Piace

in realtà chatGPT va molto meglio di gemini :slightly_smiling_face:

1 Mi Piace

@tommaso.simoncini sono curioso perché secondo te è meglio Gemini di Chat GPT?

Non so se il prompt era lo stesso, ma cito @poidomani47

La spiegazione precedente è di chatGPT.
Ho chiesto anche a Gemini di google, non so se adesso è più chiaro

Direi che la seconda è molto più chiara.

Se poi vogliamo parlare in generale, io mi trovo meglio con Claude, ma dipende sempre tutto da cosa chiedi e cosa ti aspetti.

1 Mi Piace

per esperienza mi è capitato di porre la stessa questione a Gemini e a chatGPT e ho visto delle differenze importanti. Ovviamente col passare del tempo le cose possono cambiare, io intanto li uso entrambi.

l’assistente a cui ho assegnato
image
prende delle iniziative interessanti e non le ho ancora sperimentate tutte:
image

image

Questo anche è interessante:
User

mostra i prodotti mozzarella

Assistente

Sembra che ci sia stato un errore nella decodifica dei dati. Potresti specificare ulteriori dettagli o fornire un’altra descrizione del prodotto che desideri visualizzare?
(Ho corretto l’errore nel programma e senza riscrivere tutta la richiesta ho semplicemente chiesto:)
User

riprova adesso

Assistente

Ecco il dettaglio del prodotto “mozzarella” che abbiamo nel sistema: - ID Prodotto: 1 - Descrizione: mozzarella - Categoria: latticini - Unità di Misura: kg - Prezzo: €12.00 Se hai bisogno di ulteriori informazioni o desideri modificare altri dettagli, fammelo sapere!

Risponde anche a domande sulla propria struttura e su quello che è in grado di fare, per esempio sulle funzioni:
image

“mi elenchi le funzioni che riguardano i clienti?”

  1. listclienti: Elenca i clienti in base a vari criteri come ragione sociale, CAP, indirizzo, località e provincia.

    • Parametri:
      • ragsoc (opzionale): Ragione sociale anche parziale
      • CAP (opzionale)
      • indirizzo (opzionale)
      • localita (opzionale)
      • provincia (opzionale)
  2. trovacliente: Legge i dati di un cliente specifico per ragione sociale.

    • Parametri:
      • ragsoc: Ragione sociale
1 Mi Piace