Rivista #231: Arduino, reti neurali e logica Fuzzy

Tra i contenuti del fascicolo 231 (Dicembre 2018/Gennaio 2019), attualmente in edicola, continuiamo ad occuparci dell’implementazione delle reti neurali in  ambito Arduino introducendo la logica Fuzzy.

Vi sarete accorti che da qualche numero (più precisamente dal fascicolo n° 229) stiamo affrontando l’argomento Intelligenza Artificiale e che abbiamo introdotto, nell’articolo “Arduino e le reti neurali” pubblicato in novembre scorso, l’implementazione delle reti neurali in ambito Arduino. L’opportunità dell’utilizzo delle Reti Neurali è stata spiegata con la necessità di trovare sistemi efficienti per trattare input ad output analogici (grandezze a valori continui), complicati da gestire con l’uso dei calcolatori digitali.

Infatti i calcolatori, per loro natura, sono dedicati a trattare valori puntuali e ad usare la logica Booleana (a due stati: si/no). Invece, come abbiamo visto, una semplice rete neurale a due strati (più quello di ingresso), può realizzare una soddisfacente funzione complessa tra input ed outputanalogico. Infatti l’abbiamo usata per pilotare un rover come Ardusumo sulla base dei due sensori anteriori di distanza.

L’inconveniente (per così dire) dell’utilizzo delle Reti Neurali è che sono sistemi che vanno addestrati con l’imitazione, oppure fornendo loro una serie di esempi prototipi e ripetendo più volte la loro presentazione: almeno qualche migliaio di ripetizioni.

Nell’articolo che abbiamo dedicato ai sensori di distanza (pubblicato nel fascicolo di ottobre 2018), ma soprattutto in un precedente articolo (Rivista numero 169), è stato accennato ad un diverso approccio alla gestione delle grandezze analogiche, basato su una logica differente utilizzabile dai computer: la Logica Fuzzy.

Rimandiamo agli articoli succitati chi volesse approfondire l’argomento Fuzzy, e riassumiamo qui le caratteristiche salienti di questo approccio.

  • L’input analogico viene partizionato in classi: per esempio grande distanza, media distanza, piccola distanza. Ogni classe risulta centrata su un valore caratteristico con le bande laterali decrescenti.
  • Le classi dell’output analogico sono rappresentate solo da valori caratteristici senza le bande laterali (Fuzzy Systems in modalità Sugeno, chiamato così grazie studioso che lo ha proposto).
  • Un insieme di regole collega classi di input a conseguenti valori di output (per esempio if sensore 1 = Molto vicino and sensore 2 = Vicino then classe-output-C).

Il funzionamento del sistema così descritto è il seguente:

  • in base al valore di input si determina il grado di appartenenza di quel valore alla classe corrispondente;
  • viene esaminata ogni regola e valutato il suo grado di verità, il quale diventa un “peso” da attribuire al valore di output collegato a quella regola;
  • alla fine della valutazione di tutte le regole, viene calcolata la media pesata dei valori di output assegnati ad ogni regola e questo risultato rappresenta l’output analogico.

In sostanza il sistema Fuzzy divide il complesso in sottoinsiemi che valuta singolarmente in base all’associazione fornita dalle regole e poi ne riassume il risultato. L’insieme delle classi in cui viene partizionato ogni output si chiama Fuzzy set. In Fig. 1 vedete come viene rappresentato, di conseguenza, ogni valore di input; ovvero come insieme di appartenenze ad ogni classe. In Fig. 2 è invece rappresentato il processo di inferenza delle regole per la costituzione dei valori di output.

Gli inviluppi che determinano le classi si chiamano funzioni di membership e possono avere diverse forme analitiche, ma in genere sono formati da tratti lineari e si sovrappongono parzialmente (come in Figura 1). In questo modo il sistema Fuzzy finisce per scomporre la funzione input->output in combinazioni di tratti lineari.

Un s rientra nella programmazione anche se di tipo non tradizionale. I sistemi Fuzzy sono utilizzati anche nei processori di ridottissimo hardware per fornire una risposta più uniforme e “morbida” (Fuzzy) in varie apparecchiature, sia civili che sia industriali. Per utilizzarlo in un hardware limitato, il sistema software deve poter essere configurato in modo efficiente per eseguire velocemente il processo di inferenza delle regole. Ne consegue una certa macchinosità di programmazione, a meno di non usare IDE predisposti. Ma in queste pagine vi proponiamo un’alternativa che utilizza una variante delle Neural Network classiche e che permette una rapida descrizione e soprattutto una rapida elaborazione di un sistema Fuzzy.

Il progetto prosegue con ….

UNA RETE NEURALE CHE È UN SISTEMA FUZZY

PILOTARE ARDUSUMO CON LA LOGICA FUZZY

LIBRERIA FUZZY NEURAL NETWORK

CONFRONTO DEI DUE APPROCCI SU ARDSUMO

Nel Listato 3 è proposto lo sketch che utilizza la Neural Network Fuzzy, mentre nel Listato 4 è mostrato lo sketch presentato nel precedente articolo e che usa una normale Neural Network addestrata su un set di 16 esempi per alcune migliaia di ripetizioni. Come si vede, gli sketch sono quasi identici, ma se andiamo a vedere il loro funzionamento possiamo verificare che la Rete Neurale produce un comportamento un po’ più “equilibrato”, mentre quella programmata con logica fuzzy e con sole sette regole ha un comportamento un po’ più “schematico”.

In Fig. 5 è rappresentato il comportamento dei due motori per i vari valori dei sensori del sistema con rete neurale, mentre in Fig. 6 l’analoga rappresentazione è relativa al sistema in logica fuzzy.

La spiegazione del diverso comportamento sta proprio nella natura dei due processi: il primo, quello relativo al funzionamento con la rete neurale, produce una sintesi interpolata degli esempi e quindi presenta una maggiore continuità, mentre il secondo applica delle regole che, se benché in logica sfumata (Fuzzy), sono più definite e quindi producono una variazione meno uniforme. Utilizzando un maggior numero di regole, il sistema programmato può diventare più “morbido”.

Questo sistema proposto per implementare un sistema a logica Fuzzy è abbastanza efficiente in esecuzione e permette di usare la stessa modalità operativa del sistema con Neural Network classico presenta, inoltre, delle sue caratteristiche ben determinate:

  • Adotta il paradigma Sugeno e non il più clas sico Mamdani (lo studioso che lo ha proposto). Ma ciò a poca importanza perché la maggior parte delle implementazioni con microprocessori adotta questo modello.
  • Le funzioni di membership sono lineari e triangolari (al massimo trapezoidali ma solo agli estremi).
  • Le funzioni di membership si sovrappongono parzialmente (sul centro di ognuna termina la precedente e inizia la successiva).
  • Le regole hanno sempre lo stesso numero di antecedenti e di conseguenti (input e output). Nel caso di due variabili di input possiamo dare una rappresentazione tridimensionale della combinazione delle funzioni di membership in ogni regola (ovvero la sua attivazione) che risulta così rappresentata da una piramide nel grafico.

Vediamo ora cosa ci può entrare in un Arduino Uno. La libreria occupa meno di 10 chilobyte di memoria di programma, quindi molto poco (circa il 25%). Ma lo spazio di lavoro (variabili) è veramente limitato su Arduino Uno. In ogni caso è possibile creare reti Fuzzy da circa 300 parametri totali (nodi + link). In pratica si può creare al massimo una rete da 4 input 20 regole e 4 output; oppure da 2 input, 30 regole e 2 output; oppure da 5 input, 14 regole e 5 output; oppure ogni altra combinazione intermedia. È chiaro che con queste dimensioni rimane pochissimo spazio alle altre eventuali variabili del programma.

Riguardo ai tempi di esecuzione, si ha una elaborazione della rete (funzione forward) in un tempo che va da un minimo inferiore a 2 millisecondi (per la rete per Ardusumo) ad un massimo di circa 7 millisecondi, secondo le dimensioni della rete.

In conclusione sul sito https://github.com/open-electronics sono scaricabili due alternative che permettono di elaborare gli input e gli output analogici di Arduino in modo da fargli generare una risposta anche complessa ma di bassissimo impatto computazionale e abbastanza veloce in un hardware limitato. Sono sistemi che si possono applicare ad un’infinità di applicazioni che spaziano dalla robotica ai veicoli terrestri o ai velivoli, dai sistemi di allarme all’automazione casalinga o industriale.

Infatti si tenga presente che i sistemi Fuzzy possono essere usati anche come sistemi di controllo dinamici al posto dei PID (controller Proportional Integrative Derivative), perché le variabili di ingresso possono anche rappresentare le derivate (o più precisamente la velocità di variazione ad ogni step temporale) delle funzioni da controllare.

Ciò detto, abbiamo concluso e vi rimandiamo al prossimo articolo dedicato all’Intelligenza Artificiale, che esporrà nuovi concetti.

L’articolo completo è pubblicato sul numero 231 (Dicembre 2018/Gennaio 2019), acquistabile in tutte le edicole.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

0