+-------------------------------------------------------------+ | F O R T G E S C H R I T T E N E N P R A K T I K U M | |-------------------------------------------------------------| | H E B B - N E T Z & R E I N F O R C E M E N T | +-------------------------------------------------------------+ Thema: Konstruktion von Netzen mit REINFORCEMENT-Input, die nur mittels der HEBB-Regel lernen. Bearbeiter: Marcus Hutter MatNr.: 0893341 Betreuer: Gerhard Weiß Abgabedatum: 2.7.90
+-------------------------------------------------------------+ | 0. I N H A L T S V E R Z E I C H N I S | +-------------------------------------------------------------+ 0. Inhaltsverzeichnis ...................................... __ 1. Idee / Einleitung ....................................... __ 2. Reinforcement-Hebb-Netze ohne Hidden-Units .............. __ 3. Konstruktionsversuche von RH-Netzen mit Hidden-Units .... __ 4. Anmerkungen, Ausblicke .................................. __ 5. Literaturverzeichnis .................................... __ 6. Programmlisting ......................................... __ 7. Protokoll eines einfachen Beispiels ..................... __ - 2 -
+-------------------------------------------------------------+ | 1. Idee / Einleitung | +-------------------------------------------------------------+ Hier, in der Einleitung möchte ich die Idee, die hinter diesem Thema steckt, und das Thema selbst etwas näher erläutern. Dazu sei vorweg erwähnt, daß die meisten Vergleiche mit der Biologie und erst recht die Analogien zum Menschen recht spekulativ sind und nur zur Anregung dienen sollten. zum Verständnis notwendige Grundkenntnisse ------------------------------------------- - Reinforcement-Netze - Hebb-Netze - Darwinistische Evolution Übersicht über Netze - Gegenüberstellung ---------------------------------------- Aus zwei Gründen möchte ich zuerst eine kurze Übersicht über verschiedene Charakteristika neuronaler Netze geben. Da erstens die Vielfalt dieser Netze mit der Idee und damit dem Thema zu tun hat und zweitens ich einige darunter implementiert habe und die Auswahl anhand der Tabelle begründen möchte. Die Tabelle enthält nur die für diesen Artikel notwendigen Punkte. Supervised <--> Unsupervised <--> Reinforcement Backpropagation <--> Hebb-Lernregel Statistische Units <--> Deterministische Units Schwellwert Units <--> Sigmoid-Units Synchroner Update <--> Asynchroner Update Impuls-Units <--> Statischer Unit-Output Idee ---- Supervised-Netze (z.B. mit Backprop.-Algorithmus) sind eine der erfolgreichsten Netze, haben aber den entscheidenden Nachteil ständig auf einen Lehrer angewiesen zu sein, der ihnen "sagt was zu tun ist". So ein Lehrer ist aber in vielen Problemen nicht verfügbar. Wesentlich bescheidener sind da die Reinforce- ment-Netze (nachfolgend kurz R-Netze), denen man nur "sagen" muß, ob ihre Reaktion richtig oder falsch war. Dies entspricht in vieler Hinsicht auch mehr dem menschlichem Lernen durch 'trial and error'. Allerdings gibt es auch bedeut- same Unterschiede, die dieses Fopra anzupacken versucht. Ganz so sporadisch wie bei den R-Netzen ist die Rückkoppelung in der Natur nämlich nicht. Das R-Signal könnte man als das allgemeine Wohlbefinden des Individuums betrachten, welches es zu maxi- mieren gilt. Doch dieses Signal wird weder ausschließlich noch direkt von der Umwelt geliefert. Vielmehr nehmen wir mehrere R- Signale in codierter Form über unsere normalen Sinnesorgane auf. Um etwas konkreter zu werden, gebe ich hier einige Bei- spiele: - zu helles Licht schmerzt in den Augen (R < 0) - gute Mahlzeit bekommt Zunge & Magen (R > 0) - Tritt ans Schienbein tut weh am Bein (R < 0) - heitere Musik erfreut das Gemüt (R > 0) Ähnliche Beispiele lassen sich natürlich auch im technischen Bereich finden, etwa für einen Staubsauger-Roboter. - 3 -
Neurologisch scheint unser Gehirn noch weniger ein R-Netz zu sein, als vielmehr ein Unsupervised-Netz (nachfolgend kurz U- Netz), das wesentlich mit Hilfe der Hebb-Regel lernt. Doch un- bestreitbar besitzen wir die Fähigkeit des R-Lernens. Die Punkte noch einmal zusammenstellend - codierte R-Info. an Standardinputs, aber kein R-Eingang - Unsupervised Netz mit Hebb-Lernregel - Fähigkeit des R-Lernens ergibt sich die Frage: Wie kann ein Hebb-Netz R-Lernen ? Dies ist der Titel des Fopras. Lösung ------ Obige Annahmen vorausgesetzt, hat es die Evolution anscheinend geschafft, aus einfachen U-Netzen durch Modifikation der Netz- struktur R-ähnliche Netze zu konstruieren. Man kann dies auch anders sehen (vergleiche Kap. 3 in [2]): Der Lernprozess im Gehirn stellt auch eine Art Evolution auf einer kleinen Zeitskala dar (somatic time), die im Zuge der (darwinistischen) Evolution im großen Zeitraum von Jahr- milliarden (earth time) entstanden ist und immer mehr ausge- feilt wurde, sodaß heute "Lernen" auf zwei Zeitskalen statt- findet. Zuerst besaßen die Tiere nur fest verdrahtete Netze, dann U-Netze und irgendwann erfolgte der Sprung (oder eher der fließende Übergang) zu R-Netzen (und sogar zu S-Netzen). Einen solchen Übergang in einer (natürlich stark vereinfachten) Simulation festzustellen, weckte mein Interesse an Hebb-Netzen. Zuvor war es jedoch ratsam zu untersuchen, ob U-Netze überhaupt zu R-ähnlichen Netzen umfunktioniert (strukturiert) werden kön- nen, bevor man versucht, diese Aufgabe einem genetischen Algo- rithmus anzuvertrauen. Genau dies habe ich mit teilweisem Er- folg versucht: Die (geschickte) Verschaltung von Hebb-Netzen zu R-ähnlichen Netzen, deren Details im folgenden näher ausgeführt werden. Der Ausspruch "Neurononale Netze programmiert man nicht, man konstruiert sie" spiegelt hier besonders deutlich die Vertei- lung des Arbeitsaufwandes wieder. - 4 -
+-------------------------------------------------------------+ | 2. Reinforcement-Hebb-Netze ohne Hidden-Units | +-------------------------------------------------------------+ Eine einfache Klasse von Netzen sind Netze ohne Hidden-Units, die zwar nicht besonders leistungsfähig sind, aber sehr gut ge- eignet sind, Erfahrungen zu sammeln. Deshalb möchte ich diese Netzklasse hier näher untersuchen. Bei solchen Netzen besteht nämlich kein prinzipieller Unter- schied zwischen S- und U-Lernen. Beim S-Netz wird auf den Out- put der Output-Units gewartet und der Fehler der dabei gemacht wurde an die Output-Units angelegt und daraus die Gewichts- änderung berechnet (Backprop. entfällt bei 2 Layer Netzen). Bei U-Netzen mit nur sichtbaren Units (gleichzeitig Input- und Out- put-Units) werden beim Lernen verschiedene Muster angeboten und dadurch die Gewichte verändert. Anschließend werden nur noch Bruchstücke angelegt, deren Rest vom Netz rekonstuiert wird. Präsentiert man diesem U-Netz beim Lernvorgang ein Muster, dessen einer Teil dem Input des S-Netzes entspricht und dessen anderer Teil aus dem gewünschten dazugehörigen Output besteht und legt anschließend nur Teil 1 an, so wird das U-Netz Teil 2 rekonstruieren, ohne "zu wissen", daß wir dies als Output zu einem Input auffassen. Insofern ist die Unterscheidung in Out- put- und Input-Units nur Interpretationssache. Auf jeden Fall sind beide Algorithmen zur Gewichtsänderung in solchen Netzen äquivalent. Ich verwende hier deterministische Schwellwert-Units mit Out- putbereich {-1,+1}, wobei ich häufig -1 als FALSE und +1 als TRUE interpretieren werde. +-------------------------------------------------------------+ Bild 1: Zwei-Lagen-Netz ohne Hidden Units +-------------------------------------------------------------+ Grundkonstruktion ----------------- Das sichtlich einfachste Netz, welches man sich vorstellen kann, besteht nur aus je einer Unit im Input- und Output-Layer mit einem nach Hebb unsupervised zu lernenden Gewicht. Dies kann auch wie oben als S-Netz und sogar als R-Netz aufgefaßt werden, da hier die R-Information gleich dem Betrag der S- Information ist. Mit Hilfe dieser Information läßt sich aber der 'richtige' Output nach Tabelle 1 berechnen. R=-1 soll Bestrafung, R=+1 Belohnung bedeuten. - 5 -
+----------------------------------------+ | gelieferter Output | -1 | -1 | +1 | +1 | | R-Info. | -1 | +1 | -1 | +1 | |--------------------+----+----+----+----| | gewünschter Output | +1 | -1 | -1 | +1 | +----------------------------------------+ Tabelle 1: Berechnung des Outputs aus R-Info. Dies ist die XNOR-Funktion. D.h. erweitere ich mein Netz um einen weiteren Input (dem R-Input), verknüpfe diesen mit dem Output des ursprünglichen Netzes zu XNOR, so erhalte ich den gewünschten Output, also einen Superviser. Die XNOR-Funktion läßt sich durch ein kleines Netz realisieren. Was fange ich aber in einem Hebb-Netz mit einem Superviser an ? Ganz einfach: Lege ich diesen mit einem sehr starken Gewicht als weiteren Input an die (einzige) Output-Unit, so erzwinge ich den erwünschten Output an der Output-Unit. Diese Situation un- terscheidet sich nicht von derjenigen, in der ich direkt Input & zugehörigen Output an beide Units angelegt hätte (bis auf eine zeitliche Verzögerung). Dies ist aber genau die Situation im Unsupervised Fall - Und das Netz lernt diese IO-Kombination. +-------------------------------------------------------------+ Bild 2 : Erzeugung eines Supervisers (schematisch) +-------------------------------------------------------------+ Hier sind einige Bemerkungen angebracht: - Der neue R-Input verhält sich zwar so wie ein Reinforcement- Input bei R-Netzen, wird aber hier nicht durch einen mit gesondertem Algorithmus behandelten Input realisiert, sondern fungiert wie jeder andere Input und erhält nur einen eigenen Namen und weist bei geeigneter Interpretation des Betrachters besondere Eigenschaften auf. - Da das Netz nach einer Lernphase den gewünschten Output auch ohne R-Signal liefern soll, kann der durch XNOR erhaltene Output nicht direkt als Output des Netzes dienen. Außerdem verhält sich alles nur in diesem äußerst primitiven Netz so schön und übersichtlich. - 6 -
Bild 3 stellt unser Netz nun komplett dar. Die Units U1 bis U5 bilden ein XNOR-Gatter, wie man sich leicht überzeugen kann und sind wie oben beschrieben mit der Output-Unit U7 verbunden. +-------------------------------------------------------------+ Bild 3 : Einfachstes U-Netz mit R-Input +-------------------------------------------------------------+ Mit diesem Netz lassen sich zwei Funktionen lernen. Die Identi- tät (Id) mit Gewicht größer Null bzw. die Negation (not) mit Gewicht kleiner Null. Überzeugen wir uns durch Analyse des zeitlichen Verhaltens, daß diese Funktionen bei geeignetem R- Signal tatsächlich auch gelernt werden (und nur in diesem ein- fachsten aller Beispiele ist dies überhaupt möglich). Nehmen wir an, das Netz soll ein 'not' lernen. Der initiale Zustand der Units sei beliebig, am Eingang und am Ausgang liege eine 1. Dies ist nicht was wir wünschen, also le- gen wir am R-Eingang U5 ein negatives Reinforcement -1 an. Die- ser wird nun mit dem Output von U7 XNOR verknüpft und gelangt nach 2 Zeitschritten (synchroner Update aller Units) nach U3 als eine -1. Ein kritischer Punkt ist, daß sich U7 in der Zwi- schenzeit geändert haben kann, z.B. auf -1. Dann wird aber das zeitlich korrespondierende R-Signal +1 angelegt (da dieser Out- put ja erwünscht ist), und dieses ergibt zusammen nach einer gewissen Verzögerung auch -1 an U3. D.h. in jedem Zeitschritt ändert sich der Input des XNOR-Gatters, der Ausgang liefert jedoch korrekt immer -1. Daß dieses 'Pipeline'-Prinzip funktio- niert, ist nicht selbstverständlich und gilt auch nur bei Net- zen, bei denen für je zwei Units JEDER Weg zwischen diesen die gleiche Länge (d.h. gleiche Zahl an zwischen-Unit) hat, also bei streng geschichteten Netzen, wie das für dieses XNOR der Fall ist. Nach zwei Zeitschritten liegt also an U3 der gewünschte Output an, unabhängig von der Netzinitialisierung, und wird im näch- sten Schritt durch das starke Gewicht auf die Output-Unit U7 übertragen. Nun haben wir einen stabilen (und gewünschten) Out- put erreicht. In den ersten 3 Zeitschritten wird das Gewicht w aufgrund des zufälligen Outputs durch die Hebbregel zufällig verändert, also im schlimmsten Fall 3* um einen bestimmten Wert vergrößert, im Mittel einfach gleich gelassen. In den nächsten stationären Schritten, solange der Input noch konstant bleibt, wird das Gewicht garantiert verkleinert. Der Fall eines negati- ven Inputs verläuft analog und bewirkt letztenendes auch eine - 7 -
Verkleinerung von w. Damit konvergiert w gegen einen negativen Wert, der durch die Form der Hebbregel beschränkt bleibt. Dies stellt aber eine Negation wie gewünscht dar. In der anschließenden Rekapitulation des Gelernten, in der der R-Input auf einen beliebigen Wert >=0 gesetzt wird, wird durch die Rückkoppelung von U3 nach U7 der Output höchstens positiv, d.h. in gewünschter Weise beeinflußt. (darauf wird später noch ein- gegangen). Analog überzeugt man sich, daß bei umgekehrten R-In- put wie erwünscht die Identität mittels positivem Gewicht w ge- lernt wird. Dies ist das erste Hebb-Netz, welches zwei sich widerspechende Aufgaben lernen kann, einmal 'Id' und einmal 'not', in Abhän- gigkeit vom R-Signal. Mehrere IO-Units ---------------- Vergrößern wir nun die Zahl der Input und Output-Units. Die Ersetzung einer Unit durch mehrere bedeutet einen qualitativen Sprung. Von mehreren zu noch mehr nur noch einen quantitativen, sodaß alles wesentliche schon an einem Netz mit je zwei Input- und Output-Units zu erkennen ist. Dazu kommen außerdem zwei zu lernende Schwellwerte (Bild 4). +-------------------------------------------------------------+ Bild 4 : U-Netz mit R-Input, 2 Input-, 2 Output-Units +-------------------------------------------------------------+ Die Vermehrung der Input-Units bewirkt nur eine Verlangsamung der Lernrate. Für zwei Output-Units benötigen wir zwei XNOR- Rückkoppelungen. Da aber nur ein R-Signal zur Verfügung steht, das beiden zugeführt wird, können die an U10 und U11 erzeugten Werte nur noch im statistischen Mittel den gewünschten Output abgeben (positive Kovarianz; gleiches Phänomen wie beim Stan- dard-R-Lernen). Damit wird eine direkte Verfolgung der Signale (mit der Absicht die Funktionsweise zu verstehen) unmöglich. Abhilfe schafft eine Tabelle, die für ein Beispiel angegeben ist. U10 habe ein NAND, U11 ein OR zu lernen. Nur wenn beide Output- Units das richtige Ergebnis liefern sei R=1, ansonsten -1. Im allgemeinen wird das R-Signal den mittleren Fehlerabstand, nor- miert auf ein beliebiges Nullniveau darstellen, Feinheiten spielen für die Funktionstüchtigkeit nur eine untergeordnete Rolle. Legt man einen Input an, so gibt es 4 Output-Möglichkei- ten des Netzes. - 8 -
1.Beide Outputs sind (relativ zum gewünschten Output) falsch: Das R-Signal wird -1 und nach 3 Zeitschritten zeigen die Out- put-Units gegenteiliges Verhalten, d.h. das gewünschte. Nun wird R=1 gesetzt und das System bleibt stabil. 2.Beide Outputs entsprechen dem gewünschten Output: Das R-Signal wird +1 und der Zustand bleibt stabil. 3/4.Eine Unit liefert das richtige, die andere ein falsches Ergebnis: Das auf -1 gesetzte R-Signal bewirkt eine Invertie- rung des Outputs. Dies führt aber wieder in den Fall 3/4. R bleibt -1 und die Outputs schwingen periodisch zwischen +1 und -1. Im Fall 1 und 2 liefern die Output-Units den richtigen Wert, im Fall 3 und 4 zu 50% den richtigen und 50% den falschen Wert. Die Gewichtsänderung ist im Fall 3 und 4 also 0, da sich posi- tive und negative Kovarianzen aufheben. D.h. nur Fall 1 und 2, die beide (spätestens nach einer Verzögerung) den gewünschten Output liefern, tragen zum Lernen bei. Bei geringsten Unregelmäßigkeiten im Update der Units im Fall 3/4 (also spe- ziell bei asynchronem Update) geht dieser oszillierende in den stabilen Zustand 1/2 über. Somit ist die Abschätzung, daß in 50% der Fälle, also 50% der Zeit, effektiv gelernt wird, im allg. zu schlecht. In Tabelle 2 ist zu jeder stabilen IO-Kombination die zugehö- rige und in der letzten Spalte die mittlere Gewichtsänderung angegeben. Die Zahlenwerte bedeuten, daß bei unendlich langer Verweilzeit in diesem Zustand die Gewichte gegen ñ1 konvergie- ren würden, bei zyklischer Repräsentation der Inputs gegen ñ«. +---------------------------------------------+ | Input I | -1 | -1 | +1 | +1 | | | Input II | -1 | +1 | -1 | +1 | | |--------------------+----+----+----+----| _ | | Output I | +1 | +1 | +1 | -1 | W | | Output II | -1 | +1 | +1 | +1 | | |--------------------+----+----+----+----+----| | Gewicht W11 | -1 | -1 | +1 | -1 | -« | | Gewicht W21 | -1 | +1 | -1 | -1 | -« | | Schwellwert S1 | +1 | +1 | +1 | -1 | +« | |--------------------+----+----+----+----+----| | Gewicht W12 | +1 | -1 | +1 | +1 | +« | | Gewicht W22 | +1 | +1 | -1 | +1 | +« | | Schwellwert S2 | -1 | +1 | +1 | +1 | +« | +---------------------------------------------+ Tabelle 2: Gewichtsänderung im 2-2 Netz Wie man sich leicht überzeugen kann sind die zur korrekten Funktion des Netzes notwendigen Gewichte und Schwellwerte ge- rade die in der Tabelle angegebenen. Das Netz lernt also kor- rekt. Dies gilt für alle Paare von boolschen Funktionen, so- lange diese nicht XOR oder XNOR sind, welche prinzipiell nicht durch ein Netz ohne Hidden-Units dargestellt werden können (Siehe Kapitel 3) Größeres Beipiel ---------------- Wie oben schon erwähnt, läßt sich die Argumentation auch auf größere Netze übertragen. Um ganz sicher zu gehen, ist es am besten einfach ein größeres Netz zu konstruieren und zu testen. Dabei nimmt die Lernzeit allerdings schneller mit der Anzahl - 9 -
der Output-Units zu (exponentiell ?) als dies theoretisch not- wendig wäre (linear !). Auch wird im allg. nicht mehr fehler- frei gelernt, alles in allem ergeben sich aber durchaus zufrie- denstellende Ergebnisse (wenn man die Einfachheit der Mittel berücksichtigt). Anmerkungen ----------- - Je mehr Output-Units das Netz enthält, desto chaotischer scheint sich das Netz zu verhalten. Dieses Verhalten ist be- stimmt nicht negativ, da durch diese quasi-statistische Ver- haltensweise, die wesentlich durch die Antisymmetrie der Ge- wichte oder konkreter durch die Rückkoppelung bewirkt wird, der Lösungsraum abgesucht wird. Hier ist die Ähnlichkeit zu Boltzmann-Netzen auffällig, auf die in Kap. 3 noch näher eingegangen wird. - Bisher wurden nur Schwellwert-Units betrachtet und somit nur Outputs von ñ1. Bei Sigmoiden Units, die auch Zwischenwerte liefern, machte sich folgender Effekt bemerkbar: 1.Das quasi-statistische Verhalten verstärkte sich, da die XNOR-Rückkoppelung bei kontinuierlichen Input-Werten eher zum Schwingen neigt. 2.Wurde eine Funktion gut gelernt, so verstärkten sich die Gewichte auch noch in der Remind-Phase, d.h. ohne R-Input, durch die bestehende Rückkoppelung. Bei schlecht gelernten Funktionen trat der gegenteilige Effekt ein, und eine par- tiell gelernte Funktion wurde wieder vergessen. - Da die Konstruktion dieser R-lernenden Hebb-Netze nur eine Voruntersuchung war, die zeigen sollte ob dies prinzipiell möglich ist, wurde hier der einfachste Fall eines expliziten R-Signals untersucht. Interessant wird es erst, Netze zu kon- struieren (von genetischen Algorithmen konstruieren zu las- sen), bei denen das R-Signal implizit in der restlichen In- put-Information codiert ist und durch das Netz entschlüsselt wird. Da diese Decodierung jedoch möglich ist, konnte ich mich der Einfachheit halber auf den expliziten Fall beschrän- ken. - Die vielen festen Gewichte (in den XNOR) muß man sich als Ge- wichte mit sehr kleiner (null) Flexibilität denken. Somit wird der Rahmen der Hebb-Netze nicht verlassen. Diese Verbin- dungen wirken aber dennoch etwas künstlich und störend. Ver- suche auch die Flexibilität dieser Units ungleich Null zu setzen, haben alle zur Zerstörung der XNOR-Funktion und damit der Funktionsfähigkeit des Netzes geführt. Wahrscheinlich sind solche starren Gewichte auch notwendig für komplexer ge- staltete Netze. Genetisch erzeugte Netze werden vermutlich ein kontinuierliches Spektrum an Gewichten verschiedenster Flexibilität aufweisen (natürlich nur wenn diese Option zur Verfügung steht). - 10 -
+-------------------------------------------------------------+ | 3. Konstruktionsversuche von RH-Netzen mit Hidden-Units | +-------------------------------------------------------------+ Um es gleich vorwegzunehmen - der Versuch, die Idee aus Kapitel 2 auf Netze mit Hidden-Units, um die es in diesem Kapitel geht, zu übertragen, ist gescheitert. Welche Probleme dabei auftraten und die Versuche, diese zu lösen, sollen im folgenden erörtert werden. Der Einfachheit halber beziehen sich die meisten nun folgenden Betrachtungen auf Netze mit nur einem Hidden-Layer (ähnlich Bild 5). Es wurden alle Experimente mit - synchronem / asynchronem Unit-Update - Schwellwert / Sigmoid-Units - direkter / akkumulierter Gewichtsänderung durchgeführt. Erweiterte Klasse von Netzen ---------------------------- Stellt man sich das Input-Layer der bisher betrachteten 2- Layer-Netze als Hidden-Layer-Schicht vor, die von anderen Units durch Verbindungen mit festen Gewichten gespeist werden, so än- dert dies natürlich weder am Lern-Prinzip, noch am Rückkoppe- lungsmechanismus etwas, d.h. auch solche Netze können R-Lernen. Anders interpretiert stellen diese Units Hidden-Units mit von vornherein durch die Netzstruktur festgelegter Bedeutung dar, und stellen somit keine 'echten' Hidden-Units dar. Man kann theoretisch durch eine solche feste Zwischencodierung zwar alle Probleme auf lineare Probleme reduzieren und damit auf die hier beschriebene Weise lösen, doch nimmt die Zahl der benötigten Hidden-Units exponentiell (also unbrauchbar) mit der Zahl der Input-Units zu. Für zwei Input-Units benötigt man 2ý=4 Hidden- Units. Somit hat ein Netz, das neben den 14 Bool-Funktionen auch XOR und XNOR lernen kann, folgende Gestalt. +-------------------------------------------------------------+ Bild 5: Netz, das alle 16 bool.-Funtionen lernen kann +-------------------------------------------------------------+ Diese Methode ist für große Netze aber absolut unbrauchbar und führt an der Idee der Hidden-Units total vorbei. - 11 -
Rückkoppelungsverzögerung bei Hidden-Units ------------------------------------------ Eine 'echte' Hidden-Unit, deren Bedeutung erst gelernt wird, besitzt mindestens eine flexible Verbindung inputseitig. Die naheliegendste Idee ist, auch solche Units mit einem XNOR- Rückkoppelungsglied zu verbinden. Die Argumentation könnte etwa wie folgt aussehen: Jede Hidden-Unit trägt zu einem gewissen Prozentsatz zum Output bei, d.h. es wird eine positive Korrelation zwischen der Korrektheit der Hidden-Unit und der Output-Unit und somit auch zum R-Signal bestehen. Folgendes muß jedoch im Fall des synchronen Updates unbedingt beachtet werden: Ein Output einer Hidden-Unit beeinflußt erst im nächsten (bzw. nächsten n) Schritt den Netz-Output und damit das dazugehörige R-Signal mit dem er durch die XNOR-Rückkoppe- lung verbunden wird. Der Output der Hidden-Unit muß somit einen (bzw. mehrere) Schritte 'aufbewahrt werden' bevor er mit dem R- Signal verknüpft werden kann. Diese Aufbewahrung kann durch eine zwischen Hidden-Unit und XNOR-Eingang geschaltete Unit be- werkstelligt werden. (Das Problem der zeitlichen Nicht-lokali- tät haben viele Netze). Allen Versuchen zum Trotz stellte sich nicht einmal bei einfachsten nicht-linearen Problemen (XOR) ein Lernerfolg ein. Schwacher Feedback für partiell korrekte Funktionen --------------------------------------------------- Da auch eine Hidden-Unit mit XNOR-Rückkoppelung versucht die gestellte Aufgabe 100% korrekt zu lösen, dies aber aufgrund der Art der Aufgabe nicht möglich ist, sollte sie diese wenigstens partiell korrekt lernen, sodaß in der nächsten Schicht aus den partiell korrekt gelösten Aufgaben der Hidden-Units die exakte Lösung in der 2. Schicht linearkombiniert werden kann. Nun stellte sich aber bei 2-layer Netzen heraus, daß diese bei dem Versuch ein XOR zu lernen, lieber gar nichts lernten, als ein OR, NAND oder etwas ähnlichem, welche aber typische Kandidaten für eine interne Repräsentation/Codierung und anschließender Linearkombination zu einem XOR sind. Abhilfe schafft hier, die Zwangsrückkoppelung von U3 nach U7 in Bild 1 und analog in al- len anderen abzuschwächen (Werte kleiner 1), um so dem Netz die Möglichkeit zu geben, entgegen seiner Vorbestimmung zu rea- gieren. Tatsächlich lernten die Netze weiterhin die auch theo- retisch erlernbaren Aufgaben; bei nichtlinearen Aufgaben wurden Approximationen gelernt. Leider führte auch diese Modifikation in Multilayer-Netzen nicht zum Erfolg. Feedback zu jedem 2. Layer -------------------------- Ein Problem war folgendes: Da sowohl Output-Layer als auch Hid- den-Layer bei negativem Reinforcement zu inversem Verhalten ge- zwungen werden, ändert sich am Produkt ihrer Aktivationen ((- a)*(-b)=a*b) und damit an der Richtung, in der die Gewichte ge- ändert werden, nichts. Nur zwischen Input- und erstem Hidden- Layer ändert sich das Vorzeichen und der Rückkoppelungsmecha- nismus 'greift'. Dem könnte Abhilfe geschaffen werden, indem nur jede 2. Netz- schicht rückgekoppelt wird und damit die Lernrichtung bei nega- tivem Reinforcement in jedem Layer umgekehrt wird. In einem 3- Layer-Netz bedeutet dies, nur die mittlere Schicht rückzukop- peln. Wie auch bei allen anderen Modifikationen brachte dies zwar eine konvergenzfördernde Wirkung, aber keineswegs eine be- friedigende. - 12 -
Symmetrische Gewichte --------------------- Ersetzt man im Netz die Gewichte durch symmetrische, d.h. fügt Gewichte gleicher Stärke und Flexibilität in entgegengesetzter Richtung hinzu, und betrachtet sowohl Input- als auch Output- Layer als Inputs, so hat man ein unsupervised lernendes Netz mit Hidden-Units. Hätten sich nicht schon bei dieser Lernme- thode unlösbare Schwierigkeiten ergeben, wäre der Versuch, nun die Information am Output-Layer durch eine XNOR-Rückkoppelung mit R-Signal zu approximieren, einer der erfolgsversprechend- sten gewesen. Da mir aber kein funktionsfähiges Hebb-Netz mit Hidden-Units bekannt war, konnte ich die Fehlerursache nicht finden. Boltzmann-Netze --------------- Das passendste, das ich finden konnte, waren Boltzmann-Netze, die von der Idee der Hebb-Netze nicht allzuweit entfernt sind. Die Gewichtsänderung ist im wesentlichen wie bei Hebb-Netzen proportional zur Korrelation benachbarter Unit-Aktivitäten. Die Unterschiede zu Hebb-Netzen sind folgende: - Der Output ñ1 wird statistisch in Abhängikeit der Aktivation und einer Größe, Temperatur genannt, berechnet. - Das Netz benötigt eine 'Vergeßphase', in der in Abwesenheit externer Einflüsse (Inputs), die Gewichte mit der inversen Lernregel verändert werden, also in entgegengesetzter Rich- tung. Da aber beide Unterschiede über den Rahmen der üblichen Hebb- Netze hinausgehen und mir keine funktionsäquivalenten Simulationen innerhalb dieses Rahmens eingefallen sind, führte jene Entdeckung nur zur Erkenntnis, daß der Rahmen (Hebb-Netze) vielleicht enger als notwendig gesteckt war (Siehe Kap. 4). Einfluß der Musterrepräsentationshäufigkeit auf die Gewichte ------------------------------------------------------------ Beim Versuch, die verschiedenen Inputmuster nicht mehr gleich- häufig zu präsentieren, zeigte sich eine auffällige Abhängig- keit der Gewichte hiervon. Diese an sich negative Erscheinung, die auch bei vielen anderen Netzen zu finden ist, konnte an dieser Stelle gewinnbringend eingesetzt werden. Präsentierte man dem Netz Muster, die es gut gelernt hatte, seltener, noch unzureichend gelernte entsprechend häufiger, so ließ sich der Lernvorgang bei 2-Layer Netzen aus Kap.2 beschleunigen. Bei einem 3-Layer-Netz mit 2 Hidden Units ließ sich unter anderem folgendes Problem lösen: Versucht man einem 3-Layer-Netz bei gleichverteilter Präsenta- tionshäufigkeit ein XOR zu lernen, so ist der Output zu 50% 1 und zu 50% -1, d.h. der Schwellwert der Output-Units wird gegen 0 konvergieren. Mit einem solchen Schwellwert ist es aber unmöglich ein XOR zu lernen. Legt man die Muster aber in oben beschriebener Weise an, so konvergiert zumindest der Schwell- wert gegen den benötigten Wert (abhängig vom Verhalten der Hidden-Units). - 13 -
+-------------------------------------------------------------+ | 4. Anmerkungen / Ausblicke | +-------------------------------------------------------------+ Man kann sich fragen, woran es wohl gelegen haben kann, daß alle Konstruktionsversuche von RH-Netzen mit Hidden-Units ge- scheitert sind. Liest man Kapitel 3 sorgfältig, so stellt man fest, daß an einigen Stellen erfolgversprechende Versuche hät- ten durchgeführt werden können, wenn man die Beschränkung auf Hebb-Netze aufgehoben hätte. Doch stellt sich dann die Frage, "wie weit man geht". Schließlich ist es kein Problem mit 'beliebigen' Units (nämlich R-Units) R-Netze zu konstruieren. Aus dieser Perspektive war ein eindeutig definierter Rahmen für die Charakteristika der Units durchaus sinnvoll. Doch scheint dieser Rahmen zu eng gewählt worden zu sein, aber jede Erweite- rung 'im nachhinein' gekünstelt. Konzentriert man sich dagegen auf die Idee des impliziten Reinforcement (Erklärung siehe Einleitung), so kann man, da dieses Problem meines Wissens noch niemand untersucht hat, auf einen abgrenzenden Rahmen verzichten. Läßt man gleich einen ge- netischen Algorithmus an dieses Problem, ohne Voruntersuchungen ähnlich zu meinen anzustellen, dann ist eine erfolgreiche Evo- lution eines Netzes mit implizitem R-Signal auch dann noch beachtlich, wenn man beliebige Units zuläßt. Auch die Verwen- dung von verschiedenartigsten Units innerhalb eines Netzes könnte für die Evolution von Vorteil sein. Insgesamt glaube ich, daß mit den heutigen Erkenntnissen und Mitteln, eine solche 'Evolution von (implizitem) Reinforce- ment', nachgebildet (simuliert) werden kann. Dies wäre auch ein experimenteller Beweis dafür, daß evolutionäre Prozesse auf einer Langzeitskala Lernverfahren auf einer Kurzzeitskala her- vorbringen können. +-------------------------------------------------------------+ | 5. Literaturverzeichnis | +-------------------------------------------------------------+ Literatur zum Fopra ------------------- [1] Williams R.J.; 1988 Toward a theory of reinforcement lear- ning; Techn. Report NU-CCS-88-3, College of Computer Science, Northeastern Univ. (Boston) [2] Gerhard Weiss: 1990 Combining neuronal and evolutionary learning; Techn. Report FKI-132-90; TU-München; weissg@tumult.informatik.tu-muenchen.de [3] Hinton G.E & Sejnowski T.J.; 1986; Learning and relearning in Boltzmann machines; IN: [5], Chapter 7, pp. 282-317 [4] Schulten K.; 1986 Associative Recognition and Storage in a Model Network of Physiological Neurons. IN: Biological Cybernetics 54,319-335 1986; Springer-Verlag Allgemeine Literaturhinweise ---------------------------- [5] Rumelhart D.E. & McClelland J.L.; 1986; Parallel distribu- ted processing vol 1 & 2. Book/MIT Press [6] Goldberg D.E.; 1989; Genetic algorithms in search, optimization machine learning; Addison-Wesley - 14 -
+-------------------------------------------------------------+ | 6. Programmlisting | +-------------------------------------------------------------+ {************************************************************} {* Hebb-Net-Simulation (c) by Marcus Hutter 25.6.90 *} {************************************************************} PROGRAM HebbNet; {---------------------} { Vars, Consts, Types } {---------------------} USES Crt; CONST MaxUNum = 30; { Max. Unit-Number } MaxCNum = MaxUNum*MaxUNum; { Max. Connection-Number } ESC = #27; none = #0; synchron = true; { Synchron Update of Units } rpres = false; { random pattern-presentation } lr = 0.001; { lernrate } ReInOff = 0; { Reinf-Input in remind-mode } scl = 5; { scaling factor } TYPE TUnitId = 1..MaxUNum; TUnit0Id = 0..MaxUNum; TUnit = record activ: real; { Unit-activation } output: real; { Unit-output } kind: Byte; { Unit-kind (not used) } end; TUnits = array[TUnit0Id] of TUnit; TConn = record weight: real; { Weight } elig: real; { Connection-eligibility } kind: Byte; { (not used) } end; TConns = array[TUnit0Id,TUnitId] of TConn; { Weights to Unit 0 are Offsets } VAR Conns: TConns; { all connections } Units: TUnits; { all units } XInp: array[TUnitId] of real; { external net-Input } WSt: Integer; { External World-Status } LernF: boolean; { Lern-Flag } RE: real; { middle Reinforcement } c: char; dev: Text; { Output-Device } {$DEFINE Example4} { Compile Example } {-------------------} { Special Functions } {-------------------} FUNCTION sign(x:real):integer; begin if x>0 then sign:=+1 else - 15 -
if x<0 then sign:=-1 else sign:=0 end; FUNCTION bound(x,l,u: real):real; begin if x>u then bound:=u else if x then bound:=l else bound:=x; end; FUNCTION actf(x: real):real; { Activation-Function of Units } begin actf:=bound(x*scl,-1,+1) end; {----------------} {$IFDEF Example1 } {----------------} { Hebb-Net to lern 14 Bool-Functions } CONST PSTime = 15; { Pattern-Show-Time } PNum = 4; { Pattern-Number } PLen = 2; { Pattern-Lenght } OLen = 1; { Output-Length } ReIn = 5; { ReinforcementInput-UnitId } UnitNum = 8; { Unit Number (here constant) } TYPE TPatN = 1..PNum; { Pattern-Numbers } CONST { Table of Input-Units } ITab: array[1..PLen] of TUnitId = (6,8); { Input-UnitIds } OTab: array[1..OLen] of TUnitId = (7); { Output-UnitIds } IPat: array[TPatN,1..PLen] of integer = { Input-Patterns } ((-1,-1 ),(-1,+1 ),(+1,-1 ),(+1,+1) ); OPat: array[TPatN,1..OLen] of integer = { Output-Patterns } ( (-1) , (+1) , (+1) , (+1) ); { Or-Function } ConW: array[0..UnitNum,1..UnitNum] of real = { Weight-Array } ( ( 1, 1,-1, 0, 0, 0, 0, 0 ), { OffSets } ( 0, 0, 1, 0, 0, 0, 0, 0 ), { Conn. from 1 } ( 0, 0, 1, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 1, 0 ), ( 1,-1, 0, 0, 0, 0, 0, 0 ), (-1, 1, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 2, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0 ) ); ConE: array[0..UnitNum,1..UnitNum] of real = { Elig.-Array } ( ( 0, 0, 0, 0, 0, 0, 2, 0 ), { OffSets } ( 0, 0, 0, 0, 0, 0, 0, 0 ), { Conn. from 1 } ( 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0 ), { ... } ( 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 2, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 2, 0 ) ); {$ENDIF} {----------------} {$IFDEF Example3 } {----------------} - 16 -
{ Hebb-Net to lern 16 Bool-Functions incl. XOR (1 lernlayer) }CONST PSTime = 15; { Pattern-Show-Time } PNum = 4; { Pattern-Number } PLen = 2; { Pattern-Lenght } OLen = 1; { Output-Length } ReIn = 3; { ReinforcementInput-UnitId } UnitNum = 12;{ Unit Number (here constant) } TYPE TPatN = 1..PNum; { Pattern-Numbers } CONST { Table of Input-Units } ITab: array[1..PLen] of TUnitId = (1,2); { Input-UnitIds } OTab: array[1..OLen] of TUnitId = (10); { Output-UnitIds } IPat: array[TPatN,1..PLen] of integer = { Input-Patterns } ((-1,-1),(-1,+1),(+1,-1),(+1,+1) ); OPat: array[TPatN,1..OLen] of integer = { Output-Patterns } ( (-1) , (-1) , (-1) , (+1) ); { Or/And-Function } ConW: array[0..UnitNum,1..UnitNum] of real = { to_1__2__3__4__5__6__7__8__9_10_11_12_ } ( ( 0, 0, 0, 0,-1,-1,-1,-1,-1,-3, 1, 1 ), { OffSets } ( 0, 0, 0, 0, 1, 0,-1, 0, 1, 0, 1, 0 ), { Conn. from 1 } ( 0, 0, 0, 0,-1, 0, 1, 0, 1, 0, 1, 0 ), ( 0, 0, 0, 0, 0,-1, 0, 1, 0, 0, 0, 0 ), { ... } ( 0, 0, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) ); ConE: array[0..UnitNum,1..UnitNum] of real = ( ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), { OffSets } ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), { Conn. from 1 } ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), { ... } ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) ); {$ENDIF} {----------------} {$IFDEF Example4 } {----------------} { Hebb-Net to lern 14*14 Bool-Functions } CONST PSTime = 20; { Pattern-Show-Time } PNum = 4; { Pattern-Number } PLen = 2; { Pattern-Lenght } OLen = 2; { Output-Length } ReIn = 3; { ReinforcementInput-UnitId } UnitNum = 12;{ Unit Number (here constant) } - 17 -
TYPE TPatN = 1..PNum; { Pattern-Numbers } CONST { Table of Input-Units } ITab: array[1..PLen] of TUnitId = (1,2); { Input-UnitIds } OTab: array[1..OLen] of TUnitId = (10,11); { Output-UnitIds } IPat: array[TPatN,1..PLen] of integer = { Input-Patterns } ((-1,-1),(-1,+1),(+1,-1),(+1,+1) ); OPat: array[TPatN,1..OLen] of integer = { Output-Patterns } ((-1,-1),(+1,-1),(+1,-1),(+1,+1) ); { Or/And-Function } ConW: array[0..UnitNum,1..UnitNum] of real = { to_1__2__3__4__5__6__7__8__9_10_11_12_ } ( ( 0, 0, 0, 0, 0, 1, 1, 1, 1,-3,-3, 1 ), { OffSets } ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), { Conn. from 1 } ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0,-1,-1, 1, 1, 0, 0, 0 ), { ... } ( 0, 0, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 1, 0,-1, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0 ), ( 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) ); ConE: array[0..UnitNum,1..UnitNum] of real = ( ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), { OffSets } ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0 ), { Conn. from 1 } ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), { ... } ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0 ) ); {$ENDIF} {----------------} {$IFDEF Example5 } {----------------} { Hebb-Net to lern Room-Inventory-Relation } { Test !! } CONST PSTime = 20; { Pattern-Show-Time } PNum = 5; { Pattern-Number } PLen = 9; { Pattern-Lenght } OLen = 5; { Output-Length } ReIn = 30; { ReinforcementInput-UnitId } UnitNum = 30;{ Unit Number (here constant) } TYPE TPatN = 1..PNum; { Pattern-Numbers } CONST { Table of Input-Units } ITab: array[1..PLen] of TUnitId = { Input-UnitIds } (1,2,3,4,5,6,7,8,9); OTab: array[1..OLen] of TUnitId = { Output-UnitIds } (10,11,12,13,14); - 18 -
IPat: array[TPatN,1..PLen] of integer = { Input-Patterns } ((-1,-1,+1,-1,-1,+1,+1,-1,+1), (-1,+1,+1,+1,-1,+1,-1,-1,+1), (-1,-1,+1,-1,-1,-1,-1,+1,-1), (+1,-1,-1,+1,-1,+1,+1,-1,-1), (-1,+1,-1,-1,+1,+1,-1,-1,+1)); OPat: array[TPatN,1..OLen] of integer = { Output-Patterns } ( (+1,-1,-1,-1,-1), (-1,+1,-1,-1,-1), (-1,-1,+1,-1,-1), (-1,-1,-1,+1,-1), (-1,-1,-1,-1,+1) ); { ConW and ConE are defined in InitExample } {$ENDIF} {----------------------} { Forward-Declarations } {----------------------} PROCEDURE chdo(ch:char); forward; FUNCTION event:char; forward; {-------------} { IO-Features } {-------------} PROCEDURE wrConns; { Write Connections } var c: TUnit0Id; u: TUnitId; begin writeln(dev,'Connection-Strength:'); for c:=0 to UnitNum do begin for u:= 1 to UnitNum do write(dev,100*Conns[c,u].weight:5:0); writeln(dev); end; end; PROCEDURE wrUnits; { Write Activation of Units (in one line) } var u: TUnitId; begin for u:=1 to UnitNum do write(dev,100*Units[u].activ:5:0); writeln(dev); end; PROCEDURE SaveStatus; { Save Status (Connection-Weights) to Disk } var sdev: file; begin writeln(dev,'Saving Status as Status.Dat'); assign(sdev,'D:\pascal\myprogs\status.dat'); rewrite(sdev,1); blockwrite(sdev,Conns,SizeOf(Conns)); close(sdev); end; PROCEDURE LoadStatus; { Load Status (Connection-Weights) from Disk } var sdev: file; begin - 19 -
writeln(dev,'Loading Status from Status.Dat'); assign(sdev,'D:\pascal\myprogs\status.dat'); reset(sdev,1); blockread(sdev,Conns,SizeOf(Conns)); close(sdev); end; PROCEDURE wrStatus; { Write Status (Connection-Weights) } begin wrConns end; {----------------} { Initialisation } {----------------} PROCEDURE InitExample; { Example-Specific-Initialistion-Routine } var c: TUnit0Id; u: TUnitId; begin {$IFDEF Example5 } { Create Net with Input-Units 1..9, Output-Units 10..14, Feedback-Units 14..29, R-Input-Unit 30 } FillChar(Conns,SizeOf(Conns),0); for c:=1 to OLen do begin for u:=1 to PLen do Conns[u,PLen+c].elig:=1; Conns[0,PLen+c].weight:=-5; Conns[PLen+OLen-2+3*c,PLen+c].weight:=-5; Conns[PLen+OLen-1+3*c,PLen+c].weight:=-5; Conns[0,PLen+OLen-2+3*c].weight:=-1; Conns[0,PLen+OLen-1+3*c].weight:=-1; Conns[PLen+OLen+3*c,PLen+OLen-2+3*c].weight:=+1; Conns[PLen+OLen+3*c,PLen+OLen-1+3*c].weight:=-1; Conns[ReIn,PLen+OLen-2+3*c].weight:=-1; Conns[ReIn,PLen+OLen-1+3*c].weight:=+1; Conns[PLen+c,PLen+OLen+3*c].weight:=1; Conns[PLen+OLen+3*c,PLen+OLen+3*c].weight:=1; end; {$ELSE} { Copy Net from Example to Conns-Array } for c:=0 to UnitNum do for u:=1 to UnitNum do begin Conns[c,u].weight:=ConW[c,u]; Conns[c,u].elig:=ConE[c,u]; end; {$ENDIF} end; PROCEDURE InitConns; { Initialize weights with 0 and eligibility with 1 } var c: TUnit0Id; u: TUnitId; begin for c:=0 to MaxUNum do for u:=1 to MaxUNum do begin Conns[c,u].weight:=0; Conns[c,u].elig:=1; end; end; PROCEDURE InitUnits; { Random-Initialisation of Unit-Output } var u:TUnitId; - 20 -
begin FillChar(Units,SizeOf(Units),0); for u:=1 to MaxUNum do { Random-Init } Units[u].output:=integer(random(3))-1; Units[0].output:=1; Units[0].activ:=1; end; PROCEDURE InitNet; { Initialize Net } begin InitConns; InitUnits; FillChar(XInp,SizeOf(XInp),0); InitExample; RE:=OLen; end; {--------------} { Net-Dynamics } {--------------} PROCEDURE EvalUnit(u: TUnitId); { Calculate new Unit-Activation with old Unit-Output } var s: real; c: TUnit0Id; begin s:=XInp[u]; for c:=0 to UnitNum do s:=s + Units[c].output * Conns[c,u].weight; Units[u].activ:=s; end; PROCEDURE EvalConn(c:TUnit0Id; u: TUnitId); { Change Conns[c,u].weight with Hebb-Rule } var change: real; begin if Conns[c,u].elig<>0 then begin change:=bound(Units[u].activ,-1,1) * bound(Units[c].activ,-1,1); Conns[c,u].weight:= bound( (1-lr)*Conns[c,u].weight + lr*change*Conns[c,u].elig ,-1,+1); end; end; PROCEDURE UpdUOut(u: TUnitId); { Update Unit-Output (Activation --> Output) } begin Units[u].output:=actf(Units[u].activ) end; PROCEDURE SetXInp; { Set external Input (Pattern[WSt] & Reinf.) , Calculate Reinforcement-Signal and expectation of R. } var n: integer; R: real; begin FillChar(XInp,SizeOf(XInp),0); { not needed } XInp[ReIn]:=ReInOff; for n:=1 to PLen do XInp[ITab[n]]:=IPat[WSt,n]; if LernF then begin { Set Reinforce-Input } R:=0; for n:=1 to OLen do R:=R + Abs(Units[OTab[n]].output-OPat[WSt,n]); - 21 -
XInp[ReIn]:=OLen-R; RE:=RE+0.002*(R-RE); end; end; PROCEDURE TimeStep; { One Simulation-Step: SetXInp -> EvalUnit --> (EvalConn) } var c: TUnit0Id; u,v: TUnitId; begin SetXInp; for u:=1 to UnitNum do if synchron then EvalUnit(u) else begin v:=random(integer(UnitNum))+1; EvalUnit(v); UpdUOut(u); end; if LernF then for c:=0 to UnitNum do for u:=1 to UnitNum do EvalConn(c,u); for u:=1 to UnitNum do UpdUOut(u); end; {------------} { Simulation } {------------} PROCEDURE dis1Pat; { Can be used to disturb disturb Inputpattern } var i,k: integer; begin end; PROCEDURE dis2Pat; { Can be used to disturb disturb Inputpattern } begin end; PROCEDURE lern; { 10 Lern-Cycles for a Set of Patterns defined in Example } { Show Pattern PSTime-TimeSteps } var t,k,p: integer; begin writeln(dev,'Pattern-Lerning'); lernF:=true; for k:=1 to 10 do begin for p:=1 to PNum do begin if rpres then WSt:=random(PNum)+1 else WSt:=p; writeln(dev,'Pattern ',WSt,' RE=',RE:0:2); InitUnits; for t:=1 to PSTime do begin TimeStep; wrUnits; if event=ESC then exit; end; end; wrConns; end; end; PROCEDURE remind; { Remind Output to every Pattern without R-Signal } var t: integer; begin - 22 -
writeln(dev,'Pattern-Reminding'); lernF:=false; for WSt:=1 to PNum do begin writeln(dev,'Pattern ',WSt); InitUnits; for t:=1 to PSTime do begin TimeStep; wrUnits; if event=ESC then exit; end; end; end; {-----------------} { Test-Procedures } {-----------------} PROCEDURE Test1; begin writeln(dev,'Init Example'); InitExample; end; PROCEDURE Test2; begin writeln(dev,'Test-Routine 2'); end; {--------------} { Menu-Control } {--------------} PROCEDURE wrMenu; { Write Menu in first screenline } begin window(1,1,80,1); TextBackGround(Blue); ClrScr; write('Save Load sTatus Help lerN reMind', ' DisturB Intr Cont test1/2 R'); window(1,3,80,48); TextBackGround(Black); end; PROCEDURE Menu; { wait for Key / Menu-selection } var ch:char; begin repeat ch:=ReadKey; chdo(ch); until ch='c'; end; PROCEDURE chdo(ch:char); { Branch on Menu-Selection ch } begin case ch of 's': SaveStatus; { Save status } 'l': LoadStatus; { Load status } 't': wrStatus; { write sTatus } 'h': Menu; { Help (not implemented) } 'n': lern; { lerN } 'm': remind; { reMind } 'd': dis1pat; { disturb 1 } - 23 -
'b': dis2pat; { disturb 2 } 'i': Menu; { Interrupt } 'c': { Continue procedure } writeln('Procedure Continued'); '1': Test1; '2': Test2; 'r': wrMenu; { Refresh } end; end; FUNCTION event:char; { look for keyboard-event } var ch:char; begin event:=none; if KeyPressed then begin ch:=ReadKey; chdo(ch); event:=ch; end; end; {--------------} { Main Program } {--------------} BEGIN TextMode(Font8x8+CO80); { Screen-Init. } TextColor(Yellow); { Color-Init. } Randomize; { Random-Generator-Init. } wrMenu; { write Menu } assignCrt(dev); { Output-Device-Init. } rewrite(dev); InitNet; { Net-Init } Menu; { Wait for Menu-Selection } close(dev); END. - 24 -
+-------------------------------------------------------------+ | 7. Protokoll von Beispiel 4 des Programms | +-------------------------------------------------------------+ Die Lernrate lr wurde auf 0.002 gesetzt, um auch bei diesem kleinen Beispiel die Oszillationen der Output-Units am Anfang der Lernphase gut erkennen zu können. In jeder Zeile sind die Aktivationen der 12 Units in Prozent ausgedruckt. Zur Bedeutung der einzelnen Units vergleiche Bild 3 Kap. 2. Pattern-Lerning U1 U2 U3 U4 U5 U6 U7 U8 U9 U10 U11 U12 Pattern 1 RE=2.00 -100 -100 -200 200 200 100 -100 100 300 0 -300 100 -100 -100 100 0 -200 300 300 -100 -100 300 -302 100 -100 -100 0 200 -200 0 -100 200 300 -298 -304 100 -100 -100 200 -200 -200 200 0 0 200 -0 -305 100 -100 -100 100 -0 -200 -100 -100 300 300 -0 -7 100 -100 -100 36 -0 -72 -0 -100 200 300 -300 -307 100 -100 -100 200 -200 -200 -0 -100 200 300 -5 -309 100 -100 -100 123 -45 -200 -100 -100 300 300 -5 -311 100 -100 -100 123 -46 -200 -100 -100 300 300 -302 -313 100 -100 -100 200 -200 -200 -100 -100 300 300 -304 -314 100 -100 -100 200 -200 -200 -100 -100 300 300 -306 -316 100 -100 -100 200 -200 -200 -100 -100 300 300 -307 -318 100 -100 -100 200 -200 -200 -100 -100 300 300 -309 -320 100 -100 -100 200 -200 -200 -100 -100 300 300 -311 -321 100 -100 -100 200 -200 -200 -100 -100 300 300 -313 -323 100 -100 -100 200 -200 -200 -100 -100 300 300 -314 -325 100 -100 -100 200 -200 -200 -100 -100 300 300 -316 -327 100 -100 -100 200 -200 -200 -100 -100 300 300 -318 -328 100 -100 -100 200 -200 -200 -100 -100 300 300 -320 -330 100 -100 -100 200 -200 -200 -100 -100 300 300 -322 -332 100 Pattern 2 RE=1.94 -100 100 100 0 -200 100 -100 100 300 -608 -11 100 -100 100 -44 -200 -112 0 -100 200 300 290 -311 100 -100 100 200 200 -200 100 100 100 100 -8 -313 100 -100 100 61 -77 -200 100 -100 100 300 292 285 100 -100 100 0 200 200 -100 -100 300 300 294 -313 100 -100 100 200 200 -200 200 200 0 0 -304 -315 100 -100 100 0 -200 -200 100 -100 100 300 -6 -17 100 -100 100 53 -60 -167 0 0 200 200 294 -317 100 -100 100 200 200 -200 -100 -100 300 300 -4 -19 100 -100 100 72 -43 -187 100 -100 100 300 -304 -319 100 -100 100 0 -200 -200 -100 -100 300 300 294 -321 100 -100 100 200 200 -200 0 0 200 200 -304 -323 100 -100 100 0 -200 -200 100 -100 100 300 -6 -24 100 -100 100 69 -61 -200 0 0 200 200 294 -325 100 -100 100 200 200 -200 -100 -100 300 300 -4 -26 100 -100 100 78 -44 -200 100 -100 100 300 -304 -327 100 -100 100 0 -200 -200 -100 -100 300 300 294 -329 100 -100 100 200 200 -200 0 0 200 200 -304 -330 100 -100 100 0 -200 -200 100 -100 100 300 -6 -32 100 -100 100 69 -63 -200 0 0 200 200 294 -333 100 Pattern 3 RE=1.91 100 -100 -100 -200 0 0 100 200 100 -605 -334 100 100 -100 0 -200 -200 100 200 100 0 -10 295 100 100 -100 -151 -102 200 0 0 200 200 290 -3 100 - 25 -
100 -100 115 200 -29 100 300 100 -100 -9 -3 100 100 -100 -28 -85 -30 100 -100 100 300 291 -303 100 100 -100 200 200 -200 100 100 100 100 293 -305 100 100 -100 200 200 -200 100 -100 100 300 295 293 100 100 -100 0 200 200 100 -100 100 300 297 -305 100 100 -100 200 200 -200 200 200 0 0 299 -307 100 100 -100 200 200 -200 100 -100 100 300 0 -8 100 100 -100 44 4 -84 100 -100 100 300 300 -309 100 100 -100 200 200 -200 18 -100 182 300 302 -310 100 100 -100 200 200 -200 100 -100 100 300 277 -312 100 100 -100 200 200 -200 100 -100 100 300 306 -314 100 100 -100 200 200 -200 100 -100 100 300 308 -316 100 100 -100 200 200 -200 100 -100 100 300 309 -317 100 100 -100 200 200 -200 100 -100 100 300 311 -319 100 100 -100 200 200 -200 100 -100 100 300 313 -321 100 100 -100 200 200 -200 100 -100 100 300 315 -323 100 100 -100 200 200 -200 100 -100 100 300 316 -324 100 Pattern 4 RE=1.87 100 100 -100 0 -200 100 -100 100 300 -912 264 100 100 100 0 -200 200 200 100 0 100 315 -303 100 100 100 0 200 -200 0 200 200 0 17 295 100 100 100 184 168 200 200 0 0 200 17 -3 100 100 100 70 171 -31 100 100 100 100 17 -3 100 100 100 71 173 -32 100 -100 100 300 318 297 100 100 100 200 200 200 100 -100 100 300 319 -301 100 100 100 0 200 -200 100 100 100 100 321 -303 100 100 100 0 200 -200 200 0 0 200 323 295 100 100 100 200 200 200 200 0 0 200 25 -3 100 100 100 84 200 -32 100 100 100 100 25 -3 100 100 100 84 200 -32 100 -100 100 300 325 297 100 100 100 200 200 200 100 -100 100 300 327 -301 100 100 100 0 200 -200 100 100 100 100 329 -303 100 100 100 0 200 -200 200 0 0 200 331 295 100 100 100 200 200 200 200 0 0 200 32 -3 100 100 100 84 200 -33 100 100 100 100 33 -3 100 100 100 83 200 -33 100 -100 100 300 333 297 100 100 100 200 200 200 100 -100 100 300 335 -302 100 100 100 0 200 -200 100 100 100 100 337 -303 100 Connection-Strength: 0 0 0 0 0 100 100 100 100 -300 -300 100 0 0 0 0 0 0 0 0 0 22 10 0 0 0 0 0 0 0 0 0 0 7 10 0 0 0 0 0 0 -100 -100 100 100 0 0 0 0 0 0 0 0 100 0 -100 0 0 0 0 0 0 0 0 0 0 100 0 -100 0 0 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 -25 0 Pattern 1 RE=1.84 -100 -100 100 -200 0 100 0 100 200 -12 -934 100 -100 -100 160 -120 -200 -100 0 300 200 281 -46 100 -100 -100 0 200 -200 -100 -100 300 300 -317 -47 100 -100 -100 200 -200 -200 200 0 0 200 -319 -348 100 -100 -100 200 -200 -200 -100 -100 300 300 -21 -49 100 -100 -100 200 -200 -200 -100 -100 300 300 -321 -350 100 -100 -100 200 -200 -200 -100 -100 300 300 -323 -352 100 -100 -100 200 -200 -200 -100 -100 300 300 -325 -354 100 -100 -100 200 -200 -200 -100 -100 300 300 -326 -355 100 - 26 -
-100 -100 200 -200 -200 -100 -100 300 300 -328 -357 100 -100 -100 200 -200 -200 -100 -100 300 300 -330 -359 100 -100 -100 200 -200 -200 -100 -100 300 300 -332 -360 100 -100 -100 200 -200 -200 -100 -100 300 300 -333 -362 100 -100 -100 200 -200 -200 -100 -100 300 300 -335 -364 100 -100 -100 200 -200 -200 -100 -100 300 300 -337 -365 100 -100 -100 200 -200 -200 -100 -100 300 300 -338 -367 100 -100 -100 200 -200 -200 -100 -100 300 300 -340 -369 100 -100 -100 200 -200 -200 -100 -100 300 300 -342 -370 100 -100 -100 200 -200 -200 -100 -100 300 300 -344 -372 100 -100 -100 200 -200 -200 -100 -100 300 300 -345 -374 100 Pattern 2 RE=1.78 -100 100 -200 -200 200 200 200 0 0 0 -265 100 -100 100 101 1 -200 100 300 100 -100 -15 -36 100 -100 100 27 -145 -200 6 -100 194 300 285 -337 100 -100 100 200 200 -200 -100 -100 300 300 74 -338 100 -100 100 200 200 -200 100 -100 100 300 -312 -340 100 -100 100 0 -200 -200 100 -100 100 300 287 -342 100 -100 100 200 200 -200 0 0 200 200 288 -343 100 -100 100 200 200 -200 100 -100 100 300 -10 -45 100 -100 100 51 -97 -200 100 -100 100 300 290 -346 100 -100 100 200 200 -200 -100 -100 300 300 292 -348 100 -100 100 200 200 -200 100 -100 100 300 -306 -349 100 -100 100 0 -200 -200 100 -100 100 300 292 -351 100 -100 100 200 200 -200 0 0 200 200 294 -353 100 -100 100 200 200 -200 100 -100 100 300 -4 -54 100 -100 100 78 -44 -200 100 -100 100 300 296 -355 100 -100 100 200 200 -200 -100 -100 300 300 297 -357 100 -100 100 200 200 -200 100 -100 100 300 -301 -359 100 -100 100 0 -200 -200 100 -100 100 300 297 -360 100 -100 100 200 200 -200 0 0 200 200 299 -362 100 -100 100 200 200 -200 100 -100 100 300 1 -64 100 Pattern 3 RE=1.74 100 -100 100 0 -200 300 300 -100 -100 -345 -39 100 100 -100 0 -200 -200 0 -100 200 300 -293 -324 100 100 -100 0 -200 -200 0 0 200 200 5 -326 100 100 -100 126 52 -200 0 0 200 200 5 -27 100 100 -100 126 52 -200 100 -100 100 300 5 -28 100 100 -100 127 53 -200 100 -100 100 300 305 -328 100 100 -100 200 200 -200 100 -100 100 300 307 -330 100 100 -100 200 200 -200 100 -100 100 300 309 -332 100 100 -100 200 200 -200 100 -100 100 300 311 -333 100 100 -100 200 200 -200 100 -100 100 300 313 -335 100 100 -100 200 200 -200 100 -100 100 300 314 -337 100 100 -100 200 200 -200 100 -100 100 300 316 -339 100 100 -100 200 200 -200 100 -100 100 300 318 -340 100 100 -100 200 200 -200 100 -100 100 300 320 -342 100 100 -100 200 200 -200 100 -100 100 300 321 -344 100 100 -100 200 200 -200 100 -100 100 300 323 -346 100 100 -100 200 200 -200 100 -100 100 300 325 -347 100 100 -100 200 200 -200 100 -100 100 300 327 -349 100 100 -100 200 200 -200 100 -100 100 300 328 -351 100 100 -100 200 200 -200 100 -100 100 300 330 -352 100 Pattern 4 RE=1.68 100 100 0 -200 200 0 100 200 100 312 247 100 100 100 200 200 200 0 200 200 0 57 287 100 100 100 200 200 200 100 100 100 100 58 -12 100 100 100 42 200 -117 100 100 100 100 359 288 100 100 100 200 200 200 100 -100 100 300 361 290 100 100 100 200 200 200 100 100 100 100 363 -308 100 100 100 0 200 -200 100 100 100 100 364 290 100 100 100 200 200 200 200 0 0 200 366 292 100 - 27 -
100 100 200 200 200 100 100 100 100 68 -6 100 100 100 68 200 -63 100 100 100 100 369 294 100 100 100 200 200 200 100 -100 100 300 370 295 100 100 100 200 200 200 100 100 100 100 372 -303 100 100 100 0 200 -200 100 100 100 100 374 295 100 100 100 200 200 200 200 0 0 200 375 297 100 100 100 200 200 200 100 100 100 100 77 -1 100 100 100 95 200 -10 100 100 100 100 378 299 100 100 100 200 200 200 100 -50 100 250 380 301 100 100 100 200 200 200 100 100 100 100 382 -297 100 100 100 0 200 -200 100 100 100 100 383 301 100 100 100 200 200 200 200 0 0 200 385 303 100 Connection-Strength: 0 0 0 0 0 100 100 100 100 -300 -300 100 0 0 0 0 0 0 0 0 0 41 24 0 0 0 0 0 0 0 0 0 0 22 25 0 0 0 0 0 0 -100 -100 100 100 0 0 0 0 0 0 0 0 100 0 -100 0 0 0 0 0 0 0 0 0 0 100 0 -100 0 0 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 -44 0 [ ... 7 weitere Lernrunden ... ] Pattern 1 RE=0.74 -100 -100 -200 200 200 -100 100 300 100 -300 300 100 -100 -100 0 -200 200 300 300 -100 -100 -399 27 100 -100 -100 0 -200 200 0 200 200 0 -400 -572 100 -100 -100 200 -200 -200 0 200 200 0 -101 -273 100 -100 -100 200 -200 -200 -100 -100 300 300 -103 -274 100 -100 -100 200 -200 -200 -100 -100 300 300 -404 -575 100 -100 -100 200 -200 -200 -100 -100 300 300 -405 -577 100 -100 -100 200 -200 -200 -100 -100 300 300 -406 -578 100 -100 -100 200 -200 -200 -100 -100 300 300 -407 -579 100 -100 -100 200 -200 -200 -100 -100 300 300 -408 -580 100 -100 -100 200 -200 -200 -100 -100 300 300 -410 -581 100 -100 -100 200 -200 -200 -100 -100 300 300 -411 -582 100 -100 -100 200 -200 -200 -100 -100 300 300 -412 -583 100 -100 -100 200 -200 -200 -100 -100 300 300 -413 -584 100 -100 -100 200 -200 -200 -100 -100 300 300 -414 -585 100 -100 -100 200 -200 -200 -100 -100 300 300 -415 -585 100 -100 -100 200 -200 -200 -100 -100 300 300 -416 -586 100 -100 -100 200 -200 -200 -100 -100 300 300 -417 -587 100 -100 -100 200 -200 -200 -100 -100 300 300 -418 -588 100 -100 -100 200 -200 -200 -100 -100 300 300 -419 -589 100 Pattern 2 RE=0.73 -100 100 0 -200 -200 100 200 100 0 -300 -598 100 -100 100 0 -200 -200 0 0 200 200 379 -91 100 -100 100 200 200 -200 0 0 200 200 81 -93 100 -100 100 200 200 -200 100 -100 100 300 82 -94 100 -100 100 200 200 -200 100 -100 100 300 383 -396 100 -100 100 200 200 -200 100 -100 100 300 384 -397 100 -100 100 200 200 -200 100 -100 100 300 386 -399 100 -100 100 200 200 -200 100 -100 100 300 387 -400 100 -100 100 200 200 -200 100 -100 100 300 388 -401 100 -100 100 200 200 -200 100 -100 100 300 389 -402 100 -100 100 200 200 -200 100 -100 100 300 391 -404 100 - 28 -
-100 100 200 200 -200 100 -100 100 300 392 -405 100 -100 100 200 200 -200 100 -100 100 300 393 -406 100 -100 100 200 200 -200 100 -100 100 300 394 -407 100 -100 100 200 200 -200 100 -100 100 300 395 -408 100 -100 100 200 200 -200 100 -100 100 300 397 -410 100 -100 100 200 200 -200 100 -100 100 300 398 -411 100 -100 100 200 200 -200 100 -100 100 300 399 -412 100 -100 100 200 200 -200 100 -100 100 300 400 -413 100 -100 100 200 200 -200 100 -100 100 300 401 -414 100 Pattern 3 RE=0.71 100 -100 0 200 200 100 200 100 0 -388 -500 100 100 -100 0 -200 -200 200 200 0 0 372 -86 100 100 -100 200 200 -200 0 0 200 200 73 -87 100 100 -100 200 200 -200 100 -100 100 300 75 -88 100 100 -100 200 200 -200 100 -100 100 300 376 -389 100 100 -100 200 200 -200 100 -100 100 300 377 -390 100 100 -100 200 200 -200 100 -100 100 300 379 -391 100 100 -100 200 200 -200 100 -100 100 300 381 -393 100 100 -100 200 200 -200 100 -100 100 300 382 -394 100 100 -100 200 200 -200 100 -100 100 300 384 -395 100 100 -100 200 200 -200 100 -100 100 300 386 -396 100 100 -100 200 200 -200 100 -100 100 300 387 -397 100 100 -100 200 200 -200 100 -100 100 300 389 -399 100 100 -100 200 200 -200 100 -100 100 300 390 -400 100 100 -100 200 200 -200 100 -100 100 300 392 -401 100 100 -100 200 200 -200 100 -100 100 300 394 -402 100 100 -100 200 200 -200 100 -100 100 300 395 -403 100 100 -100 200 200 -200 100 -100 100 300 397 -405 100 100 -100 200 200 -200 100 -100 100 300 398 -406 100 100 -100 200 200 -200 100 -100 100 300 400 -407 100 Pattern 4 RE=0.69 100 100 -100 0 -200 -100 0 300 200 -413 -15 100 100 100 -177 -200 -155 200 100 0 100 -30 77 100 100 100 0 -200 200 100 100 100 100 269 378 100 100 100 200 200 200 0 200 200 0 570 380 100 100 100 200 200 200 100 100 100 100 272 81 100 100 100 200 200 200 100 100 100 100 573 383 100 100 100 200 200 200 100 100 100 100 574 384 100 100 100 200 200 200 100 100 100 100 575 386 100 100 100 200 200 200 100 100 100 100 577 387 100 100 100 200 200 200 100 100 100 100 578 389 100 100 100 200 200 200 100 100 100 100 579 391 100 100 100 200 200 200 100 100 100 100 580 392 100 100 100 200 200 200 100 100 100 100 582 394 100 100 100 200 200 200 100 100 100 100 583 396 100 100 100 200 200 200 100 100 100 100 584 397 100 100 100 200 200 200 100 100 100 100 585 399 100 100 100 200 200 200 100 100 100 100 586 400 100 100 100 200 200 200 100 100 100 100 588 402 100 100 100 200 200 200 100 100 100 100 589 404 100 100 100 200 200 200 100 100 100 100 590 405 100 Connection-Strength: 0 0 0 0 0 100 100 100 100 -300 -300 100 0 0 0 0 0 0 0 0 0 99 92 0 0 0 0 0 0 0 0 0 0 92 100 0 0 0 0 0 0 -100 -100 100 100 0 0 0 0 0 0 0 0 100 0 -100 0 0 0 0 0 0 0 0 0 0 100 0 -100 0 0 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 0 0 0 0 0 0 0 0 300 0 - 29 -
0 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 -85 0 Pattern-Reminding U1 U2 U3 U4 U5 U6 U7 U8 U9 U10 U11 U12 Pattern 1 -100 -100 0 200 0 300 200 -100 0 -607 -892 100 -100 -100 0 -200 -200 200 100 0 100 -390 -277 100 -100 -100 0 -200 -200 0 0 200 200 -90 23 100 -100 -100 0 -200 200 0 0 200 200 -90 -277 100 -100 -100 0 -200 -200 0 200 200 0 -90 -277 100 -100 -100 0 -200 -200 0 0 200 200 -90 -277 100 -100 -100 0 -200 -200 0 0 200 200 -90 -277 100 -100 -100 0 -200 -200 0 0 200 200 -90 -277 100 -100 -100 0 -200 -200 0 0 200 200 -90 -277 100 -100 -100 0 -200 -200 0 0 200 200 -90 -277 100 Pattern 2 -100 100 0 0 -200 200 300 0 -100 -110 192 100 -100 100 0 -200 200 100 0 100 200 93 -377 100 -100 100 0 200 -200 0 200 200 0 393 -77 100 -100 100 0 200 -200 200 0 0 200 93 -77 100 -100 100 0 200 -200 200 0 0 200 93 -77 100 -100 100 0 200 -200 200 0 0 200 93 -77 100 -100 100 0 200 -200 200 0 0 200 93 -77 100 -100 100 0 200 -200 200 0 0 200 93 -77 100 -100 100 0 200 -200 200 0 0 200 93 -77 100 -100 100 0 200 -200 200 0 0 200 93 -77 100 Pattern 3 100 -100 0 -200 0 100 100 100 100 -207 -977 100 100 -100 0 -200 -200 0 100 200 100 407 207 100 100 -100 0 200 200 0 0 200 200 107 207 100 100 -100 0 200 200 200 200 0 0 107 -93 100 100 -100 0 200 -200 200 200 0 0 107 -93 100 100 -100 0 200 -200 200 0 0 200 107 -93 100 100 -100 0 200 -200 200 0 0 200 107 -93 100 100 -100 0 200 -200 200 0 0 200 107 -93 100 100 -100 0 200 -200 200 0 0 200 107 -93 100 100 -100 0 200 -200 200 0 0 200 107 -93 100 Pattern 4 100 100 0 -200 0 -100 0 300 200 -690 -577 100 100 100 0 -200 -200 0 100 200 100 -10 107 100 100 100 0 -96 200 0 0 200 200 290 407 100 100 100 0 200 200 0 200 200 0 290 107 100 100 100 0 200 200 200 200 0 0 290 107 100 100 100 0 200 200 200 200 0 0 290 107 100 100 100 0 200 200 200 200 0 0 290 107 100 100 100 0 200 200 200 200 0 0 290 107 100 100 100 0 200 200 200 200 0 0 290 107 100 100 100 0 200 200 200 200 0 0 290 107 100 [ Ende des Protokolls ] - 30 -