Implementazione di un Singolo Neurone
Un neurone è l'unità computazionale di base di una rete neurale. Elabora input multipli e genera un singolo output, consentendo alla rete di apprendere ed effettuare previsioni.
In questo esempio, l'obiettivo è costruire una rete neurale con un singolo neurone. Verrà utilizzata per un compito di classificazione binaria, come il rilevamento dello spam, dove 0 corrisponde a una email ham (non spam) e 1 corrisponde a una email spam.
Il neurone riceverà come input caratteristiche numeriche estratte dalle email e produrrà un output compreso tra 0 e 1, rappresentando la probabilità che una determinata email sia spam.
Ecco cosa succede 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 termine di bias viene aggiunto alla somma degli input, permettendo al neurone di spostare il proprio output e fornendo ulteriore flessibilità al modello;
- La somma viene passata attraverso una funzione di attivazione. Poiché un singolo neurone produce direttamente l'output finale (una probabilità), viene utilizzata la funzione sigmoide per comprimere 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: una lista 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.
I pesi e il 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.
In sintesi, 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
La classe Neuron dovrebbe includere un metodo activate() che calcola la somma pesata degli input e applica la funzione di attivazione (in questo caso la funzione sigmoide).
Quando sono disponibili due vettori della stessa lunghezza — weights e inputs — la somma pesata può essere calcolata in modo efficiente utilizzando il prodotto scalare di questi vettori.
Questo consente 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
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 input multipli e genera un singolo output, consentendo alla rete di apprendere ed effettuare previsioni.
In questo esempio, l'obiettivo è costruire una rete neurale con un singolo neurone. Verrà utilizzata per un compito di classificazione binaria, come il rilevamento dello spam, dove 0 corrisponde a una email ham (non spam) e 1 corrisponde a una email spam.
Il neurone riceverà come input caratteristiche numeriche estratte dalle email e produrrà un output compreso tra 0 e 1, rappresentando la probabilità che una determinata email sia spam.
Ecco cosa succede 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 termine di bias viene aggiunto alla somma degli input, permettendo al neurone di spostare il proprio output e fornendo ulteriore flessibilità al modello;
- La somma viene passata attraverso una funzione di attivazione. Poiché un singolo neurone produce direttamente l'output finale (una probabilità), viene utilizzata la funzione sigmoide per comprimere 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: una lista 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.
I pesi e il 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.
In sintesi, 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
La classe Neuron dovrebbe includere un metodo activate() che calcola la somma pesata degli input e applica la funzione di attivazione (in questo caso la funzione sigmoide).
Quando sono disponibili due vettori della stessa lunghezza — weights e inputs — la somma pesata può essere calcolata in modo efficiente utilizzando il prodotto scalare di questi vettori.
Questo consente 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!