Strati di Perceptron
Perceptron è il nome della rete neurale più semplice, composta da un solo neurone. Tuttavia, per poter risolvere problemi più complessi, verrà creato un modello chiamato perceptron multistrato (MLP). Un perceptron multistrato è costituito da uno o più strati nascosti. La struttura di un perceptron multistrato è la seguente:
- Strato di input: riceve i dati in ingresso;
- Strati nascosti: questi strati elaborano i dati ed estraggono schemi.
- 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, è stato illustrato 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 è pari al numero di neuroni.
Dato uno strato con 3 input e 2 neuroni, i suoi pesi saranno memorizzati in una matrice 2×3 W e i suoi bias saranno memorizzati in un vettore 2×1 b, che sono così rappresentati:
W=[W11W21W12W22W13W23]b=[b1b2]Qui, l'elemento Wij rappresenta il peso del j-esimo input verso il i-esimo neurone, quindi la prima riga contiene i pesi del primo neurone e la seconda riga contiene i pesi del secondo neurone. L'elemento bi rappresenta il bias del i-esimo neurone (due neuroni – due bias).
Propagazione in avanti
Eseguire la propagazione in avanti per ciascun livello significa attivare ciascun neurone calcolando la somma pesata degli input, aggiungendo il bias e applicando la funzione di attivazione.
In precedenza, per un singolo neurone, la somma pesata degli input veniva implementata 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, ora è sufficiente eseguire un prodotto scalare tra ogni riga della matrice e il vettore di input. Fortunatamente, è 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)dove a è il vettore delle attivazioni (output) dei neuroni.
Classe Layer
I componenti fondamentali del perceptron sono i suoi layer (strati), quindi ha senso creare una classe Layer separata. I suoi attributi includono:
inputs: un vettore di ingressi (n_inputsè il numero di ingressi);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.
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 coerenza tra gli strati, permettendo operazioni matriciali fluide senza richiedere 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 ...
Rimodellare inputs in un vettore colonna garantisce una corretta moltiplicazione di matrici 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 multilayer perceptron (MLP) più potente di un semplice perceptron?
2. Perché applichiamo questo codice prima di moltiplicare inputs per la matrice dei pesi?
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Can you explain how the weights and biases are initialized in the Layer class?
What is the purpose of the activation function in the forward propagation?
Could you show an example of how to use the Layer class for a simple input?
Awesome!
Completion rate improved to 4
Strati 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, verrà creato un modello chiamato perceptron multistrato (MLP). Un perceptron multistrato è costituito da uno o più strati nascosti. La struttura di un perceptron multistrato è la seguente:
- Strato di input: riceve i dati in ingresso;
- Strati nascosti: questi strati elaborano i dati ed estraggono schemi.
- 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, è stato illustrato 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 è pari al numero di neuroni.
Dato uno strato con 3 input e 2 neuroni, i suoi pesi saranno memorizzati in una matrice 2×3 W e i suoi bias saranno memorizzati in un vettore 2×1 b, che sono così rappresentati:
W=[W11W21W12W22W13W23]b=[b1b2]Qui, l'elemento Wij rappresenta il peso del j-esimo input verso il i-esimo neurone, quindi la prima riga contiene i pesi del primo neurone e la seconda riga contiene i pesi del secondo neurone. L'elemento bi rappresenta il bias del i-esimo neurone (due neuroni – due bias).
Propagazione in avanti
Eseguire la propagazione in avanti per ciascun livello significa attivare ciascun neurone calcolando la somma pesata degli input, aggiungendo il bias e applicando la funzione di attivazione.
In precedenza, per un singolo neurone, la somma pesata degli input veniva implementata 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, ora è sufficiente eseguire un prodotto scalare tra ogni riga della matrice e il vettore di input. Fortunatamente, è 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)dove a è il vettore delle attivazioni (output) dei neuroni.
Classe Layer
I componenti fondamentali del perceptron sono i suoi layer (strati), quindi ha senso creare una classe Layer separata. I suoi attributi includono:
inputs: un vettore di ingressi (n_inputsè il numero di ingressi);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.
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 coerenza tra gli strati, permettendo operazioni matriciali fluide senza richiedere 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 ...
Rimodellare inputs in un vettore colonna garantisce una corretta moltiplicazione di matrici 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 multilayer perceptron (MLP) più potente di un semplice perceptron?
2. Perché applichiamo questo codice prima di moltiplicare inputs per la matrice dei pesi?
Grazie per i tuoi commenti!