A. Steinmetz N EURONALE N ETZE IN B EZUG AUF M USTERERKENNUNG Vom biologischen Vorbild zum informatischen Modell A. Steinmetz N EURONALE N ETZE IN B EZUG AUF M USTERERKENNUNG Vom biologischen Vorbild zum informatischen Modell Ausbildungsjahr: Fach: Name: Prüfer: Koprüfer: Ausgabetermin des Themas: Abgabetermin der Facharbeit: Abgabeort WS 2002/ SS 2003 Informatik Andrea Steinmetz Stephan Gringard Dr. Jürgen Mayer-Gürr 13.12.2002 20.02.2003 Oberstufenkolleg Bielefeld Wenn unser Gehirn so simpel wäre, dass wir es verstehen könnten, wären wir so simpel, dass wir es nicht könnten. Emerson Puigh1 , Gehirnforscher 1 Emerson Puigh, BrainTech. Mind Machines und Bewusstsein, hg. v. Lutz Berger und Werner Pieper, Löhrbach 1989 Vorwort Diese Arbeit entstand im Rahmen der Abschlußprüfungen am OberstufenKolleg in Bielefeld als Facharbeit des Wahlfachs Informatik. Ausschlaggebend für die Wahl meines Themas war der Wunsch, das Studium der Informatik im Fachbereich Neuroinformatik an einer Universität fortzuführen. In dieser Arbeit habe ich versucht, eine knappe Einführung in die Grundlagen der Neuroinformatik zu geben. Ich hoffe, dabei die enge Verwandtschaft zweier Fachgebiete, der Biologie und der Informatik, aufgezeigt haben zu können. Ich möchte hier die Gelegenheit nutzen, mich bei den wissenschaftlichen Mitarbeitern des Oberstufen-Kollegs für ihre Hilfe zu bedanken, die mit Geduld und Sachkenntnis zu der Fertigstellung meiner Facharbeit beigetragen haben. Andrea Steinmetz Bielefeld, 17. Februar 2003 v vi Inhaltsverzeichnis Einleitung 4 1 Die Nervenzelle 5 1.1 Aufbau und Funktion eines Neurons . . . . . . . . . . . . . . . . 5 1.2 Das Myelin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2 Erregung von Nervenfasern 15 2.1 Das Ruhepotential . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.2 Das Aktionspotential . . . . . . . . . . . . . . . . . . . . . . . . 19 2.3 Die Reizfortpflanzung . . . . . . . . . . . . . . . . . . . . . . . . 24 3 Synaptische Erregungsübertragung 27 3.1 Die Synapse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 Die Informationsverarbeitung . . . . . . . . . . . . . . . . . . . 30 4 Visuelle Wahrnehmung 35 4.1 Ultrakurzzeit-Gedächtnis . . . . . . . . . . . . . . . . . . . . . . 35 4.2 Kurzzeit-Gedächtnis . . . . . . . . . . . . . . . . . . . . . . . . 36 4.3 Langzeit-Gedächtnis . . . . . . . . . . . . . . . . . . . . . . . . 37 4.4 Verarbeitung visueller Reize im Gehirn . . . . . . . . . . . . . . 40 5 Die Zellen eines Künstlichen Neuronalen Netzes 43 5.1 Aktivierungszustand . . . . . . . . . . . . . . . . . . . . . . . . 44 5.2 Ausgabefunktion . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.3 Propagierungsfunktion . . . . . . . . . . . . . . . . . . . . . . . 46 5.4 Aktivierungsfunktion . . . . . . . . . . . . . . . . . . . . . . . . 47 vii INHALTSVERZEICHNIS 6 Zellen eines KNN im Verbund 6.1 Netzwerktopologien . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.2 Verschiedene Formen der Aktivierung . . . . . . . . . . . . . . . 51 6.3 Methoden des Lernens . . . . . . . . . . . . . . . . . . . . . . . 53 6.4 Lernregel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 6.4.1 Hebbsche Lernregel . . . . . . . . . . . . . . . . . . . . . 55 6.4.2 Delta-Regel . . . . . . . . . . . . . . . . . . . . . . . . . 56 6.4.3 Backpropagation-Regel . . . . . . . . . . . . . . . . . . . 56 7 KNN-Modelle 59 7.1 Mustererkennung . . . . . . . . . . . . . . . . . . . . . . . . . . 59 7.2 Perzeptron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 7.3 Backpropagation . . . . . . . . . . . . . . . . . . . . . . . . . . 63 7.4 7.3.1 Backpropagation-Verfahren . . . . . . . . . . . . . . . . 63 7.3.2 Probleme der Backpropagation . . . . . . . . . . . . . . 67 7.3.3 Herleitung der Delta-Regel . . . . . . . . . . . . . . . . . 71 Hopfield-Netze . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 7.4.1 Binäre Hopfield-Netze . . . . . . . . . . . . . . . . . . . 73 7.4.2 Beweis der Stabilität von Hopfield-Netzen . . . . . . . . 73 8 Simulation eines KNN in JAVA viii 49 77 8.1 Typenklassendeklaration und Initialisierung der wichtigsten Komponenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 8.2 Das Erlernen von Mustern . . . . . . . . . . . . . . . . . . . . . 81 8.3 Die Hamming-Distanz . . . . . . . . . . . . . . . . . . . . . . . 84 8.4 Das Wiedererkennen von Mustern . . . . . . . . . . . . . . . . . 85 8.4.1 Analyse der fehlerhaften Programmfunktionen . . . . . . 88 8.4.2 Umsetzung der Wiedererkennung in Java . . . . . . . . . 90 INHALTSVERZEICHNIS Ausblick 95 Literaturverzeichnis 98 Anhang 98 A Java-Sourcecode 99 1 INHALTSVERZEICHNIS 2 Einleitung Technische Errungenschaften beruhen häufig auf dem Versuch, die Natur in ihrer Funktionsweise zu kopieren. Die Entwicklung der Computer lief anfänglich noch unabhängig davon ab. Zu Beginn dienten sie der Durchführung von Berechnungen. Im Laufe der Zeit wurden sie weiterentwickelt, sodass sie kompliziertere Speicherprozesse vornehmen konnten. Dadurch zeigten sie Ähnlichkeit mit dem menschlichen Gehirn. Dieses hat jedoch dem Computer gegenüber einen großen Vorteil: es kann Informationen assoziativ speichern. Ist bei einem Computer der Speicherort einer Information nicht bekannt, kann er nicht aus den übrigen gespeicherten Informationen erschlossen werden. Auch unzureichende Informationen können von einem Computer nicht verarbeitet werden, wohingegen das Gehirn Informationslücken assoziativ auffüllt. Ein Bereich, in dem sich Gehirn und Computer in ihrer Speicherung unterscheiden, ist die Mustererkennung. Um diese Differenz zum biologischen Vorbild zu überwinden, liegt es nahe, seine Funktionsweise zu simulieren. Diese Arbeit beschäftigt sich mit der Funktionsweise des menschlichen Gehirns bezüglich der Mustererkennung und dem Versuch, diese in informatische Modelle umzusetzen. Dazu werden im ersten Kapitel dieser Arbeit die Nervenzellen vorgestellt, die für die Informationsverarbeitung innerhalb des Gehirns zuständig sind. Sie werden durch elektrische Reize erregt, die bei der Mustererkennung von Rezeptoren innerhalb des Auges produziert werden. Um die Weiterleitung von Nervenreizen zu verstehen, wird der Aufbau und die chemischen Vorgänge vor, während und nach einer Erregung einer Nervenzelle in einem weiteren Kapitel beleuchtet. Die Kommunikation zwischen Nervenzellen ist ausschlaggebend für die Weiterverarbeitung der Informationen, die in das Gehirn gelangen. Wie es dazu kommt, dass nicht alle Zellen in gleicher Stärke ihre Impulse an ihre benachbarten Nervenzellen weitergeben, soll in einem darauf folgenden Kapitel erklärt werden. Der Teil, der sich mit dem menschlichen Gehirn beschäftigt, schließt mit einem Kapitel, dass sich mit der Speicherung von Informationen, dem Gedächtnis, beschäftigt, ab. Dabei soll ein kurzer Einblick in die Abläufe visueller Wahrnehmung gegeben werden. 3 INHALTSVERZEICHNIS Darauf folgt ein Teil der Arbeit, der zeigen soll, wie diese Nervenzellen und ihre Kommunikation untereinander in Modelle der Informatik umgesetzt werden. Dabei soll der Schwerpunkt im Aufzeigen der Analogien zwischen den beiden Fachbereichen Biologie und Informatik gelegt werden. Dieser Teil beginnt mit den einzelnen Komponenten der Modelle und der Vorstellung mathematischer Formeln, die die Vorgänge der Informationsweiterleitung von künstlichen Neuronen untereinander repräsentieren. Dabei soll gezeigt werden, wie sich unterschiedliche Verschaltungen künstlicher Neuronen untereinander auf die Funktionsweise eines Netzes aus mehreren Neuronen auswirkt. Ein weiteres Kapitel stellt einige der bekanntesten Modelle künstlicher neuronaler Netze vor, denen unterschiedliche Netzarchitekturen zugrunde liegen. Eines dieser vorgestellten Modelle ist das Hopfield-Netz, welches im letzten Teil der Arbeit die Grundlage für ein Programm bildet. Dabei soll dargestellt werden, wie die Informationen der vorangegangenen Kapitel in der Programmiersprache JAVA implementiert werden können. Die Arbeit schließt mit einem Ausblick auf zukünftige Entwicklungen auf dem Gebiet der künstlichen neuronalen Netze. 4 Kapitel 1 Die Nervenzelle Alle Lebewesen reagieren auf ihre Umwelt. Pflanzen zum Beispiel, richten ihre Blätter nach dem Sonnenlicht aus. Eine solche Reaktion läuft sehr langsam ab. Tiere und Menschen hingegen reagieren wesentlich schneller auf Reize. Dies verdanken sie den Nervenzellen, die nur im Tier-, jedoch nicht im Pflanzenreich vorkommen. Neben den Nervenzellen ist das Myelin ein weiterer wichtiger Bestandteil des Nervensystems. In den folgenden Kapiteln soll der Aufbau und die Funktionsweisen der Nervenzellen und des Myelins erläutert werden. 1.1 Aufbau und Funktion eines Neurons Nervenzellen, auch Neuronen oder Gangliazellen genannt, haben die Funktion der Informationsverarbeitung und -weiterleitung. Sie bilden somit das Bindeglied zwischen einem Reiz und der darauf folgenden Reaktion. Die Anzahl von Neuronen im menschlichen Gehirn kann nur geschätzt werden. Man vermutet, dass es mehr als 100 Milliarden1 sind. Die Anzahl der Neuronen, über die ein Mensch verfügt, steht schon vor seiner Geburt fest. Während der Embryonalphase verlieren Neuronen ihre Fähigkeit, sich zu teilen. Zu diesem Zeitpunkt sind bereits alle Neuronen gebildet und können sich ab da nicht weiter vermehren. Jedes Neuron ist wiederum mit anderen Neuronen verknüpft. Das Neuron hat, wie alle tierischen Zellen, eine Zellmembran (Plasmalemma), einen Zellkern (Nucleus) und Zellflüssigkeit (Cytoplasma). Zusammen bilden sie den Zellkörper, der die Bezeichnung Soma trägt (Abb. 1.1). Dendriten und Neuriten (Axone oder Nervenfasern) sind Fortsätze, die dem Soma entspringen. Dendriten können in unterschiedlicher Anzahl oder gar nicht auftreten. 1 1 Milliarde = 1000 Millionen = 109 5 1. Die Nervenzelle Abbildung 1.1: Schematische Darstellung eines Neurons. In der Mitte des Axons ist der Zellkern (Nucleus) zu erkennen. Sie sind für die Informationsaufnahme von anderen Neuronen zuständig, wohingegen die Axone genau einmal je Zelle vorkommen und Informationen an andere Neuronen abgeben. Sie enden entweder an Dendriten anderer Neuronen oder an deren Soma. Beachtenswert ist die Länge, die sie ausbilden können. Dendriten haben eine durchschnittliche Länge von 200 Mikrometern bis 300 Mikrometern 2 , Axone jedoch können bis zu einem Meter lang werden. Sowohl Dendriten als auch Axone können sich nach ihrem Abgang vom Soma weiter aufzweigen. Die Verzweigungen des Axons werden Kollaterale genannt. Neuronen treten in grosser Formenvielfalt auf. Anhand der Anzahl ihrer Fortsätze lassen sie sich jedoch klassifizieren (Abb. 1.2): • Unipolare Zellen haben keine Dendriten und ein Axon • Bipolare Zellen haben jeweils einen Dendriten und ein Axon • Multipolare Zellen haben viele Dendriten und ein Axon. Sie sind nur bei Wirbeltieren vorzufinden. Bei höher entwickelten Lebewesen ist das Axon durch eine fetthaltige Isolierschicht umgeben, dem Myelin. Das Myelin umgibt das Axon jedoch nicht kontinuierlich. Unter dem Lichtmikroskop sind Einschnürungen zu erkennen. Sie werden nach ihrem Entdecker Ranviersche Schnürringe genannt. Am Ende des Axons sitzt die Synapse, die die Kontaktstelle zum Nachbarneuron darstellt. Das Soma kann in Größen zwischen 5 µm und 100 µm vorkommen. Es enthält neben dem Zellkern, der das genetische Material enthält und die Lebensprozesse der Zelle kontrolliert, noch weitere Organellen, die in allen Zellen, die einen Zellkern haben, vorkommen (Abb. 1.3). Jede Organelle hat eine zellspezifische 2 6 1 mm = 1.000 µm = 1.000 Mikrometer 1.1. Das Neuron Abbildung 1.2: Verschiedene Neuronentypen Aufgabe. Dicht dem Nucleus angesiedelt ist das endoplastische Retikulum. Es fungiert als Transport- und Sammelsystem der Zelle. In seinem Inneren werden Produkte (hauptsächlich Proteine) synthetisiert, die dann über die Membran in das Cytoplasma abgegeben werden. Das endoplastische Retikulum ist in Kompartimente aufgeteilt, den Zisternen. Auf ihnen sitzen kleine runde Partikel, die aus RNA3 und Proteinen bestehen. Diese sogenannten Ribosomen habe die Aufgabe der Proteinbiosynthese. Weitere Organellen sind die Mitochondrien. Sie sind für die Zellatmung zuständig. In ihrem Inneren wird durch Nährstoffabbau ATP4 produziert. ATP setzt bei Abspaltung seines Phosphatanteils Energie frei und ist damit ein wichtiger Energielieferant. Das Dictyosom (Golgi-Apparat) nimmt die am endoplastischen Retikulum synthetisierten (Glyco-)Proteine auf und modifiziert sie je nach ihrem Bestimmungsort. Die aus dem Golgi-Apparat austretenden Proteine werden mittels Vesikel innerhalb der Zelle an ihren Bestimmungsort transportiert. Bei Proteinen, die außerhalb der Zelle benötigt werden, verschmelzen die Vesikel mit der Zellmembran und geben dabei ihren Inhalt an das Zelläußere ab. Wie das endoplastische Retikulum, besteht auch der Golgi-Apparat aus mehreren Zisternen, die unterschiedliche Enzyme enthalten, die unterschiedliche Aufgaben bei der Proteinmodifikation übernehmen. Die für die intrazellulare Verdauung zuständige Organelle ist das Lyosom. Die 3 4 Ribonucleinsäure Adenosintriphosphat 7 1. Die Nervenzelle Abbildung 1.3: Schematische Darstellung einer Zelle mit ihren Organellen Membran des Lyosoms umschließt eine Vielzahl unterschiedlicher Enzyme, die die Fähigkeit der Zerlegung von Makromolekülen besitzen. 1.2 Das Myelin Die meisten Nervenfasern sind von einer Myelinschicht umhüllt. Je dicker eine Nervenfaser ist, umso dicker ist auch die sie umschließende Myelinschicht. Ein Schnitt durch eine myelinisierten Nervenfaser zeigt, dass das Myelin in mehreren Schichten um das Axon anlagert ist (Abb. 1.4). Erkennbar ist das an den dunklen und hellen Linien, die spiralförmig um das Axon liegen. In Abständen von 0,8-2 mm fehlt bei den myelinisierten Nervenfasern die Myelinhülle, so dass die Umhüllung eingeschnürrt erscheint. Diese Einschnürungen heißen Ranviersche Schnürringe5 (Abb. 1.5). Untersuchungen in den dreißiger Jahren des letzten Jahrhunderts haben gezeigt, dass sich das Myelin aus einer 5,5 Nanometer6 dicken Lipidschicht und einer drei Nanometer dicken Proteinschicht zusammensetzt, die abwechselnd aufeinander folgen. Diese Struktur des Myelins gleicht auffallend der von Zellmembranen. Die Entdeckung der Schwann-Zellen zeigte den Grund dieser Ähnlichkeit, denn das Myelin wird nicht von der Nervenzelle selbst produziert, 5 6 8 nach ihrem Entdecker Louis Ranvier benannt 1 Nanometer = 1nm = 1 Millionstel Millimeter 1.2. Das Myelin Abbildung 1.4: Mikroskopie eines Schnitts durch ein Axon mit Myelinschicht Abbildung 1.5: Rasterelektronenmikroskopische Aufnahme von einem Axon mit Myelinschicht sondern stammt von den Membranen der Schwann-Zelle. Die Bildung des Myelins ist abhängig von der Lage des Axons im Nervensystem. Befindet sich das Axon außerhalb von Hirn und Rückenmark, spricht man von peripheren Nervenfasern. Ihr Myelin wird von den Schwannschen Zellen gebildet. Nerven innerhalb von Hirn und Rückenmark bilden das Zentralnervensystem. Die Aufgabe der Myelinbildung im Zentralnervensystem übernehmen die Oligodendrocyten. Eine Schwann-Zelle erzeugt einen zwischen zwei Ranvierschen Schnürringen liegenden Abschnitt der Myelinhülle. Der Prozess der Umwicklung beginnt mit der Anlagerung der Schwann-Zelle an eine Nervenfaser (Abb. 1.6). Sie bildet ihre Membran zu einer flachen Zunge aus, die das Axon im Laufe der Zeit mehrfach umwickelt. Dabei wird fast das gesamte Zellplasma aus der Membran heraus gedrückt. Bei nur einer Umwindung liegen dem Axon also zwei Membranen an. Bestimmte Proteine (basische Proteine), die auf der Innenseite der Zellmembran liegen, bewirken, dass die Innenseiten der Membran miteinander verschmelzen. Dabei entstehen die in der mikroskopischen Aufnahme sichtbaren dunklen Linien. Die Außenseiten der Schwannschen Zellmembran besitzt dieses Protein nicht. Daher berühren sich benachbarte Windungen nur und verschmelzen nicht miteinander. 9 1. Die Nervenzelle Abbildung 1.6: Bildung der Myelinscheide Oligodendrocyten sind Stützstellen, die Myelin produzieren (Abb. 1.7). Sie bilden Fortsätze aus, die zu den Axonen hinwachsen und sie einhüllen. Jedes Myelinsegment eines Axons wird von einer anderen Stützstelle gebildet. Ein Oligodendrocyt kann bis zu vierzig solcher Fortsätze haben. Die Vorteile von Myelin Myelin ist, bedingt durch seinen hohen Fettanteil, wasserabweisend und damit ein guter Isolator für Axone, durch die elektrische Impulse laufen. Aber es gibt noch zwei weitere Vorteile: den der Geschwindigkeitserhöhung und den der Energieeinsparung. Durch myelinisierte Nervenfasern läuft ein elektrisches Signal schneller als durch ein Axon ohne Myelinmantel. Die Geschwindigkeit, mit der sich Signale in einer Nervenfaser fortpflanzen können, hängt von ihrer Dicke ab und dem Umstand, ob die Nervenfaser isoliert ist oder nicht. Ist sie nicht isoliert, steigt die Geschwindigkeit des sie durchlaufenden Impulses proportional zu der Quadratwurzel ihres Durchmessers. Das würde bedeuten, dass sich bei einem vierfachen Durchmesser die Geschwindigkeit nur verdoppelt. Ist die Nervenfaser hingegen durch eine Myelinschicht geschützt, pflanzt sich das Signal mit einer Geschwindigkeit proportional zur Dicke der Faser fort, das heißt, dass ein Axon mit vierfachem Durchmesser ein Signal auch in vierfacher Geschwindigkeit weiterleiten kann. Bei gleicher Geschwindigkeit benötigt also die myelinisierte Nervenfaser weniger Platz als die ohne Myelin. Wären die Nervenfasern im menschlichen Rückenmark nicht von einer Myelinschicht umgeben, müsste es einen Durchmesser von mehre10 1.2. Das Myelin Abbildung 1.7: Schematische Darstellung der Myelinisierung durch ein Oligodendrocyt (Bildmitte). ren Metern haben, um den von ihr geforderten Leistungen gerecht werden zu können ([Mor1980]). Myelin hat auch einen positiven Einfluss auf den Energieverbrauch. Eine zwölf Mikrometer dicke Nervenfaser eines Frosches leitet die Signale mit einer Geschwindigkeit von 25 Metern pro Sekunde. Die gleiche Geschwindigkeit erzielt die Nervenfaser eines Tintenfisches. Sie ist unmyelinisiert und benötigt deshalb einen Durchmesser, der vierzigmal so groß ist wie die des Frosches. Gewaltig erscheint jedoch der Unterschied im Energiebedarf. Er ist beim Tintenfisch fünftausendmal höher als beim Frosch. Das menschliche Gehirn kann also Dank des Myelins Reize sehr schnell aufnehmen und verarbeiten, benötigt dabei wenig Platz und Energie. Wie aktiv das Gehirn ist, verdeutlicht die Tatsache, dass es trotzdem noch etwa zwanzig Prozent der Energie des Gesamtumsatzes für die Arbeit des Nervensystems verwendet. Ist die Myelinproduktion gestört oder verlieren Nervenfasern ihre Myelinschicht, kann dies schwerwiegende Folgen auf die Gesundheit haben, die von Taubheitsgefühlen bis hin zu Lähmungserscheinungen und Erblindung reichen. Eine Krankheit, bei der die Myelinschicht abgebaut wird, ist die Multiple Sklerose. 11 1. Die Nervenzelle Molekulare Zusammensetzung Wie bereits erwähnt, ist Myelin eine Zellmembran. Membrane bestehen (unter anderem) aus Proteinen und Eiweißstoffen (Lipide), welche die Eigenschaft besitzen, Wasser und wasserlösliche Stoffe abzustoßen. Im Vergleich mit der Membran von Leberzellen fällt auf, dass beide gleichartige Moleküle, diese jedoch in unterschiedlichen Mengenverhältnissen besitzen (Abb. 1.8). Durch verschiedene Labormethoden kann man die Abbildung 1.8: Mengenverhältnisse zwischen Proteinen und Lipiden bei Membranen und Myelin Lipide aus dem Myelin isolieren und untersuchen. Sie bestehen aus Cholesterin, Phospholipiden und Glycolipiden. Phospholipide enthalten alle ein Phosphoratom. Glycolipide sind fettartige Substanzen mit einem Zuckermolekül. Einen prozentual großen Anteil der Lipide im Myelin nimmt ein Glycolipid mit dem Namen Cerebrosid ein (Abb. 1.9). Sein Zuckermolekül ist die Galactose, die den wasserlösliche Teil des Cerebrosid ausmacht. Als Beispiel für ein Molekül aus der Phospholipidgruppe des Myelins kann das Phosphatidylcholin genannt werden. Wie das Cerebrosid enthält auch das Phosphatidylcholin ein wasserlösliches Molekül. Auch die Proteine von Myelin unterscheiden sich von denen anderer Membranen. Die meisten Membrane bestehen aus einer Vielzahl unterschiedlicher Proteine, von denen keines überwiegt. Myelin enthält weniger verschiedene Arten von Proteinen. Von diesen bilden zwei Proteinarten einen Großteil. Die einen sind die bereits erwähnten basischen Proteine, die anderen sind Lipoproteine. Sie sind in die Außenseite der Myelinmembran eingebettet. Der Einfluß der Ernährung auf die Bildung von Myelin Der Prozess der Myelinisierung läuft parallel zur Entwicklung der Nervenfasern. Da die12 1.2. Das Myelin Abbildung 1.9: a: Phosphatidcholin, b: Cerebrosid, c: Cholesterin. Die großen Kreise indizieren die Moleküle, die wasserlöslich sind. se Entwicklung hauptsächlich in den ersten drei Lebensmonaten abläuft, wird dann auch der größte Teil des Myelins produziert. Einseitige oder unzureichende Ernährung in dieser Zeit kann dazu führen, dass nicht ausreichend Myelin produziert wird. Versuche an Ratten haben gezeigt, dass das Gehirn von unterernährten Ratten im Vergleich zu denen von normal ernährten Ratten 40% weniger Verknüpfungen von Nervenzellen ausgebildet hat. Da das Myelin zum Teil aus Eiweißen besteht, ist eine eiweißhaltige Ernährung der Bildung von Myelin zuträglich. 13 1. Die Nervenzelle 14 Kapitel 2 Erregung von Nervenfasern Der menschliche Organismus ist in der Lage, eingehende Informationen an die Zentren im Gehirn weiterzuleiten, die für die Verarbeitung dieser Informationen zuständig sind. Informationen haben im Nervensystem die Form von elektrischen Reizen. Diese wiederum entstehen durch die Veränderung des Spannungsunterschiedes, der zwischen dem Zellinneren eines Neurons und dem ihm umgebenden Raum herrscht. Die folgenden Kapitel erklären, welche Bedingungen erfüllt sein müssen, damit ein Reiz von einem Neuron weitergeleitet wird und welche elektrochemischen Veränderungen an der Zellmembran der Neuronen ablaufen. 2.1 Das Ruhepotential Erkenntnisse über elektrische Vorgänge innerhalb von Nervenzellen lassen sich durch Messungen gewinnen, die man an ihnen vornimmt. Derzeitige Messmethoden sind soweit fortgeschritten, dass sie Untersuchungen an Nervenfasern gewöhnlicher Größe zulassen. Zur Untersuchung werden zwei Messelektroden benötigt (Abb. 2.1). Die eine Elektrode (M1 ) besteht aus einem dünnen Glasröhrchen, das mit einer leitenden Flüssigkeit, einem Elektrolyt, gefüllt ist. Die andere Elektrode ist ein Metallplättchen (M2 ). Zu Beginn der Untersuchung liegen beide Elektroden im extracellulärem Raum. Der Spannungsmesser (in der Abbildung mit Oszilloskop bezeichnet), der beide Elektroden miteinander verbindet, zeigt keine Spannungsdifferenz an. Man nennt dies extracelluläres Potential. Elektrische Spannung wird in Volt, in diesem Fall in Millivolt (mV), gemessen. Das extracelluläre Potential beträgt also 0 mV. Sticht man mit der Glaskapillare in einen Neuriten, zeigt der Spannungsmesser eine negative Differenz an (in der 15 2. Erregung von Nervenfasern Abbildung 2.1: Messung des Ruhepotentials Abbildung durch einen Pfeil gekennzeichnet). Je nach Zelltyp kann sie zwischen -60 mV und -110 mV liegen. Diese Spannungsdifferenz zwischen dem Intracellulärraum einer unerregten Nervenzelle und ihrem Extracellulärraum wird als Ruhepotential bezeichnet. Ursache des Zustandekommens des Ruhepotentials Da bei der Messung des Ruhepotentials eine negative Spannungsdifferenz angezeigt wird, muss im Intracellulärraum ein Überschuss an negativer Ladung gegenüber dem Extracellulärraum bestehen. In wässrigen Lösungen zerfallen Moleküle in Ionen, das sind negativ, bzw. positiv geladene Teilmoleküle. Sowohl der Intra- als auch der Extracellulärraum ist mit einer wässrigen Salzlösung angefüllt. Innerhalb eines Neuriten ist keine Spannungsdifferenz messbar, d.h. es gibt genauso viele negativ geladene Ionen, genannt Anionen, wie positiv geladene, Kationen genannt. Gleiches gilt für den Extracellulärraum, da sein Potential ebenfalls 0 mV beträgt. Der Grund für die Entstehung einer Spannungsdifferenz zwischen beiden Räumen liegt in der Durchlässigkeit (Permeabilität) der Membran, die beide voneinander trennt. Diese Membran ist selektiv durchlässig. Das bedeutet, dass verschiedene Ionen unterschiedlich gut durch die Membran diffundieren können. Untersuchungen an der Zellmembran von Neuriten haben gezeigt, dass sie für Kalium (K+ )-Ionen, die sowohl im Intra- als auch im Extracellulärraum vorkommen, besonders gut durchlässig ist. Für weitere Ionen, die sowohl im Zellinneren wie auch im Zelläußeren auftreten, ist die Membran weniger permeabel. In Bezug auf die Durchlässigkeit von K+ -Ionen beträgt die Durchlässigkeit von Chlorid (Cl− )-Ionen etwa 45% und für Natrium (Na+ )-Ionen sogar nur 4%. K+ -Ionen treten im Zellinneren in sehr viel höherer Konzentration als im Zelläußeren auf (Abb. 2.2), weshalb die Wahrscheinlichkeit, dass sie vom Intracellulärraum in den Extracellulärraum durch die Membran diffundieren höher 16 2.1. Das Ruhepotential ist, als auf umgekehrtem Wege. Man spricht hier vom osmotischen Druck, der die Ionen zur Diffusion bewegt. Dieser Diffusionsprozess könnte jetzt so lange ablaufen, bis sowohl im Zellinneren als auch im Zelläußeren die gleiche K+ -Ionenkonzentration erreicht ist. Das ist jedoch nicht der Fall. Dafür verantwortlich ist die positive Ladung von K+ -Ionen. Wie bereits erwähnt, herrscht im Zellinneren eine hohe K+ -Ionenkonzentration. Dem gegenüber steht eine nahezu genauso hohe Konzentration von negativ geladenen Eiweißanionen (A− ), die das Spannungsgleichgewicht im Zellinneren entstehen lässt. Durch ihre gegensätzliche Ladung ziehen sich beide Ionen einander an (elektrostatische Kraft). Diffundiert nun ein K+ -Ion durch die Zellmembran, wird es vom Eiweißanion, das nicht durch die Membran dringen kann, vom Zellinneren aus festgehalten. Da das Eiweißanion ’größer’ als das K+ Ion ist, macht es die Membran Abbildung 2.2: Prozentuale Ionenverteilung im an der Stelle undurchlässig für Intra- und Extracellulärraum weitere Kaliumionen. Das Ruhepotential entsteht daher an der Zellmembran. Es bestehen also zwei Kräfte, die gegeneinander wirken: die elektrostatische Kraft und der osmotische Druck. Die Diffusion durch die Membran dauert solange an, bis sich ein Gleichgewicht zwischen diesen Kräften eingestellt hat. Dadurch erreicht das Membranpotential einen konstanten Wert. Dieses Gleichgewichtspotential lässt sich mit Hilfe der Nernstschen Gleichung errechnen. Errechnen des Ruhepotentials mit der Nernstschen Gleichung Die allgemeine Form der Nernstschen Gleichung lautet: Eion = R∗T Ca ∗ ln( ) z∗F Ci Dabei stellen die Variablen folgende Werte dar: Eion R T z = = = = das Gleichgewichtspotential [mV] die Gaskonstante (8,3143 J K−1 mol−1 ) absolute Temperatur (293 K, das entspricht 20°C) die Valenz (Ladung) des Ions1 17 2. Erregung von Nervenfasern F = die Farady-Konstante (96.487 C mol−1 ) Ca = die Konzentration des Ions außerhalb der Zelle [mmol l−1 ] Ci = die Konzentration des Ions innerhalb der Zelle [mmol l−1 ] Die Konstanten und die Temperatur lassen sich für die Berechnung des Kaliumgleichgewichtspotentials zu einem Wert zusammenfassen2 . EK + Ka+ = 25mV ∗ ln( + ) Ki Mit den Werten für die Kaliumkonzentration im Intracellulärraum (410 mmol l−1 ) und Extracellulärraum (10 mmol l−1 ), lässt sich dann der Wert berechnen3 . EK + = 25mV ∗ ln(0, 024) EK + = 25mV ∗ (−)3, 7 EK + = −92, 5mV Vergleicht man das Ergebnis mit dem in der Abbildung 2.1 gemessenen Wert, erkennt man, dass der errechnete Wert kleiner ist. Das liegt daran, dass Kalium nicht alleine zum Ruhepotential beiträgt. Um zu einem identischen Ergebnis zu gelangen, müssen weitere Werte in die Gleichung aufgenommen werden. Dazu gehören die Konzentrationen von Na+ und Cl− und die für diese Ionen entsprechende Durchlässigkeit (g) der Membran. − Ka+ + gN a ∗ N a+ a + gCl ∗ Cli E = 25mV ∗ ln( + ) − Ki + g N a ∗ N a + i + gCl ∗ Cla Die Konzentrationen von Cl− sind deshalb vertauscht eingesetzt, weil sie im Gegensatz zu K+ und Na+ negativ geladen sind. Dabei ist: N a+ a N a+ i = 460 mmol dm−3 = 50 mmol dm−3 J Dabei gelten folgende Umformungsregeln: V = C und 1 V = 1.000 mV 3 bei Werten, die kleiner als 1 sind, ergeben sich unter Anwendung des natürlichen Logarithmus’ negative Werte. 2 18 2.2. Das Aktionspotential gN a Cla− Cli− gCl = = = = 0,04 540 mmol dm−3 60 mmol dm−3 0,45 Diese Werte in obige Gleichung eingesetzt ergibt: E = −62mV Dieser Wert stimmt mit dem gemessenen Wert überein. 2.2 Das Aktionspotential Wird eine unerregte Nervenzelle durch einen Reiz erregt, ändert sich ihr Ladungszustand. Für einen kurzen Zeitraum wechselt ihre Ladung vom Negativen zum Positiven und kehrt anschließend wieder zu ihrem ursprünglichen Zustand zurück. Diese kurzfristige Veränderung wird Aktionspotential genannt, man sagt auch: ein Neuron feuert. Eine Voraussetzung für die Entstehung des Aktionspotentials ist das Ruhe- Abbildung 2.3: Spannungskurve des Aktionspotentials potential. Wird eine Nervenzelle erregt, wird die in ihrem Inneren bestehende negative Ladung abgebaut. In der Abbildung 2.3 ist dies durch den Anstieg der Spannungskurve erkennbar. Diese Phase des Aktionspotentials wird als Aufstrich bezeichnet. Da die Zelle beim Aufstrich ihre negative Ladung verliert, nennt man den Aufstrich auch Depolarisationsphase. Das Potential erreicht in 19 2. Erregung von Nervenfasern dieser Phase positive Werte. Der Anteil, den die positiven Werte beim Aktionspotential ausmachen, wird als Überschuss bezeichnet. Langsamer als die Depolarisation verläuft die Repolarisation - die Phase, in der die negative Ladung im Zellinneren wieder aufgebaut wird. Nähert sich die Ladung wieder ihrem ursprünglichen Zustand, verlangsamt sich die Repolarisation weiter. Am Ende dieser Phase können Nachpotentiale entstehen. Unterschreitet das Potential nach der Repolarisation den Wert des Ruhepotentials, spricht man vom hyperpolarisierndenem Nachpotential. Bleibt das Potential noch eine kurze Zeit oberhalb des Ruhepotentials, bevor es dieses erreicht, spricht man vom depolarisierendem Nachpotential. Die Zeitspanne, in der die Spannung während des Aktionspotentials von der des Ruhepotentials abweicht, wird Refraktärphase genannt. Die Dauer der Refraktärzeit ist von Zelle zu Zelle unterschiedlich. Bei Nervenzellen dauert sie nur etwa eine Millisekunde. Der Herzmuskel benötigt das 200-fache dieser Zeit, um seinen ursprünglichen Ladungswert wieder hergestellt zu haben. Das Aktionspotential kann durch einen Reiz ausgelöst werden. Dabei ist die Stärke des Reizes für die Auslösung entscheidend (Abb. 2.4). Wird der Ladungszustand des Intracellulärraums eines Neurons bis zu Abbildung 2.4: Auslösebedingungen für das Aktionspotential einem gewissen Wert verändert, wird das Aktionspotential nicht ausgelöst. Wird dieser Wert, der als Schwellenwert bezeichnet wird, überschritten, wird es ausgelöst und läuft dann unabhängig von der Höhe des den Schwellenwert überschreitenden Wertes ab. Diese Tatsache wird als Alles-oder-Nichts“-Regel ” 20 2.2. Das Aktionspotential des Aktionspotentials bezeichnet. Ist das Aktionspotential einmal ausgelöst worden, befindet sich die Zelle in einem unerregbaren Zustand. Während der Refraktärzeit eintreffende Reize werden nicht verarbeitet. Ursachen der Spannungsveränderung. Wird ein Neuron über seinen Schwellwert hinaus gereizt, verändern sich die Eigenschaften seiner Membran. Wie auch beim Ruhepotential sind Verschiebungen von Ionen an der Membran für eine Veränderung des Spannungsunterschiedes verantwortlich. Bei einer unerregten Nervenzelle ist die Membran durchlässig für Kalium- und Natriumionen. Durch eine Kalium-Natrium-Pumpe, die Natrium aus dem Intracellulärraum durch die Membran in den Extracellulärraum zurück leitet, fällt die positive Ladung von Natrium bei der Berechnung des Ruhepotentials jedoch nicht ins Gewicht. Wird das Neuron erregt, erhöht sich sprunghaft ihre Leitfähigkeit für Natriumionen (Abb. 2.5). Außerhalb der Zelle herrscht eine sehr viel höhere Natriumkonzentration als innerhalb der Zelle, so dass ein Konzentrationsgefälle vorliegt, das Natriumionen veranlasst, die Membran von Aussen nach Innen zu durchdringen (osmotischer Druck). Während der Erregung übertrifft die Leitfähigkeit für Natriumionen die für Abbildung 2.5: Membranleitfähigkeit während des Aktionspotentials. Oben Zeitverlauf eines Aktionspotentials, darunter Zeitverlauf der Membranleitfähigkeit von Natriumionen (gN a ) und Kaliumionen (gK ) während des Aktionspotentials Kaliumionen. Durch das Eindringen von Natriumionen erhöht sich die positive Ladung im Zellinneren und der negative Spannungsunterschied zwischen Intraund Extracellulärraum wird kompensiert. Währenddessen steigt die Kaliumleitfähigkeit der Membran weiter an, bis sie mehr als das Hundertfache ihres ursprünglichen Wertes erreicht hat. Die Natriumionen würden jetzt solange in die Zelle einströmen, bis sich der osmotische Druck abgebaut haben würde. Wäre das der Fall, müsste der höchste gemessene Spannungswert bei etwa +60 mV liegen. In der Abbildung 2.3 sieht 21 2. Erregung von Nervenfasern man jedoch, dass der Wendepunkt der Spannungskurve bei +30 mV liegt. Das hat zwei Gründe: • Die Natriumionen-Leitfähigkeit der Membran hält nicht lange genug an, um so viele Natriumionen durchzulassen, bis ein Spitzenwert von +60 mV erreicht werden kann. • Neben der Erhöhung der Leitfähigkeit von Natriumionen wird auch die Leitfähigkeit von Kaliumionen mit einer Verzögerung von etwa 1 ms verstärkt. Somit wird die positive Ladung im Zellinneren wieder abgebaut. Ist also die Spitze der Spannungskurve erreicht, werden die Poren, die Natriumionen in die Zelle lassen, wieder geschlossen und die Poren, die Kaliumionen, die für die Entstehung des Ruhepotentials verantwortlich sind, durchlassen, erhöhen ihre Aktivität, sodass die Spannungskurve wieder sinkt. Der Ladungsausgleich ist am Ende dieses Prozesses im Intra- und Extracellulärraum wieder hergestellt. Die Mengenverhältnisse von Natrium- und Kaliumionen haben sich jedoch sowohl außerhalb als auch innerhalb der Zelle verändert. Um dieser Veränderung entgegenzuwirken und die ursprünglichen Mengenverhältnisse wieder herzustellen, erhöhen die bereits erwähnten Natrium-Kalium-Pumpen ihre Tätigkeit und transportieren Natriumionen aus dem Zellinneren ins Zelläußere und Kaliumionen aus dem Zelläußeren ins Zellinnere. Damit ist das Ruhepotential wieder hergestellt. In der Abbildung 2.6 sind die Vorgänge in der Membran während des Aktionspotentials schematisch dargestellt. Jedes einzelne Teilbild zeigt dabei den Zustand der Poren, die Natriumionen durchlassen (eckig dargestellt) und denen, die Kaliumionen durchlassen (rund dargestellt). Diese Abbildung vernachlässigt aus Gründen des besseren Verständnisses die Tatsache, dass die Kaliumionen durchlassenden Poren auch schon während des Ruhepotentials geöffnet sind. Die Menge der Ionen, die die Membran während des Aktionspotentials durchdringen, ist im Verhältnis zu denen, die die Zelle umgeben, relativ klein. Das bedeutet auch, dass die Menge der Natriumionen, die während des Aktionspotentials in die Zelle eindringt, nur einen Bruchteil der Menge der Natriumionen ausmacht, die die Zelle umschließt. Schaltet man die für den Rücktransport der Natriumionen aus dem Extra- in den Intracellulärraum verantwortliche Natrium-Kalium-Pumpe aus, können noch Tausende von Aktionspotentialen ablaufen, ehe der Natriumgehalt außerhalb der Zelle so hoch geworden ist, dass 22 2.2. Das Aktionspotential Abbildung 2.6: Vorgänge in der Membran während des AP die Zelle unerregbar wird. Der Einfluss der Natriumkonzentration im Extracellulärraum auf das Ruhepotential ist nahezu unerheblich. Das Ruhepotential würde unter einer solchen Bedingung um etwa 10 mV geringer werden. Der Einfluss auf das Aktionspotential ist jedoch um ein Vielfaches größer. Das Aktionspotential entfaltet sich nicht mehr in seiner gewohnten Größe. Das heißt, dass der Überschuss abnimmt und sich der Aufstrich verlangsamt. Die Unerregbarkeit der Neuronen ist dann erreicht, wenn der Natriumgehalt im Extracellulärraum auf ein Zehntel seiner Ursprünglichen Konzentration absinkt. Beschleunigen kann man diesen negativen Effekt, indem man die Natriumkonzentration im Innern des Neurons erhöht. Da das Konzentrationsgefälle zwischen Intra- und Extracellulärraum nicht mehr so stark ist, ist auch der osmotische Druck schwächer. Die Geschwindigkeit der in die Zelle einströmenden Natriumionen verringert sich und die Zelle wird nicht mehr in gleicher Höhe depolarisiert. Funktionsweise der Natrium-Kalium-Pumpe. Im Intracellulärraum befindet sich ein Trägermolekül (in der Abbildung 2.7 mit A’ bezeichnet), das die Eigenschaft besitzt, sich mit Natriumionen verbinden zu können. Die Ionenpumpe kann diese Verbindung in den Extracellulärraum leiten. Dort löst sich diese Verbindung wieder. Ein Enzym verändert das Trägermolekül so, 23 2. Erregung von Nervenfasern dass es nun Natriumionen binden kann (in den Abbildung mit A’ bezeichnet). Diese neue Verbindung diffundiert nun durch die Membran ins Zellinnere und zerfällt dort wieder. Das veränderte Trägermolekül wird nun wieder durch ein Enzym in seinen ursprünglichen Zustand zurück verwandelt, so dass es wieder Natriumionen binden kann. Bei diesem Umwandlungsprozess wird Energie benötigt, die aus dem Abspalten eines Phosphatteils von ATP gewonnen wird. Dabei wird ADP4 gebildet. Für jedes Natriumion, das die Membran nach außen passiert, wird ein Kaliumion in den Intracellulärraum geleitet. Abbildung 2.7: Mechanismus der Ionenpumpe 2.3 Die Reizfortpflanzung Werden an mehreren Stellen eines Axons Messpunkte angebracht und an einem Ende des Axons durch einen elektrischer Reiz, der den Schwellwert übersteigt, das Aktionspotential ausgelöst, so tritt das Aktionspotential an dem Messpunkt auf, der dem Reizpunkt am nächsten liegt, dann an dem zweitnächsten, usw. Daran erkennt man, dass sich ein Reiz entlang eines Axons fortpflanzt. Mithilfe der Meßstationen lässt sich auch die Geschwindigkeit5 der Reizübertragung ermitteln. Sie ist abhängig von den Eigenschaften des Neurons und kann zwischen 1 m/s und mehr als 100 m/s liegen. Das Aktionspotential ist an allen gemessenen Stellen gleichgroß. Das zeigt, dass ein Neuron den Strom nicht einfach nur leitet (elektrotonische Ausbreitung), denn dann würde der an 4 5 24 Adenosindiphosphat Geschwindigkeit = Weg / Zeit 2.3. Die Reizfortpflanzung den Messpunkten gemessene Wert abnehmen. Bei der Reizfortpflanzung wirken elektrotonische Ausbreitung und Erregung zusammen. Wird die Zellmembran an einer Stelle zur Auslösung des Aktionspotentials gereizt, fließt Strom in benachbarte Membranbereiche und depolarisiert diese. Das dort entstehende elektrotonische Potential überschreitet den Schwellwert und löst dabei das selbstständig ablaufende Aktionspotential aus. Von dieser Stelle aus werden wieder die Nachbarbereiche depolarisiert. Da sich die Stelle, von der aus der Reiz ursprünglich ausging aber noch in der Refraktärphase befindet, also unerregbar ist, pflanzt sich der Reiz nur in eine Richtung, von der Reizquelle weg, fort. Diese Reizströme bewegen sich ringförmig von der Reizquelle weg und werden deshalb auch Kreisströmchen genannt. Die Leitungsgeschwindigkeit hängt von verschiedenen Faktoren ab. Einer dieser Faktoren ist der Faserdurchmesser. Der Widerstand der Faser, die den elektrotonischen Strom abbremst, fällt mit dem Quadrat des inneren Faserdurchmessers. Durch einen geringeren Widerstand werden benachbarte Membranbereiche schneller depolarisiert und das Aktionspotential kann früher ausgeführt werden. Ebenfalls Einfluss auf die Leitungsgeschwindigkeit nimmt die Höhe des NatriumEinstroms in die Zelle. In der Depolarisationsphase schießen Natriumionen in den Intracellulärraum und depolarisieren dabei die Zellmembran. Der dabei entstehende elektrotonische Strom fließt in die Nachbarbezirke und depolarisiert die Membran an dieser Stelle. Ist der Natriumionenstrom geringer, z.B. bei einem erniedrigten (weniger negativen) Ruhepotential, kann auch weniger elektrotonischer Strom in die benachbarten Bereiche fließen, um diese zu depolarisieren. Daher steigt die Leitungsgeschwindigkeit mit der Amplitude des Natriumionen-Einstroms in die Zelle. Einen weiteren Faktor stellt das Vorhandensein einer Myelinschicht dar. An den Internioden, das sind die Stellen des Axons, die von einem Myelinmantel umhüllt sind, kann sich kein Aktionspotential bilden, da die Membran nicht mit dem Extracellulärraum in Berührung kommt (Abb. 2.8). Das bedeutet, dass an diesen Stellen nur der elektrotonische Strom den Reiz leitet. Der elektrotonische Strom ist abhängig von Membrankapazität und -widerstand. Geringere Kapazität und höherer Membranwiderstand wirken sich positiv auf die elektrotonische Leitfähigkeit aus. Die Myelinschicht erzeugt genau diese Bedingungen an der Membranoberfläche: Der Widerstand erhöht sich und die Kapazität sinkt. In den Internioden wird also die Stärke eines elektrischen Reizes nur sehr wenig verringert und schnell weitergeleitet. Eine Verzögerung tritt erst wieder ein, wenn das Signal einen Ranvierschen Schnürring erreicht, 25 2. Erregung von Nervenfasern an dem Membrankapazität und -widerstand wieder ihren normalen Wert haben. An diesen myelinlosen Stellen steigt das elektrotonische Potential an und löst ein Aktionspotential aus. Bei myelinisierten Nervenfasern springt also das Aktionspotential von Schnürring zu Schnürring. Die Erregungsleitung wird deshalb dort saltatorisch genannt6 . Da das Aktionspotential immer in voller Höhe ausgeführt wird (Alles-oder-Nichts-Regel), entstehen keine Signalverluste. Verluste, die auf dem Weg zu einem Schnürring auftreten können, werden durch die volle Auslösung des Aktionspotentials also wieder ausgeglichen. Myelinisierte Nervenfasern benötigen auch weniger Energie als unmyelinisierte. Das liegt daran, dass die energieverbrauchende Natrium-Kalium-Pumpe nur an den Ranvierschen Schnürringen, jedoch nicht an den Internioden arbeiten muss. Abbildung 2.8: Erregungsfortleitung am myelinisierten Axon. R 1 ist eine Reizelektrode, R2 die dazugehörige Bezugselektrode. An den Meßpunkten a und d wird ein Aktionspotential ausgebildet. An diesen Stellen ist ein Ranvierscher Schnürring, daher kommt die Zellmembran mit dem Extracellulärraum in Kontakt. Hier wird der Reiz durch Erregung fortgepflanzt. An den Meßpunkten b und c ist das Axon durch eine Myelinschicht vom Extracellulärraum getrennt. Hier kann sich kein Aktionspotential ausbilden. An diesen Stellen wird der Reiz durch elektrotonische Leitung fortgepflanzt. 6 26 saltare lat. springen Kapitel 3 Synaptische Erregungsübertragung Die Stellen, an denen Axone enden und mit anderen Zellen eine Verbindung eingehen, werden Synapsen genannt. Früher nahm man an, dass es sich bei den Synapsen um feste Verbindungen handelte, die das Aktionspotential auf die nächste Zelle ohne Unterbrechung weiterleiteten. Als dann die Labortechniken in ihrer Entwicklung fortschritten und die Synapsen mit einem Elektronenmikroskop untersucht werden konnten, stellte man fest, dass es zwar Synapsen dieser Form, die heute elektronische Synapsen genannt werden, gibt, sie jedoch nur sehr selten vorkommen. Sehr viel häufiger sind die chemischen Synapsen, die sich wiederum in hemmende und erregende chemische Synapsen untergliedern lassen. Bei den chemischen Synapsen liegt zwischen den aneinander liegenden Zellen ein schmaler Spalt, das heißt, die Membrane berühren einander nicht. Aufbau und Funktion der chemischen Synapsen, sowie die Methoden mit denen Nervenzellen Informationen verarbeiten, sollen im Folgenden erklärt werden. 3.1 Die Synapse Synapsen können in großer Formenvielfalt vorkommen. In Abbildung 3.1 sieht man verschiedene Arten von Verbindungen, nach denen die Synapsen wie folgt benannt werden: axo-axonale Synapse (AAS), axo-dendritische Synapse (ADS) und axo-somatische Synapse (ASS). Ihnen allen ist ihre Funktion gemein. Aufbau einer chemischen Synapse. Das Axon endet in einer Verdickung, dem Synapsenendknöpfchen. Da es den vorderen Teil der Synapse bildet, wird 27 3. Synaptische Erregungsübertragung Abbildung 3.1: Synaptische Verbindungen zwischen verschiedenen Nervenzellen es auch präsynaptische Endigung genannt (Abb. 3.2). Sie enthält eine Vielzahl von Mitochondrien und Vesikeln. Diese sind mit Transmittersubstanzen gefüllt, die im Synapsenendknöpfchen synthetisiert werden. Die präsynaptische Endigung ist durch einen Spalt, dem synaptischen Spalt, von der postsynaptischen Seite getrennt. Dieser Spalt ist zwischen 10 nm und 50 nm breit. Auf der gegenüberliegenden Seite des synaptischen Spaltes, der postsynaptischen Seite, liegt die postsynaptische Membran. Sie wird auch subsynaptische Membran genannt. Untersuchungen mit dem Elektronenmikroskop haben gezeigt, dass dieser Membranteil dicker ist als die Membran, die nicht einem Synapsenendknöpfchen gegenüberliegt. Das deutet darauf hin, dass sie sich auch funktionell voneinander unterschieden. Funktion einer chemischen Synapse. Im Synapsenendknöpfchen werden Neurotransmitter synthetisiert und in Vesikeln gespeichert, die sich an die präsynaptische Membran legen. Ein an der Synapse ankommendes Aktionspotential veranlasst die Vesikelmembran mit der präsynaptischen Membran zu verschmelzen. Dabei werden die in den Vesikeln gelagerten Neurotransmitter in den synaptischen Spalt freigesetzt. Die Moleküle der freigesetzten Neurotransmitter binden sich an Rezeptormoleküle, die an den Ionenkanälen der Empfängerzelle sitzen. Durch diese Bindung werden die Ionenkanäle veranlasst sich zu öffnen. Dabei strömen Ionen in den Intracellulärraum der Empfängerzelle und verändern das Membranpotential an dieser Stelle. Hierbei unterscheiden sich erregende Synapsen von hemmenden: 28 3.1. Die Synapse Abbildung 3.2: Schematische Darstellung einer längsgeschnittenen axo-dendritischen Synapse • Handelt es sich bei der Synapse um eine erregende Synapse, binden sich die Moleküle ihrer Neurotransmitter an die Rezeptormoleküle von Natriumporen. Diese sind (da die Zelle unerregt ist) geschlossen. Durch die Bindung öffnen sie sich und Natriumionen strömen in die Empfängerzelle. Dabei wird dieser Bereich der Membran depolarisiert. Liegt die Depolarisation über dem Schwellwert, kann ein neues Aktionspotential ausgebildet werden. Das an der postsynaptischen Membran gemessene Potential wird als excitatorisches postsynaptisches Potential (EPSP) bezeichnet. Die Abbildung 3.3 zeigt die Ausbildung eines EPSP’s. Je nach Neuronentyp kann die Amplitude ihre Größe verändern. In diesem Beispiel beträgt die Höhe der Depolarisation nur wenige Millivolt. • Bei hemmenden Synapsen werden andere Transmitterstoffe ausgeschüttet, die sich an Rezeptoren von Chlorid- und Kaliumionenporen binden. Diese öffnen sich und Chloridionen treten in die Empfängerzelle ein, Kaliumionen treten aus. Dabei wird die intracelluläre Spannung negativer. Das bedeutet, dass sich der Spannungsunterschied zwischen Intracellulärraum der Empfängerzelle und dem synaptischen Spalt erhöht. Das an der postsynaptischen Membran gemessene Potential wird als inhibitorisches postsynaptisches Potential (IPSP) bezeichnet (Abb. 3.4). Durch die im Zellinneren steigende negative Ladung wird die Ausbildung 29 3. Synaptische Erregungsübertragung eines neuen Aktionspotentials erschwert. Die Erregbarkeit des Neurons wird also vermindert. Nachdem sich die Ionenkanäle geöffnet haben, werden die Transmittermoleküle von Enzymen aufgespalten und verlieren dadurch ihre Eigenschaft die Kanäle offen zu halten. Die gespaltenen Moleküle werden von der präsynaptischen Membran wieder aufgenommen und für die Synthese weiterer Transmittermoleküle verwendet. Werden keine neuen Transmittermoleküle gebildet, reicht der im Synapsenendknöpfchen gespeicherte Vorrat noch für die Übertragung von bis zu 5000 Impulsen ([Sch1974]). Es gibt eine Vielzahl verschiedener Transmitterstoffe. Sie weisen häufig Aminosäurecharakteristika auf oder gehen aus einfachen chemischen Reaktionen aus Aminosäuren hervor. Ein Transmitterstoff, der in erregenden Synapsen synthetisiert wird, ist das Acetylcholin. Es wirkt im vegetativen Nervensystem und bei der Übertragung von Nervenimpulsen auf Muskelzellen. Ein hemmender Transmitter ist das Glycin oder Gamma-Aminosäurebutter. Es konnte im schlafenden Gehirn nachgewiesen werden. Neuronen können nur Transmitter eines bestimmten Typs synthetisieren. Daher sind alle Synapsen eines Neurons entweder erregend oder hemmend. Man spricht deshalb auch von erregenden oder hemmenden Neuronen. Abbildung 3.3: Zeitlicher Verlauf des EPSP 3.2 Abbildung 3.4: Zeitlicher Verlauf des IPSP Die Informationsverarbeitung In den vorangehenden Kapiteln haben wir gesehen, dass ein Nervensignal immer in voller Stärke übertragen wird (Alles-oder-Nichts-Regel). Für die Übermittlung der Intensität eines Signals kann also die Höhe der Depolarisation während des Aktionspotentials nicht ausschlaggebend sein. Variieren 30 3.2. Die Informationsverarbeitung kann jedoch der Zeitraum zwischen zwei Aktionspotentialen. Wird auf eine Nervenfaser ein Reiz in konstanter Höhe ausgeübt, bildet sich in regelmäßigen Abständen ein Aktionspotential aus. Erhöht man die Stärke des Reizes, verkürzen sich diese Abstände (Abb. 3.5). Die Stärke des Signals ist umgekehrt proportional zu der Länge der Zwischenräume, die zwischen den Aktionspotentialen entstehen. Dieses Prinzip wird Frequenzmodulation genannt. Durch Frequenzmodulation wird das Nervensystem vor Systemüberlastung und Informationsverfälschung geschützt. Während der Refraktärzeit kann kein neues Aktionspotential ausgebildet werden. Das bedeutet, dass die Impulsfrequenz einen Maximalwert nicht überschreiten kann. Dadurch wird das Nervensystem gegen Überlastung gesichert. Abbildung 3.5: Auswirkungen von Reizstärke auf Aktionspotentialfrequenz Die Nervenfasern besitzen einen für sie spezifischen Leitwiderstand. Wird durch ein myelinisiertes Axon ein elektrotonischer Reiz geleitet, verliert er auf dem Weg durch das Axon an Stärke. Erreicht der Reiz einen Ranvierschen Schnürring, kann er immer noch groß genug sein, um ein weiteres Aktionspotential auszulösen. Die Breite eines Schnürringes ist so breit, dass die elektrotonische Reizstärke ausreicht, um die Zellmembran bis zum Schwellenwert zu depolarisieren. Die Ranvierschen Schnürringe wirken also wie Reizverstärker. Das Aktionspotential wird immer in gleicher Stärke ausgebildet, das bedeutet, dass durch die Reizverstärkung der Reiz weder erhöht, noch erniedrigt wird, er wird lediglich erhalten. Arbeitet ein Schnürring nicht einwandfrei, wird das Aktionspotential am ihm folgenden Schnürring ausgebildet, der Reiz geht also nicht verloren. Da für die Signalintensität die Frequenz entscheidend ist und nicht die Höhe des Aktionspotentials, bietet hier die Frequenzmodulation einen Schutz gegen Informationsverfälschung. Im Nervensystem können auf Neuronen eine Vielzahl von Synapsen unterschiedlicher anderer Neuronen wirken. Diese Impulse können zu unterschiedlichen Zeitpunkten und in unterschiedlicher Frequenz eintreffen. Wie bereits erwähnt, enden Synapsen vorgeschalteter Neuronen entweder an der Somamembran oder an den Dendriten. An diesen Stellen können keine Aktionspotentiale ausgebildet werden. Die dort eingehenden Impulse verursachen eine kurzzeitige Veränderung des Membranpotentials, das durch die Membran bis zum Ansatzpunkt des Axons am Soma, dem Axonhügel, weitergeleitet wird. Gleichzeitig eingehende Signale summieren einander auf. Das bedeutet, dass 31 3. Synaptische Erregungsübertragung erregende Impulse das Membranpotential in positiver Richtung anheben und hemmende dieses wieder senken. In der Abbildung 3.6 sieht man, wie sich ein erregendes (A) und ein hemmendes Signal (B) gegenseitig aufheben. Überschreitet das am Axonhügel eingehende Signal den Schwellenwert, wird an dieser Stelle das Aktionspotential ausgelöst, das dann durch das Axon bis an sein Ende weiterläuft und an den Synapsen endet. Diese Art der Erregungsauslösung nennt man räumliche Summation, da sie durch Abbildung 3.6: Zusammenwirken die gleichzeitige Aktivität mehrerer räumvon hemmender und erregender lich voneinander getrennten Synapsen bewirkt wird. Synapse zur gleichen Zeit Eine ähnliche Erregungsauslösung wird zeitliche Summation genannt. Bei ihr wirkt nur eine Synapse auf das Neuron, die in hoher Frequenz Signale sendet. Die Spannung, die auf das Soma wirkt, klingt nur langsam ab, weshalb sich mehrere kurz aufeinander folgende Signale addieren (Abb. 3.7). Bei allen Erregungsarten ist der Schwellenwert ausschlaggebend für die Weiter- Abbildung 3.7: Zeitliche Summation der postsynaptischen Potentiale. Oberer Graph: Messung an der präsynaptischen Membran. Unterer Graph: Messung an der postsynaptischen Membran leitung eines Signals. Die Membrandepolarisation baut sich über einen längeren Zeitraum ab als die Refraktärzeit lang ist. Liegt die Depolarisation der Membran nach einem Aktionspotential oberhalb des Schwellenwertes, werden weitere Aktionspotentiale ausgelöst, bis die Depolarisation den Schwellenwert unterschritten hat (Abb. 3.10). Kommen zwei erregende Reize zeitlich versetzt an einem Neuron an, hängt es vom Schwellenwert ab, wie diese Signale verarbeitet werden und welche Form 32 3.2. Die Informationsverarbeitung das Signal annimmt, das das Neuron wieder verlässt (Abb. 3.8 und 3.9). Abbildung 3.8: Räumliche Summation mit niedrigem Schwellenwert Abbildung 3.9: Räumliche Summation mit hohem Schwellenwert Abbildung 3.10: Weiterleitung von Aktionspotentialen 33 3. Synaptische Erregungsübertragung 34 Kapitel 4 Visuelle Wahrnehmung In den vorangegangenen Kapiteln ist gezeigt worden, wie Neuronen arbeiten und wie Reize weitergeleitet und verarbeitet werden. Einen Großteil der Reize, die das Gehirn verarbeitet, sind visuelle Reize mit denen die Umwelt wahrgenommen wird. Die über das Auge aufgenommenen Informationen gelangen in das Gehirn. Doch wie werden diese Informationen dort gespeichert? Wie kommt es, dass wir uns Dinge für eine kurze Zeit merken können und uns anschließend nicht mehr an sie erinnern? Auf der anderen Seite bleiben bestimmte Ereignisse, die uns unwichtig erscheinen, im Gedächtnis verankert. Wie kommt es dazu? Und wie lässt sich das Phänomen erklären, dass Menschen, die einen elektrischen Schock erleiden, deren elektrischen Reize im Gehirn also überlastet und durcheinander gebracht werden, anschließend nicht unter vollkommener Amnesie1 leiden? Die Antworten zu diesen Fragen haben gemein, dass sie mit dem Gedächtnis zu tun haben. Das Gedächtnis lässt sich in drei Speicherphasen aufteilen: dem Ultrakurzzeit-Gedächtnis, dem Kurzzeit-Gedächtnis und dem Langzeitgedächtnis. Wie diese Speicherstufen im einzelnen funktionieren und wie sie zusammenhängen, soll in den folgenden Kapiteln erklärt werden. Desweiteren soll der Weg, den visuelle Informationen im Gehirn nehmen, nachgezeichnet werden. 4.1 Ultrakurzzeit-Gedächtnis Auf das Gehirn strömen innerhalb einer kurzen Zeit eine große Menge an Sinneseindrücken und die mit ihnen verbundenen Informationen ein. Diese 1 Gedächtnisverlust 35 4. Visuelle Wahrnehmung Informationen, die im Ultrakurzzeit-Gedächtnis eingehen, klingen nach einer kurzen Zeit von etwa zwanzig Sekunden wieder ab, sodass sie nicht mehr abrufbar sind. Ein Beispiel aus dem Sport kann dies verdeutlichen: Während eines Fussballspiels wird einer der Spieler gefoult. Der Spieler liegt am Boden und man kümmert sich um eventuelle Verletzungen. Anschließend wird der Spieler gefragt, wie dieses Foul zustande gekommen sei, doch er kann sich an den Vorfall nicht mehr erinnern (diese Form des Vergessens wird retrograde Amnesie genannt). Wird der Spieler jedoch noch innerhalb der ersten zwanzig Sekunden nach dem Foul befragt, kann er den Hergang genau schildern, auch später wird er sich noch daran erinnern können. Zu diesem Zeitpunkt sind die Informationen noch nicht aus dem Ultrakurzzeit-Gedächtnis gelöscht worden. Dadurch, dass sie innerhalb der ersten zwanzig Sekunden, nachdem sie ins UKZ-Gedächtnis aufgenommen wurden, abgerufen werden, können sie in die nächsthöhere Speicherstufe gelangen. Es gibt mehrere Störfaktoren, die dies verhindern können: mangelndes Interesse, fehlende Assoziation, Reizüberflutung oder störende Zusatzwahrnehmungen, wie zum Beispiel Schmerz. Diese Form des Überganges von einer Speicherstufe zur nächsten kann man als Filter sehen, der für das Gehirn uninteressante oder unwichtige Informationen herausfiltert, um es vor Überlastung zu schützen. Die von den Sinnesorganen an das Gehirn übergebenen Impulse sind elektrisch. Ein Hinweis darauf liefert ein Experiment, das an Ratten vorgenommen wurde. Ratten lernen leicht, einer Gefahrquelle auszuweichen. Durch eine leichte Gehirnreizung lässt sich diese Erinnerung an das Erlernte wieder aus dem Gedächtnis löschen. Wartet man mit der Gehirnreizung länger als zwanzig Sekunden, nachdem die Ratte gelernt hat, ist eine Löschung des Erlernten mit gleicher Reizstärke nicht mehr möglich, da es bereits die nächste Speicherstufe erreicht hat. 4.2 Kurzzeit-Gedächtnis Das Kurzzeit-Gedächtnis unterscheidet sich nur unwesentlich vom UltrakurzzeitGedächtnis. Die Zeit, die die Informationen in dieser Speicherphase verweilen, ist jedoch länger. Sie beträgt etwa zwanzig Minuten. Man könnte hier von einer Nachfilterung sprechen. Auch hier lassen sich die Informationen mittels einer Gehirnreizung löschen, nur muss dieser Reiz sehr viel stärker sein als der, der Informationen aus dem Ultrakurzzeit-Gedächtnis löscht. Ein Beispiel, bei dem dies geschieht, ist ein Autounfall. Ein Autofahrer verlässt morgens seine Wohnung, um mit dem Auto zur Arbeit zu fahren. Auf dem Weg zur 36 4.3. Langzeit-Gedächtnis Arbeit gerät sein Auto von der Fahrbahn ab und prallt gegen einen Baum. Unfallwagen und Polizei treffen an der Unfallstelle ein. Die Polizisten befragen den Autofahrer, der unter Schock steht, wie es dazu gekommen ist, dass der Wagen von der Fahrbahn abgekommen sei, doch der Fahrer kann sich nicht mehr daran erinnern. Er weiß lediglich, wie er morgens das Haus verlassen hat, aber alles was darauf folgte hat er vergessen. Der Schock, den er bei dem Unfall erlitten hat, ist so groß, dass er nicht nur die Informationen, die im Ultrakurzzeit-Gedächtnis gespeichert waren, gelöscht hat, sondern auch die, die sich Kurzzeit-Gedächtnis befanden. Polizeiberichten zufolge geschieht das häufig bei größeren Unfällen oder wenn es bei Unfällen zu Personenschäden gekommen ist ([Ves1975]). Auch im bereits erwähnten Rattenversuch kann dies simuliert werden. Wartet man mit der Gehirnreizung länger als eine halbe Minute, kann das Erlernte nicht mehr gelöscht werden. Versetzt man der Ratte jedoch noch vor Ablauf von zwanzig Minuten einen elektrischen Schock, ist des Erlernte vergessen. 4.3 Langzeit-Gedächtnis Das Langzeit-Gedächtnis ist die Gedächtnisstufe, die dem Kurzzeit-Gedächtnis folgt. Bis in die fünfziger Jahre des letzten Jahrhunderts hinein nahm man an, dass das Gedächtnis nur durch elektrische Impulse gespeichert wird. Untersuchungen mit dem Elektroenzephalogramm (EEG) schienen diese Vermutung zu bestätigen. In einem gewissen Grade ist dies auch richtig, da alle eingehenden Informationen auf diese Weise aufgenommen werden. Die Langzeitspeicherung hebt sich jedoch von der (Ultra-)Kurzzeit-Speicherung deutlich ab. Immer mehr Experimente zeigen deutlich, dass die Speicherung nicht mehr ausschließlich über elektrische Impulse verläuft, sondern stofflicher Natur ist. Der Versuch, das Langzeit-Gedächtnis von Ratten mittels Stromschlag zu löschen, schlug fehl. Griff man in ihren Stoffwechsel ein und stoppte durch Verabreichung bestimmter chemischen Stoffe die Protein-Synthese, konnte das von den Ratten Erlernte nicht länger als eine Stunde gespeichert werden. Die (Ultra)Kurzzeit-Erinnerung wurde durch diesen Eingriff nicht vermindert. Dieses Experiment lässt vermuten, dass die Lanzeitspeicherung andersartig ablaufen muss. In der Gen-Forschung wurden viele Entdeckungen gemacht, die Aufschluss über diese Speicherart geben können. In den Zellkernen aller in unserem Körper befindlichen Zellen mit Zellkern, 37 4. Visuelle Wahrnehmung also auch in denen der Neuronen, befinden sich Doppelspiralen aus DNA2 , die die Erbinformationen der Zelle speichert - die Gene. Da die Reproduktion von DNA einen wichtigen Punkt bei der Speicherung von Informationen darstellt, soll dieser Vorgang näher beleuchtet werden. Ein in den Zellen vorhandener Grundstoff ist die Nucleinsäure. Nucleinsäure setzt sich aus drei verschiedenen Verbindungsklassen zusammen: Zucker, organische Stickstoffbasen und Phosphorsäure. Die DNA besteht aus Nucleinsäure. Es gibt vier verschiedene Stickstoffbasen, die eine DNA enthalten kann. Diese sind Cytosin (C), Thymin (T), Guanin (G) und Adenin (A). Eine Einheit, die durch ein Zucker-Molekül, einer der Stickstoffbasen und einem PhosphorsäureMolekül gebildet wird, wird Nucleotide genannt. Das Phosphorsäure-Molekül eines Nucleotids kann sich an ein Zucker-Molekül eines anderen Nucleotids binden. Dadurch bildet sich eine DNA-Kette. C,T,G und A können ebenfalls Verbindungen eingehen, sogenannte Basenpaare, wobei sich das A eines Nucleotids nur an ein T eines anderen Nucleotids binden kann. Äquivalent verhält es sich mit C und G. Durch die Basenpaarbildung liegt dem DNA-Strang ein weiterer DNA-Strang gegenüber, man nennt ihn DNA-Doppelstrang. Durch die Struktur seiner Moleküle ist er spiralförmig gewunden. Die RNA3 ist ebenfalls eine Nucleinsäure. Im Unterschied zur DNA hat sie ein Abbildung 4.1: Modell der DNA anderes Zucker-Molekül und sie hat anstelle des T die Base Uracil (U), die sich aber wie T an A binden kann. RNA tritt (mit Ausnahme einiger Viren-RNA’s) 2 3 38 Desoxyribonukleinsäure Ribonucleinsäure 4.3. Langzeit-Gedächtnis nur einsträngig auf. Bei der DNA-Reproduktion lösen sich die Basenverbindungen an bestimmten Stellen auf. Bei Nervenzellen wird dies durch ein eingehendes Nervensignal katalysiert. An den Stellen, an denen die DNA-Basen keine Verbindung zu ihrer gegenüberliegenden DNA-Kette haben, lagern sich die Basen der RNA an und bilden eine RNA-Kette, die in ihrer Basenfolge eine Kopie des gegenüberliegenden DNA-Strangs darstellt (man könnte auch sagen, dass die Basenfolge des RNA-Strangs eine Negativabbildung von der Basenfolge des abgelesenen DNA-Strangs ist). Der RNA-Strang löst sich nun wieder von der DNA und tritt aus dem Zellkern Abbildung 4.2: Schematische Darstellung der Transkription aus und wandert zu einem Ribosom des endoplastischen Retikulums (vergl. Abb. 1.3). Innerhalb des Ribosoms werden, je nach Basenfolge der RNA, verschiedene Proteine synthetisiert. Die Umsetzung der genetischen Information aus der Basensequenz der RNA in die Aminosäurensequenz, aus denen Proteine bestehen, wird Translation genannt. Während der Translation zerfällt die RNA wieder in ihre Nucleotide. Jede Zelle zeichnet sich durch Eigenschaften aus, die durch Stoffwechselprozesse repräsentiert werden. Diese werden mittels Proteine katalysiert. Die in den Ribosomen synthetisierten Proteine haben also die gleichen Stoffwechseleigenschaften wie die Zelle, aus der sie stammen. Die Flußrichtung der genetischen 39 4. Visuelle Wahrnehmung Information (DN A → RN A → P rotein) wird das zentrale Dogma der Molekularbiologie genannt ([Haf1980]). Die Proteine, die in den Ribosomen von Nervenzellen produziert werden, werden in die Zellmembran eingelagert. Da die Nervenzelle nur an wenig Stoffwechselfunktionen beteiligt ist, dient ein Großteil dieser eingelagerten Proteine einem anderen Zweck. Sie dienen als Erkennungsmoleküle, die durch gezielte Signale und über eingeprägte Bahnen in der Zellmembran gefunden werden können und dann auch die Zelle aktivieren, um selbst Signale auszusenden. Dieser Prozess von der RNA-Bildung bis zur Proteinsynthese dauert etwa zwanzig Sekunden - also etwa die gleiche Zeit, wie das Gehirn Informationen im Kurzzeitgedächtnis aufbewahrt. Wird Information nicht aus dem KurzzeitGedächtnis ins Langzeitgedächtnis übernommen, bedeutet das, dass die RNA zerfällt, ohne vorher zur Proteinsynthese verwendet worden zu sein. Der Zeitpunkt der Proteinsynthese stellt also den Übergang von Kurzzeit- zum Langzeitgedächtnis dar. Das oben beschriebene Experiment und weitere Experimente, konnten dies bestätigen. Besonders ältere Menschen können sich schlecht an Dinge erinnern, die nur wenige Tage zurückliegen, was jedoch vor mehreren Jahren oder Jahrzehnten geschehen ist, können sie mit wesentlich weniger Schwierigkeiten wiedergeben. Das hängt ebenfalls mit der Proteinsynthese zusammen, da diese im Alter abnimmt. 4.4 Verarbeitung visueller Reize im Gehirn Visuelle Reize werden vom Auge aufgenommen. Im Inneren des Auges befindet sich die Netzhaut (Retina), auf die das durch das Auge aufgenommene Bild projeziert wird. Die Netzhaut besteht aus Zapfen, die für die Farbwahrnehmung, und Stäbchen, die für die Helligkeitswahrnehmung zuständig sind (Abb. 4.3). Es gibt drei verschiedene Zapfentypen, die jeweils für rotes, blaues und grünes Licht empfänglich sind. Zapfen und Stäbchen sind Rezeptoren, die visuelle Signale in Nervenimpulse umwandeln. Die Reize, die von den Rezeptoren ausgehen, werden auf den Sehnerv übertragen. Die Sehnerven, die von jedem Auge ins Gehirn führen, vereinigen sich in einem Areal des Gehirns, dem Chiasma opticum (Abb. 4.4). Dort kreuzen etwa die Hälfte der Nervenfasern in die andere Gehirnhälfte, die andere Hälfte verbleibt in der Gehirnhälfte, von der sie stammen. Von dort aus führen 40 4.4. Verarbeitung visueller Reize im Gehirn Abbildung 4.3: Rezeptoren der Retina: Stäbchen und Zapfen sie ihren Weg fort in den hinteren Bereich des Gehirns und enden im Corpus geniculatum laterale (CGL), einem Teil des Hirnstammes. Obwohl sich Abbildung 4.4: Schema des Verlaufes der Sehbahnen im Gehirn des Menschen die Nervenbahnen bereits gekreuzt haben, werden die Signale, die von beiden Augen kommen, erst im CGL als Ganzes verarbeitet. Von dort aus werden die Nervensignale in den visuellen Cortex4 geleitet. Bildreize werden in verschiedenen Neuronenklassen verarbeitet. Es gibt mindestens fünfzehn verschiedene Neuronenklassen, die jeweils einzelne Eigenschaften des Bildes, wie Helligkeit, Kontrast, Farbe, Bewegung, etc. getrennt voneinander verarbeiten. 4 Cortex = Hirnrinde 41 4. Visuelle Wahrnehmung Zwei dieser Neuronenklassen befinden sich im CGL: die Kontrastneurone und die Hell-Dunkelneurone. Die Kontrastneurone sind besonders aktiv, wenn im Gesichtsfeld ein kontrastreiches Bild erscheint. Diffuse Beleuchtung hingegen bewirkt geringere Aktivität. Andere Neuronenklassen sind im visuellen Cortex zu finden. Die einzelnen neuronalen Vorgänge während der Gestaltwahrnehmung sind noch nicht bekannt. Durch Versuche konnte jedoch gezeigt werden, dass das Gehirn Informationen assoziativ verarbeitet. Assoziation ist die (un-)bewusste Verknüpfung bedeutungsähnlicher Begriffe. Erkennt das Auge einen Gegenstand, wie zum Beispiel ein Glas Milch, werden gleichzeitig mit dieser Gestaltwahrnehmung Assoziationen verbunden. Eine dieser Assoziationen könnte die Farbe weiß sein. Ohne dass es einem bewusst wird, wird dieses assoziierte Wort mitaktiviert und ist dadurch schneller abrufbar als ohne eine vorherige Assoziation ([Rol2003]). 42 Kapitel 5 Die Zellen eines Künstlichen Neuronalen Netzes Die Neuronen eines Künstlichen Neuronalen Netzes (KNN) haben die gleichen Grundbausteine wie ihre Vorbilder in der Biologie. Sie sind zusammengesetzt aus Dendriten, Soma und einem Axon. Die Funktionen, die sie im KNN übernehmen sind identisch geblieben. Die Dendriten nehmen Informationen von vorgeschalteten Neuronen auf und leiten diese ans Soma. Das Soma summiert alle eingehenden Signale auf und bestimmt die Größe des ausgehenden Signals, das dann über das Axon und dessen Synapsen an nachgeschaltete Neuronen weitergeleitet wird. In der Abbildung 5.1 sind zwei Neuronen dargestellt. Die Stärke der Verbindungen, die diese Neuronen über ihre Synapsen mit dem Soma eingehen, ist mit w bezeichnet, wobei die erste Stelle des Indexes die vorgeschaltete, die zweite Stelle die Nervenzelle, auf die sie einwirkt, indiziert. Besteht zwischen dem Neuron i und dem Neuron j keine Verbindung, ist der Wert ihrer Verbindung wij gleich Null. Links der Neuronen wirken die Informationen vorgeschalteter Neuronen, sie werden Netzeingaben (neti,j ) genannt, ein. Der Aktivierungszustand der Neu- Abbildung 5.1: Darstellung von Zellen eines neuronalen Netzes 43 5. Die Zellen eines Künstlichen Neuronalen Netzes ronen ist in der Abbildung mit ai und aj bezeichnet, die Ausgabe mit oi und oj . Alle diese Werte sind durch Funktionen untereinander verknüpft und von ihnen abhängig. Die Ausgabe eines Neurons wird durch eine Ausgabefunktion fout bestimmt, die sich aus dem Aktivierungszustand eines Neurons ergibt. oi = fout (ai ) (5.1) Mit den so errechneten Werten für die Ausgabe vorgeschalteter Neuronen und den Werten der Verbindungsgewichte lässt sich mit der Propagierungsfunktion die Netzeingabe berechnen. netj (t) = X oi (t)wij (5.2) Der neue Aktivierungszustand eines Neurons ist abhängig von dem alten Aktivierungszustand (aj (t)), der Netzeingabe (netj ) und dem Schwellenwert. Der Schwellenwert des Neurons wird mit Θj bezeichnet. Die Aktivierungsfunktion (fact ) berechnet mit diesen Parametern den neuen Wert der Aktivierung (aj (t + 1)). aj (t + 1) = fact (aj (t), netj (t), Θj ) (5.3) Welche unterschiedliche Formen der Aktivierungszustand, die Ausgabefunktion, die Propagierungsfunktion und die Aktivierungsfunktion annehmen können, soll in den folgenden Kapiteln erläutert werden. 5.1 Aktivierungszustand Die verschiedenen Werte, die der Aktivierungszustand ai (t) eines Neurons annehmen kann, lassen sich in diskrete und (quasi-)kontinuierliche Wertebereiche trennen (Abb. 5.2). Bei kontinuierlichen Wertebereichen beschränken die meisten Modelle den Aktivierungszustand auf ein Intervall. Das liegt daran, dass die meisten Netzmodelle nichtlineare oder sigmoide Aktivierungsfunktionen und die Identität als Ausgabefunktion verwenden. Ebenfalls zu den kontinuierlichen Wertebereichen gehört die Menge aller reellen Zehlen. Das ursprüngliche Hopfield-Modell und andere Modelle verwenden diskrete Aktivierungszustände. Diese werden dann auch in der Implementierung als 44 5.2. Ausgabefunktion Abbildung 5.2: Unterschiedliche Realisierungen des Aktivierungszustandes binäre Werte gespeichert und verarbeitet. Bei den biologischen Nervenzellen kann man ebenfalls zwischen Wertebereichen unterscheiden. Das einfachste Beispiel ist ein binärer Wertebereich, der angibt, ob sich ein Neuron im unerregten Zustand befindet oder ob gerade ein Aktionspotential ausgeführt wird. Auch die Natriumionen-Konzentration gibt Aufschluss über der Aktivierungszustand. Misst man den relativen Anteil, können die Werte in einem Intervall von 0 bis 100 auftreten. 5.2 Ausgabefunktion Mit Hilfe der Ausgabefunktion lässt sich der Wert berechnen, den eine Zelle an eine nachgeschaltete Zelle, bzw. ins Neuronale Netz weitergibt. Sie verwendet dabei den derzeitigen Aktivierungszustand der Zelle. Somit gibt die Ausgabefunktion an, wie stark ein Neuron feuert. Die Ausgabefunktion kann verschiedene Formen haben. Eine dieser Funktionen ist die Identiät (Abb. 5.3). Das bedeutet, dass die Ausgabe identisch mit dem Aktivierungszustand der Zelle ist. Der Wertebereich der Aktivierungsfunktion gibt dadurch den Wertebereich des Aktivierungszustandes an. Die binäre Schwellenwertfunktion kommt dem biologischen Original sehr nahe, da ein Axon erst beim Erreichen eines Schwellenwertes feuert. Jedoch wird dabei vernachlässigt, dass das Neuron ja in unterschiedlicher Stärke (Impulsfrequenz) feuern kann. Daher werden lineare Ausgabefunktionen verwendet. Die Abstände, in denen ein Neuron feuern kann, sind durch die Refraktärzeit nach unten hin beschränkt, daher bietet es sich an, eine Mischform aus einer linearen Funktion und einer mit Schwellenwert zu verwenden. In der Abbildung ist ein Beispiel einer solchen semilinearen Funktion dargestellt (linear bis 45 5. Die Zellen eines Künstlichen Neuronalen Netzes Abbildung 5.3: Häufig verwendete Ausgabe-, bzw. Aktivierungsfunktionen. Die Achsenbeschriftung ’out’ bezeichnet den Ausgabewert, ’net’ die Netzeingabe. Bei der Ausgabefunktion repräsentiert ’net’ den Aktivierungszustand Sättigung). Einige Funktionen stellen ein Glättung dieser semilinearen Funktion dar (sin(x), logistische Funktion, tanh(x)). Da sie S-förmig sind, werden sie auch sigmoide Funktionen genannt. Diese nichtlinearen Funktionen sind die am häufigsten verwendeten. 5.3 Propagierungsfunktion Die Propagierungsfunktion errechnet aus der Summe aller Ausgaben vorgeschalteter Zellen mit ihren jeweiligen Gewichten die Netzeingabe zu einem Zeitpunkt t, die auf ein Neuron wirkt. Das Vorbild in der Biologie ist ein Neuron, das mehrere Impulse von vorgeschalteten Neuronen erhält. Die Impulse können sowohl erregender wie auch 46 5.4. Aktivierungsfunktion hemmender Natur sein. Für das Auslösen eines Aktionspotentials ist die Summe aller Impulse, die zu einem Zeitpunkt ankommen, ausschlaggebend, also die räumliche Summation. Bei den KNN lassen sich die Neuronen ebenfalls in erregende und hemmende separieren. Dies spiegelt sich in den Werten ihrer Gewichte wieder. Sie sind positiv, wenn das Neuron erregend wirkt, negativ bei hemmenden Neuronen. Die Netzeingabe die auf ein Neuron j zur Zeit t einwirkt, errechnet sich also aus der Summe aller Netzeingaben, die erregend wirken abzüglich der Summe aller Netzeingaben, die hemmend sind. netj (t) = netj,err (t) − netj,hemm (t) Die Gewichte der einzelnen Neuronenverbindungen werden in einer quadratischen Matrix zusammengefasst. Die Anzahl ihrer Spalten, bzw. Reihen ist gleich der Anzahl der Neuronen im Netzwerk. Für eine Netzwerk mit n Neuronen ergibt sich also eine n2 -große Matrix. 5.4 Aktivierungsfunktion Der Aktivierungszustand eines Neurons muss nicht zwangsläufig immer gleich sein. Nach einem ausgebildeten Aktionspotential kann die Zellmembran noch so stark depolarisiert sein, dass ein schwacher Impuls von einem vorgeschalteten Neuron ausreicht, um das Neuron zum Ausbilden eines neuen Aktionspotentials ausreicht. Bei den KNN errechnet die Aktivierungsfunktion den neuen Aktivierungszustand einer Zelle, der ebenfalls von seinem alten Aktivierungszustand und der Netzeingabe abhängig ist. Die Aktivierungsfunktion kann wie die Ausgabefunktion linear oder nichtlinear sein, häufig sind auch beide gleich. Es gibt zwei Klassen von Aktivierungsfunktionen: • deterministische1 : Bei diesen Funktionen ist der ausgegebene Wert eindeutig durch die Eingabe bestimmt. • stochastische2 : Der ausgegebene Wert ist durch eine Zufallsverteilung von der Eingabe abhängig. 1 2 determinativ, lat = begrenzend, festgelegt, entschieden stochastisch , gr. = zufallsabhängig 47 5. Die Zellen eines Künstlichen Neuronalen Netzes 48 Kapitel 6 Zellen eines KNN im Verbund Da die einzelnen Bestandteile eines künstlichen neuronalen Netzes und ihre Funktionen bekannt sind, stellt sich nun die Frage, wie sie untereinander verschaltet sind. Die Funktionsweise eines neuronalen Netzes wird dabei unter anderem durch seine Topologie bestimmt, von denen einige in den folgenden Kapiteln vorgestellt werden. Die Wahl der Aktivierungsform und der Lernmethode wirken sich ebenfalls auf die Arbeitsweise eines Netzes aus. Welche Unterschiede dabei vorherrschen können, soll in den folgenden Kapiteln erklärt werden. 6.1 Netzwerktopologien Jedes Netzwerk aus Neuronen hat einen Ein- und einen Ausgang. Die Eingabeneuronen in einem KNN werden input units genannt und entsprechen den Neuronen, die Sinneswahrnehmungen aufnehmen. Sie bilden gemeinsam die Eingabeschicht (input layer). Die output units sind die Neuronen, die die Informationen bearbeitet wieder aus dem Netzwerk ausgeben. Sie bilden zusammengenommen die Ausgabeschicht eines Netzwerkes. Dabei entsprechen sie den Neuronen, die ihre Impulse an die Muskeln weitergeben, die diese Impulse dann in motorische Impulse umwandeln. Die Schichten von Neuronen, die zwischen der Eingabe- und der Ausgabeschicht liegen, werden verdeckte Schichten (hidden layers) genannt. Sie tragen diesen Namen, weil nach einer Eingabe in des Netz die Ausgabe erfolgt, ohne dass der Betrachter weiß, wieviele Neuronenschichten an der Informationsverarbeitung beteiligt sind und wie sie untereinander verschaltet sind. Bei den KNN lassen sich die Netzwerke anhand ihrer verschiedenen Verknüpfun49 6. Zellen eines KNN im Verbund gen ihrer Neuronen untereinander in zwei Klassen einteilen: • Netzwerke ohne Rückkopplung (feedforward-Netzwerke) • Netzwerke mit Rückkopplung (rekurrente Netzwerke) Ein Beispiel für ein feedforward-Netzwerk ist in der Abbildung 6.1 dargestellt. Die Zellen dieses Netzwerkes sind ebenenweise miteinander verknüpft, wo- Abbildung 6.1: Ein Beispiel für ein feedforward-Netzwerk bei jedes Neuron einer Schicht mit allen Neuronen der nächsthöheren Schicht verbunden ist. Es gibt zwei verdeckte Schichten. Zusammen mit der Eingabeund der Ausgabeschicht bilden sie vier Zellschichten, die durch insgesamt drei Schichten von Verbindungen voneinander getrennt sind. Diese Anzahl gibt dem Netz den Namen 3-stufiges Netz. Ein n-stufiges feedforward-Netz besteht somit aus n+1 Zellschichten, von denen n-1 Schichten hidden layers sind. Neben diesen feedforward-Netzen, die ebenenweise verbunden sind, gibt es noch solche, die sogenannte Kurzschluss-Verbindungen (shortcut connections) haben. Diese Verbindungen überspringen eine oder mehrere Zellebenen des Netzwerkes. Netze mit Rückkoplung lassen sich nach Art ihrer Rückkopplung unterteilen: • Netze mit direkter Rückkopplung (direct feedback) Neuronen dieser Netzwerkart geben ihr Ausgangssignal als Eingangssignal an sich selbst weiter. Dadurch wird seine Aktivierung verstärkt oder geschwächt (ja nach Gewicht). 50 6.2. Verschiedene Formen der Aktivierung • Netze mit indirekter Kopplung (indirect feedback) Die Rückkopplung dieser Netze besteht zwischen Neuronen einer Schicht mit Neuronen untergeordneter Schichten. • Netze mit Rückkopplung innerhalb einer Schicht (lateral feedback) Bei diesen Netzen wirkt die Ausgabe eines Neurons einer Schicht als Eingabe eines Neurons der gleichen Schicht. Eines der bekanntesten lateralfeedback-Netzwerke ist das Winner-takes-all-Netzwerk. Bei diesem Netzwerk gibt es zusätzlich noch direkte Rückkopplungen. Das Neuron einer Schicht, das die größte Aktivierung hat (der Gewinner), hemmt dann über die laterale Rückkopplung die anderen Neuronen in seiner Schicht und verstärkt über die direkte Rückkopplung die eigene Aktivierung. • Vollständig verbundene Netze Die Neuronen vollständig verbundener Netze gehen Verbindungen mit allen anderen Neuronen ein, unabhängig davon, in welcher Schicht sie sich befinden. In der Abbildung 6.2 sind Beispiele der obenbeschriebenen Netzwerk-Topologien abgebildet. 6.2 Verschiedene Formen der Aktivierung In einem Netzwerk aus Neuronen ist die Reihenfolge, in der die Neuronen ihre Werte berechnen, besonders wichtig, weil die Ergebnisse je nach Netzwerk voneinander abhängig sind. Man unterscheidet dabei in synchrone und asynchrone Aktivierung. Synchrone Aktivierung Bei der synchronen Aktivierung werden die Aktivierungszustände aller Neuronen des Netzes zur gleichen Zeit berechnet. In einem weiteren Schritt werden ebenfalls gleichzeitig ihre Ausgaben berechnet. Diese Form der Aktivierung ist bei rekurrenten Netzen von Vorteil, da die Berechnung der Aktivierungszustände einzelener Neuronen nachvollziehbar bleibt und kein Datenchaos entsteht. Bei feedforward-Netzen allerdings ist die synchrone Aktivierung nachteilig, da sie im Vergleich zu anderen Aktivierungsarten langsam arbeitet. 51 6. Zellen eines KNN im Verbund Abbildung 6.2: Beispiele verschiedener Netzwerk-Topologien mit ihren Matrizen. Die dunkle Färbung der einzelnen Matrizenwerte bedeutet eine existierende Verbindung. Asynchrone Aktivierung Bei der asynchronen Aktivierung werden die Werte einzelner Zellen zu unterschiedlichen Zeitpunkten berechnet. Damit ist die asynchrone Aktivierung dem biologischen Vorbild näher als die synchrone. Je nach Reihenfolge, in der die Neuronen angesprochen werden, lassen sie sich in vier Modi aufteilen: • feste Ordnung (fixed order) Bei einer festen Ordnung errechnen die Zellen in einer vorher festgelegten Reihenfolge ihre Werte. Jede Zelle wird dabei einmal angesprochen. Entspricht die Reihenfolge der Netzwerktopologie, ist dieses Verfahren für feedforward-Netze das schnellste. • zufällige Ordnung (random order) Die Reihenfolge der angesprochenen Neuronen unterliegt bei der zufälli52 6.3. Methoden des Lernens gen Ordnung dem Zufall. Es errechnet dann sowohl seinen Aktivierungszustand, wie auch seine Ausgabe. Ein Leerzyklus für ein Netz mit n Neuronen ist dann beendet, wenn n Neuronen angesprochen wurden. Dabei kann es sein, dass eine Zelle mehrfach, andere gar nicht angesprochen werden. Sie findet daher nur selten Verwendung bei der Modellierung künstlicher neuronaler Netze. • zufällige Permutation (random permutation) Dieser Modus funktioniert ähnlich der random order. Die Reihenfolge der angesprochenen Zellen ändert sich jedoch von Zyklus zu Zyklus. Ausserdem wird sichergestellt, dass jedes Neuron genau einmal angesprochen wird. Die Berechnung der zufälligen Permutation ist allerdings zeitaufwendig. • topologische Ordnung (topological order) Diese Ordnung ist bestimmt durch die Topologie eines Netzes. Das bedeutet, dass zuerst alle Werte der Neuronen, die in der Eingabeschicht vorkommen, berechnet werden, dann die der versteckten Schichten. Der Zyklus ist abgeschlossen, nachdem zuletzt die Werte der Zellen der Ausgabeschicht berechnet wurden. Dieser Modus ist für feedforward-Netze besonders günstig. 6.3 Methoden des Lernens Neuronale Netze zeichnen sich dadurch aus, dass sie lernfähig sind. Zum Lernen bedarf es einer Kontrollinstanz, die die Netzausgabe mit der gewünschten Ausgabe vergleicht. Je nachdem, wo diese Kontrollinstanz in den Ablauf der Berechnung eingreift, lässt sich das Lernen klassifizieren. Es gibt drei verschiedene Arten des Lernen von KNN: • Überwachtes Lernen (supervised learning) Beim überwachten Lernen wird dem Netz neben dem Eingabemuster auch die erwünschte Ausgabe angegeben. Das Netz vergleicht sie mit der errechneten Ausgabe und modifiziert die verwendeten Rechenkomponenten (meist die Verbindungsgewichte), um die Abweichung zu verringern. Ziel beim überwachten Lernen ist, dass dem Netz nach mehren Rechengängen mit unterschiedlichen Ein- und Ausgaben die Fähigkeit antrainiert wird, Assoziationen herzustellen. Das bedeutet, dass die Abweichungen erstmaliger Präsentationen neuer Muster von den gewünsch53 6. Zellen eines KNN im Verbund ten Ausgabemustern immer geringer werden. Diese Art des Lernens ist die schnellste. • Bestärkendes Lernen (reinforcement learning) Beim bestärkenden Lernen gibt die Kontrollinstanz nach einer Ausgabe vom Netz die Information, ob die Ausgabe falsch oder richtig war, eventuell auch noch den Grad der Richtigkeit. Liegt die gewünschte Ausgabe vor, ist diese Art des Lernens langsamer als überwachtes Lernen. Sie ist aber ihrem Original in der Biologie wesentlich näher, da das motivierte Lernen (durch Belohnung oder Bestrafung) die häufigste Lernform beim Menschen ist. • Unüberwachtes Lernen (unsupervised learning) Das unüberwachte Lernen verzichtet vollständig auf den Eingriff einer netzexternen Kontrollinstanz. Das bedeutet, dass dem Netz weder ein gewünschtes Ausgabemuster vorliegt, noch ihm mitgeteilt wird, ob sein errechnetes Ergebnis korrekt ist oder nicht. Das Netz erstellt selbständig Klassifikatoren, nach denen es die Eingabemuster einteilt. Diese Methode ist die langsamste der bisher vorgestellten. Allerdings ist sie dem menschlichen Lernen am ähnlichsten, da das autodidaktische Lernen über dem didaktischen steht ([Ves1975]). 6.4 Lernregel Da nun verschiedene Arten des Lernens bekannt sind, stellt sich die Frage, wie das Lernen umgesetzt wird. Es gibt sehr viele Möglichkeiten einzelne Komponenten des Netzes nach einem Lernschritt so zu modifizieren, dass es dem gewünschten Ergebnis am nächsten kommt. Auch kann man Komponenten entfernen oder hinzufügen. Erlernen ist möglich durch eine oder mehrere der folgenden Möglichkeiten: 1. Entwicklung neuer Verbindungen 2. Entwicklung neuer Zellen 3. Löschen existierender Verbindungen Löschen existierender Zellen 4. Modifikation der Gewichtsmatrix 5. Modifikation der Schwellenwerte 54 6.4. Lernregel 6. Modifikation der Rechenfunktionen (Aktivierungs-, Propagierungs- oder Ausgabefunktion) Diese Methoden sind nicht vollkommen voneinander getrennt. So erreicht man mit Hilfe der Modifikation der Verbindungsgewichte, dass Verbindungen gelöscht (nicht angesprochen) oder dem Netz hinzugefügt werden (das entsprechende Verbindungsgewicht wird von Null auf einen Wert erhöht oder erniedrigt). Einige Modelle künstlicher neuronaler Netze eignen sich jedoch nicht für diese Methode, da ihre Gewichtsmatrix nicht für alle Neuronen Verbindungen vorsieht und die entsprechenden Werte nicht mit in die Gewichtsmatrix aufnehmen, anstatt sie in ihr zu belassen und auf Null zu setzen. Das Hinzufügen oder Löschen von Zellen tritt bei neueren Modellen häufiger auf. Diese Methode ist jedoch nur bedingt plausibel, da das Wachstum biologischer Neuronen bereits im Kindesalter abgeschlossen ist, das Zellsterben aber zu jeder Zeit stattfinden kann. Diese Modelle bieten jedoch den Vorteil, dass sie durch das Absterben selten genutzter Zellen und die Entwicklung neuer benötigter Zellen ihre Netzwerk-Topologie selbst zum Optimum weiterentwickeln. Wenig verbreitet ist die Modifikation der Rechenfunktionen. Die meisten Lernmethoden verwenden die Modifikationsform der Gewichtsmatrix, damit das Netz lernen kann. Im folgenden sollen einige bekannte Lernregeln vorgestellt werden. 6.4.1 Hebbsche Lernregel Die Hebbsche Lernregel basiert auf dem Prinzip Verbindungen von Neuronen untereinander zu verstärken, wenn sie zur gleichen Zeit stark aktiviert sind. Sie wurde 1949 von Donald O. Hebb formuliert und dient häufig als Grundlage komplizierterer Lernregeln. Die mathematische Formel der Hebbschen Regel lautet wie folgt: ∆wij = ηoi aj (6.1) Wobei ∆wij die Änderung des Gewichtes zwischen dem vorgeschalteten Neuron i und dem Neuron j, auf das jenes einwirkt, darstellt. Die Ausgabe der vorgeschalteten Zelle i wird mit oi , die Aktivierung der darauf folgenden Zelle j mit aj bezeichnet. η ist die sogenannte Lernrate. Die Hebbsche Lernregel wird häufig im Zusammenhang mit binären Aktivierungswerten verwendet. Sind diese Werte 1 und 0, ist zu beachten, dass eine 55 6. Zellen eines KNN im Verbund Verbindung zwar gestärkt, aber nicht geschwächt, sondern nur inaktiv gesetzt werden kann. Aus diesem Grund werden als Binärwerte bevorzugt 1 und -1 verwendet. Da die Verbindungsgewichte die Synapsenart (hemmend bei negativen oder erregend bei positiven Werten) darstellen, ist es jedoch unplausibel, das Gewicht vom ursprünglichen positiven Wert auf einen negativen Wert herabzusetzen, da aus einem hemmenden Neuron kein erregendes Neuron werden kann. Bei der allgemeinen mathematischen Form der Hebbschen Regel, spielt noch eine weiterer Parameter eine Rolle: das teaching input tj , das die erwartete Aktivierung darstellt. Die allgemeine Form lautet (nach [Rum1986]): ∆wij = ηh(oi , wij )g(aj , tj ) (6.2) Hierbei werden zwei Funktionen h und g als weitere Faktoren neben der Lernrate η verwendet, von denen eine vom teaching input tj abhängig ist. 6.4.2 Delta-Regel Die Delta-Regel gehört zu den Derivaten der Hebbschen Lernregel. Auch bei dieser Lernregel wird das Verbindungsgewicht verändert. Der Grad der Veränderung steigt dabei proportianal zur Differenz der aktuellen Aktivierung und der erwarteten Aktivierung eines Neurons. Die Delta-Regel tritt in zwei Formen auf: ∆wij = ηoi (tj − aj ) = ηoi δj (6.3) ∆wij = ηoi (tj − oj ) = ηoi δj (6.4) und Bei beide Formen entspricht das teaching input tj der erwarteten Ausgabe. Die Delta-Regel ist ein Spezialfall, denn sie wird nur bei linearen Aktivierungsfunktionen von Netzen mit nur einer Schicht trainierbarer Gewichte verwendet. 6.4.3 Backpropagation-Regel Die Backpropagations-Regel ist der Delta-Regel sehr ähnlich. Sie wird bei Netzen mit mehr als einer Schicht trainierbarer Gewichte und für Neuronen mit nichtlinearer Aktivierungsfunktion verwendet. Die Aktivierungsfunktion muss 56 6.4. Lernregel bei dieser Lernregel semilinear sein. Das bedeutet, dass sie monoton und differenzierbar sein muss. Die Backpropagations-Regel lautet: ∆wij = ηoi δj (6.5) Soweit ist sie analog zur Delta-Regel. Der Unterschied zu ihr liegt in der Berechnung von δj : f 0 (net )(t − o ) falls j eine Ausgabezelle ist j j j j δj = (6.6) P f 0 (netj ) (δk wjk ) falls j eine verdeckte Zelle ist j k Dabei ist f 0 die Aktivierungsfunktion, net die Propagierungsfunktion und t die erwartete Ausgabe. Bei der zweiten Fallunterscheidung ist der Summationsindex k zu beachten. Das Verbindungsgewicht wjk zeigt an, dass damit alle nachfolgenden Zellen gemeint sind. 57 6. Zellen eines KNN im Verbund 58 Kapitel 7 KNN-Modelle Mit den Informationen der voran gegangenen Kapiteln lassen sich verschiedenste Modelle neuronaler Netze modellieren. Die Wahl eines passenden Modells hängt von seinem Anwendungsgebiet ab. Viele Anwendungen basieren auf Mustererkennung (Zeichenerkennung, Spracherkennung, Bilderkennung, Sternklassifikation, etc.). Im folgenden soll ein kurzer Einblick in die Mustererkennung gegeben werden. Desweiteren werden einige der bekanntesten Modelle neuronaler Netze vorgestellt, die bei der Mustererkennung angewendet werden. 7.1 Mustererkennung Künstliche neuronale Netze sind in der Lage, Muster zu lernen. Das heißt, ihnen wird ein Muster zusammen mit einer gewünschten Ausgabe präsentiert und das Netz verändert seine Verbindungsgewichte in Wiederholungsvorgängen solange, bis die Netzausgabe der gewünschten Ausgabe entspricht. Um ein Muster für die Verarbeitung in einem neuronalen Netz zugänglich zu machen, wird es gerastert. Ein Beispiel für eine einfache Rasterung zeigt Abb. 7.1. Zu sehen ist eine Matrix aus 8x15 Feldern, auf die die Zahl Acht aufgetragen wurde. Zur Verarbeitung des Musters innerhalb eines Netzes mit binären Aktivierungszustände 0 und 1, werden die 120 Felder in schwarz-weiß Zustände umgewandelt: Jedes Feld, das durch die Zahl berührt wird, wird schwarz, die übrigen verbleiben weiß. Dabei entsprechen die schwarzen Feldern dem Wert 1 und die weißen dem Wert 0 oder umgekehrt. Die so entstandene Matrix kann nun vom Netz gelesen werden. Die Genauigkeit dieser Umwandlung ist von der Größe der Rasterung abhängig. Je feiner sie ist, desto größer ist die Genauigkeit, mit denen ein Muster erkannt 59 7. KNN-Modelle Abbildung 7.1: Rasterung der Zahl Acht werden kann. Das gleiche Prinzip wird auf komplexere Muster angewandt. Meist empfehlen sich für die Verarbeitung andere Aktivierungszustände, sodass zum Beispiel Graustufen oder Farbanteile eines Rasterfeldes erkannt werden können. 7.2 Perzeptron Ein Perzeptron ist ein Modell eines neuronalen Netzes. Anfang der 60er Jahre des letzten Jahrhunderts wurden von Frank Rosenblatt [Ros1958] mehrere Modelle entwickelt, die alle Perzeptron genannt wurden, somit gibt es kein einheitliches Perzeptron. Später wurde der Begriff jedoch verallgemeinert, so dass der Aufbau eines Perzeptrons wie in der Abb. 7.2 dargestellt aussieht. Eine Schicht aus Eingabeneuronen ist mit einer Neuronenschicht (Ebene 0) Abbildung 7.2: Links: Schema des Perzeptrons; rechts: Ausgabeneuron des Perzeptrons über unveränderbare Gewichte verbunden. Diese Neuronenschicht wiederum ist mit einem einzigen Neuron (Ebene 1) mit veränderbaren Gewichten verbunden. Durch diesen Aufbau entsteht ein feedforward-Netz ohne short cuts. Da nur eine der beiden Verbindungsschichten trainierbar ist, handelt es sich 60 7.2. Perzeptron hierbei um ein einschichtiges Netz oder einstufiges Perzeptron. Mehrstufige Perzeptrons haben den gleichen Aufbau, jedoch je nach Stufenzahl mehrere trainierbare Verbindungsschichten. Die am häufigsten untersuchten Anwendungen bei Perzeptrons sind Anwendungen visueller Wahrnehmung. Bei ihnen stellen die Neuronen der Eingabeschicht Zellen der Retina (Netzhaut des Auges) dar, die einfache Muster erkennen (simple feature detectors). Das Ausgabeneuron dient dem Netz als Klassifikator. Es gibt an, ob das Muster, das über die Eingabeschicht ins Netz aufgenommen wird, erkannt wird oder nicht. Bei den Perzeptrons handelt es sich in den meisten Fällen um binäre Netze, deren Eingaben und Aktivierungszustände nur binäre Werte annehmen dürfen (0 und 1, bzw. -1 und 1). Die Verbindungsgewichte unterliegen allerdings keinen Auflagen. Sie können reell sein. Da die Neuronen der Eingabeschicht nur -1, 0 oder 1 als Ausgabe haben können (je nachdem, welches System gewählt wurde), brauchen sie nicht näher spezifiziert zu werden. Die Neuronen der Ebene 0 und 1 errechnen mit der Propagierungsregel die Netzeingabe, die sich aus den Ausgaben der Neuronen der Vorgängerschicht und deren Verbindungsgewichten ergibt. Wie bereits erwähnt, kann ein Neuron nur einen Binärwert annehmen, bzw. ausgeben. Da die Gewichte jede reelle Zahl annehmen können, kann auch die Netzeingabe reell sein. Eine Fallunterscheidung sorgt mit Hilfe des Schwellenwertes dafür, dass die Ausgabe, bzw. der Aktivierungszustand eines Neurons ebenfalls binär wird. 1 falls net > θ j j oj = a j = (7.1) 0 falls netj < θj Sehr einfache Funktionen lassen sich mit Perzeptrons realisieren. Dazu gehören die logischen Operationen OR, AND, NOR, NAND oder die Implikation. Es gibt jedoch Probleme, die nicht von einem Perzeptron gelöst werden können. Zu ihnen zählt das XOR1 -Problem. Zur Demonstration wird ein einstufiges Perzeptron verwendet, das zwei Eingabeneuronen in der Ebene 0 und ein Ausgabeneuron j in der Ebene 1 hat und die binären Zahlen ’0’ und ’1’ verwendet. Die Ausgaben für XOR sind in der Tabelle 7.1 abgebildet. Die Netzeingabe für das Neuron j muss gleichgroß oder größer als der Schwellenwert sein, damit die Ausgabe oj ’1’ ergibt. netj > θj 1 Exklusives Oder. In der deutschen Sprache, lässt es sich mit ’entweder/oder’ übersetzen 61 7. KNN-Modelle o1 o2 o1 XOR o2 0 0 1 1 0 1 0 1 0 1 1 0 Tabelle 7.1: Die XOR-Verknüpfung Die Netzeingabe errechnet sich aus zwei Summanden, da das Perzeptron zwei Eingabeneuronen besitzt. netj = o1 w1j + o2 w2j Daraus ergibt sich folgende Ungleichung, die erfüllt sein muss, damit das Neuron j feuert: o1 w1j + o2 w2j > θj . Diese Formel lässt sich nach o2 umformen (für w2j 6= 0). o2 > 1 (θj − o1 w1j ) w2j Da der Schwellenwert einen konstanten Wert repräsentiert, ergibt sich aus dieser Formel eine Geradengleichung, die sich darstellen lässt (Abb. 7.3). Diese Gerade schneidet die Ebene, die durch die beiden Ausgaben der Eingabeneuronen o1 und o2 aufgespannt wird. Ist w2j positiv, stellen alle Punkte oberhalb der Geraden Kombinationen aus o1 und o2 dar, bei denen oj den Wert ’1’ hat. Ist w2j negativ, sind es die Punkte unterhalb der Geraden, die das gleiche bewirken. In der Abbildung 7.3 sind die Eckpunkte mit A0 , A1 , B0 und B1 bezeichnet worden. Soll das Netz eine XOR-Anweisung Abbildung 7.3: o2 -Funktion durchführen, muss an den Punkten B0 und B1 der Ausgabewert des Neurons j ’1’ haben. Das ist jedoch nicht möglich, da w2j bei reellen Werten nicht gleichzeitig positiv und negativ sein kann. Die Lösung des Problems kann auch nicht durch Verschiebung oder Drehung der Geraden erreicht werden. Man sagt dazu: Die Mengen {A0 ,A1 } und {B0 ,B1 } sind nicht linear separierbar. Das Perzeptron 62 7.3. Backpropagation versucht eine Klassifikation in zwei Klassen A und B vorzunehmen und scheitert daran. Allgemein gilt: Ein einstufiges Perzeptron kann nur linear separierbare Mengen klassifizieren. Das macht das Perzeptron nur beschränkt einsatzfähig, da die lineare Separierbarkeit vor dem Einsatz eines Perzeptrons geprüft werden sollte. 7.3 Backpropagation Wie auch beim Perzeptron, gibt nicht ein bestimmtes Backpropagation-Netz, sondern eine Menge unterschiedlicher Netze, die gemeinsame Eigenschaften besitzen. Meistens werden feedforward-Netz ohne Rückkopplung verwendet, es gibt aber noch andere Topologien, die verwandt werden. Die Netze besitzen alle eine Eingabeschicht, eine Ausgabeschicht und mindestens eine verdeckte Schicht von Neuronen. Bei der Backpropagation handelt es sich um ein überwachtes Lernverfahren. Wie das Lernen bei der Backpropagation durchgeführt wird und welche Probleme dabei auftreten können, soll in den folgenden Kapiteln erläutert werden. Da die Backpropagation u.a. auf der Delta-Regel beruht, soll diese anschließend hergeleitet werden. 7.3.1 Backpropagation-Verfahren Beim Lernverfahren der Backpropagation werden folgende Phasen durchlaufen: 1. Zufälliges Setzen der Verbindungsgewichte 2. Forward Pass Dem Netz wird eine Trainingsmenge präsentiert, die aus einem oder mehreren Eingabevektoren besteht, die dann das Netz durchlaufen. Jede Schicht berechnet seine Aktivierungen und Ausgaben bezüglich des Eingabevektors. Die Ausgabeschicht gibt als letzte ihre errechneten Werte wieder, die ebenfalls einen Vektor darstellen. 3. Fehlerbestimmung Zu jedem Element der Trainingsmenge ist die erwünschte Ausgabe bekannt. Eine Fehlerfunktion berechnet aus der aktuellen Ausgabe und der erwünschten Ausgabe den Fehler des Netzes. Eine Güteschwelle entscheidet in dieser Phase, ob ein Backward Pass durchgeführt wird oder nicht. 63 7. KNN-Modelle 4. Backward Pass Beim Backward Pass werden die Verbindungsgewichte modifiziert. Dies geschieht in umgekehrter Richtung zum Forward Pass. Bei einem Netz mit n Schichten heißt das, dass zuerst die Verbindungsgewichte von der n-1 ten Schicht modifiziert werden, dann die Verbindungsgewichte von der n-2 ten Schicht, usw. bis hin zu den Gewichten der Eingabeschicht. Eine Lernregel bestimmt mit Hilfe des errechneten Fehlers den Grad der Modifikation. Hinsichtlich des Zeitpunktes der Gewichtsmodifikation gibt es zwei Varianten: • Online-Training Die Gewichtsmodifikation wird nach jeder Präsentation eines Trainigsmusters vorgenommen. • Offline-Training Beim Online- oder auch Batch-Training werden die Gewichte erst nach einer bestimmten Zahl von Trainingsmustern (batchsize) modifiziert. Das Backpropagation-Verfahren versucht den durch die Fehlerfunktion errechneten Fehler, der aus der Differenz zwischen Ausgabe und der erwünschten Ausgabe berechnet wird, durch Modifikation der Verbindungsgewichte zu minimieren. Man könnte dazu sagen, das Netz versucht aus seinen Fehlern zu lernen. Nach diesem Lernschritt wird die darauf folgende Ausgabe des Netzes näher an der gewünschten Ausgabe sein als vor der Gewichtsmodifikation. Aus den Fehlern und den Gewichten lässt sich eine Funktion bilden, die sich im Koordinatensystem darstellen lässt (Abb. 7.4). Anhand einer solchen Abbildung kann man ablesen, wie groß der Fehler des Netzes bei einem bestimmten Gewicht ist. Im Idealfall gibt es keinen Fehler (in diesem Fall berührt der Graph die W-Achse). Das absolute Minimum gibt das Gewicht an, für den der Fehler am geringsten ist, das Maximum, den größten Fehler. Ziel ist es, den Fehler für alle Gewichte zu minimieren. Zu beachten ist bei der Abbildung, dass es sich bei ihr um eine Vereinfachung handelt, denn diese Abbildung geht von eindimensionalen Gewichten aus. Diese sind allerdings mehrdimensional, so dass die korrekte Darstellung der Fehlerfunktion eine Fläche zeigen müsste (die allerdings auch nur im zweidimensionalen Fall darstellbar ist). Die Wahl der Ausgabefunktion ist ausschlaggebend für die Struktur der Fehlerfläche. Eine sigmoide Ausgabefunktion, wie die logistische Funktion, die bei der Backpropagation am häufigsten verwendet wird, 64 7.3. Backpropagation Abbildung 7.4: Beispiel einer Fehlergeraden eines neuronalen Netzes als Funktion der Gewichte W. bewirkt eine Glättung der Fläche. Fast alle Punkte der Fehlerfläche besitzen die Eigenschaft, dass sie zu einem Tal hin geneigt sind. Die Punkte, die die Ausnahme bilden, sind die Minima und Maxima der Fläche. Die Backpropagation ist ein Gradientenabstiegsverfahren2 , das solche Minima errechnen kann. Dabei nutzt es die oben genannte Eigenschaft aus, indem es das Gefälle des Graphen für ein bestimmtes Gewicht verwendet, um die passende Modifikation für dieses Gewicht zu finden. ∆W = −η 5 F (W ) (7.2) W stellt dabei den Gewichtvektor dar, der durch Umformung der Gewichtsmatrix entstanden ist. F (W ) ist die Fehlerfunktion und 5F (W ) deren Gradient. Die Änderung des Gewichtsvektors ∆W ist proportional zum negativen Gradienten. Der bereits bekannte Lernfaktor η hat hier die Funktion eines Proportionalitätsfaktors. Er wird auch Schrittweite genannt. Durch Ableitung der Funktion lässt sich die Steigung einer Tangente in einem Punkt der Funktion ermitteln. Daher kann die Gewichtsveränderung für ein einzelnes Argument wie folgt berechnen werden: ∆wij = −η δ F (W ) δwij (7.3) Zur Veranschaulichung der Funktionsweise des Gradientenabstiegverfahrens wird wieder eine zweidimensionale Abbildung verwendet (Abb 7.5). Das Verfahren beginnt mit der zufälligen Wahl eines Gewichtsvektors w1 . Anschließend wird ein Forward Pass durchgeführt und das Ergebnis mit dem gewünschten verglichen. Dadurch entsteht eine Fehlerkurve. Die Steigung der 2 Gradient, lat. = Gefälle 65 7. KNN-Modelle Abbildung 7.5: Funktionsweise eines Gradientenabstiegsverfahren Fehlerkurve an der Stelle des Fehlers von w1 wird bestimmt. Diese wird mit der (negativen) Schrittweite multipliziert und gibt damit die Gewichtsänderung an (je größer das Gefälle in diesem Punkt ist, desto größer ist die Gewichtsänderung). Zu dem so erhaltenen Vektor w2 wird der Fehler bestimmt. Liegt dieser Fehler oberhalb einer zuvor definierten Güteschwelle, wird das Verfahren fortgesetzt, bis das Minimum der Fehlerkurve erreicht ist. An diesem Beispiel ist gut zu erkennen, dass nicht die gesamte Fehleroberfläche bekannt sein muss, um zu einem Ergebnis zu kommen. Es gibt verschiedene Fehlerfunktionen, die bei der Backpropagation angewendet werden. Am häufigsten wird die Fehlerberechnung über den quadratischen Abstand errechnet. Der Fehler eines einzelnen Neurons j nach Eingabe eines Trainingsmusters p ergibt sich aus der Differenz zwischen der Lerneingabe (teaching input) tpj und der errechneten Ausgabe opj . Fpj = tpj − opj (7.4) Der errechnete Fehler kann sowohl positive als auch negative Werte ergeben. Es macht jedoch keinen Sinn, zwischen positiven und negativen Fehlern zu unterscheiden, daher quadriert man die Differenz, sodass nur noch positive Fehler berechnet werden. Man spricht hier vom quadratischen Fehler. Die Summe aller quadratischen Fehler innerhalb eines Musters ergibt den Musterfehler. Fp = X (Fpj )2 (7.5) j Da bei der späteren Herleitung der Delta-Regel der Musterfehler abgeleitet wird, soll er hier mit dem Faktor 1/2 multipliziert werden, damit er sich bei der späteren Ableitung wegkürzen lässt. Zur Gewichtsbestimmung ist es uner66 7.3. Backpropagation heblich, ob man den Fehler oder den halben Fehler minimiert. Fp = 1X (Fpj )2 2 j (7.6) Für die Gesamtfehlerberechnung gelten alle zu erlernende Muster, daher werden sie aufsummiert. X Fp (7.7) F = p 7.3.2 Probleme der Backpropagation Das Backpropagation-Verfahren beruht, wie bereits erwähnt, auf einem Gradientenabstiegsverfahren. Bei der Anwendung können jedoch Probleme auftreten, die in der Regel darauf beruhen, dass nicht die gesamte Fehlerfläche bekannt ist. Im Folgenden sollen einige Probleme erläutert werden. Lokale Minima Dadurch, dass das Verfahren mit einem zufällig gewählten Gewichtsvektor beginnt, kann es vorkommen, dass durch den Gradientenabstieg nicht das absolute Minimum, sondern nur ein lokales Minimum erreicht wird. Ob ein absolutes Minimum erreicht wird, hängt davon ab, ob mit einem Gewichtsvektor gestartet wird, der in der Nähe eines solchen liegt (Abb. 7.6). Die Anzahl der Verbindungen zwischen den Neuronen bestimmt die Dimension Abbildung 7.6: Problem der lokalen Minima des Netzes. Je größer die Dimension eines Netzes ist, desto zerklüfteter ist die Fehleroberfläche. Mit dem Grad der Zerklüftung steigt auch die Anzahl der 67 7. KNN-Modelle lokalen Minima und somit die Gefahr, durch den Gradientenabstieg in einem solchen zu enden. Zusätzlich können Täler in der Oberfläche entstehen, die nur eine geringe Ausdehnung haben. Es kann also auch vorkommen, dass solche Täler übersprungen werden, in denen eventuell das absolute Minima liegt. Durch die Wahl einer geringeren Schrittweite, kann dieses Problem reduziert werden. Dadurch verlangsamt sich allerdings der Gradientenabstieg. Symmetry Breaking Bei diesem Problem handelt es sich um ein Problem, das bei vollständig verbundenen feedforward-Netzen auftritt. Es tritt dann auf, wenn alle Verbindungsgewichte mit demselben Wert initialisiert werden. Das Problem besteht darin, dass nach dem Backward Pass alle Gewichte, trotz Modifikation, immer noch den gleichen Wert haben. Man kann dies anhand eines Beispiels verdeutlichen. Gegenen sein ein vollständig verbundenes feedforward-Netz mit zwei Eingabeneuronen, drei Neuronen in der verdeckten Schicht und zwei Ausgabeneuronen (Abb. 7.7). Alle Verbindungsgewichte haben den gleichen Startwert. Da alle Neuronen der verdeckten Schicht ihre Werte von beiden Eingabeneuronen erhalten, sind auch ihre Ausgaben identisch. Das hat zur Folge, dass auch die beiden Ausgabeneuronen die gleichen Werte annehmen. Nach diesem Forward Pass beginnt der Backward Pass. Er startet mit der Modifikation der Gewichte zwischen der verdeckten Abbildung 7.7: Schematische Schicht und der Ausgabeschicht. Abhängig vom Darstellung eines KNN teaching input werden die Gewichtsänderungen berechnet. Alle Gewichte, die zu einem Ausgabeneuron führen, werden mit dem gleichen Faktor geändert (gemäß der Abbildung heißt das: alle grünen Gewichte sind untereinander identisch, sowie alle magenta farbenen). Dasselbe Verfahren wird auf die Gewichte zwischen der Eingabeschicht und der verdeckten Schicht angewandt (alle blauen und alle roten Gewichte sind untereinander identisch). Trotzdem die Gewichte einen zum Initialwert unterschiedlichen Wert angenommen haben, bleibt doch der Effekt bestehen, dass die Neuronen der verdeckten Schicht wieder identische Werte annehmen. Das Problem kann vermieden werden, indem die Gewichte mit zufälligen Werten initialisiert werden. 68 7.3. Backpropagation Flache Plateaus Die Fehleroberfläche kann neben Maxima und Minima auch flache Plateaus enthalten. Die Steigung ist an dieser Stelle sehr gering. Da die Gewichtsveränderung mit der Größe des Gefälles steigt und fällt, kann es an Plateaus zu einer deutlichen Verlangsamung kommen (Abb. 7.8). Im Extremfall kann Abbildung 7.8: Problem der Plateaus aufgrund der zu geringen Steigung vom Verfahren der falsche Schluss gezogen werden, ein Minimum erreicht zu haben. Oszillation Ist das Gefälle am Rande eines Tals besonders groß, kann es sein, dass die Gewichtsänderung auf die gegenüberliegende Seite des Tals springt. Ist das Gefälle an dieser Stelle zufällig genauso groß, ändert sich nur das Vorzeichen des Gradienten und die Gewichtsänderung springt auf den Initialwert zurück und es kommt zu einer direkten Oszillation (Abb. 7.9). Bei der indirekten Oszillation, sind mehrere Gewichtsänderungen mit inbegriffen, die jedoch ebenfalls wieder den Anfangswert erreichen. Verlassen guter Minima Liegt das absolute Minimum in einem steilen Tal, kann es sein, dass es beim Verfahren übersprungen wird (Abb. 7.10). Der Gradient ist dann am Beginn des Tales so groß, dass eine große Gewichtsänderung errechnet wird. Auch hier kann eine geringere Schrittweite helfen. 69 7. KNN-Modelle Abbildung 7.9: Problem der Oszillation Abbildung 7.10: Problem des Verlassens guter Minima 70 7.3. Backpropagation 7.3.3 Herleitung der Delta-Regel Bei dieser Herleitung ist zu beachten, dass hier vom Offline-Training ausgegangen wird. Die Gleichung (7.3) zeigt die Gewichtsveränderung für ein einzelnes Argument. Unter Anwendung der Gleichung (7.7) ergibt sich folgendes: X ∂ ∆wij = −η Fp (7.8) ∂wij p Die Ableitung von Fp zu wij lässt sich mit Hilfe der Kettenregel errechnen: ∂Fp ∂Fp ∂opj = ∗ ∂wij ∂opj ∂wij (7.9) Beide Faktoren lassen sich getrennt voneinander berechnen. Unter Verwendung der Gleichung für den Musterfehler (7.6) lässt sich der erste Faktor ebenfalls mit Hilfe der Kettenregel berechnen. Dabei entfällt der beim Musterfehler gewählte Faktor 1/2 durch Kürzung. ∂Fp = −(tpj − opj ) ∂opj (7.10) Die Differenz zwischen dem teaching input tpj und der Ausgabe opj wird mit δpj bezeichnet (vergl. (6.4)). Somit ergibt sich: ∂Fp = −δpj ∂opj (7.11) In dieser Herleitung wird die Identität als Aktivierungsfunktion verwendet, die besagt, dass opj = netpj . Mit der Standard-Propagierungsfunktion ergibt sich dann für den zweiten Faktor: ∂opj ∂ X = opi wij = opi (7.12) ∂wij ∂wij i Die in (7.11) und (7.12) errechneten Faktoren lassen sich in die Gleichung (7.9) einsetzen. ∂Fp = −δpj ∗ opi (7.13) ∂wij Die Herleitung der Dalta-Regel ist beendet, indem man diesen Wert in die erste Gleichung (7.8) einsetzt, dabei heben sich die beiden negativen Vorzeichen gegeneinander auf. Da η ein Faktor ist, der sich auf alle Summanden auswirkt, kann er vor das Summenzeichen gesetzt werden. X ∆wij = η opi ∗ δpj (7.14) p Die Backpropagation-Regel beinhaltet Bereiche, die durch die Delta-Regel nicht abgedeckt werden können. Diese jedoch herzuleiten, würde den Rahmen dieser Arbeit sprengen. Die Herleitung der Backpropagation-Regel kann unter [RumMcC86] nachgelesen werden. 71 7. KNN-Modelle 7.4 Hopfield-Netze Das Hopfield-Netz besteht aus nur einer Schicht Neuronen, die untereinander verbunden sind. Dabei erfüllen sie folgende Bedingungen: 1. Jedes Neuron i ist mit einem Neuron j des Netzes verknüpft (Rückkopplung, Rekursion). 2. Es besteht keine Verbindung von einem Neuron zu sich selbst (keine direkte Rückkopplung). 3. Die Verbindungen zwischen zwei Neuronen ist symmetrisch, das heißt wij = wji . 4. Jedes Neuron hat als Aktivierungsfunktion eine lineare Schwellenwertfunktion. In der Abbildung 7.11 ist ein Hopfield-Netz mit 4 Neuronen abgebildet. Das Abbildung 7.11: Hopfield-Netz mit 4 Neuronen Hopfield-Netz ist ein rückgekoppeltes Netz und unterschiedet sich in seiner Informationsverabreitung von Feedforward-Netzen. Bei Feedforward-Netzen geschieht die Verarbeitung durch Propagation von der Eingabeschicht, über die verdeckte(n) Schicht(en) bis zur Ausgabeschicht. Bei Hopfield-Netzen gibt es nur eine Schicht von Neuronen, die diese Aufgabe erfüllt. Dabei werden die Neuronen nach einer Ausgabe wiederverwendet, da die Ausgabe ihrer Nachbarneuronen wieder ihre neue Eingabe bestimmt. Die Aktivierungszustände der Neuronen werden solange neu berechnet, bis sie einen stabilen Zustand (Ruhezustand) erreicht haben, das heisst, bis sich keine weiteren Änderungen der Aktivierungszustände mehr ergeben. 72 7.4. Hopfield-Netze 7.4.1 Binäre Hopfield-Netze Die Netzeingabe binärer Hopfield-Netze ähnelt sehr der Standard-Propagierungsfunktion. Zu der gewichteten Summe wird allerdings zusätzlich die Eingabe in addiert. netj (t + 1) = X wij oi (t) + inj (7.15) i6=j Man erkennt, dass inj bei jedem Iterationsschritt von neuem addiert wird. Das bedeutet, dass das Eingabemuster immer wieder gelesen wird und somit konstant anliegen muss. Die Ausgabe eines Neurons ist entweder 1, wenn die Netzeingabe oberhalb, oder 0, wenn sie unterhalb des Schwellenwertes liegt. Ist sie identisch mit dem Schwellenwert, bleibt sie unverändert. In der Aktivierungsfunktion stellt sich das wie folgt dar: falls (netj (t + 1)) > θj 1 oj (t + 1) = f (netj (t + 1)) = 0 (7.16) falls (netj (t + 1)) < θj oj (t) sonst Ursprüngliche Untersuchungen des Hopfield-Netzes beruhten auf der asynchronen Aktivierung (Kapitel 5.4, Seite 47), mit der auch die Stabilität dieses Netzes bewiesen werden konnte. Die synchrone Aktivierung findet in der Praxis jedoch häufiger Anwendung ([Zel2000]). 7.4.2 Beweis der Stabilität von Hopfield-Netzen Wird dem Hopfield-Netz ein Muster angelegt, ändert das System seine Werte gemäß der Eingabe. Diese Änderungen müssen in einem gewissen Maß abnehmen, damit ein stabiler Zustand erreicht werden kann. Die Stabilität eines Hopfield-Netzes kann mit Hilfe einer Energiefunktion berechnet werden. Wenn diese Funktion gegen ein Minimum konvergiert, tritt das Netz in einen Ruhezustand ein. Damit die Funktion gegen ein Minimum konvergiert, muß sie folgende Bedingungen erfüllen: • Sie muss nach unten beschränkt sein. • Jede Veränderung des Netzes muß zu einem geringeren Funktionswert führen. 73 7. KNN-Modelle Die Liapunov-Funktion ist eine solche Energiefunktion, die diese Bedingungen erfüllt. X X 1 XX E(t) = − wij oi (t)oj (t) − inj oj (t) + θj oj (t) (7.17) 2 i j j j Dabei ist E(t) die Energie des Hopfield-Netzes zum Zeitpunkt t, wij das Verbindungsgewicht zwischen dem Ausgang von Neuron i zum Eingang von Neuron j, oi (t), bzw. oj (t) die Ausgabe von Neuron i, bzw. j zum Zeitpunkt t, inj die externe Eingabe in das Neuron j und θj der Schwellenwert des Neurons j, der in der Arbeitsphase einen konstanten Wert besitzt. Da die Energie mit jedem Zeitschritt abnehmen soll, errechnet sich ihre Änderung zum Zeitpunkt t + 1 aus der Differenz zwischen der Energie zu diesem Zeitpunkt und der alten Energie. ∆E(t + 1) = E(t + 1) − E(t) (7.18) Unter Verwendung der Liapunov-Funktion ergibt sich damit die Änderung der Energie beim Feuern eines einzelnen Neurons k: 1 XX wij oi (t + 1)oj (t + 1) 2 i j X X − inj oj (t + 1) + θj oj (t + 1)] ∆E(t + 1) = [− j (7.19) j 1 XX −[− wij oi (t)oj (t) 2 i j X X − inj oj (t) + θj oj (t)] j j Geht man davon aus, dass sich ausschließlich das Neuron k ändert, bedeutet das, dass die Ausgaben der Neuronen i und j 6= k gleich bleiben. dadurch entfallen alle Summanden, außer denen, für die i = k oder j = k gilt. X ∆E(t + 1) = [− wik oi (t + 1)ok (t + 1) (7.20) i6=k −ink ok (t + 1) + θk ok (t + 1)] X −[− wik oi (t)ok (t) i6=k −ink ok (t) + θk ok (t)] Hier ist zu beachten, dass sich alle Terme eliminieren, in denen wii vorkommt. Denn ein Neuron i ist nicht mit sich selbst verknüpft und so ist das Verbindungsgewicht wii =0. Eine weitere Voraussetzung für Hopfield-Netze, die Symmetrie der Gewichte, besagt, dass wij = wji . Das bedeutet für die Gleichung, 74 7.4. Hopfield-Netze dass wik = wkj , für alle i und j 6= k. In der Gleichung entstehen jeweils zwei Terme, die auf Grund dieser Tatsache identisch werden. Dadurch kann der Faktor 1/2 entfallen. Die so entstandene Gleichung lässt sich weiter vereinfachen, indem man ok (t + 1) im Minuend und ok (t) im Subtrahend ausklammert. X ∆E(t + 1) = [− wik oi (t + 1) − ink + θk ]ok (t + 1) (7.21) i6=k −[− X wik oi (t) − ink + θk ]ok (t) i6=k Der Inhalt beider eckiger Klammern ist gleich, weil wiederum gilt: oi (t + 1) = oi (t) für alle i 6= k. Daher lässt sich die Gleichung weiter vereinfachen. X ∆E(t + 1) = [− wik oi (t + 1) − ink + θk ](ok (t + 1) − ok (t)) (7.22) i6=k In der eckigen Klammer ist die Netzausgabe zu erkennen. ∆E(t + 1) = −[netk (t + 1) − θk ]∆ok (t + 1) (7.23) Wobei ∆ok (t + 1) die Änderung der Ausgabe in Neuron j darstellt. Die Aktivierungsfunktion (7.16) unterscheidet 3 Fälle, von denen hier nur zwei ins Gewicht fallen, da davon ausgegangen wurde, dass das Neuron k seinen Zustand geändert hat und somit netk (t + 1) 6= θk ist. • 1.Fall: netk (t + 1) > θk Gemäß der Aktivierungsfunktion ist die Ausgabe von ok (t + 1)=1. Das bedeutet, dass ok (t) seinen ursprüngliche Zustand von 0 auf 1 geändert haben muss. Daraus folgt: ∆ok (t + 1) > 0 . Wegen der Negation in 7.23 gilt: ∆E(t + 1) < 0 • 2.Fall: netk (t + 1) < θk Die Ausgabe lautet in diesem Fall ok (t+1)=0. Der ursprüngliche Zustand ok (t) muss also 1 gewesen sein. Daher ist ∆ok (t + 1) < 0 und netk (t + 1) − θk < 0 . Daraus folgt: ∆E(t + 1) < 0 75 7. KNN-Modelle Beide Fälle zeigen, dass sich die Energie bei jeder Änderung eines Neurons verringert und ansonsten gleich bleibt. Daher muss die Netzwerk-Energie ein Minimum finden und das Netzwerk ist stabil. 76 Kapitel 8 Simulation eines KNN in JAVA Ein bereits vorgestelltes Modell eines KNN ist das Hopfield-Netz. Im Anhang dieser Arbeit befindet sich der Sourcecode eines Programmes, das ein binäres Hopfield-Netz simuliert. Die gewählte Programmiersprache ist Java. Die wichtigsten Details, die notwendig sind, um ein Hopfield-Netz in Java zu simulieren, sollen im folgenden erläutert werden. Alle Angaben beziehen sich dabei auf das oben erwähnte Programm. Für die folgenden Erläuterungen sind Kenntnisse in der Implementierung von Java von Vorteil. 8.1 Typenklassendeklaration und Initialisierung der wichtigsten Komponenten Zu den wichtigsten Komponenten, die benötigt werden, zählen: • die Anzahl der Spalten des Musters. Da diese Zahl nur ganzzahlig sein kann, empfiehlt sich der Typ int. • die Anzahl der Spalten des Musters. Wie auch bei den Spalten ist diese Zahl ganzzahlig, also vom Typ int. • die Anzahl der Neuronen des Netzes. Sie setzt sich zusammen aus dem Produkt der Zeilen und Spalten des Musters und ist daher ebenfalls vom Typ int. • die Gewichtsmatrix wij , deren Größe durch die Anzahl der Neuronen bestimmt wird. Matrizen lassen sich am besten durch einen Doppelarray vom Typ int darstellen. 77 8. Simulation eines KNN in JAVA Dabei stellt der erste Array die Spalten i, der zweite Array die Zeilen j dar. • die Anzahl der zu erlernenden Muster. Da auch sie nur ganzzahlig sein kann, sollte hier ebenfalls der Typ int verwendet werden. • der Aktivierungszustand ai eines Neurons. Der Zustand eines Neurons i kann bei binärer Aktivierung nur zwei verschiedene Zustände annehmen. In diesem Fall wurden die Zustände 1 und -1 gewählt. Da in einem Hopfield-Netz alle Neuronen in einer Schicht liegen, bietet sich hier die Darstellung der Aktivierungszustände aller Neuronen in einem Vektor an. In Java lässt sich ein Vektor am besten durch einen Array vom Typ int darstellen. • der Schwellenwert θi eines Neurons i. Da die Aktivierungszustände aller Neuronen in einem Array dargestellt werden, ist es sinnvoll, ihre Schwellenwerte ebenfalls in einem Array darzustellen. Der Schwellenwert kann reelle Werte annehmen, daher ist der Array vom Typ double. • die Zustände des zu erlernenden Musters. Ein Muster das aus Zeilen und Spalten besteht, lässt sich entweder durch einen Doppelarray darstellen, der die Spalten und Zeilen des Musters darstellt, oder durch einen einfachen Array, der das Muster zeilen- oder spaltenweise liest und deren Aktivierungszustände in einen Vektor (Array) schreibt. Zur besseren Übersicht wurde die zweite Variante gewählt. Da das Netz auch mehrere Muster gleichzeitig erlernen können soll, wird diese Bedingung durch einen weiteren Array abgefangen, der die Nummer des zu erlernenden Musters repräsentieren soll. Beide Arrays sind vom Typ int. Die folgenden beiden Komponenten sind Objekte der Klasse Gitter, die eine Schnittstelle zur grafischen Oberfläche des Programmes darstellt. Die Funktionsweise dieser Klasse soll nicht im einzelnen erläutert werden. Jedoch wird auf einige ihrer Methoden, die bei späteren Berechnungen verwendet werden, eingegangen. Die Objekte sind: • das/ die zu erlernende(n) Muster. Die Anzahl der zu erlernenden Muster ist variabel. Daher werden die Muster mit einem Array beschrieben. 78 8.1. Die wichtigsten Komponenten • das zu überprüfende Muster Diese Anzahl ist vorbestimmt, daher ist die Anwendung eines Arrays nicht notwendig. Die Klasse Hopfield beinhaltet, neben anderen, die oben genannten Komponenten. Die Implementierung dieser Komponenten führt zu folgenden Typendeklarationen: public class Hopfield extends Applet { : public int columns; public int rows; private int neurons; private int Gewichtsmatrix[][]; public int Muster; private int Zustand_vector[]; private double Grenzwert_vector[]; private int lern_muster_vektor[][]; private Gitter Display_Gitter; public Gitter pattern_Gitter[]; : } Der Konstruktor der Klasse Hopfield setzt einige Default-Startwerte dieser Objekte. Die übrigen werden in der init()-Methode initialisiert. In dieser Methode werden auch noch nicht erstellte Objekte der oben genannten Klassen erzeugt. Da alle Muster zu Beginn noch nicht aktiviert sein sollen, ist ihr Initialwert -1. Die Objekte der Klasse Gitter verlangen bei ihrer Erzeugung die Angabe über die Anzahl der Zeilen und Spalten des Musters, das durch Gitter dargestellt werden soll. Die Belegung der Gewichtsmatrix und des Schwellenwertes (Grenzwert_vector) mit Werten wird in einer Methode vorgenommen, die zu einem späteren Zeitpunkt erläutert werden soll. Display_Gitter ist das Muster, das durch das Netz wiedererkannt werden soll, pattern_Gitter jene, die erlernt werden sollen. Das stellt sich in der Implementierung wie folgt dar: public Hopfield() { : rows = 3; 79 8. Simulation eines KNN in JAVA Abbildung 8.1: Start-Bild des Programms columns = 3; Muster =2; : } public void init() { : neurons = rows * columns; Zustand_vector = new int[neurons]; for(int i = 0; i < neurons; i++) Zustand_vector[i] = -1; Grenzwert_vector = new double[neurons]; Gewichtsmatrix = new int[neurons][neurons]; lern_muster_vektor = new int[Muster][neurons]; for(int j = 0; j < Muster; j++) for(int l = 0; l < neurons; l++) lern_muster_vektor[j][l] = -1; Display_Gitter = new Gitter(rows, columns); pattern_Gitter = new Gitter[Muster]; for(int k = 0; k < (Muster+unsichtbare_Muster) ; k++) pattern_Gitter[k] = new Gitter(rows, columns); : } Mit diesen Startwerten ergibt sich beim erstmaligen Start des Programmes eine Anzeige, die in Abb. 8.1 dargestellt ist. 80 8.2. Das Erlernen von Mustern Abbildung 8.2: Beispiel für ein Muster mit 3 Spalten und 3 Zeilen 8.2 Das Erlernen von Mustern Die Klasse Hopfield besitzt eine Methode, die den Prozess des Erlernens von Mustern beschreibt. Diese Methode verwendet u.a. auch eine Methode der Klasse Gitter. Da diese Methode für das weitere Verständnis von Bedeutung ist, soll diese kurz erläutert werden. Wie bereits erwähnt, stellt die Klasse Gitter eine Schnittstelle zur grafischen Oberfläche dar. Der Benutzer des Programmes hat die Möglichkeit, am Bildschirm durch Anklicken der Zellen der abgebildeten Muster deren Aktivierungszustände selber zu bestimmen. Die abgebildeten Muster speichern ihre Aktivierungszustände in einem Doppelarray vom Typ int mit dem Namen Zustand. Der erste Array repräsentiert dabei die Zeile, der zweite die Spalte des Musters. Analog zur Klasse Hopfield sind alle Zustände mit dem Wert -1 initialisiert. Durch Anklicken färbt sich die ausgewählte Zelle des Musters schwarz und wechselt ihren Aktivierungszustand von -1 zu 1. Nochmaliges Anklicken macht diesen Vorgang wieder rückgängig. In der Abbildung 8.2 ist ein Beispiel für ein Muster mit unterschiedlichen Aktivierungszuständen dargestellt. Die Belegung des Doppelarrays sieht für dieses Beispiel wie folgt aus: int[][] Zustand={{1,1,1},{-1,1,-1},{-1,1,-1}} Im Gegensatz zur Klasse Gitter werden in der Klasse Hopfield die Aktivierungszustände nicht in einem 2-, sondern in einem 1-dimensionalen Array gespeichert. Die Methode hole_Zustand liest die Zustände eines Musters zeilenweise und schreibt diese in einen 1-dimensionalen Array. Dabei muss ihr ein 1-dimensionaler Array übergeben werden, dessen Werte durch diese Methode überschrieben werden. void hole_Zustand(int ai[]) { for(int i = 0; i < Spalten; i++) { 81 8. Simulation eines KNN in JAVA for(int j = 0; j < Zeilen; j++) ai[j * Spalten + i] = Zustand[j][i]; } } Für das oben genannte Beispiel ergibt sich dadurch: int[] ai={1,1,1,-1,1,-1,-1,1,-1} Der so entstandene Vektor kann von der Klasse Hopfield verarbeitet werden. Nachdem alle Muster der Trainingsmenge am Bildschirm eingegeben wurden, kann durch Klicken des Buttons lernen“ der Lernprozess des Netzes gest” artet werden. Innerhalb der Klasse Hopfield wird dadurch u.a. die Methode Gewichtung() aufgerufen, die die Gewichtsmatrix über alle Trainigsmuster errechnet. Dazu werden die Zustandsvektoren aller Trainingsmuster mit der oben beschriebenen Methode aus der Bildschirmanzeige gelesen. Nach vorheriger Definition ist lern_muster_vector ein 2-dimensionaler Array. Die Methode hole_Zustand verlangt allerdings einen 1-dimensionalen Array als Parameter. Da lern_muster_vector mit nur einem Argument aufgerufen wird, ist die Übergabe an die Methode also tatsächlich ein 1-dimensionaler Array. private void Gewichtung() { for(int i = 0; i < Muster; i++) { pattern_Gitter[i].hole_Zustand(lern_muster_vektor[i]); } : } Für die Implementierung wurde ein Schwellenwert von θ=0 gewählt, der für alle Neuronen gilt. for(int k = 0; k < neurons; k++) Grenzwert_vector[k] = 0.0d; Die Berechnung der Gewichtsmatrix wird in Anlehnung an der Hebbschen Lernregel (Kapitel 6.4.1) implementiert. Sie erfolgt mit einer konstanten Lernrate von η=1. Da dieser Faktor keine Auswirkung auf das Ergebnis hat, wird 82 8.2. Das Erlernen von Mustern Abbildung 8.3: Beispiel für zwei Muster mit je 2 Spalten und 2 Zeilen er in der Implementierung vernachlässigt. Der erste Schritt besteht darin, alle Werte der Matrix auf 0 zu setzen. Anschließend werden alle Werte, die sich nicht auf der Hauptdiagonalen befinden verändert. Stimmt der Aktivierungszustand der Zelle i mit dem der Zelle j überein, bewirkt das eine positive Veränderung des entsprechenden Gewichtes (Erregung). Ist er jedoch unterschiedlich, verringert sich der Wert des Gewichtes (Hemmung). Für die Umsetzung des Summenzeichens in Java bietet sich der Operator +=“ an. Der ” Wert links dieses Operators wird um den Wert erhöht, der rechts von ihm steht. Die Zählvariablen der for-Schleifen bedeuten dabei: i= Spalten der Gewichtsmatrix, j= Zeilen der Gewichtsmatrix und k= Musteranzahl. for(int i = 0; i < neurons; i++) { for(int j = 0; j < neurons; j++) { Gewichtsmatrix[i][j] = 0; if (i != j) for(int k = 0; k < Muster; k++) Gewichtsmatrix[i][j] += (lern_muster_vektor[k][i] * lern_muster_vektor[k][j];) } } Zur Verdeutlichung der Funktionsweise soll ein weiteres Beispiel gewählt werden (Abb. 8.3). Dabei haben die Variablen folgenden Werte: neurons =4, Muster=2, der Zustandsvektor des ersten (linken) Musters ist {1,-1,-1,1} und der des zweiten (rechten) {1,-1,1,-1}. Im ersten Schritt wird die Gewichtsmatrix mit Nullen gefüllt. 0 0 0 0 0 0 0 0 wij = 0 0 0 0 0 0 0 0 83 8. Simulation eines KNN in JAVA Die if-Bedingung stellt sicher, dass sich die Diagonale nicht weiter ändert und somit eine ihrer Anforderungen erfüllt. Daraufhin werden die Gewichtsmatrizen jedes Musters seperat bearbeitet. Dabei wird der i-te Wert des Zustandsvektors eines Musters mit dem j-ten Wert des selben Musters multipliziert. Das so ermittelte Produkt ersetzt die Null an der entsprechenden Stelle der Gewichtsmatrix. Daraus ergibt sich für das erste Muster folgende Gewichtsmatrix: 0 −1 −1 1 −1 0 1 −1 wij von Muster 1 = −1 1 0 −1 1 −1 −1 0 In gleicher Weise wird die Gewichtsmatrix für das zweite Muster berechnet. Diese hätte folgende Werte: wij von Muster 2 = 0 −1 1 −1 −1 0 −1 1 1 −1 0 −1 −1 1 −1 0 Die Werte der Gewichtsmatrix vom zweiten Muster werden stellenweise, direkt nach ihrer Berechnung mit den entsprechenden Werten der bereits bestehenden Matrix vom ersten Muster addiert. Das bedeutet, dass die oben abgebildete Matrix für das zweite Muster zu keinem Zeitpunkt der Berechnungen in der abgebildeten Weise gespeichert wird. Aus der Addition der einzelnen Werte ergibt sich dann die Gewichtsmatrix, die Gültigkeit für beide Muster hat. wij = 0 −2 0 0 −2 0 0 0 0 0 0 −2 0 0 −2 0 Der Lernvorgang ist hiermit abgeschlossen. Die Gewichtsmatrix wurde so erstellt, dass bei der Wahl eines Musters aus der Trainingsmenge durch Anlegen an das Hopfield-Netz die Ausgabe identisch mit der Eingabe ist. 8.3 Die Hamming-Distanz Um ein Muster in einem trainierten Hopfield-Netz wieder zuerkennen, muss es über eine Methode verfügen, die zwei Vektoren miteinander vergleichen kann. Eine solche Methode ist die Ermittlung der Hamming Distanz, die angibt, an 84 8.4. Das Wiedererkennen von Mustern wievielen Stellen sich zwei Vektoren voneinander unterscheiden. Als Beispiel sollen die Vektoren der Aktivierungszustände der beiden Muster in Abb. 8.3 verglichen werden. Ihre Aktivierungszustände in Vektorschreibweise sind: 1 1 −1 −1 und . −1 1 1 −1 Die beiden Vektoren unterscheiden sich an zwei Stellen. Ihre Hamming Distanz beträgt somit 2. Ist die Hamming Distanz gleich Null, sind die Vektoren identisch. Die Klasse Hopfield verfügt über eine Methode errechne_hamming_distanz, die die Hamming Distanz zweier Vektoren errechnet. Diese müssen der Methode als Parameter übergeben werden. Die Inhalte der Vektoren werden stellenweise miteinander verglichen. Ein zuvor mit dem Wert Null initialisierter Zähler erhöht seinen Wert, sobald an einer Stelle keine Übereinstimmung gefunden wird. Der nach dem Vergleich von der Methode gelieferte Wert entspricht der Hamming Distanz. private int errechne_hamming_distanz(int ai[], int a2[]) { int k = 0; for(int j = 0; j < neurons; j++) if(ai[j] != a2[j]) k++; return k; } 8.4 Das Wiedererkennen von Mustern Die Wiedererkennung eines Musters in einem mit Mustern trainierten HopfieldNetz erfolgt durch das Einlesen des Musters und der Berechnung des Ausgabevektors. Diese Berechnungungen werden in einer endlichen Anzahl wiederholt. Sobald der Ausgabevektor identisch mit einem im vorangegangenen Iterationsschritt ermittelten Ausgabevektor ist, gilt das Muster als erkannt. Die Gewichtsmatrix hat die Eigenschaft, dass Muster die der Trainingsmenge angehören, bereits nach zwei Iterationsschritten erkannt werden. Ist das Muster verrauscht, unscharf oder geringfügig abweichend von einem Muster der 85 8. Simulation eines KNN in JAVA Trainingsmenge, kann es trotzdem wieder erkannt werden, jedoch bedarf es dabei mehrerer Iterationsschritte. Ein Beispiel soll zeigen, wie der mathematische Prozess abläuft. Dazu wird das Hopfield-Netz mit den Mustern der Abb. 8.3 auf Seite 83 trainiert. Die dazugehörige Gewichtsmatrix ist im Kapitel 8.2 bereits ermittelt worden. Als wieder zuerkennendes Muster soll ein Muster der Trainingsmenge gewählt werden (das linke der beiden abgebildeten Muster). Grundlage für die folgenden Berechnungen sind die Propagierungs- und Aktivierungsfunktion für binäre Hopfield-Netze, dabei ist zu beachten, dass die Fallunterscheidungen zwischen den Ausgaben 1 und -1 (anstatt 0) entscheidet. Im ersten Iterationsschritt liegt noch keine Ausgabe oi eines Neurons i vor, daher entspricht die Netzeingabe dieses Neurons bei diesem Schritt der Eingabe des selben Neurons. Für alle Neuronen des Netzes entspricht das dem Eingabevektor des wieder zuerkennenden Musters. netj (0) = inj Da inj die binären Zustände 1 oder -1 hat, verändert die Aktivierungsfunktion den eingegebenen Vektor nicht. Somit gilt: oi (1) = netj (0) = inj Erst im zweiten Iterationsschritt wird die Summe der gewichteten Ausgaben in die Berechnung der Netzeingabe mit einbezogen. 1 1 0 −2 0 0 −2 0 0 0 −1 −1 net(1) = + . 0 0 0 −2 −1 −1 0 0 −2 0 1 1 Daraus ergibt sich: net(1) = 3 −3 −3 3 . Die Aktivierungsfunktion wandelt negative Werte in -1, positive in 1 um. Die Ausgabe lautet daher: 1 −1 o(1) = . −1 1 Vergleicht man das Ergebnis dieser Berechnung mit dem Eingabevektor, kann man feststellen, dass beide Vektoren identisch sind. Gibt man die Muster wie 86 8.4. Das Wiedererkennen von Mustern Abbildung 8.4: Beispiel mit 2 Trainingsmustern und einem Suchmuster beschrieben in die grafische Oberfläche des Programmes ein, bestätigt dieses, dass das Muster gefunden wurde. Um ein Beispiel für eine oszillierende Ausgabe zu finden, muss ein Suchmuster gewählt werden, dass kein Element der Trainingsmenge ist, da dieses vom Netz erkannt werden kann. Um eine größere Anzahl von Iterationschritten zu erhalten, scheint ein Beispiel mit einer 3x3-Matrix geeignet. Das Netz sei mit den Mustern 1 und 2 in Abb.8.4 trainiert worden. Nach dem Lernvorgang sieht die Gewichtsmatrix wie folgt aus: 0 −2 −2 0 0 −2 0 −2 0 −2 0 2 0 0 2 0 2 0 −2 2 0 0 0 2 0 2 0 0 0 0 0 −2 0 2 0 −2 . w= 0 0 0 −2 0 0 −2 0 2 2 0 0 0 0 2 0 −2 2 0 0 0 2 −2 0 0 0 −2 −2 2 2 0 0 2 0 0 0 0 0 0 −2 2 0 −2 0 0 Mit ihr und dem Eingabemuster, das ebenfalls in der Abbildung zu sehen ist, ergeben sich folgende Ausgaben: 1 1 1 −1 −1 −1 −1 −1 −1 −1 −1 −1 1 −1 1 −1 , o(1) = 1 , o(2) = −1 , o(3) = 1 . o(0) = −1 −1 −1 −1 −1 −1 1 −1 1 −1 −1 −1 1 −1 1 −1 1 87 8. Simulation eines KNN in JAVA Abbildung 8.5: mathematisch errechnete Ausgabemuster Abbildung 8.6: durch das Java-Programm errechnete Ausgabemuster An dieser Stelle kann die Berechnung abgebrochen werden, da o(3) und o(1) identisch sind (ihre Hamming-Distanz beträgt Null). Weitere Berechnungen würden zeigen, dass das Netz keinen stabilen Zustand erreicht. o(t) = o(t + 2) Die Ausgabevektoren entsprechen den in Abb.8.5 dargestellten Mustern. Benutzt man das Java-Programm, um die errechneten Ausgaben mit denen des Programmes vergleichen zu können, erhält man abweichende Ergebnisse (Abb. 8.6). Daraus lässt sich schließen, dass das Programm eine fehlerhafte Berechnung der Ausgaben errechnet. In den folgenden Kapiteln sollen die Fehler, die zu dieser fehlerhaften Ausgabe führen, gefunden und ein Vorschlag für eine Implementierung gegeben werden, die eine Ausgabe liefert, die mit der mathematisch errechneten identisch ist. 8.4.1 Analyse der fehlerhaften Programmfunktionen Die Methode, die die Berechnung der Ausgabe durchführt, heißt auswerten(). In ihr wird eine Variable verwendet, die die Netzeingabe eines Neurons i spei88 8.4. Das Wiedererkennen von Mustern chern soll (ausg[i]). Nach der Berechnung der Netzeingabe, wird diese Variable mit der Ausgabe des betreffenden Neurons überschrieben. private void auswerten() { kille_alle_i_Fenster(); int ausg[] = new int[neurons]; int vor_zustand[] = new int[neurons]; int l; for(l = 0; l < limit; l++) { for(int i = 0; i < neurons; i++) { for(int j = 0; j < neurons; j++) ausg[i] += Gewichtsmatrix[i][j] * Zustand_vector[j]; } for(int i = 0; i < neurons; i++) if ( ausg[i] >= Grenzwert_vector[i] ) ausg[i] = 1; else ausg[i] = -1; if (errechne_hamming_distanz(Zustand_vector,ausg) == 0) { d.label1.setText("Muster erkannt!"); d.show(); break; } if (errechne_hamming_distanz(vor_zustand,ausg) == 0) { d.label1.setText("Das Muster ist nicht konvergent!"); d.show(); break; } this.creiere_I_Fenster(l+1,ausg); for(int i = 0; i < neurons; i++) { vor_zustand[i] = Zustand_vector[i]; Zustand_vector[i] = ausg[i]; } } if (l >= limit) 89 8. Simulation eines KNN in JAVA { d.label1.setText("Das Limit wurde {\"u}berschritten!"); d.show(); } } Dabei entspricht die Variable Zustand_vector dem Vektor des Suchmusters, das über die grafische Oberfläche eingegeben wurde. Die Variable limit entspricht dem Zeitpunkt t in o(t) und net(t) in der mathematischen Berechnung. Bei genauerer Betrachtung lassen sich mehrere Unstimmigkeiten erkennen. 1. Die Gewichtsmatrix wird mit dem Zustandsvektor multipliziert. In den mathematischen Berechnungen geschieht dies erst beim zweiten Iterationsschritt. Die Implementierung fängt diesen Umstand nicht auf. 2. Die Eingabe wird nicht konstant addiert. Das Programm wäre dann richtig implementiert, wenn ausg[i] bereits mit den Werten des Zustandsvektors des Suchmusters belegt worden wäre und zu Beginn eines jeden weiteren Schrittes wieder mit ihnen belegt wird. Das ist jedoch nicht der Fall. 3. Die Summe der gewichteten Eingaben wird auf die Ausgabe addiert. Das führt dazu, dass sich das Ergebnis von Iterationschritt zu Iterationsschritt immer mehr verfälscht. 4. Der angezeigte Text bei oszillierenden Ausgaben macht keinen Sinn. Muster können nicht konvergieren. Die Netz jedoch kann gegen einen stabilen Zustand konvergieren. 8.4.2 Umsetzung der Wiedererkennung in Java Die folgenden Erklärungen beziehen sich auf die Methode auswerten() der Klasse Hopfield. An einigen Stellen ist eine Modifikation des Quellcodes notwendig geworden, daher weicht der hier verwendetete Quellcode an einigen Stellen von dem im Anhang abgedruckten ab. Die mathematische Berechnung zur Wiedererkennung von Mustern beginnt mit der Ermittlung der Netzeingabe. Die konstanten Werte sind die Eingabe in und die Gewichtsmatrix wij . Da die Gewichtsmatrix bereits durch die Methode 90 8.4. Das Wiedererkennen von Mustern Gewichtung ermittelt wurde, braucht sie in dieser Methode nicht neu initialisiert werden. Die Eingabe ergibt sich aus dem Muster, das über die grafische Oberfläche vom Benutzer eingegeben wurde. Der übergebene eindimensionale Array Zustand_vector ist somit identisch mit der konstanten Eingabe für alle Iterationsschritte. Da sich der Zustandsvektor von einem Iterationsschritt zum nächsten verändert, werden seine Werte zu Beginn der Methode in einen neuen Array input übertragen, um deren Konstanz zu garantieren. private void auswerten() { : int input[] = new int[neurons]; for(int i = 0; i < neurons; i++) { input[i] = Zustand_vector[i]; } : } Die Anzahl der Iterationsschritte ist begrenzt, daher empfiehlt sich eine forSchleife, die diese Anzahl durch ein oberes Limit festlegt. Sie beinhaltet alle zeitabhängigen Berechnungen. Wird dieses Limit überschritten, wird der Benutzer durch einen Text darüber informiert. int l; for(l = 0; l < limit; l++) { : } if (l >= limit) { d.label1.setText("Das Limit wurde uberschritten!"); d.show(); } In der Einleitung zu diesem Kapitel ist gezeigt worden, dass im ersten Iterationsschritt die Ausgabe o(t) mit der Eingabe in identisch ist. Für alle weiteren Iterationsschritte müssen die Netzeingabe net(t) und die Ausgabe o(t) mit 91 8. Simulation eines KNN in JAVA der Propagationsregel und der Ausgabefunktion berechnet werden. Durch eine if-Anweisung lassen sich die Iterationsschritte, die vom ersten abweichen, separieren. Da die Variable ausg in jedem Iterationsschritt mit neuen Werten überschrieben wird, werden ihre Werte am Ende eines jeden Iterationsschrittes an den Zustandsvektor übergeben, der dann das o(t) in der Netzeingabe repräsentieren soll. Bei oszillierenden Ausgaben muss die Ausgabe eines Schrittes mit der aus dem vor dem davor liegendem Schritt verglichen werden. Dazu wird ein neuer Array vor_zustand eingeführt, der seine Werte vom Zustandsvektor übergeben bekommt. Die Methode errechne_hamming_distanz nimmt diese Überprüfung vor und gibt bei Übereinstimmung der beiden Vektoren einen Text aus. int ausg[] = new int[neurons]; int vor_zustand[] = new int[neurons]; int input[] = new int[neurons]; : for(int i = 0; i < neurons; i++) { ausg[i]=input[i]; } if(l!=0) { : } if (errechne_hamming_distanz(vor_zustand,ausg) == 0) { d.label1.setText("Oszillation!"); d.show(); break; } for(int i = 0; i < neurons; i++) { vor_zustand[i] = Zustand_vector[i]; Zustand_vector[i] = ausg[i]; } Die Umsetzung der Propagationsregel und der Aktivierungsfunktion in JavaAnweisungen erfolgt innerhalb der bereits erwähnten if-Anweisung. Da die ermittelten Netzeingaben in die Aktivierungsfunktion einfliessen, wird der glei92 8.4. Das Wiedererkennen von Mustern che Array zur Speicherung dieser Werte verwendet. Der Array ausg ist bereits durch die Eingabe vorbelegt, daher braucht nur noch die Summe der gewichteten Verbindungen addiert werden. Die Aktivierungsfunktion lässt sich aufgrund ihrer Fallunterscheidungen äquivalent in if- und else-Anweisungen umsetzen. Nachdem die Ausgabe errechnet wurde, wird sie mit dem Eingabemuster verglichen. Dazu wird wieder die Methode errechne_hamming_distanz verwendet. if(l!=0) { for(int i = 0; i < neurons; i++) { for(int j = 0; j < neurons; j++) { ausg[i] += Gewichtsmatrix[i][j] * Zustand_vector[j]; } } for(int i = 0; i < neurons; i++) if ( ausg[i] >= Grenzwert_vector[i] ) ausg[i] = 1; else ausg[i] = -1; if (errechne_hamming_distanz(input,ausg) == 0) { d.label1.setText("Das Muster wurde wiedererkannt!"); d.show(); break; } } Mit der so erstellten Methode auswerten werden Ausgaben ermittelt, die mit denen übereinstimmen, die mathematisch errechnet werden. 93 8. Simulation eines KNN in JAVA 94 Ausblick Die Umsetzung biologischer Vorgänge im menschlichen Gehirn in informatische und mathematische Modelle gestaltet sich verhältnismäßig simpel gemessen an der Komplexität ihrer biologischen Vorbilder. Der Erfolg solcher Umsetzungen zeigt nach Meinung der Autorin deutlich, wie wichtig die weitere Erforschung auf dem Gebiet der Neurologie ist. Viele Erkenntnisse über die Vorgänge im Gehirn beruhen auf Modellen, deren Beweis bisher noch nicht erbracht werden konnte. So ist bekannt, dass mit dem Erkennen von Bildern noch weitere Assoziationen verbunden sind, die nicht zwangsläufig ebenfalls als Bilder im Gehirn gespeichert sind. Dazu gehören zum Beispiel die Gefühle. Ihre Existenz ist unumstritten, jedoch ist noch weitgehend unbekannt, wie sie im Gehirn erzeugt werden. Bei dem Versuch die Biologie nachzuahmen, spielen eine Vielzahl von verschiedenen Forschungsbereichen eine Rolle, die alle dazu beitragen, das menschliche Gehirn besser zu verstehen. Auf dem Gebiet der künstlichen Intelligenz (KI) wird bereits versucht, diese Vorgänge so naturgetreu wie möglich nachzuahmen. Die Erfolge, die mit der KI bereits erzielt werden konnten, sind beeindruckend, jedoch stößt man schnell an Grenzen, die es noch zu überwinden gilt. Die Entwicklung der KI ist nach Meinung der Autorin daher stark abhängig von den Erkenntnissen, die auf dem Gebiet der Neurologie gemacht werden. Erst dann ist es möglich, eine naturgetreue Nachbildung des menschlichen Gehirns zu entwickeln. Vielleicht wird es in der Zukunft möglich sein, dass eine KI Gefühle empfinden kann, die denen des Menschen ähneln. Spätestens dann wird sich die Frage stellen, inwiefern das dann noch ethisch vertretbar sein wird. 95 8. Simulation eines KNN in JAVA 96 Literaturverzeichnis [Bir1987] H. Birett, D. Kallus: Sinnes-, Nerven- und Muskelzellen, Verlag Moritz Diesterweg, Verlag Sauerländer, 1987. [Haf1980] L. Hafner: Biochemie, Schroedel Schulbuchverlag, 1980 [Kle1994] R. Kleinert, W. Ruppert, Franz X. Stratil: Nervensystem, Hormonsystem und Immunsystem, 5. verb. Aufl., 1994. [Mir1985] W. Miram, D. Krumwiede: Informationsverarbeitung, Schroedel Schulbuchverlag, 1985 [Mor1980] P. Morell, W.T. Norten: Myelin, Spektrum der Wissenschaft, Juli 1980: 12-22 [Rol2003] B. Rolke: Ein Wort und seine Folgen, Geist & Gehirn, 1/2003: 73-75 [Ros1958] F. Rosenblatt: The Perceptron: a probabilistic model for information storage and organization in the brain, Psychological review 65: 386-408, auch in J.A. Anderson, E. Rosenfeld (Eds.): Neurocomputing: Foundations of Research, Kap. 8, pp. 92-114, MIT Press, 1988. [Rum1986] D.E. Rumelhart, J.L. McClelland: Parallel Distributed Processing: Explorations in the Microstructure of Cognition, Volume 1: Foundations. The MIT Press, 1986. [Sch1973] R.F. Schmidt: Grundriß der Sinnesphysiologie, Springer-Verlag, 1973. [Sch1974] R.F. Schmidt: Grundriß der Neurophysiologie, 3. verb. Aufl., Springer-Verlag, 1974. [Ves1975] F. Vester: Denken, Lernen, Vergessen, Deutscher Taschenbuchverlag, 1975. 97 LITERATURVERZEICHNIS [Zel2000] A. Zell: Simulation neuronaler Netze, 3. unver. Aufl., R.Oldenbourg Verlag, 2000 [Wes2003] Westfälische Wilhems Universität-Münster: http://wwwmath.uni-muenster.de/SoftComputing/lehre/material/ wwwnnscript/startseite.html Letzte Modifikation: 06.02.2003. Zum Zeitpunkt der Erstellung dieser Arbeit lag diese Seite bereits zur Verfügung. Sämtliche in dieser Arbeit verwendeten Abbildungen, enstammen der hier aufgeführten Literatur. 98 Anhang A Java-Sourcecode A.1 Hopfield.java import java.applet.Applet; import java.awt.*; import java.util.*; import java.awt.event.*; import java.util.Random; public class Hopfield extends Applet { private int neurons; public int Muster; public int unsichtbare_Muster; public int Stoerfaktor; public int limit; private int Zufallsvektor[]; private int Zustand_vector[]; private int Gewichtsmatrix[][]; private double Grenzwert_vector[]; private int lern_muster_vektor[][]; public int rows; public int columns; private Gitter Display_Gitter; public Gitter pattern_Gitter[]; private Label pattern_label[]; private Panel Haupt_Diplay_panel; private Panel Haupt_Lernmuster_panel; private Panel button_panel; private Panel Lermuster_panel; private Button aendern_button; private Button loesche_button; private Button fuellen_button; private Button run_network_button; private Button clear_patterns_button; private Button train_network_button; private Button stoeren_button; private Button disp_unsichtbar; private W_Fenster Gewicht_fenster; private Init_Dialog id; private Dialog1 d; private unsichtbare_Muster uM; private Vector v; private Random r; private int aktives_Grid; public Hopfield() { rows = 3; columns = 3; limit =4; Muster =2; A. Java-Sourcecode unsichtbare_Muster=0; Stoerfaktor=1; } public void stop() { if (!v.isEmpty()) kille_alle_i_Fenster(); if (Gewicht_fenster.isShowing()) Gewicht_fenster.dispose(); if (id.isShowing()) id.dispose(); if (d.isShowing()) d.dispose(); if (uM.isShowing()) uM.dispose(); } public void init() { neurons = rows * columns; v = new Vector(); r = new Random(); Zustand_vector = new int[neurons]; for(int i = 0; i < neurons; i++) Zustand_vector[i] = -1; Zufallsvektor = new int[neurons]; Grenzwert_vector = new double[neurons]; Gewichtsmatrix = new int[neurons][neurons]; lern_muster_vektor = new int[Muster+unsichtbare_Muster][neurons]; for(int j = 0; j < Muster+unsichtbare_Muster; j++) for(int l = 0; l < neurons; l++) lern_muster_vektor[j][l] = -1; Haupt_Lernmuster_panel = new Panel(); Haupt_Lernmuster_panel.setLayout((new FlowLayout())); button_panel = new Panel(); button_panel.setLayout(new GridLayout(4, 1)); loesche_button = new Button("loeschen"); fuellen_button = new Button("fuellen"); clear_patterns_button = new Button("Alle Muster l{\"o}schen"); train_network_button = new Button("lernen"); run_network_button = new Button("auswerten"); aendern_button = new Button("aendern"); stoeren_button = new Button("stoeren (um "+Stoerfaktor+")"); disp_unsichtbar = new Button("Zufallsmuster: "+unsichtbare_Muster); button_panel.add(aendern_button); button_panel.add(loesche_button); button_panel.add(fuellen_button); button_panel.add(clear_patterns_button); button_panel.add(train_network_button); button_panel.add(run_network_button); button_panel.add(stoeren_button); button_panel.add(disp_unsichtbar); train_network_button.setEnabled(false); stoeren_button.setEnabled(false); run_network_button.setEnabled(false); if (unsichtbare_Muster >0) disp_unsichtbar.setEnabled(true); else disp_unsichtbar.setEnabled(false); Display_Gitter = new Gitter(rows, columns); pattern_Gitter = new Gitter[Muster+unsichtbare_Muster]; pattern_label = new Label[Muster+unsichtbare_Muster]; Panel Haupt_Diplay_panel = new Panel(); Haupt_Diplay_panel.setLayout(new BorderLayout()); Haupt_Diplay_panel.add(Display_Gitter, BorderLayout.CENTER); for(int k = 0; k < (Muster+unsichtbare_Muster) ; k++) { pattern_Gitter[k] = new Gitter(rows, columns); if (k<Muster) { pattern_label[k] = new Label("Muster "+ String.valueOf(k+1), Label.CENTER); Lermuster_panel = new Panel(); Lermuster_panel.setLayout(new BorderLayout()); Lermuster_panel.add(pattern_label[k], BorderLayout.NORTH); Lermuster_panel.add(pattern_Gitter[k], BorderLayout.CENTER); Haupt_Lernmuster_panel.add(Lermuster_panel); } } fuelle_Zufallsmuster(); 100 A.1. Hopfield.java Panel tmp2 = new Panel(); tmp2.setLayout(new BorderLayout()); tmp2.add(Display_Gitter, BorderLayout.CENTER); tmp2.add(button_panel, BorderLayout.EAST); this.setLayout(new BorderLayout()); this.add(tmp2, BorderLayout.NORTH); this.add(Haupt_Lernmuster_panel, BorderLayout.CENTER); Gewicht_fenster = new W_Fenster(); uM = new unsichtbare_Muster(this); id=new Init_Dialog(new Frame(),this,"Properties aendern",false); d=new Dialog1(new Frame(),""); } public boolean handleEvent(Event event) { switch(event.id) { default: break; case Event.ACTION_EVENT: if(event.target == fuellen_button) { if (aktives_Grid == 0) Display_Gitter.fuelle_Gitter(); else pattern_Gitter[aktives_Grid-1].fuelle_Gitter(); for(int i = 0; i < neurons; i++) Zustand_vector[i] = 1; train_network_button.setEnabled(true); stoeren_button.setEnabled(true); break; } if(event.target == loesche_button) { if (aktives_Grid == 0) Display_Gitter.loesche_Gitter(); else pattern_Gitter[aktives_Grid-1].loesche_Gitter(); train_network_button.setEnabled(true); stoeren_button.setEnabled(true); break; } if(event.target == run_network_button) { Display_Gitter.hole_Zustand(Zustand_vector); auswerten(); break; } if(event.target == clear_patterns_button) { Display_Gitter.loesche_Gitter(); for(int i1 = 0; i1 < Muster; i1++) pattern_Gitter[i1].loesche_Gitter(); train_network_button.setEnabled(true); stoeren_button.setEnabled(true); break; } if(event.target == aendern_button) { if (!v.isEmpty()) kille_alle_i_Fenster(); if (Gewicht_fenster.isShowing()) Gewicht_fenster.dispose(); if (id.isShowing()) id.dispose(); if (d.isShowing()) d.dispose(); if (uM.isShowing()) uM.dispose(); this.removeAll(); for(int k = 0; k < Muster+unsichtbare_Muster; k++) { this.pattern_Gitter[k].removeNotify(); } id.show(); train_network_button.setEnabled(false); stoeren_button.setEnabled(false); run_network_button.setEnabled(false); } if(event.target == stoeren_button) 101 A. Java-Sourcecode { if(aktives_Grid == 0) { Display_Gitter.hole_Zustand(Zustand_vector); add_hamming_distance(); Display_Gitter.setze_Zustand(Zustand_vector); } else { pattern_Gitter[aktives_Grid-1].hole_Zustand(Zustand_vector); add_hamming_distance(); pattern_Gitter[aktives_Grid-1].setze_Zustand(Zustand_vector); } } if(event.target == train_network_button) { Gewichtung(); run_network_button.setEnabled(true); } if(event.target == disp_unsichtbar) { if (uM.isShowing() == false) { uM.show(); } else uM.repaint(); } break; case Event.MOUSE_DOWN: if ( aktives_Grid >0 ) { pattern_Gitter[aktives_Grid-1].ist_angewaehlt = -1; pattern_Gitter[aktives_Grid-1].repaint(); } if(event.target == Display_Gitter) { aktives_Grid =0; Display_Gitter.ist_angewaehlt = 0; Display_Gitter.repaint(); } else { Display_Gitter.ist_angewaehlt = -1; Display_Gitter.repaint(); } for(int k1 = 0; k1 < Muster; k1++) { if(event.target == pattern_Gitter[k1]) { pattern_Gitter[k1].ist_angewaehlt = 1; pattern_Gitter[k1].hole_Zustand(Zustand_vector); int j1 = pattern_Gitter[k1].holeletzteSpalte(); int j2 = pattern_Gitter[k1].holeletzteZeile(); int l2 = pattern_Gitter[k1].holeZellenZustand(j2, j1); Zustand_vector[j2 * columns + j1] = l2; aktives_Grid = k1+1; pattern_Gitter[k1].repaint(); train_network_button.setEnabled(true); stoeren_button.setEnabled(true); } } break; case Event.MOUSE_DRAG: for(int k1 = 0; k1 < Muster; k1++) { if(event.target == pattern_Gitter[k1]) { int l1 = pattern_Gitter[k1].holeletzteSpalte(); int k2 = pattern_Gitter[k1].holeletzteZeile(); int i3 = pattern_Gitter[k1].holeZellenZustand(k2, l1); 102 A.1. Hopfield.java Zustand_vector[k2 * columns + l1] = i3; aktives_Grid = k1+1; } else if(event.target == Display_Gitter) aktives_Grid = 0; } break; } return true; } private void fuelle_Zufallsmuster() { for (int i=Muster; i < (Muster+unsichtbare_Muster) ;i++) { for (int j=0; j< neurons;j++) { if ( r.nextInt() < 0 ) Zustand_vector[j]=-1; else Zustand_vector[j]=1; } pattern_Gitter[i].setze_Zustand(Zustand_vector); } } private void Gewichtung() { for(int mz = 0; mz < Muster+unsichtbare_Muster; mz++) { pattern_Gitter[mz].hole_Zustand(lern_muster_vektor[mz]); } for(int i = 0; i < neurons; i++) { for(int j = 0; j < neurons; j++) { Gewichtsmatrix[i][j] = 0; if (i != j) for(int k = 0; k < Muster+unsichtbare_Muster; k++) Gewichtsmatrix[i][j] += lern_muster_vektor[k][i] *lern_muster_vektor[k][j]; } creiere_W_Fenster(); for(int k = 0; k < neurons; k++) Grenzwert_vector[k] = 0.0d; } } private void auswerten() { kille_alle_i_Fenster(); int ausg[] = new int[neurons]; int vor_zustand[] = new int[neurons]; int l; for(l = 0; l < limit; l++) { for(int i = 0; i < neurons; i++) { for(int j = 0; j < neurons; j++) ausg[i] += Gewichtsmatrix[i][j] * Zustand_vector[j]; } for(int i = 0; i < neurons; i++) if ( ausg[i] >= Grenzwert_vector[i] ) ausg[i] = 1; else ausg[i] = -1; if (errechne_hamming_distanz(Zustand_vector,ausg) == 0) { d.label1.setText("Muster erkannt!"); d.show(); break; } if (errechne_hamming_distanz(vor_zustand,ausg) == 0) { d.label1.setText("Das Muster ist nicht konvergent!"); d.show(); 103 A. Java-Sourcecode break; } this.creiere_I_Fenster(l+1,ausg); for(int i = 0; i < neurons; i++) { vor_zustand[i] = Zustand_vector[i]; Zustand_vector[i] = ausg[i]; } } if (l >= limit) { d.label1.setText("Das Limit wurde {\"u}berschritten!"); d.show(); } } private int errechne_hamming_distanz(int ai[], int a2[]) { int k = 0; for(int j = 0; j < neurons; j++) if(ai[j] != a2[j]) k++; return k; } private void add_hamming_distance() { randomize(Zufallsvektor, neurons,r); for(int j = 0; j < Stoerfaktor; j++) Zustand_vector[Zufallsvektor[j]] *= -1; } private void randomize(int ai[], int i,Random r) { for(int j = 0; j < i; j++) ai[j] = j; for(int k = 0; k < i; k++) { int l = Math.abs(r.nextInt()) % i; int i1 = Math.abs(r.nextInt()) % i; int j1 = ai[l]; ai[l] = ai[i1]; ai[i1] = j1; } } private void creiere_W_Fenster() { Gewicht_fenster.list1.removeAll(); String temp=new String(); for(int i = 0; i < neurons; i++) { for(int l = 0; l < neurons; l++) { if (Gewichtsmatrix[i][l] >= 0 && Gewichtsmatrix[i][l]< 10) temp += String.valueOf(" "+Gewichtsmatrix[i][l]); else if (Gewichtsmatrix[i][l] < 0 && Gewichtsmatrix[i][l]< 10) temp += String.valueOf(" "+Gewichtsmatrix[i][l]); else if (Gewichtsmatrix[i][l] >= 0 && Gewichtsmatrix[i][l]> 10) temp += String.valueOf(" "+Gewichtsmatrix[i][l]); else temp += String.valueOf(" "+Gewichtsmatrix[i][l]); } Gewicht_fenster.list1.addItem(temp); temp=""; } if (Gewicht_fenster.isShowing()) Gewicht_fenster.repaint(); else { Gewicht_fenster.setLocation(300,0); Gewicht_fenster.show(); } } 104 private void creiere_I_Fenster(int l, int ai[]) { v.addElement(new Iteration_Fenster(rows,columns,l)); ((Iteration_Fenster) v.elementAt(l-1)).setLocation(200,200); ((Iteration_Fenster) v.elementAt(l-1)).g.setze_Zustand(ai); ((Iteration_Fenster) v.elementAt(l-1)).show(); } private void kille_alle_i_Fenster() { while (!v.isEmpty()) { ((Iteration_Fenster) v.firstElement()).dispose(); v.removeElementAt(0); } } } A.2 Gitter.java import java.awt.*; public class Gitter extends Canvas { int Zustand[][]; int Zellenbreite; int Zellenhoehe; int Zeilen; int Spalten; int plus_eins; int minus_eins; int Zeilenende; int Spaltenende; int letzter_Zustand; int breite_Rand; int hoehe_Rand; boolean ist_editierbar; int ist_angewaehlt = -1; Color Zellenfarbe; public Gitter(int i, int j, int k, int l, int i1, int j1) { Zeilen = i; Spalten = j; plus_eins = i1; minus_eins = j1; Zellenbreite = k; Zellenhoehe = l; breite_Rand = 0; hoehe_Rand = 0; setSize(Spalten*Zellenbreite+1+2*breite_Rand,Zeilen*Zellenhoehe+1+2*hoehe_Rand); ist_editierbar = true; Zellenfarbe = Color.black; Zustand = new int[i][j]; for(int l1 = 0; l1 < Zeilen; l1++) for(int k1 = 0; k1 < Spalten; k1++) Zustand[l1][k1] = minus_eins; } public Gitter(int i, int j) { this(i, j, 30, 30, 1, -1); } public int hole_Randbreite() { return breite_Rand; } public int hole_Randhoehe() { return hoehe_Rand; } public void setForeground(Color temp) {super.setForeground(temp);} public void setBackground(Color temp) {super.setBackground(temp);} public void setCellColour(Color temp) {Zellenfarbe = temp;} public void paint(Graphics g) { switch (ist_angewaehlt) { A. Java-Sourcecode case 1: g.setColor(Color.red); break; case 0: g.setColor(Color.yellow); break; case 10: { g.setColor(Color.white); Dimension d=new Dimension(); d = getSize(); Zellenbreite = d.width/Spalten; Zellenhoehe = d.height/Zeilen; break; } default : g.setColor(getBackground()); break; } g.fillRect(0, 0, Zellenbreite * Spalten, Zellenhoehe * Zeilen); g.setColor(getForeground()); for(int i = 0; i < Spalten; i++) g.drawLine(breite_Rand + i * Zellenbreite, hoehe_Rand, breite_Rand + i * Zellenbreite, hoehe_Rand + Zeilen * Zellenhoehe); g.drawLine(breite_Rand + Spalten * Zellenbreite, hoehe_Rand, breite_Rand + Spalten * Zellenbreite, hoehe_Rand + Zeilen * Zellenhoehe); for(int k = 0; k < Zeilen; k++) g.drawLine(breite_Rand, hoehe_Rand + k * Zellenhoehe, breite_Rand + Spalten * Zellenbreite, hoehe_Rand + k * Zellenhoehe); g.drawLine(breite_Rand, hoehe_Rand + Zeilen * Zellenhoehe, breite_Rand + Spalten * Zellenbreite, hoehe_Rand + Zeilen * Zellenhoehe); for(int j = 0; j < Spalten; j++) { for(int l = 0; l < Zeilen; l++) if(Zustand[l][j] == plus_eins) { g.setColor(Zellenfarbe); g.fillOval(breite_Rand + j * Zellenbreite + 3, hoehe_Rand + l * Zellenhoehe + 3 Zellenbreite -6, Zellenhoehe -6); } else { g.setColor(Zellenfarbe); g.fillOval(breite_Rand + j * Zellenbreite + 3, hoehe_Rand + l * Zellenhoehe + 3 Zellenbreite -6, Zellenhoehe -6); g.setColor(getBackground()); g.fillOval(breite_Rand + j * Zellenbreite + 4, hoehe_Rand + l * Zellenhoehe + 4 Zellenbreite -8, Zellenhoehe -8); } } g.setColor(getForeground()); } public boolean mouseDown(Event event, int i, int j) { Graphics g = getGraphics(); if(!ist_editierbar) return false; int k = (i - breite_Rand) / Zellenbreite; int l = (j - hoehe_Rand) / Zellenhoehe; Spaltenende = k; Zeilenende = l; if (i >= Zellenbreite*Spalten+ breite_Rand) return false; if (j >= Zellenhoehe*Zeilen+ hoehe_Rand) return false; if(Zustand[l][k] == minus_eins) { Zustand[l][k] = plus_eins; letzter_Zustand = plus_eins; } else { Zustand[l][k] = minus_eins; letzter_Zustand = minus_eins; } return false; } 106 A.2. Gitter.java public boolean mouseDrag(Event event, int i, int j) { Graphics g = getGraphics(); if(!ist_editierbar) return false; int k = (i - breite_Rand) / Zellenbreite; int l = (j - hoehe_Rand) / Zellenhoehe; if(k < 0 || k >= Spalten || l < 0 || l >= Zeilen) return false; if(Spaltenende != k || Zeilenende != l) { Spaltenende = k; Zeilenende = l; if(letzter_Zustand == plus_eins) { Zustand[l][k] = plus_eins; g.setColor(Zellenfarbe); g.fillOval(breite_Rand + k * Zellenbreite +3, hoehe_Rand + l * Zellenhoehe Zellenbreite -6, Zellenhoehe -6); g.setColor(getForeground()); } else { Zustand[l][k] = minus_eins; g.setColor(Zellenfarbe); g.fillOval(breite_Rand + k * Zellenbreite +3, hoehe_Rand + l * Zellenhoehe Zellenbreite -6, Zellenhoehe -6); g.setColor(getBackground()); g.fillOval(breite_Rand + k * Zellenbreite +4, hoehe_Rand + l * Zellenhoehe Zellenbreite -8, Zellenhoehe -8); g.setColor(getForeground()); } return false; } else { return true; } } public void loesche_Gitter() { for(int i = 0; i < Spalten; i++) { for(int j = 0; j < Zeilen; j++) Zustand[j][i] = minus_eins; } repaint(); } public void fuelle_Gitter() { for(int i = 0; i < Spalten; i++) { for(int j = 0; j < Zeilen; j++) Zustand[j][i] = plus_eins; } repaint(); } int holeletzteZeile() { return Zeilenende; } int holeletzteSpalte() { return Spaltenende; } int holeZellenZustand(int i, int j) { return Zustand[i][j]; } void hole_Zustand(int ai[]) { for(int i = 0; i < Spalten; i++) { for(int j = 0; j < Zeilen; j++) ai[j * Spalten + i] = Zustand[j][i]; } } void setze_Zustand(int ai[]) { 107 for(int i = 0; i < Spalten; i++) { for(int j = 0; j < Zeilen; j++) Zustand[j][i] = ai[j * Spalten + i]; } repaint(); } } A.3 Dialog1.java import java.awt.*; import java.awt.event.*; public class Dialog1 extends Dialog { Panel Main_Panel = new Panel(); Button button1 = new Button(); Label label1 = new Label(); public Dialog1(Frame frame, String s) { super(frame, "Ergebnis", false); enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { this.setLayout(new GridLayout()); Main_Panel.setLayout(null); Main_Panel.setSize(new Dimension(400, 87)); label1.setBounds(new Rectangle(23, 8, 359, 27)); label1.setAlignment(1); label1.setText(s); button1.setBounds(new Rectangle(155, 44, 96, 28)); button1.setLabel("OK"); button1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); } }); Main_Panel.add(button1, null); Main_Panel.add(label1, null); add(Main_Panel); pack(); } catch (Exception ex) { ex.printStackTrace(); } } protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { dispose(); } super.processWindowEvent(e); } } A.4 Init-Dialog.java import java.awt.*; import java.awt.event.*; public class Dialog1 extends Dialog { Panel Main_Panel = new Panel(); Button button1 = new Button(); Label label1 = new Label(); public Dialog1(Frame frame, String s) { super(frame, "Ergebnis", false); enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { this.setLayout(new GridLayout()); Main_Panel.setLayout(null); Main_Panel.setSize(new Dimension(400, 87)); label1.setBounds(new Rectangle(23, 8, 359, 27)); label1.setAlignment(1); label1.setText(s); button1.setBounds(new Rectangle(155, 44, 96, 28)); button1.setLabel("OK"); button1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); } }); Main_Panel.add(button1, null); Main_Panel.add(label1, null); add(Main_Panel); pack(); } catch (Exception ex) { ex.printStackTrace(); } } protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { dispose(); } super.processWindowEvent(e); } } A.5 unsichtbare-Muster.java import java.awt.*; import java.awt.event.*; public class unsichtbare_Muster extends Frame { private Panel Haupt_panel = new Panel(); private ScrollPane sp = new ScrollPane(1); private Panel unsichtbare_Lermuster_panel; private Label Muster_label[]; public unsichtbare_Muster(Hopfield h) { if (h.unsichtbare_Muster <= 0) return; this.setSize(400,300); this.setTitle("Zufalls-Muster"); enableEvents(AWTEvent.WINDOW_EVENT_MASK); Muster_label = new Label[h.unsichtbare_Muster]; Haupt_panel.setLayout(new GridLayout((int) Math.sqrt(h.unsichtbare_Muster), (int) Math.sqrt(h.unsichtbare_Muster))); for(int k = h.Muster; k < (h.Muster+h.unsichtbare_Muster) ; k++) { unsichtbare_Lermuster_panel = new Panel(); unsichtbare_Lermuster_panel.add(h.pattern_Gitter[k],BorderLayout.CENTER); h.pattern_Gitter[k].ist_editierbar=false; Haupt_panel.add(unsichtbare_Lermuster_panel,BorderLayout.CENTER); } sp.add(Haupt_panel,BorderLayout.CENTER); sp.doLayout(); sp.validate(); Haupt_panel.doLayout(); Haupt_panel.validate(); Haupt_panel.repaint(); this.add(sp,BorderLayout.CENTER); this.doLayout(); this.validate(); } protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { dispose(); } super.processWindowEvent(e); } } A.6 W-Fenster.java import java.awt.*; import java.awt.event.*; public class W_Fenster extends Frame { List list1 = new List(); GridLayout gridLayout1 = new GridLayout(); public W_Fenster() { try { this.setLayout(gridLayout1); this.setSize(new Dimension(200, 200)); this.setTitle("Gewichtsmatrix"); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); dispose(); } }); this.add(list1); } catch (Exception e) { e.printStackTrace(); } } } A.7 Iteration-Fenster.java import java.awt.*; import java.awt.event.*; public class Iteration_Fenster extends Frame { GridLayout gridLayout1 = new GridLayout(); Gitter g; public Iteration_Fenster(int s, int z, int i) { try { this.setSize(new Dimension(200, 200)); Dimension d=new Dimension(); A.7. Iteration-Fenster.java g = new Gitter(s,z,20,20, 1, -1); g.ist_angewaehlt=10; this.setLayout(gridLayout1); g.ist_editierbar=false; this.doLayout(); this.add(g, null); this.setTitle("Schritt "+i); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); } }); } catch (Exception e) { e.printStackTrace(); } } } 111