neuronale netze in bezug auf mustererkennung

Werbung
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
Herunterladen