Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Strati di Perceptron | Rete Neurale da Zero
Introduzione alle Reti Neurali

bookStrati di Perceptron

Perceptron è il nome della rete neurale più semplice, composta da un solo neurone. Tuttavia, per poter risolvere problemi più complessi, creeremo un modello chiamato perceptron multistrato (MLP). Un perceptron multistrato è costituito da uno o più strati nascosti. La struttura di un perceptron multistrato è la seguente:

  1. Strato di input: riceve i dati di input;
  2. Strati nascosti: questi strati elaborano i dati ed estraggono schemi.
  3. Strato di output: produce la previsione o classificazione finale.

In generale, ogni strato è composto da più neuroni, e l'output di uno strato diventa l'input per lo strato successivo.

Pesi e Bias degli Strati

Prima di implementare uno strato, è importante comprendere come memorizzare i pesi e i bias di ciascun neurone al suo interno. Nel capitolo precedente, hai imparato come memorizzare i pesi di un singolo neurone come vettore e il suo bias come scalare (singolo numero).

Poiché uno strato è composto da più neuroni, è naturale rappresentare i pesi come una matrice, dove ogni riga corrisponde ai pesi di un neurone specifico. Di conseguenza, i bias possono essere rappresentati come un vettore, la cui lunghezza è uguale al numero di neuroni.

Dato uno strato con 33 input e 22 neuroni, i suoi pesi saranno memorizzati in una matrice 2×32 \times 3 WW e i suoi bias saranno memorizzati in un vettore 2×12 \times 1 bb, che sono così rappresentati:

W=[W11W12W13W21W22W23]b=[b1b2]W = \begin{bmatrix} W_{11} & W_{12} & W_{13}\\ W_{21} & W_{22} & W_{23} \end{bmatrix} \qquad b = \begin{bmatrix} b_1\\ b_2 \end{bmatrix}

Qui, l'elemento WijW_{ij} rappresenta il peso del jj-esimo input verso il ii-esimo neurone, quindi la prima riga contiene i pesi del primo neurone e la seconda riga contiene i pesi del secondo neurone. L'elemento bib_i rappresenta il bias del ii-esimo neurone (due neuroni – due bias).

Propagazione in avanti

Eseguire la propagazione in avanti per ciascun livello significa attivare ciascun suo neurone calcolando la somma pesata degli input, aggiungendo il bias e applicando la funzione di attivazione.

In precedenza, per un singolo neurone, hai implementato la somma pesata degli input calcolando un prodotto scalare tra il vettore di input e il vettore dei pesi, aggiungendo il bias.

Poiché ogni riga della matrice dei pesi contiene il vettore dei pesi per un particolare neurone, tutto ciò che devi fare ora è semplicemente eseguire un prodotto scalare tra ogni riga della matrice e il vettore di input. Fortunatamente, questo è esattamente ciò che fa la moltiplicazione di matrici:

Per aggiungere i bias agli output dei rispettivi neuroni, deve essere aggiunto anche un vettore di bias:

Infine, la funzione di attivazione viene applicata al risultato — sigmoid o ReLU, nel nostro caso. La formula risultante per la propagazione in avanti nel livello è la seguente:

a=activation(Wx+b)a = activation(Wx + b)

dove aa è il vettore delle attivazioni (output) dei neuroni.

Classe Layer

I componenti fondamentali del perceptron sono i suoi strati (layers), pertanto è opportuno creare una classe Layer separata. I suoi attributi includono:

  • inputs: un vettore di input (n_inputs è il numero di input);
  • outputs: un vettore di valori di output grezzi (prima dell'applicazione della funzione di attivazione) dei neuroni (n_neurons è il numero di neuroni);
  • weights: una matrice dei pesi;
  • biases: un vettore dei bias;
  • activation_function: la funzione di attivazione utilizzata nello strato.

Come nell'implementazione del singolo neurone, weights e biases saranno inizializzati con valori casuali compresi tra -1 e 1 estratti da una distribuzione uniforme.

class Layer:
    def __init__(self, n_inputs, n_neurons, activation_function):
        self.inputs = np.zeros((n_inputs, 1))
        self.outputs = np.zeros((n_neurons, 1))
        self.weights = ...
        self.biases = ...
        self.activation = activation_function

Gli attributi inputs e outputs verranno utilizzati successivamente nella retropropagazione, quindi è opportuno inizializzarli come array NumPy di zeri.

Note
Nota

L'inizializzazione di inputs e outputs come array NumPy riempiti di zeri previene errori durante i calcoli nella propagazione in avanti e all'indietro. Garantisce inoltre la coerenza tra gli strati, permettendo operazioni matriciali fluide senza la necessità di controlli aggiuntivi.

La propagazione in avanti può essere implementata nel metodo forward(), dove gli outputs vengono calcolati in base al vettore inputs utilizzando NumPy, seguendo la formula sopra:

def forward(self, inputs):
    self.inputs = np.array(inputs).reshape(-1, 1)
    # Raw outputs
    self.outputs = ...
    # Applying the activation function
    return ...
Note
Nota

Rimodellare inputs in un vettore colonna garantisce la corretta moltiplicazione matriciale con la matrice dei pesi durante la propagazione in avanti. Questo previene incongruenze di forma e consente calcoli senza interruzioni attraverso tutti gli strati.

1. Cosa rende un perceptrone multistrato (MLP) più potente di un perceptrone semplice?

2. Perché applichiamo questo codice prima di moltiplicare inputs per la matrice dei pesi?

question mark

Cosa rende un perceptrone multistrato (MLP) più potente di un perceptrone semplice?

Select the correct answer

question mark

Perché applichiamo questo codice prima di moltiplicare inputs per la matrice dei pesi?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 4

bookStrati di Perceptron

Scorri per mostrare il menu

Perceptron è il nome della rete neurale più semplice, composta da un solo neurone. Tuttavia, per poter risolvere problemi più complessi, creeremo un modello chiamato perceptron multistrato (MLP). Un perceptron multistrato è costituito da uno o più strati nascosti. La struttura di un perceptron multistrato è la seguente:

  1. Strato di input: riceve i dati di input;
  2. Strati nascosti: questi strati elaborano i dati ed estraggono schemi.
  3. Strato di output: produce la previsione o classificazione finale.

In generale, ogni strato è composto da più neuroni, e l'output di uno strato diventa l'input per lo strato successivo.

Pesi e Bias degli Strati

Prima di implementare uno strato, è importante comprendere come memorizzare i pesi e i bias di ciascun neurone al suo interno. Nel capitolo precedente, hai imparato come memorizzare i pesi di un singolo neurone come vettore e il suo bias come scalare (singolo numero).

Poiché uno strato è composto da più neuroni, è naturale rappresentare i pesi come una matrice, dove ogni riga corrisponde ai pesi di un neurone specifico. Di conseguenza, i bias possono essere rappresentati come un vettore, la cui lunghezza è uguale al numero di neuroni.

Dato uno strato con 33 input e 22 neuroni, i suoi pesi saranno memorizzati in una matrice 2×32 \times 3 WW e i suoi bias saranno memorizzati in un vettore 2×12 \times 1 bb, che sono così rappresentati:

W=[W11W12W13W21W22W23]b=[b1b2]W = \begin{bmatrix} W_{11} & W_{12} & W_{13}\\ W_{21} & W_{22} & W_{23} \end{bmatrix} \qquad b = \begin{bmatrix} b_1\\ b_2 \end{bmatrix}

Qui, l'elemento WijW_{ij} rappresenta il peso del jj-esimo input verso il ii-esimo neurone, quindi la prima riga contiene i pesi del primo neurone e la seconda riga contiene i pesi del secondo neurone. L'elemento bib_i rappresenta il bias del ii-esimo neurone (due neuroni – due bias).

Propagazione in avanti

Eseguire la propagazione in avanti per ciascun livello significa attivare ciascun suo neurone calcolando la somma pesata degli input, aggiungendo il bias e applicando la funzione di attivazione.

In precedenza, per un singolo neurone, hai implementato la somma pesata degli input calcolando un prodotto scalare tra il vettore di input e il vettore dei pesi, aggiungendo il bias.

Poiché ogni riga della matrice dei pesi contiene il vettore dei pesi per un particolare neurone, tutto ciò che devi fare ora è semplicemente eseguire un prodotto scalare tra ogni riga della matrice e il vettore di input. Fortunatamente, questo è esattamente ciò che fa la moltiplicazione di matrici:

Per aggiungere i bias agli output dei rispettivi neuroni, deve essere aggiunto anche un vettore di bias:

Infine, la funzione di attivazione viene applicata al risultato — sigmoid o ReLU, nel nostro caso. La formula risultante per la propagazione in avanti nel livello è la seguente:

a=activation(Wx+b)a = activation(Wx + b)

dove aa è il vettore delle attivazioni (output) dei neuroni.

Classe Layer

I componenti fondamentali del perceptron sono i suoi strati (layers), pertanto è opportuno creare una classe Layer separata. I suoi attributi includono:

  • inputs: un vettore di input (n_inputs è il numero di input);
  • outputs: un vettore di valori di output grezzi (prima dell'applicazione della funzione di attivazione) dei neuroni (n_neurons è il numero di neuroni);
  • weights: una matrice dei pesi;
  • biases: un vettore dei bias;
  • activation_function: la funzione di attivazione utilizzata nello strato.

Come nell'implementazione del singolo neurone, weights e biases saranno inizializzati con valori casuali compresi tra -1 e 1 estratti da una distribuzione uniforme.

class Layer:
    def __init__(self, n_inputs, n_neurons, activation_function):
        self.inputs = np.zeros((n_inputs, 1))
        self.outputs = np.zeros((n_neurons, 1))
        self.weights = ...
        self.biases = ...
        self.activation = activation_function

Gli attributi inputs e outputs verranno utilizzati successivamente nella retropropagazione, quindi è opportuno inizializzarli come array NumPy di zeri.

Note
Nota

L'inizializzazione di inputs e outputs come array NumPy riempiti di zeri previene errori durante i calcoli nella propagazione in avanti e all'indietro. Garantisce inoltre la coerenza tra gli strati, permettendo operazioni matriciali fluide senza la necessità di controlli aggiuntivi.

La propagazione in avanti può essere implementata nel metodo forward(), dove gli outputs vengono calcolati in base al vettore inputs utilizzando NumPy, seguendo la formula sopra:

def forward(self, inputs):
    self.inputs = np.array(inputs).reshape(-1, 1)
    # Raw outputs
    self.outputs = ...
    # Applying the activation function
    return ...
Note
Nota

Rimodellare inputs in un vettore colonna garantisce la corretta moltiplicazione matriciale con la matrice dei pesi durante la propagazione in avanti. Questo previene incongruenze di forma e consente calcoli senza interruzioni attraverso tutti gli strati.

1. Cosa rende un perceptrone multistrato (MLP) più potente di un perceptrone semplice?

2. Perché applichiamo questo codice prima di moltiplicare inputs per la matrice dei pesi?

question mark

Cosa rende un perceptrone multistrato (MLP) più potente di un perceptrone semplice?

Select the correct answer

question mark

Perché applichiamo questo codice prima di moltiplicare inputs per la matrice dei pesi?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 3
some-alt