24

Ich möchte meinen Evolutionssimulator auf Hebb lernen, wie this one. Ich möchte, dass kleine Lebewesen lernen können, wie man Nahrung findet. Das habe ich mit den grundlegenden Feedforward-Netzwerken erreicht, aber ich muss unbedingt lernen, wie man es mit Hebb-Lernen macht. Das Grundprinzip des Hebb-Lernens ist, dass wenn zwei Neuronen miteinander feuern, sie sich miteinander verbinden.Wie Hebbian lernen?

So werden die Gewichte wie folgt aktualisiert:

weight_change = learning_rate * input * output 

Die Informationen, die ich gefunden habe, wie dies nützlich sein kann ziemlich knapp ist, und ich weiß es nicht.

In meiner aktuellen Version des Simulators sind die Gewichte zwischen einer Aktion und einer Eingabe (Bewegung, Augen) erhöht, wenn eine Kreatur ein Stück Nahrung isst, und ich sehe nicht, wie das in dieses neue Modell übersetzt werden kann. Es gibt einfach keinen Raum zu sagen, ob es hier etwas richtig oder falsch gemacht hat, denn die einzigen Parameter sind Eingabe und Ausgabe! Wenn ein Input die Bewegung in eine Richtung aktiviert, würde das Gewicht einfach weiter steigen, egal ob die Kreatur etwas isst oder nicht!

Bewerbe ich mich Hebb lernen falsch? Als Referenz verwende ich Python.

Antwort

18

Hebbs law ist ein brillanter Einblick für associative learning, aber es ist nur ein Teil des Bildes. Und du hast Recht, so wie du es getan hast, und unkontrolliert bleibt ein Gewicht einfach weiter steigen. Der Schlüssel ist, eine Form der Normalisierung oder Begrenzung hinzuzufügen. Dies wird ziemlich gut von der Wiki-Seite für Oja's rule veranschaulicht. Was ich Ihnen vorschlage, ist in einem Schritt post-synaptic divisive normalisation hinzuzufügen, was dies bedeutet, dass Sie sich durch ein Gewicht durch die Summe aller Gewichte teilen, die auf dasselbe postsynaptische Neuron konvergieren (dh die Summe aller auf ein Neuron konvergierenden Gewichte ist festgelegt) um 1).

Was Sie tun möchten, können Sie tun, indem Sie ein Netzwerk erstellen, das Hebbian learning verwendet. Ich bin mir nicht ganz sicher, was Sie als Eingabe in Ihr System eingeben oder wie Sie die Dinge eingerichtet haben. Aber Sie könnten LISSOM betrachten, die eine Hebbische Erweiterung zu SOM, (self-organising map) ist.

In einer Schicht dieser Art können typischerweise alle Neuronen miteinander verbunden sein. Sie übergeben den Eingabevektor und lassen die Aktivität im Netzwerk ablaufen. Dies ist eine Anzahl von Einschwingschritten. Dann aktualisieren Sie die Gewichte. Sie tun dies während der Trainingsphase, an deren Ende assoziierte Elemente im Eingabefeld dazu neigen, gruppierte Aktivitätsfelder in der Ausgabekarte zu bilden.

Es ist auch erwähnenswert, dass das Gehirn massiv miteinander verbunden ist und hoch rekursiv ist (d. H. Es gibt Feedforward, Feedback, laterale Interkonnektivität, Mikroschaltungen und viele andere Dinge auch ..).

1

Ich bin mit dieser Art von neuronalem Netzwerk nicht sehr vertraut, aber es sieht so aus, als ob Sie erwarten, dass es wie eine überwachte Update-Methode funktioniert, während es unbeaufsichtigt ist. Das heißt, du kannst es nicht lehren, was richtig ist, es lernt nur, was anders ist, durch Assoziation. Das heißt, es wird schließlich Aktionen mit bestimmten Clustern von Eingaben assoziieren. In Ihrer Situation, in der Sie wollen, dass es seine Entscheidung durch Feedback verbessert, glaube ich nicht, dass nur Hebbian-Updates ausreichen. Sie könnten es jedoch mit einer Art Backpropagation kombinieren.

+0

Ich möchte, dass die Netze nicht Vors sein, Gehirne funktionieren nicht so, und ich denke, dass Schleifen abkühlen könnte. Also, keine Rückmeldung, sagst du ... Also könntest du im Grunde erklären, wie genau das funktionieren würde? Weil es immer noch kaputt scheint, wird es Eingang A mit Ausgang B assoziieren, nur weil die Startgewichte so eingestellt wurden, und dann wird es die Verbindung zwischen dann unendlich erhöhen, so scheint es. – corazza

2

Obwohl das Hebbische Lernen als allgemeines Konzept die Grundlage für viele Lernalgorithmen bildet, einschließlich Rückpropagation, ist die einfache lineare Formel, die Sie verwenden, sehr begrenzt. Gewichte steigen nicht nur unendlich, auch wenn das Netzwerk alle Muster gelernt hat, aber das Netzwerk kann perfekt nur orthogonale (linear unabhängige) Muster lernen.

Linear Hebbian Lernen ist nicht einmal biologisch plausibel. Biologische neuronale Netze sind viel größer als Ihre und sind hochgradig nichtlinear, sowohl die Neuronen als auch die Synapsen zwischen ihnen. In großen, nichtlinearen Netzwerken sind die Chancen, dass Ihre Muster nahezu orthogonal sind, höher.

Also, wenn Sie darauf bestehen, ein neuronales Netzwerk zu verwenden, schlage ich vor, versteckte Schichten von Neuronen hinzufügen und Nichtlinearitäten, sowohl in den Gewichten, z. wie Fraxel vorgeschlagen, und beim Abfeuern von Neuronen --- hier könnten Sie eine Sigmoid-Funktion verwenden, wie tanh (ja, mit negativen Werten für "nicht-feuern" ist gut, da es zu Gewichtsreduzierungen führen kann). In ihrer verallgemeinerten Form kann Hebbian Regel ausgedrückt werden als

weight_change = learning_rate * f1(input, weight) * f2(output, target_output) 

wo f1 und f2 einige Funktionen. In Ihrem Fall gibt es keine target_output, so dass f2 frei ist, es zu ignorieren.

Damit Neuronen in Ihren ausgeblendeten Ebenen ausgelöst werden und damit eine Verbindung zwischen Eingabe und Ausgabe hergestellt wird, können Sie die Gewichtungen auf zufällige Werte initialisieren.

Aber ist ein neuronales Netzwerk wirklich notwendig oder sogar für Ihr Problem geeignet? Haben Sie eine einfache Korrelation in Betracht gezogen? Ich meine, Hebb leitete seine Regel ab, um zu erklären, wie Lernen in biologischen Systemen funktioniert, nicht als der bestmögliche maschinelle Lernalgorithmus.

-1

Sie können mit meinem Code versuchen.

/* 
 
* To change this license header, choose License Headers in Project Properties. 
 
* To change this template file, choose Tools | Templates 
 
* and open the template in the editor. 
 
*/ 
 
package modelhebb; 
 

 
/** 
 
* 
 
* @author Raka 
 
*/ 
 
public class ModelHebb { 
 
    public static void main(String[] args) { 
 
     Integer xinput[][] = new Integer[][]{ 
 
      {1, 1}, 
 
      {1, -1}, 
 
      {-1, 1}, 
 
      {-1, -1} 
 
     }; 
 
     Integer xtarget[] = new Integer[]{ 
 
      1, 
 
      -1, 
 
      -1, 
 
      -1 
 
     }; 
 
     Integer xweight[] = new Integer[xinput[0].length]; 
 
     System.out.println("\t Iterasi \t"); 
 
     Integer bayes = 0; 
 
     for (int i = 0; i < xtarget.length; i++) { 
 
      for (int j = 0; j < xinput[i].length; j++) { 
 
       int temp = xweight[j]==null?0:xweight[j]; 
 
       xweight[j] = temp + (xinput[i][j] * xtarget[i]); 
 
       System.out.print("W"+j+": "+xweight[j]+"\t"); 
 
      } 
 
      bayes = bayes + xtarget[i]; 
 
      System.out.println("Bobot : " + bayes); 
 
     } 
 
    } 
 
}