Perceptron: elemento costitutivo della rete neurale artificiale

Nodo di origine: 1216283

Se sei un appassionato di machine learning e intelligenza artificiale, devi esserti imbattuto nella parola percettrone. Perceptron viene insegnato nel primo capitolo di molti corsi di deep learning. Quindi di cosa si tratta esattamente? Qual è l’ispirazione dietro? Come risolve esattamente il problema della classificazione? In questo articolo, inizieremo con l'ispirazione biologica dietro il perceptron, poi approfondiremo i suoi tecnicismi matematici e infine costruiremo un classificatore binario da zero utilizzando un'unità perceptron.

Ispirazione biologica delle reti neurali

Un neurone (cellula nervosa) è l’elemento fondamentale del sistema nervoso. Il cervello umano è costituito da miliardi di neuroni interconnessi tra loro. Sono responsabili della ricezione e dell’invio di segnali dal cervello. Come si vede nel diagramma seguente, un tipico neurone è costituito da tre parti principali: dendriti, un assone e il corpo cellulare o soma. I dendriti sono rami simili ad alberi che originano dal corpo cellulare. Ricevono informazioni dagli altri neuroni. Il soma è il nucleo di un neurone. È responsabile dell'elaborazione delle informazioni ricevute dai dendriti. L'assone è come un cavo attraverso il quale i neuroni inviano le informazioni. Verso la sua fine, l'assone si divide in numerosi rami che stabiliscono connessioni con gli altri neuroni attraverso i loro dendriti. IL La connessione tra l'assone e gli altri dendriti dei neuroni è chiamata sinapsi.

1: Neurone biologico contro Rete Neurale Artificiale

Image Source: Willems, K. (2017, 2 maggio). Tutorial Keras: apprendimento profondo in Python.

Poiché l'ANN si ispira al funzionamento del cervello, vediamo come funziona il cervello. Il cervello è costituito da una rete di miliardi di neuroni. Comunicano tramite segnali elettrici e chimici attraverso una sinapsi in cui l'informazione di un neurone viene trasmessa ad altri neuroni. Il processo di trasmissione prevede un impulso elettrico chiamato “potenziale d’azione”. Affinché l'informazione possa essere trasmessa, i segnali di ingresso (impulso) dovrebbero essere sufficientemente forti da superare una certa soglia, quindi solo un neurone si attiva e trasmette ulteriormente il segnale (uscita).

Ispirato dal funzionamento biologico di un neurone, uno scienziato americano Franck Rosenblatt ha ideato il concetto di percettrone presso il Cornell Aeronautical Laboratory nel 1957.

  • Un neurone riceve informazioni da altri neuroni sotto forma di impulsi elettrici di varia intensità.
  • Il neurone integra tutti gli impulsi che riceve dagli altri neuroni.
  • Se la somma risultante è maggiore di un certo valore di soglia, il neurone “si attiva”, innescando un potenziale d’azione che viene trasmesso agli altri neuroni collegati.

Componenti principali del Perceptron

Il percettrone di Rosenblatt è fondamentalmente un classificatore binario. Il percettrone è costituito da 3 parti principali:

  • Nodi di input o livello di input: il livello di input inserisce i dati iniziali nel sistema per un'ulteriore elaborazione. Ad ogni nodo di input è associato un valore numerico. Può assumere qualsiasi valore reale.
  • Pesi e bias: i parametri di peso rappresentano la forza della connessione tra le unità. Maggiore è il peso, più forte è l'influenza del neurone di input associato nel decidere l'output. La polarizzazione funziona allo stesso modo dell'intercetta in un'equazione lineare.
  • Funzione di attivazione: la funzione di attivazione determina se il neurone si attiverà o meno. Nella sua forma più semplice, la funzione di attivazione è una funzione a gradini, ma in base allo scenario è possibile utilizzare diverse funzioni di attivazione.

Vedremo di più su questi nella sezione successiva.

Funzionamento di un Perceptron

Nella prima fase, tutti i valori di input vengono moltiplicati con i rispettivi pesi e sommati. Il risultato ottenuto è detto somma ponderata ∑wi*xi, o indicato diversamente,  x1*w1 + x2*w2 +…wn*xn. Questa somma fornisce una rappresentazione adeguata degli input in base alla loro importanza. Inoltre, un termine pregiudizievole b a questa somma si aggiunge ∑wi*xi+ b. Il bias funge da ulteriore parametro del modello (oltre ai pesi) che può essere regolato per migliorare le prestazioni del modello.

Nella seconda fase, una funzione di attivazione f viene applicato sulla somma di cui sopra ∑wi*xi + b per ottenere l'output Y = f(∑wi*xi + b). A seconda dello scenario e della funzione di attivazione utilizzata, il Uscita è l'uno o l'altro binario {1, 0} o un valore continuo. 

Funzionamento di un Perceptron

(Spesso entrambi questi passaggi sono rappresentati come un unico passaggio nei percettroni multistrato, qui li ho mostrati come due passaggi diversi per una migliore comprensione)

Funzioni di attivazione

Un neurone biologico si attiva solo quando viene superata una certa soglia. Allo stesso modo, anche il neurone artificiale si attiverà solo quando la somma degli input (somma ponderata) supera un certo valore di soglia, diciamo 0. Intuitivamente, possiamo pensare a un approccio basato su regole come questo:

Se  ∑wi*xi + b > 0:
uscita = 1
altro:
uscita = 0

Il suo grafico sarà qualcosa del genere:

Funzioni di attivazione

Questa è infatti la funzione di attivazione Unit Step (Soglia) originariamente utilizzata da Rosenblatt. Ma come puoi vedere, questa funzione è discontinua a 0, quindi causa problemi nei calcoli matematici. Una versione più fluida della funzione di cui sopra è la funzione sigmoidea. Il risultato è compreso tra 0 e 1. Un'altra è la tangente iperbolica(tanh), che produce un output compreso tra -1 e 1. Sia la funzione sigmoide che quella tanh soffrono di problemi di gradienti evanescenti. Al giorno d'oggi, ReLU e Leaky ReLU sono le funzioni di attivazione più utilizzate. Sono relativamente stabili sulle reti profonde.

Perceptron come classificatore binario

Finora abbiamo visto l'ispirazione biologica e la matematica del percettrone. In questa sezione vedremo come un percettrone risolve un problema di classificazione lineare.

Importazione di alcune librerie –

da sklearn.datasets importa make_blobs
importa matplotlib.pyplot come plt
importa Numpy come np
%matplotlib in linea

Generazione di un set di dati fittizio utilizzando make_blobs funzionalità fornita da scikit learn –

# Genera set di dati
X, Y = make_blobs(n_features = 2, centres = 2, n_samples = 1000, random_state = 12)
# Visualizza il set di dati
plt.figura(dimensionefig = (6, 6))
plt.scatter(X[:, 0], X[:, 1], c = Y)
plt.title('Verità fondamentale', dimensione carattere = 18)
plt.mostra()
Perceptron come classificatore binario

Diciamo che i punti blu sono 1 e i punti verdi sono 0. Usando la logica del percettrone, possiamo creare un confine decisionale (iperpiano) per la classificazione che separa diversi punti dati sul grafico.

Prima di procedere oltre, aggiungiamo un termine bias (uno) al vettore di input:

# Aggiunge una distorsione al vettore di input
X_bias = np.ones([X.forma[0], 3])
Deviazione_X[:, 1:3] = X

Il set di dati sarà simile a questo

dataset

Qui ogni riga del set di dati sopra rappresenta il vettore di input (un punto dati). Per creare un confine decisionale, dobbiamo trovare i pesi appropriati. I pesi vengono "appresi" dall'allenamento utilizzando la regola seguente:

w = w + (atteso — previsto) * x

Percettrone w

Significa sottrarre il risultato stimato dalla verità fondamentale e quindi moltiplicarlo per il vettore di input corrente e aggiungervi i vecchi pesi per ottenere il nuovo valore dei pesi. Se il nostro output è lo stesso della classe effettiva, i pesi non cambiano. Ma se la nostra stima è diversa dalla verità fondamentale, allora i pesi aumentano o diminuiscono di conseguenza. In questo modo i pesi vengono progressivamente adeguati in ciascuna iterazione.

Iniziamo assegnando valori arbitrari al vettore dei pesi, quindi li aggiustiamo progressivamente in ogni iterazione utilizzando l'errore e i dati a disposizione:

# inizializza i pesi con valori casuali
w = np.random.rand(3, 1)
stampa(w)

Produzione:

[[0.37547448]
[0.00239401] [0.18640939]]

Definire la funzione di attivazione del percettrone –

def funzione_attivazione(z): if z >= 1: return 1 else: return 0

Successivamente, applichiamo la regola di apprendimento del percettrone:

for _ in range(100): for i in range(X_bias.shape[0]): y =activate_func(w.transpose().dot(X_bias[i, :])) # Aggiorna i pesi w = w + (( Y[i] - y) * X_bias[i, :]).reshape(w.shape[0], 1)

Non è garantito che i pesi convergano in un unico passaggio, quindi inseriamo tutti i dati di addestramento nell'algoritmo del percettrone 100 volte applicando costantemente la regola di apprendimento in modo che alla fine riusciamo a ottenere i pesi ottimali.

Ora che abbiamo ottenuto i pesi ottimali, noi prevedere la classe per ciascun punto dati utilizzando Y = f(∑wi*xi + b) o Y = wT.x in forma vettoriale.

# prevedere la classe dei datapoint
classe_risultato = [funzione_attivazione(w.transpose().dot(x)) for x in X_bias]

Visualizza il confine decisionale e le etichette delle classi previste –

# converte in vettore unitario
w = w/np.sqrt(w.transpose().punto(w))
# Visualizza i risultati
plt.figura(dimensionefig = (6, 6))
plt.scatter(X[:, 0], X[:, 1], c = classe_risultato)
plt.plot([-10, -1], iperpiano([-10, -1], w), lw = 3, c = 'rosso')
plt.title('Classificazione del percettrone con confine decisionale')
plt.mostra()
Classificazione del percettrone con confine decisionale

È possibile confrontare l'immagine della realtà con l'immagine del risultato previsto e vedere alcuni punti classificati erroneamente. Se calcoliamo la precisione, arriviamo a circa il 98% (lo lascio ai lettori come esercizio).

Se vedi, qui i nostri dati originali erano abbastanza separati, quindi siamo in grado di ottenere una precisione così buona. Ma questo non è il caso dei dati del mondo reale. Utilizzando un singolo perceptron, possiamo costruire solo un confine decisionale lineare, quindi se i dati sono mescolati, l'algoritmo del perceptron funzionerà male. Questo è uno dei limiti del modello a percettrone singolo.

Note finali

Abbiamo iniziato comprendendo l’ispirazione biologica dietro il percettrone di Rosenblatt. Poi siamo passati alla matematica del percettrone e alle funzioni di attivazione. Infine, utilizzando un set di dati giocattolo, abbiamo visto come il percettrone può eseguire una classificazione di base costruendo un confine decisionale lineare che separa i punti dati appartenenti a classi diverse.

L'autore

Pratik Nabriya è un esperto data scientist attualmente impiegato presso una società di analisi e intelligenza artificiale con sede a Noida. È esperto in machine learning, deep learning, NLP, analisi delle serie temporali, manipolazione dei dati, SQL, Python e ha familiarità con il lavoro in un ambiente cloud. Nel tempo libero ama competere negli Hackathon e scrivere articoli tecnici.

I media mostrati in questo articolo non sono di proprietà di Analytics Vidhya e sono utilizzati a discrezione dell'autore.

Fonte: https://www.analyticsvidhya.com/blog/2021/10/perceptron-building-block-of-artificial-neural-network/

Timestamp:

Di più da Analisi Vidhya