Implementazione di un Singolo Neurone
Un neurone è l'unità computazionale di base di una rete neurale. Elabora molteplici input e genera un singolo output, consentendo alla rete di apprendere ed effettuare previsioni.
Per ora, si desidera costruire una rete neurale con un singolo neurone. Ad esempio, si supponga di utilizzarla per un compito di classificazione binaria, come il rilevamento di spam, dove 0 rappresenta una email ham (non spam) e 1 rappresenta una email spam.
Il neurone riceverà come input caratteristiche numeriche relative alle email e produrrà un output compreso tra 0 e 1, rappresentando la probabilità che una email sia spam.
Ecco cosa accade passo dopo passo:
- Ogni input viene moltiplicato per un peso corrispondente. I pesi sono parametri apprendibili che determinano l'importanza di ciascun input;
- Tutti gli input pesati vengono sommati;
- Un parametro aggiuntivo chiamato bias viene aggiunto alla somma degli input. Il bias consente al neurone di spostare il proprio output verso l'alto o verso il basso, fornendo flessibilità al modello;
- La somma degli input viene quindi passata attraverso una funzione di attivazione. Poiché si dispone di un solo neurone, che produce direttamente l'output finale (una probabilità), verrà utilizzata la funzione sigmoide, che comprime i valori nell'intervallo (0,1).
Bias del neurone è anch'esso un parametro addestrabile.
Classe Neurone
Un neurone deve memorizzare i propri pesi e bias, rendendo la classe un modo naturale per raggruppare queste proprietà correlate.
Sebbene questa classe non farà parte dell'implementazione finale della rete neurale, illustra efficacemente i principi chiave.
class Neuron:
def __init__(self, n_inputs):
self.weights = ...
self.bias = ...
weights
: un elenco di valori inizializzati casualmente che determinano quanto sia importante ciascun input (n_inputs
è il numero di input) per il neurone;bias
: un valore inizializzato casualmente che aiuta il neurone a prendere decisioni flessibili.
Weights e bias devono essere inizializzati casualmente con valori piccoli compresi tra -1 e 1, estratti da una distribuzione uniforme, per rompere la simmetria e garantire che neuroni diversi apprendano caratteristiche differenti.
Per riassumere, NumPy fornisce la funzione random.uniform()
per generare un numero casuale o un array (specificando l'argomento size
) di numeri casuali da una distribuzione uniforme nell'intervallo [low, high)
.
import numpy as np
np.random.uniform(low, high, size=...)
Propagazione in avanti
Inoltre, la classe Neuron
dovrebbe includere un metodo activate()
, che calcola la somma pesata degli input e applica la funzione di attivazione (sigmoide nel nostro caso).
Infatti, se abbiamo due vettori della stessa lunghezza (weights
e inputs
), la somma pesata può essere calcolata utilizzando il prodotto scalare di questi vettori:
Questo ci permette di calcolare la somma pesata in una sola riga di codice utilizzando la funzione numpy.dot()
, eliminando la necessità di un ciclo. Il bias può quindi essere aggiunto direttamente al risultato per ottenere input_sum_with_bias
. L'output viene poi calcolato applicando la funzione di attivazione sigmoide:
def activate(self, inputs):
input_sum_with_bias = ...
output = ...
return output
Funzioni di Attivazione
La formula per la funzione sigmoide è la seguente, dove z rappresenta la somma pesata degli input con il bias aggiunto (valore di output grezzo) per questo particolare neurone:
σ(z)=1+e−z1Utilizzando questa formula, la sigmoide può essere implementata come una semplice funzione in Python:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
La formula per la funzione ReLU è la seguente, che sostanzialmente imposta l'output uguale a z se è positivo e 0 altrimenti:
ReLU(z)=max(0,z)def relu(z):
return np.maximum(0, z)
1. Qual è il ruolo del termine di bias in un singolo neurone?
2. Perché inizializziamo i pesi con piccoli valori casuali invece che con zeri?
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 show me how to complete the Neuron class with random initialization?
How does the activate method work in practice?
Can you explain why we use the sigmoid function for binary classification?
Awesome!
Completion rate improved to 4
Implementazione di un Singolo Neurone
Scorri per mostrare il menu
Un neurone è l'unità computazionale di base di una rete neurale. Elabora molteplici input e genera un singolo output, consentendo alla rete di apprendere ed effettuare previsioni.
Per ora, si desidera costruire una rete neurale con un singolo neurone. Ad esempio, si supponga di utilizzarla per un compito di classificazione binaria, come il rilevamento di spam, dove 0 rappresenta una email ham (non spam) e 1 rappresenta una email spam.
Il neurone riceverà come input caratteristiche numeriche relative alle email e produrrà un output compreso tra 0 e 1, rappresentando la probabilità che una email sia spam.
Ecco cosa accade passo dopo passo:
- Ogni input viene moltiplicato per un peso corrispondente. I pesi sono parametri apprendibili che determinano l'importanza di ciascun input;
- Tutti gli input pesati vengono sommati;
- Un parametro aggiuntivo chiamato bias viene aggiunto alla somma degli input. Il bias consente al neurone di spostare il proprio output verso l'alto o verso il basso, fornendo flessibilità al modello;
- La somma degli input viene quindi passata attraverso una funzione di attivazione. Poiché si dispone di un solo neurone, che produce direttamente l'output finale (una probabilità), verrà utilizzata la funzione sigmoide, che comprime i valori nell'intervallo (0,1).
Bias del neurone è anch'esso un parametro addestrabile.
Classe Neurone
Un neurone deve memorizzare i propri pesi e bias, rendendo la classe un modo naturale per raggruppare queste proprietà correlate.
Sebbene questa classe non farà parte dell'implementazione finale della rete neurale, illustra efficacemente i principi chiave.
class Neuron:
def __init__(self, n_inputs):
self.weights = ...
self.bias = ...
weights
: un elenco di valori inizializzati casualmente che determinano quanto sia importante ciascun input (n_inputs
è il numero di input) per il neurone;bias
: un valore inizializzato casualmente che aiuta il neurone a prendere decisioni flessibili.
Weights e bias devono essere inizializzati casualmente con valori piccoli compresi tra -1 e 1, estratti da una distribuzione uniforme, per rompere la simmetria e garantire che neuroni diversi apprendano caratteristiche differenti.
Per riassumere, NumPy fornisce la funzione random.uniform()
per generare un numero casuale o un array (specificando l'argomento size
) di numeri casuali da una distribuzione uniforme nell'intervallo [low, high)
.
import numpy as np
np.random.uniform(low, high, size=...)
Propagazione in avanti
Inoltre, la classe Neuron
dovrebbe includere un metodo activate()
, che calcola la somma pesata degli input e applica la funzione di attivazione (sigmoide nel nostro caso).
Infatti, se abbiamo due vettori della stessa lunghezza (weights
e inputs
), la somma pesata può essere calcolata utilizzando il prodotto scalare di questi vettori:
Questo ci permette di calcolare la somma pesata in una sola riga di codice utilizzando la funzione numpy.dot()
, eliminando la necessità di un ciclo. Il bias può quindi essere aggiunto direttamente al risultato per ottenere input_sum_with_bias
. L'output viene poi calcolato applicando la funzione di attivazione sigmoide:
def activate(self, inputs):
input_sum_with_bias = ...
output = ...
return output
Funzioni di Attivazione
La formula per la funzione sigmoide è la seguente, dove z rappresenta la somma pesata degli input con il bias aggiunto (valore di output grezzo) per questo particolare neurone:
σ(z)=1+e−z1Utilizzando questa formula, la sigmoide può essere implementata come una semplice funzione in Python:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
La formula per la funzione ReLU è la seguente, che sostanzialmente imposta l'output uguale a z se è positivo e 0 altrimenti:
ReLU(z)=max(0,z)def relu(z):
return np.maximum(0, z)
1. Qual è il ruolo del termine di bias in un singolo neurone?
2. Perché inizializziamo i pesi con piccoli valori casuali invece che con zeri?
Grazie per i tuoi commenti!