Quindi vuoi creare la tua prima rete neurale artificiale, o semplicemente scoprire questo argomento, ma non hai idea da dove cominciare?
Segui questa guida rapida per capire tutti i passaggi!
Che cos'è una rete neurale artificiale?
In base alla natura, le reti neurali sono la solita rappresentazione che facciamo del cervello: neuroni interconnessi ad altri neuroni che formano una rete. Una semplice informazione transita in molte di esse prima di diventare una cosa reale, come “muovi la mano per prendere questa matita”.
L'operazione di corrente alternata o mplete rete neurale è semplice: uno immettere variabili come ingressi (ad esempio un'immagine se si suppone che la rete neurale dire cosa è su un'immagine), e dopo alcuni calcoli, si restituisce un'uscita (dopo il primo esempio , dando l'immagine di un gatto dovrebbe restituire la parola "gatto"). Ora, dovresti sapere che le reti neurali artificiali sono solitamente posizionate su colonne, in modo che un neurone della colonna n possa essere connesso solo ai neuroni delle colonne n-1 e n+1. Esistono pochi tipi di reti che utilizzano un'architettura diversa, ma per ora ci concentreremo sulla più semplice.
Quindi, possiamo rappresentare una rete neurale artificiale come quella:
Figura 1 — Rappresentazione di una rete neurale
Le reti neurali di solito possono essere lette da sinistra a destra. Qui, il primo livello è il livello in cui vengono inseriti gli input. Ci sono 2 livelli interni (chiamati livelli nascosti) che fanno alcuni calcoli e un ultimo livello che contiene tutti i possibili output. Non preoccuparti dei "+1" nella parte inferiore di ogni colonna. È qualcosa chiamato "bias" e ne parleremo più avanti.
A proposito, il termine "apprendimento profondo" deriva da reti neurali che contengono diversi strati nascosti, chiamate anche "reti neurali profonde".
Cosa fa un neurone artificiale?
Le operazioni eseguite da ciascun neurone sono piuttosto semplici:
Figura 2 — Operazioni eseguite da un neurone
Innanzitutto, somma il valore di ogni neurone della colonna precedente a cui è connesso. Nella Figura 2, ci sono 3 input (x1, x2, x3) che arrivano al neurone, quindi 3 neuroni della colonna precedente sono collegati al nostro neurone.
Tale valore viene moltiplicato, prima di essere sommato, per un'altra variabile denominata “peso” (w1, w2, w3) che determina la connessione tra i due neuroni. Ogni connessione di neuroni ha il suo peso, e questi sono gli unici valori che verranno modificati durante il processo di apprendimento.
Inoltre, al valore totale calcolato può essere aggiunto un valore di bias. Non è un valore proveniente da un neurone specifico e viene scelto prima della fase di apprendimento, ma può essere utile per la rete.
Dopo tutte queste somme, il neurone applica infine al valore ottenuto una funzione chiamata “funzione di attivazione”.
Figura 3 — Funzione sigmoide
La cosiddetta funzione di attivazione serve solitamente a trasformare il valore totale calcolato prima in un numero compreso tra 0 e 1 (fatto ad esempio da una funzione sigmoide mostrata in Figura 3). Altre funzioni esistono e possono cambiare i limiti della nostra funzione, ma mantengono lo stesso scopo di limitare il valore. Questo è tutto ciò che fa un neurone! Prendi tutti i valori dai neuroni connessi moltiplicati per il loro rispettivo peso, aggiungili e applica una funzione di attivazione. Quindi, il neurone è pronto per inviare il suo nuovo valore ad altri neuroni. Dopo che ogni neurone di una colonna lo ha fatto, la rete neurale passa alla colonna successiva. Alla fine, gli ultimi valori ottenuti dovrebbero essere utilizzabili per determinare l'output desiderato.
Ora che abbiamo capito cosa fa un neurone, potremmo creare qualsiasi rete desideriamo. Tuttavia, ci sono altre operazioni da implementare per far apprendere una rete neurale.
Come apprende una rete neurale artificiale?
Sì, creare variabili e farle interagire tra loro è fantastico, ma non è sufficiente per far apprendere da sola l'intera rete neurale. Dobbiamo preparare molti dati da dare alla nostra rete. Questi dati includono gli input e l'output previsto dalla rete neurale. Diamo un'occhiata a come funziona il processo di apprendimento:
Prima di tutto, ricorda che quando viene dato un input alla rete neurale, restituisce un output. Al primo tentativo, non riesce ad ottenere da solo l'output giusto (se non per fortuna) ed è per questo che, durante la fase di apprendimento, ogni input viene fornito con la sua etichetta, che spiega quale output dovrebbe aver indovinato la rete neurale. Se la scelta è buona, i parametri attuali vengono mantenuti e viene fornito l'input successivo. Tuttavia, se l'output ottenuto non corrisponde all'etichetta, i pesi vengono modificati. Queste sono le uniche variabili che possono essere modificate durante la fase di apprendimento. Questo processo può essere immaginato come più pulsanti, che vengono trasformati in diverse possibilità ogni volta che un input non viene indovinato correttamente.
Per determinare quale peso è meglio modificare, viene fatto un particolare processo, chiamato “backpropagation”. Non ci soffermeremo troppo su questo, poiché la rete neurale che costruiremo non utilizza questo esatto processo, ma consiste nel tornare indietro sulla rete neurale e ispezionare ogni connessione per verificare come si comporterebbe l'output in base a un cambiamento sul peso.
Infine c'è un ultimo parametro da conoscere per poter controllare il modo in cui la rete neurale apprende: il “learning rate”. Il nome dice tutto, questo nuovo valore determina su quale velocità apprenderà la rete neurale, o più specificamente come modificherà un peso, a poco a poco o a passi più grandi. 1 è generalmente un buon valore per quel parametro.
Perceptron
Ok, conosciamo le basi, controlliamo la rete neurale che creeremo. Quello spiegato qui si chiama Perceptron ed è la prima rete neurale mai creata. Consiste di 2 neuroni nella colonna di input e 1 neurone nella colonna di output. Questa configurazione permette di creare un semplice classificatore per distinguere 2 gruppi. Per capire meglio le possibilità e i limiti, vediamo un rapido esempio (che non ha molto interesse se non quello di capire): Supponiamo che tu voglia che la tua rete neurale sia in grado di restituire output secondo le regole dell'"o inclusivo".
se A è vero e B è vero, allora A o B è vero.
se A è vero e B è falso, allora A o B è vero.
se A è falso e B è vero, allora A o B è vero.
se A è falso e B è falso, allora A o B è falso.
Se sostituisci i "veri" con 1 e i "falsi" con 0 e metti le 4 possibilità come punti con coordinate su un piano, ti rendi conto che i due gruppi finali "falso" e "vero" possono essere separati da un linea singola. Questo è ciò che può fare un Perceptron. Se invece controlliamo il caso dell'“o esclusivo” (in cui il caso “vero o vero” (il punto (1,1)) è falso), allora possiamo vedere che una semplice linea non può separare il due gruppi e un Perceptron non è in grado di affrontare questo problema. Quindi, il Perceptron non è davvero una rete neurale molto efficiente, ma è semplice da creare e può comunque essere utile come classificatore.
Creare la nostra semplice rete neurale artificiale
Creiamo una rete neurale da zero con Python (3.x nell'esempio sotto).
import numpy, random, os
lr = 1 #learning rate
bias = 1 #value of bias
weights = [random.random(),random.random(),random.random()] #pesi generati in una lista (3 pesi in totale per 2 neuroni e il bias)
L'inizio del programma definisce solo le librerie ei valori dei parametri, e crea una lista che contiene i valori dei pesi che verranno modificati (quelli sono generati casualmente).
def Perceptron(input1, input2, output) :
outputP = input1*weights[0]+input2*weights[1]+bias*weights[2]
if outputP > 0 : #attivazione della funzione ( Heaviside)
outputP = 1
else :
outputP = 0
errore = output - outputP
weights[0] += errore * input1 * lr
weights[1] += errore * input2 * lr
weights[2] += errore * bias * lr
Qui creiamo una funzione che definisce il lavoro del neurone di uscita. Richiede 3 parametri (i 2 valori dei neuroni e l'output atteso). “outputP” è la variabile corrispondente all'uscita data dal Perceptron. Quindi calcoliamo l'errore, utilizzato per modificare i pesi di ogni connessione al neurone di uscita subito dopo.
for i in range(50) :
Perceptron(1,1,1) #Vero o vero
Perceptron(1,0,1) #Vero o falso
Perceptron(0,1,1) #Falso o vero
Perceptron(0,0, 0) #Falso o falso
Creiamo un loop che fa ripetere alla rete neurale ogni situazione più volte. Questa parte è la fase di apprendimento. Il numero di iterazioni viene scelto in base alla precisione che vogliamo. Tuttavia, tieni presente che troppe iterazioni potrebbero portare la rete a un adattamento eccessivo, il che fa sì che si concentri troppo sugli esempi trattati, quindi non potrebbe ottenere un output corretto nel caso in cui non abbia visto durante la sua fase di apprendimento.
Tuttavia, il nostro caso qui è un po' speciale, poiché ci sono solo 4 possibilità e le diamo tutte alla rete neurale durante la sua fase di apprendimento. Si suppone che un Perceptron dia un output corretto senza aver mai visto il caso che sta trattando.
x = int(input())
y = int(input())
outputP = x*weights[0] + y*weights[1] + bias*weights[2]
if outputP > 0 : #attivazione della funzione
outputP = 1
else :
outputP = 0
print (x, "o", y, "è : ", outputP)
Infine, possiamo chiedere all'utente di inserire lui stesso i valori per verificare se il Perceptron funziona. Questa è la fase di test.
La funzione di attivazione Heaviside è interessante da usare in questo caso, poiché riporta tutti i valori esattamente a 0 o 1, poiché stiamo cercando un risultato falso o vero. Potremmo provare con una funzione sigmoide e ottenere un numero decimale compreso tra 0 e 1, normalmente molto vicino a uno di quei limiti.
outputP = 1/(1+numpy.exp(-outputP)) #funzione sigmoide
Potremmo anche salvare i pesi che la rete neurale ha appena calcolato in un file, per utilizzarlo in seguito senza fare un'altra fase di apprendimento. È fatto per un progetto molto più grande, in cui quella fase può durare giorni o settimane.
Risultato Finale
Scarica gratuitamente il notebook del progetto
*Per aprirlo usa Jupyter o Google Colab
Questo è tutto ! Hai creato la tua rete neurale completa. L'hai creata, fatta imparare e verificato le sue capacità. Il tuo Perceptron ora può essere modificato per usarlo su un altro problema. Basta cambiare i punti dati durante le iterazioni, regolare il numero di loop se il tuo caso è più complesso e lasciare che il tuo Perceptron esegua la classificazione.
Vuoi elencare 2 tipi di alberi nella foresta più vicina ed essere in grado di determinare se un nuovo albero è di tipo A o B? Scegli 2 caratteristiche che possono dissociare entrambi i tipi (ad esempio altezza e larghezza) e crea alcuni punti per il Perceptron da posizionare sul piano. Lascia che venga dedotto un modo per separare i 2 gruppi e inserisci il punto di qualsiasi nuovo albero per sapere di quale tipo si tratta.
In seguito potresti espandere le tue conoscenze e vedere reti neurali più grandi e più profonde, che sono molto potenti!
Ci sono molti aspetti che non abbiamo trattato, o abbastanza per farti ottenere le nozioni di base, quindi non esitare ad andare oltre. Mi piacerebbe scrivere di reti neurali più complesse, quindi resta sintonizzato!
Grazie per aver letto l'articolo !
Spero che questa piccola guida sia stata utile, se avete domande e/o suggerimenti fatemelo sapere nei commenti.
Sei Interessato ad una lettura sull'intelligenza artificiale ?
Comments