Come eseguire perceptron a 2 strati per risolvere XOR

0

XOR non è risolvibile utilizzando un singolo perceptron con prodotto scalare standard e funzione step unitario.

Questo articolo suggerisce l'utilizzo di 3 percetron per creare una rete: link

Sto provando a eseguire la rete 3-perceptron in questo modo ma non produce risultati corretti per XOR:

//pseudocode
class perceptron {

  constructor(training_data) {
    this.training_data = training_data   
  }

  train() {
    iterate multiple times over training data
    to train weights
  }

  unit_step(value) {
    if (value<0) return 0
    else return 1
  }

  compute(input) {
    weights = this.train()
    sum     = scalar_product(input,weights)
    return unit_step(sum)
  }
}

Il perceptron di cui sopra può risolvere correttamente le operazioni di bit NOT, AND, OR. Ecco come uso 3 percettori per risolvere XOR:

AND_perceptron = perceptron([
  {Input:[0,0],Output:0},
  {Input:[0,1],Output:0},
  {Input:[1,0],Output:0},
  {Input:[1,1],Output:1}
])

OR_perceptron = perceptron([
  {Input:[0,0],Output:0},
  {Input:[0,1],Output:1},
  {Input:[1,0],Output:1},
  {Input:[1,1],Output:1}
])

XOR_perceptron = perceptron([
  {Input:[0,0],Output:0},
  {Input:[0,1],Output:1},
  {Input:[1,0],Output:1},
  {Input:[1,1],Output:0}
])

test_x1 = 0
test_x2 = 1 

//first layer of perceptrons
and_result   = AND_perceptron.compute(test_x1,test_x2)
or_result    = OR_perceptron.compute(test_x1,test_x2)

//second layer
final_result = XOR_perceptron.compute(and_result,or_result)

Il final_result di cui sopra non è coerente, a volte 0, a volte 1. Sembra che eseguo i 2 livelli in modo errato. Come eseguire questi 3 percettori in 2 livelli nel modo corretto?

    
posta datdinhquoc 07.10.2016 - 04:35
fonte

1 risposta

2

Sembra che tu stia tentando di addestrare il percettore singolo del secondo strato per produrre uno XOR dei suoi input. Questo non è possibile; un singolo perceptron può solo imparare a classificare gli input che sono linearmente separabili .

La solita soluzione per risolvere il problema XOR con perceptrons consiste nell'utilizzare una rete a due livelli con l'algoritmo di propagazione posteriore, in modo che i nodi a livello nascosto imparino a classificare ciascuna delle due regioni di output linearmente separabili e la finale il livello di output combina questi risultati in modo additivo o moltiplicativo (a seconda delle regioni precise di cui i nodi nascosti hanno appreso). Non sono del tutto sicuro di cosa si suppone che i tuoi "e" e "o" percettori nel tuo psuedocode realizzino, ma non fanno parte della solita soluzione.

    
risposta data 07.10.2016 - 11:29
fonte