È possibile utilizzare il percettrone senza comprenderne realmente i fondamenti matematici, ma è altrettanto divertente vedere come tutta la matematica che hai imparato a scuola può aiutarti a comprendere il percettrone e, per estensione, le reti neurali.

Definizione di percettrone

Nel percettrone di Rosenblatt, la decisione se un punto si trova al di sopra o al di sotto di una linea è basata su una funzione di attivazione applicata a una combinazione lineare degli ingressi.

La formula generale per un percettrone binario è:

import numpy as np
 
class RBPerceptron:
 
  # Constructor
  def __init__(self, number_of_epochs = 100, learning_rate = 0.1):
    self.number_of_epochs = number_of_epochs
    self.learning_rate = learning_rate
 
  # Train perceptron
  def train(self, X, D):
    # Initialize weights vector with zeroes
    num_features = X.shape[1]
    self.w = np.zeros(num_features + 1)
    # Perform the epochs
    for i in range(self.number_of_epochs):
      # For every combination of (X_i, D_i)
      for sample, desired_outcome in zip(X, D):
        # Generate prediction and compare with desired outcome
        prediction    = self.predict(sample)
        difference    = (desired_outcome - prediction)
        # Compute weight update via Perceptron Learning Rule
        weight_update = self.learning_rate * difference
        self.w[1:]    += weight_update * sample
        self.w[0]     += weight_update
    return self
 
  # Generate prediction
  def predict(self, sample):
    outcome = np.dot(sample, self.w[1:]) + self.w[0]
    return np.where(outcome > 0, 1, 0)

Differenze con percettrone moderno

Il percettrone di Rosenblatt si differenzia dei neuroni artificiali moderni:

  • Presenta una funzione di attivazione a soglia (o gradino, o  Funzione di Heaviside) per cui noteremo un output del tipo:
  • Può apprendere solo funzioni linearmente separabili;
  • Non supporta probabilità;
  • Non sono presenti strati nascosti, ha un solo strato;
  • Regole di aggiornamento dei pesi semplici (no Backpropagation).

Problema dello XOR

lo XOR non è linearmente separabile