L'articolo presenta i risultati di un'implementazione che
combina il training di una rete neurale in Python con la sua esecuzione su un
dispositivo embedded a risorse limitate per approssimare la funzione matematica
sin(x).
La rete neurale utilizzata è del tipo feedforward (MLP) con una struttura semplice ma efficace.
Il layer di input accetta un singolo neurone che rappresenta il valore x in radianti. Questo viene processato attraverso un layer nascosto di 8 neuroni con attivazione tanh, per poi produrre un singolo output tramite un neurone con attivazione lineare che restituisce il valore sin(x).
Questa architettura 1-8-1 rappresenta un buon compromesso tra accuratezza e utilizzo di memoria, aspetto cruciale per dispositivi embedded molto economici.
Il training è stato effettuato su 1000 campioni uniformemente distribuiti nell'intervallo [0, 2π]. Questo range copre un ciclo completo della funzione seno, permettendo alla rete di apprendere l'intero pattern della funzione.
La funzione tanh nel layer nascosto è particolarmente adatta per questo compito, poiché la sua forma sigmoide permette di catturare efficacemente il comportamento ondulatorio della funzione seno.
Una delle parti più interessanti dell'esperimento è la conversione dei pesi addestrati in un formato utilizzabile dalla scheda.
La rete neurale utilizzata è del tipo feedforward (MLP) con una struttura semplice ma efficace.
Il layer di input accetta un singolo neurone che rappresenta il valore x in radianti. Questo viene processato attraverso un layer nascosto di 8 neuroni con attivazione tanh, per poi produrre un singolo output tramite un neurone con attivazione lineare che restituisce il valore sin(x).
Questa architettura 1-8-1 rappresenta un buon compromesso tra accuratezza e utilizzo di memoria, aspetto cruciale per dispositivi embedded molto economici.
Il training è stato effettuato su 1000 campioni uniformemente distribuiti nell'intervallo [0, 2π]. Questo range copre un ciclo completo della funzione seno, permettendo alla rete di apprendere l'intero pattern della funzione.
La funzione tanh nel layer nascosto è particolarmente adatta per questo compito, poiché la sua forma sigmoide permette di catturare efficacemente il comportamento ondulatorio della funzione seno.
Una delle parti più interessanti dell'esperimento è la conversione dei pesi addestrati in un formato utilizzabile dalla scheda.
Lo script Python estrae
automaticamente tutti i parametri del modello scrivendoli in un file header
C/C++.
Il file generato contiene la matrice di pesi W1 con dimensioni [8][1] per il primo layer e il vettore di bias b1 con 8 elementi, seguiti dalla matrice di pesi W2 con dimensioni [1][8] per il secondo layer e dal vettore di bias b2 con un singolo elemento.
Il file generato contiene la matrice di pesi W1 con dimensioni [8][1] per il primo layer e il vettore di bias b1 con 8 elementi, seguiti dalla matrice di pesi W2 con dimensioni [1][8] per il secondo layer e dal vettore di bias b2 con un singolo elemento.
Tutti i valori sono memorizzati come array statici const
float, ottimizzando l'utilizzo della memoria flash del microcontrollore.
Il firmware deve implementare la forward propagation per calcolare l'output attraverso i layer successivi. L'attivazione tanh può essere implementata manualmente o tramite librerie matematiche disponibili. Una volta caricato, il sistema è in grado di effettuare inferenza in tempo reale, calcolando sin(x) per valori di input arbitrari.
Questo metodo offre velocità di esecuzione costante e prevedibile, senza dipendenze da librerie matematiche pesanti. Inoltre, permette di approssimare funzioni più complesse con lo stesso framework, mantenendo un'occupazione di memoria fissa e nota a priori.
Il firmware deve implementare la forward propagation per calcolare l'output attraverso i layer successivi. L'attivazione tanh può essere implementata manualmente o tramite librerie matematiche disponibili. Una volta caricato, il sistema è in grado di effettuare inferenza in tempo reale, calcolando sin(x) per valori di input arbitrari.
Questo metodo offre velocità di esecuzione costante e prevedibile, senza dipendenze da librerie matematiche pesanti. Inoltre, permette di approssimare funzioni più complesse con lo stesso framework, mantenendo un'occupazione di memoria fissa e nota a priori.
Il modello, costruito utilizzando TensorFlow/Keras con l'ottimizzatore Adam,
presenta un learning rate di 0.01. La funzione di loss è la Mean Squared Error
(MSE) e il training configurato per 500 epoche con un batch size di 32
campioni.
Considerazioni sulle Prestazioni
Con soli 8 neuroni nascosti, la rete riesce ad approssimare efficacemente
la funzione seno nell'intero intervallo di training. L'errore quadratico medio
dopo il training è dell'ordine di 10⁻³ o inferiore, un'accuratezza più che
sufficiente per la maggior parte delle applicazioni embedded.
Possibili Estensioni
Questo approccio può essere facilmente esteso per approssimare altre
funzioni trigonometriche o matematiche complesse, implementare modelli più
profondi per pattern più articolati, utilizzare la quantizzazione dei pesi per
ridurre ulteriormente l'occupazione di memoria, o portare il codice su
microcontrollori ancora più limitati in termini di risorse.
Conclusioni
Questo esperimento rappresenta, a mio avviso, un eccellente esempio di come
le tecniche di machine learning possano essere democratizzate e rese
accessibili anche su hardware con risorse limitate.
La combinazione di training offline in Python e inferenza embedded su piccole schede apre la porta a numerose applicazioni nell'IoT, nella robotica e nei sistemi embedded intelligenti.
La combinazione di training offline in Python e inferenza embedded su piccole schede apre la porta a numerose applicazioni nell'IoT, nella robotica e nei sistemi embedded intelligenti.
