KI-Programmierung (neuronale Netze oder sowas

24/01/2008 - 06:50 von Rupert | Report spam
Hallo!

Vorweg: Ich bin Laie auf dem Gebiet KI-Programmierung. Ich lese nicht
gern Bücher und will auch nicht unbedingt auf umfangreiche schon
vorhandenen Quellen verwiesen werden, die es zu dem Thema geben mag. Ich
will vielmehr eine kreative Diskussion führen aus Interesse und Lust am
Nachdenken.

Erst einmal folgendes einfaches Problem (das möglicherweise zu einfach und
deswegen zum Rumexperimentieren gar nicht so geeignet ist): Ein Programm
erhàlt als Eingabe eine gewisse fest vorgegebene Zahl boolescher Werte
(wahr/falsch) und soll eine fest vorgegebene Zahl boolescher Werte wieder
ausspucken. Auf welche Art und Weise es die Eingabewerte dazu verknüpfen
soll, weiß es am Anfang noch nicht. Es soll also lernen, indem es
wiederholt anhand zufàllig gegebener Eingangswerte irgendetwas berechnet
und hinterher Feedback bekommt, ob das Ergebnis richtig war (bzw. ein Maß
dafür, _wie_ richtig es war).

Eine triviale Lösung in dem Fall, dass es nur einen Ausgabewert gibt, wàre
natürlich einfach eine Wahrheitstabelle anzulegen: Sobald es einmal alle
möglichen Eingabewerte samt Antworten bekommen hat (es gibt in diesem Fall
ja nur zwei mögliche Ergebniswerte), hat es ausgelernt und wird von da ab
immer die richtige Antwort geben. Für mehrere Ausgabewerte gàbe es sicher
eine entsprechende mehrdimensionale Tabelle oder sowas (jetzt mal so in
den Raum gesponnen, ohne tief drüber nachgedacht zu haben).
Ich will aber kein praktisches Problem lösen sondern Experimente betreiben.
Von daher ist mir diese Lösung zu einfach. Ich will im Prinzip mit
neuronalen Netzen arbeiten - ohne bisher eigentlich viel darüber zu wissen
(da ich nicht gern lese) - und von diesem sehr einfachen Problem ausgehend
vielleicht kompliziertere Sachen basteln und mir einfach nur Gedanken
machen.

Über neuronale Netze weiß ich fast nichts. Ich weiß vom Prinzp her, wie
ein einzelnes Neuron funktioniert: Es gibt eine gewisse Zahl an Eingaben
mit möglicherweise unterschiedlichen Gewichtungen und eine Funktion, die
daraus die Ausgabe berechnet. Wie das große Ganze funktioniert, wenn
viele Neuronen vernetzt sind, wie man sie vernetzt und so weiter, davon
habe ich bis jetzt nur sehr vage Vorstellungen. Aber genau dafür will ich
mir eben durch Gedankenexperimente anhand solcher einfachen Probleme wie
hier beschrieben, Ansàtze selbst erarbeiten, möglichst jenseits von
Verweisen auf irgendwelche Fachliteratur. Das Modell, das am Ende
möglicherweise dabei rauskommt, soll außerdem möglichst wenig speziell
sondern universell einsetzbar sein. Im Klartext: Zu jeder gegebenen
Abbildung K^m -> K^n (wobei K={0,1}={true, false}=F_2, wie man's nimmt),
soll das Programm nach und nach immer bessere Nàherungslösungen und am
Ende hoffentlich DIE Lösung finden. Dabei bekommt es jedesmal, wenn es
eine Lösung propagiert, ein Feedback, das nicht alles verràt (die Anzahl
der von der wirklichen Lösung abweichenden Bits, stell ich mir jetzt mal
so vor).

(Da ich selbst nur einen etwas vagen Begriff von neuronalen Netzen habe und
nicht weiß, wie fest der etablierte Begriff definiert ist, kann ich nicht
dafür garantieren, dass ich ihn korrekt verwende, wenn ich hier meine
vagen Ideen zu entwickeln versuche und nach Worten und passenden
Begriffen ringe.)

Meine Vorstellung von dem ganzen sieht jetzt so aus:
Jedes Neuron erhàlt eine gewisse Anzahl von (booleschen) Eingabewerten und
gibt eine gewisse Zahl von (booleschen) Werten aus. Am Anfang der
Kette steht natürlich ein Neuron mit n Eingabewerten und ganz am Ende ein
Neuron mit m Ausgabewerten, wo alles wieder zusammenlàuft (oder vielleicht
m Neuronen mit je einem Ausgabewert?).
Das Netz soll keine feste Größe haben sondern auf irgendwie geregelte Art
und Weise dynamisch wachsen (oder bei festgestellter Redundanz womöglich
wieder schrumpfen), sofern es eben Anlass zur Verànderung findet. Eine
(undurchdachte) Idee: Jedes Neuron mit k Eingabe- und j Ausgabebits
speichert eine (j,k)-Matrix von Wahrscheinlichkeitswerten (0.0 bis 1.0).
Wenn das Neuron Daten bekommt, erzeugt es zunàchst anhand der Werte aus
der Wahrscheinlichkeitsmatrix zufàllig eine entsprechende Matrix über dem
Körper K=F_2={0,1} und multipliziert den Vektor der Eingabedaten von rechts
daran (natürlich alles in K=F_2=Z modulo 2). Das Ergebnis ist dann die
Ausgabe.
Ein "ausgelerntes" Neuron enthàlt in seiner Matrix
keine Wahrscheinlichkeitswerte mehr sondern nur die "sicheren" Werte 0.0
und 1.0, ist also effektiv eine lineare Abbildung zwischen Vektorràumen
über dem Körper K=F_2. Am Anfang soll das Netz nur aus einem einzigen
Neuron bestehen, das also m Eingabewerte enthàlt und n Ausgabewerte
liefert. Da die gegebene zu modellierende Abbildung K^m -> K^n aber in der
Regel nicht linear über K sein wird (es gibt (2^n)^(2^m)=2^(n*2^m)
Abbildungen K^m -> K^n, nur 2^(n*m) davon sind linear), wird ein einzelnes
Neuron nur sehr selten ausreichen. Wie eine solche Verzweigung einer
linearen Abbildung in mehrere auszusehen hat, ist natürlich im Detail noch
unklar. Außerdem muss man feststellen, dass auch eine Verzweigungen in
einen Baum dieser "linearen Abbildungsneuronen", die hintereinander
ausgeführt werden, wieder nur eine lineare Abbildung ergibt. Eine durchaus
vernünftige eindeutig zu erzeugende und das Problem vereinfachende
Verzweigung einer linearen Abbildung K^m -> K^n in zwei Abbildungen K^m'
-> K^n' und K^m'' -> K^n'' mit K^m=K^m'+K^m'' und K^n=K^n'+K^n''
(letzteres eine direkte Summe) wàre aber zum Beispiel dann gegeben, wenn
man weiß, dass die Ausgabewerte aus K^n' nur von den Eingabewerten aus
K^m' und die Ausgebewerte von K^n'' nur von den Eingabewerten aus K^m''
abhàngen. Und um mehr als nur lineare Abbildungen erzeugen zu können, wàre
es beispielsweise denkbar, Abbildungen mit anschließender bitweiser
Negation zuzulassen (damit wàre beispielsweise die nichtlineare konstante
Abbildung mit lauter Einsen möglich). Ob damit aber schon alle Abbildungen
erzeugt werden können, ist zu bezweifeln. Ich muss aber auch langsam mal
schlafen gehen und kann nicht mehr denken. Eine denkbare Möglichkeit wàre
noch, zwei lineare Abbildungen zu einer bilinearen und sukzessive alle
möglichen Abbildungen zu multilinearen zusammenzufügen. So könnte man in
diesen ganzen Verzweigungen und wieder zusammenfügungen schließlich jede
x-beliebige polynomiale Funktion erzeugen. Und im Fall des endlichen
Körpers F_2 müssten das doch eigentlich auch schon alle Funktionen sein,
oder?
Wie diese ganzen Wahrscheinlichkeiten sich am Ende zu "Sicherheiten"
herauskristallisieren sollen, ist natürlich immer noch die spannendste
Frage, die ich jetzt erst mal allen interessierten Leuten überlasse, die
wach sind.

Gute Nacht (bzw. Morgen)
der Rupert

PS: Trotz meiner vorherigen Aussagen bin ich Literaturverweisen natürlich
nicht ganz stur prinzipiell abgeneigt. Ich würde nur gern ein paar
spontane kreative Gedanken sehen.

PPS: Sorry für das Cross-Posting, falls das nicht den Gepflogenheiten
entspricht. Aber ich konnte mich letztendlich nicht entscheiden und denke,
dass sowohl Mathematiker als auch Informatiker hier etwas zu sagen haben
werden.
 

Lesen sie die antworten

#1 Roland Damm
24/01/2008 - 09:52 | Warnen spam
Moin,

Rupert schrub:

Meine Vorstellung von dem ganzen sieht jetzt so aus:
Jedes Neuron erhàlt eine gewisse Anzahl von (booleschen)
Eingabewerten und gibt eine gewisse Zahl von (booleschen)
Werten aus.



Nach üblicher Verwendung der Begriffe hat jedes Neuron nur
_einen_ Ausgabewert, seinen Erregungszustand nàmlich. Diesen mag
man auf 0,1 reduzieren, viel praktischer ist aber, auch
Zwischenzustànde zuzulassen.

Wenn du immer nur mit 0 und 1 rechnest, verlierst du ja den
ganzen Reiz an neuronalen Netzen, nàmlich deren Fàhigkeit, auch
mit unscharfen Informationen klarzukommen.

Ebenso würde ich die Eingangswerte auch der Einfachheit halber
als Erregungszustànde von Eingangsneuronen auffassen. Wenn da
nur 0 oder 1 reinkommt, mag das sein. Aber Netzintern sollte man
schon mit Zwischenzustànden rechnen können dürfen.

Bei den Ausgàngen ist die Sache am einfachsten so: Ein 'externes'
Programm wertet die Ausgangsneuronen aus und rundet ihre Werte
auf 0 oder 1. Oder aber es wird von einer Teilmenge der Neuronen
herausgesucht, welches den größten Erregungszustand hat, dieses
zàhlt dann. Beispiel:

Mustererkennung: Der Neurocomputer soll aus dem Bild einer Ziffer
erkennen, welche Ziffer das ist. Da würde man Eingangsseitig
z.B. 10*100 Eingangsneuronen haben. Jedes repràsentiert einen
Pixel des 10*10 Pixel großen Bildes. Die Zustànde können 0/1
sein (Schwarz/Weiß) oder wenn der Scanner auch Graustufen kann,
was dazwischen.
Auf der Ausgangsseite gibt es 10 Ausgangsneuronen. Jedes Neuron
der Ausgangsebene ist mit jedem Neuron der Eingangsebene
vernetzt, vernetzt heißt, es gibt einen Gewichtungsfaktor
zwischen ihnen.
Die Werte der Eingànge werden dann dem Bild entsprechend gesetzt.
Die Ausgànge errechnen sich für jeden Ausgang durch Summation
der Eingànge mal ihre Gewichtungsfaktoren.
Ist letztendlich eine Matrixmultiplikation:
a=M*e

a: Ausgangsvektor, 10 Elemente
e: Eingangswertevektor, 100 Elemente
M: Matrix, 10*100 Elemente.

Auswertung des Ergebnisses: Man suche heraus, welches der
Ausgànge den größten Wert hat. Jeder Ausgang repràsentiert eine
Ziffer. Stellte das Bild z.B. eine '4' dar, sollte das Neuron
mit der Nummer 4 (Man zàhlt natürlich mit 0 los:-)) den größten
Aktivierungszustand bekommen.

Lernen:
Man gebe ein Bild vor. Man errechne, was der Neurocomputer
ausrechnen würde. Man gebe vor, was er hàtte ausrechnen sollen:
Nur ein Ausgangsneuron (das richtige) hàtte 1 sein sollen, alle
anderen Null. Man errechne die Abweichung, den Fehler der
Ausgànge. Nun verteile man diesen Fehler zu gleichen Teilen auf
alle Elemente der Matrix (wie dieser Schritt zu tun ist, dazu
gibt es Varianten). Damit ist das Muster dieser Ziffer
eingepràgt.
Das wiederholt man mit allen Ziffern und das Ganze muss man auch
noch mehrfach machen. Je öfter gelernt wird, desto besser
funktioniert die Ziffernerkennung. Und schon hat man ein
mittelmàßig bis schlecht funktionierendes OCR-Programm:-)

Für kompliziertere Auswertungen kann das Netz natürlich noch
mehrere Zwischenebenen haben. Die Ausgànge der einen Ebene sind
dann die Eingànge der nàchsten. Allerdings muss man in diesem
Fall bei der Rechnung von einer Ebene auf die nàchste die
Erregungszustànde nichtlinear veràndern - denn würde man die
Zahlenwerte einfach so lassen, würde das Netz nie mehr tun
können, als ein Netz mit zwei Ebenen auch könnte.
Die nichtlineare Umrechnung kann sein:
e_neu = sgn(e_alt)
also der Wertebereich wird auf das Vorzeichen beschrànkt. Es sind
jede Menge andere Funktionen auch denkbar.

Das Problem ist dann aber das Lernen. Der Fehler der Ausgabe muss
ins gesamte Netz zurückfließen, das Lernen darf ja nicht allein
in der letzten Ebene passieren. Durch eine harte Beschneidung
der Zwischenwerte kann man aber nicht mehr vernünftig
zurückrechnen auf den Fehler in den vorangegangenen Ebenen.
Besser ist also eine weiche Funktion, z.B.
e_neu = 2*atan(e_alt) / pi

Bei passend gewàhlter Funktion kann man sauber den Fehler durch
ganze Netz zurückverfolgen und korrigieren, das nennt sich dan
Backpropagation (hatte ich in àhnlicher Laune wie du gerade mal
programmiert, die Quelle hatte ich aber nur schriftlich - kann
sogar sein, dass ich den Zettel noch habe).


Generelles Problem dabei: Was ist, wenn der Außenstehende gewisse
Antworten des Netzes garnicht beurteilen kann?

Aufgabe: Das neuronale Netz soll eine gute Strategie lernen,
TicTacToe zu spielen.
Also 9 Eingànge jeder für ein Spielfeld das vom Neurocomputer
besetzt ist, 9 Eingànge für je ein Spielfeld, das vom Gegner
besetzt ist -> 18 Eingànge.
9 Ausgànge für jedes Feld, auf das der Neurocomputer setzen will,
tatsàchlich setzen tut er auf dasjenige freie Feld, welches den
größten Erregungszustand hat.

Problem: Wie soll nach einem Zug berechnet werden, ob die
Entscheidung des Netzes falsch oder richtig war? Es kann erst am
Ende eines Spiels wenn feststeht wer gewonnen hat, festgestellt
werden, ob die Gesamtheit der Entscheidungen gut oder schlecht
war. Für jeden einzelnen Spielzug kann das garnicht festgelegt
werden, also können auch keine 'richtigen' Spielzüge eingelernt
werden. Knifflig

CU Rollo

Ähnliche fragen