Bernd Thomas
Beck et al.
Published in
15 min readJan 14, 2020

--

6.4 Multiplizieren Lernen — problematisch für NN

Dieser Abschnitt wird etwas komplizierter. Wir versuchen das Multiplizieren Lernen von verschiedenen NN-Ansätzen aus anzugehen — ohne, das sei vorweg genommen, am Ende eine wirklich voll zufriedenstellende Lösung zu haben. Daher ist der Abschnitt in vier Unterabschnitte aufgeteilt, die man jeden für sich lesen kann. Insbesondere der Unterabschnitt 6.4.3 stellt eine gewisse Herausforderung dar, da wir dort einen cleveren Ansatz zu Konstruktion eines NN-Modells untersuchen, das von M. Tegmark in seinem Buch “Leben 3.0” präsentiert wird und — so die Behauptung — beliebige zwei Zahlen miteinander multiplizieren kann.

Warum ist Multiplizieren Lernen problematisch — zumindest für Neuronale Netze? Gemäß dem Universal Approximation Theorem (eigentlich gibt es inzwischen mehrere Theoreme) müssten wir die Multiplikation y=a*b als Funktion von zwei Inputgrößen ebensogut approximieren können, wie wir es bei der Pythagoras-Formel konnten.

Grundschüler lernen das Multiplizieren sicher nicht als Approximation. Eher lernen sie es — didaktisch geschickt verpackt — als 1x1 für einen Wertebereich kleinerer Faktoren auswendig und darüber hinaus als “Schriftliches Multiplizieren”, also einem Algorithmus auf Basis der Zifferndarstellung der Zahlen. (Oder sie verwenden eh gleich die Rechnerfunktion ihres Smartphones.)

Wenn man versucht, die numerische Weise der Multiplikation einem NN beizubringen, stellt man sofort fest, dass eine Multiplikation von zwei Inputgrößen in NN-Modellen “nicht vorgesehen” ist. Künstliche Neuronen verarbeiten gewichtete Inputs (per Summenbildung) und führen das Ergebnis einer Aktivierungsfunktion zu. Dabei kommen die Inputs nirgends als Faktoren “miteinander in Kontakt”.

Natürlich wird bei der Gewichtung eine Multiplikation ausgeführt. Diese ist im NN-Formalismus aber lediglich eine Methode, wie man “die Bedeutung von Inputs” für das empfangende Neuron darstellen kann — hat also nicht die Funktion einer multiplikativen Verrechnung von zwei Inputs. Auch die Aktivierungsfunktionen, deren Berechnung durchaus Multiplikationen enthalten kann, operieren nur auf einer Variablen (etwa der Summe der gewichteten Inputs).

Ein Neuronales Netz, das zuverlässing zu multiplizieren lernt, wäre ein wichtiger “Baustein” für die universelle Lernfähigkeit von Neuronalen Netzen. Zusammen mit der Addition, die für ein einfaches NN leicht zu lernen ist, mit den Gewichten und nicht-linearen Aktivierungsfunktionen würde sich (vermutlich) jede polynomiale Approximation effektiver lernen lassen.

Es gibt verschiedene Ansätze, NN-Modelle zu konstruieren, die ein Produkt a*b berechnen können sollen. In diesem Abschnitt 6.4 wollen wir einige davon überprüfen, insbesondere auf die Trainierbarkeit hin.

Entsprechend ist dieser Abschnitt in 3 Unterabschnitte und einem “Bonustrack” gegliedert, in denen wir die verschiedenen Ideen entwickeln. Sie werden dabei schrittweise komplizierter; insbesondere in 6.4.3, wo es darum geht, das 5-Neuronen-Modell von M. Tegmark (in “Leben 3.0”, s. unten), sowie abgeleitete einfachere Varianten zu verstehen und zu überprüfen. Da dies etwas tiefergehende Betrachtungen erfordert, bis hin zu Ausflügen in die Numerische Mathematik (die man aber auch zugunsten der Ergebnis-Diskussion überspringen kann), ist die ausführliche Darstellung in einen eigenen “Bonustrack A” ausgelagert. Es lohnt sich auf jeden Fall, sich diesen in Ruhe anzusehen.

6.4.1 Der universelle Interpolationsansatz

Als erstes prüfen wir das generische NN-Modell aus den vorigen Abschnitten, insbesondere das für die Pythagoras-Formel, da wir dann nur den Ausdruck sqrt(a**2 + b**2) durch den Produkt-Ausdruck a*b austauschen müssen. D.h. das Modell und das Vorgehen mit Training und Evaluation bleiben gleich, nur die Trainings- und Testdaten ändern sich.

Das Modell

# A flat NN model for the Multiplication taskn_nodes = 64
mf = Sequential()
mf.add(Dense(n_nodes, activation='sigmoid',input_shape=(2,)))
mf.add(Dense(1, activation='linear'))
sgd1 = sgd(lr= 0.001)
mf.compile(optimizer=sgd1,loss='mean_squared_error',metrics=['accuracy'])

Das Grundgitter des Definitionsbereichs ist wieder [0,10]x[0,10] in Schritten von 0.1. Allerdings ergibt die Trainingsmenge im Umfang von 30% der Punkte ein schlechtes Ergebnis, weshalb im Test der Wert auf 50% erhöht wurde. Weiterhin ergab die Vergrößerung des Hidden Layer auf 100 Neuronen keine Verbesserung.

Wir stellen hier die Ergebnisse nach Training mit gleichen Paramtern und max. 200 Epochen als Multiplikationstabelle dar. Die erste Tabelle zeigt die (gerundeten) predict Werte der NN-Multiplikation, die zweite Tabelle den (gerundeten) Fehler. Man erkennt wieder, dass die Berechnung an den Rändern des Definitionsbereichs größere Fehler aufweisen (Interpolation).

Abb. 1: Multiplikationstabelle und Fehler als Trainingsergebnis des NN mit 64 Neuronen

Skalierung?

Wir berechnen weiterhin die Ergebnisse für die Testdaten wie in 6.3 (obwohl wir hier keine pythagoräischen Zahlen suchen). Dabei fällt auf, dass Inputdaten, die außerhalb des Interpolationsbereichs liegen, sehr schlechte Ergebnisse liefern.

Einige Ganzzahl-Multiplikationen
a b a*b y_pred y_round
------------------------------------
3.0 4.0 12.0 11.7114 12.0
6.0 8.0 48.0 47.8395 48.0
5.0 12.0 60.0 61.4772 61.0
8.0 15.0 120.0 102.3434 102.0
9.0 12.0 108.0 101.0633 101.0
12.0 16.0 192.0 117.9563 118.0

Kann Skalierung hier helfen (s. 6.3)? Division der beiden Faktoren durch 2, wie in 6.3, bedeutet a' = a/2, b' = b/2, d.h. das Produkt der reduzierten Faktoren ist a'*b' = a*b/4, daher muss die Vorhersage wieder mit 4 multipliziert werden. Beispiel: a=12, b=16 werden zu a'=6, b'=8. Es werden dem Modell also die Faktoren 6 und 8 vorgelegt, das daraus eine Näherung für 6*8=24 berechnet. Um das eigentliche Produkt zu bekommen, muß - quasi als Post-Processing - das Modell-Ergebnis mit 4 multipliziert werden - außerhalb des Modells. Das Ergebnis zeigt die folgende Tabelle; es ist erwartungsgemäß besser.

Einige Ganzzahl-Multiplikationen (* skaliert)
a b a*b y_pred y_round
------------------------------------
3.0 4.0 12.0 11.7114 12.0
6.0 8.0 48.0 47.8395 48.0
5.0 12.0 60.0 60.0554 60.0 *
8.0 15.0 120.0 120.2196 120.0 *
9.0 12.0 108.0 108.8935 109.0 *
12.0 16.0 192.0 191.3581 191.0 *

Auf diese Weise könnte man doch alle Multiplikationsaufgaben von diesem trainierten NN berechnen lassen, wenn durch die Skalierung dafür gesorgt wird, dass die skalierten Faktoren a', b' in den sicheren Bereich fallen.

Ich halte das bzgl. der Frage “Kann ein NN Multiplizieren lernen?”, für einen Trugschluß — ähnlich wie bei der sin**2 Transformation in Teil 1 für die Unterscheidung gerader und ungerader Zahlen.

  1. Man müsste die Faktoren stets in Abhängigkeit von ihrer Größe skalieren. Als Extremfall kann man sich vorstellen, jede Zahl durch sich selbst zu teilen, um dann vom NN nur die sichere Aufgabe 1*1=1 berechnen zu lassen.
  2. Das Ergebnis des Modells muss anschließend mit dem Produkt der Skalierungswerte multipliziert werden (im Extermbeispiel also mit a*b). Dadurch wird die Multiplikationsaufgabe zum Teil oder ganz außerhalb des NN-Modells berechnet.
  3. Das NN kann also das Produkt zweier allgemeiner Zahlen immer nur berechnen, wenn eine Multiplikation außerhalb erfolgt.

D.h. diese Modellstruktur kann nicht sinnvoll allgemeines Multiplizieren lernen bzw. durchführen.

6.4.2 Ein einfaches multiplikatives NN-Modell

Ein anderer Modellansatz geht auf den Kern der Aufgabe a*b zurück, statt eine Approximation der Funktion y=a*b zu versuchen. Er bedient sich dabei der Möglichkeiten, die keras für die Struktur von NN-Modellen bietet und tensorflow insbesondere für das Back-Propagating.

Für die Lernaufgabe “Multiplikation zweier (ganzer) Zahlen” werden zwei einfache Input-Output Perzeptrons über einen multiply Layer verknüpft:

Abb. 2: Schichten des einfachen NN-Modells für Multiplikation

Man fragt sich mit Recht sofort, wo denn die Sinnhaftigkeit steckt. Statt wie in 6.4.1 die Multiplikation (teilweise) nach außerhalb der Modells zu legen, würden wir hier eine Tensor-Multiplikation als gegebene Berechnungsvorschrift in das Modell einbetten. Dazu weiter unten mehr. Zunächst wollen wir sehen, was denn ein solches (zugegeben, Fake-) Modell leisten kann. Immerhin multiplizieren wir nicht einfach die beiden Inputs direkt, sondern führen sie jeweils durch ein Mini-NN (Dense_a, Dense_b).

Das Modell in der keras API

in1 = Input(shape=(1,),name='Input_a')
out1 = (Dense(1,activation='linear',use_bias=False,name='Dense_a'))(in1)
in2 = Input(shape=(1,),name='Input_b')
out2 = (Dense(1,activation='linear',use_bias=False,name='Dense_b'))(in2)
out = multiply([out1,out2],name='Multiply_ab')
m = Model([in1,in2],out)
m.compile(optimizer='adam',loss='mean_squared_error',metrics=['accuracy'])

Wir lassen hier die Bias-Gewichte inaktiv, was lediglich die Konvergenz verbessert. Zum Training wählen wir für a und b die ganzen Zahlen von 0 bis 20. Es macht für den Traingsprozess keinen Unterschied, ob wir float- oder integer-Zahlen verwenden. Wir benötigen keine (nicht-lineare) Transformation als Aktivierung und belassen die Aktivierung bei 'linear'.

Das Training benötigt 600 und mehr Epochen, um in einen zuverlässigen trainierten Zustand zu kommen. Wir trainieren mit 1000 Epochen. Die loss-Funktion sinkt dabei auf 10**(-5). A,B sind die beiden Faktoren-Arrays, die als Input in das Modell einfließen.

hist1 = m.fit(x=[A,B],y=C,epochs=1000, batch_size=5,verbose=False)
Abb. 3: Entwicklung der Lossfunktion (mse)

Der mse (mean square error) zeigt ein erfreulich gutes Konvergenzverhalten.

Wir testen das trainierte Modell mit Zahlen a und b, die außerhalb des Trainingsbereichs liegen: a von 15 bis 25, b von 30 bis 40.

A_test = np.arange(15,26)
B_test = np.arange(30,41)
y_test = A_test*B_test
y_pred = m.predict([A_test,B_test])
y_rnd = np.round(y_pred)
for i in range(y_test.shape[0]):
print(A_test[i],B_test[i],y_test[i],'-',y_rnd[i],y_pred[i])

Ergebnis:
a b a*b y_rnd y_pred
--------------------------------
15 30 450 - [450.] [449.99652]
16 31 496 - [496.] [495.99612]
17 32 544 - [544.] [543.9958]
18 33 594 - [594.] [593.9954]
19 34 646 - [646.] [645.995]
20 35 700 - [700.] [699.99457]
21 36 756 - [756.] [755.99414]
22 37 814 - [814.] [813.99365]
23 38 874 - [874.] [873.99316]
24 39 936 - [936.] [935.9927]
25 40 1000 - [1000.] [999.9922]

Wir sehen hier, anders als bei dem approximierenden NN in 6.4.1, dass das trainierte Modell aus Zahlen außerhalb des Trainingsbereichs, problemlos korrekte Produkte berechnet. Genauer, korrekt auf 5 Stellen.

Das entspricht der Erwartung aus theoretischer Sicht: mit Gewichten w1 = 1.0 und w2 = 1.0 (und ohne Bias) generiert der Multiply-Layer das richtige Produkt. Die Modell-Initialisierung setzt für die Gewichte zufällige Startwerte, das Training lässt die Gewichte konvergieren, so dass eine korrekte Multiplikation möglich wird.

Schauen wir uns die trainierten Gewichte an:

w = m.get_weights()w1 = w[0][0][0]
w2 = w[1][0][0]
print(w1,w2,w1*w2)
Trainierte Gewichte:-1.6564233 -0.6037057 0.9999922

Das überrascht zunächst — man hätte 1.0 und 1.0 erwartet. Das NN findet aber andere Lösungen, mit denen das Produkt korrekt berechnet werden kann. Denn mathematisch ist klar:

a*b = (w1*a)*(w2*b) = (w1*w2)*(a*b)

Die gewichteten Inputs ergeben das korrekte Produkt immer dann, wenn w1*w2 = 1.0. Wir sehen bei der Ausgabe oben, dass die dritte Zahl tatsächlich ziemlich genau 1.0 ist, die Gewichte also die Bedingung für eine korrekte Multiplikation erfüllen

Anm: Bei Tests des Modells mit Bias entwickeln sich die Bias-Gewichte zu Null, so dass die w1*w2=1.0 Bedingung wieder realisiert wird.

Natürlich bleibt der Makel, dass das Modell das Multiplizieren nicht wirklich lernt — lediglich die Input-Aufbereitung. Wir haben also immer noch kein komplett trainierbares NN, das das Multiplizieren (im starken Sinne, s. Teil 2) lernt.

Im nächsten Abschnitt probieren wir es mit einem elegant abgeleiteten NN-Modell, das von M. Tegmark in “Leben 3.0” [1] beschrieben wird.

[1] M. Tegmark: Leben 3.0 (Ullstein 2017)

6.4.3 Ein 5-Neuronen Modell für die Multiplikation (nach Tegmark [1])

Dass das Multiplizieren Lernen für NNs keine einfache Aufgabe ist, hatten wir eingangs in 6.4 Multiplizieren Lernen — Problematisch für NN erläutert.

Wir hatten dort das Multiplizieren Lernen naiv als Interpolationsaufgabe für ein NN formuliert in der Erwartung, dass die Universelle Approximationseigenschaft von NNs das Produkt als Funktion von zwei Faktoren darstellen kann. Das Ergebnis ist allerdings nicht sehr zufrieden stellend, weil das Netz die Multiplikation nur im Bereich der Trainingsdaten einigermaßen zuverlässig erlernt (Interpolation) und dann nur über vorherige Skalierung von beliebigen Zahlen in Input-Faktoren aus dem Trainingsbereich Produkte berechnen kann. Das wiederum bedeutet, dass bereits außerhalb des NN Multiplikationen stattfinden müssen.

In diesem Abschnitt wollen wir einige anders strukturierte NN-Modelle mit dem Multiplikationsproblem konfrontieren, in der Hoffnung, bessere universelle Lern-Ergebnisse zu erzielen.

Hier die Modellansätze, die wir im Folgenden explorieren:

  • Das 5-Neuronen Modell von Tegmark [1] zur Multiplikation beliebiger Zahlen
  • Ein nahezu perfektes Modell für die Multiplikation als Spezialfall
  • Ein perfektes Modell abgeleitet aus den Binomischen Formeln

Wir werden sehen, dass auch diese NN-Modelle ihre Einschränkungen haben, sowohl bei der Berechnung eines Produkts als auch, insbesondere, in der Trainierbarkeit. Die beste Version stellt das einfache, aus der Anwendung der 1. Binomischen Formel abgeleitete NN dar (6.4.5).

Alle Modelle basieren auf mathematischen Ausdrücken (Formeln), die sich auf einfache Neuronale Netze abbilden lassen. Insofern sind diese NN als Berechnungsverfahren eigentlich obsolet. Bedeutung bekommt das NN lediglich als “lernendes” NN, d.h. wenn es auf die korrekte Multiplikation hin trainierbar ist. Das unterscheidet diese Ansätze von dem generischen NN in 6.4.1, in dem lediglich die Anzahl der Schichten und Neuronen je Schicht die NN-Struktur bilden und nicht eine vorgegebene Formel.

Da die Untersuchung dieser “eleganten” Modelle eine etwas tiefergehende Betrachtungen erfordert, bis hin zu Ausflügen in die Numerische Mathematik (die man aber auch zugunsten der Ergebnis-Diskussion überspringen kann), ist die ausführliche Darstellung in einen eigenen “Bonustrack A” ausgelagert. Hier geben wir nur eine Übersicht und zusammenfassende Bewertung der Ergebnisse. Es lohnt sich daher auf jeden Fall, sich den Bonustrack A in Ruhe anzusehen.

Das 5-Neuronen Modell für die Multiplikation (nach Tegmark [1] [2])

[1] M. Tegmark: Leben 3.0 (Ullstein 2017) und [2] Tegmark M., H. Lin, D. Rolnick: “Why does deep and cheap learning work so well” (http://arxiv.org/abs/1608.08225)

In seinem Buch [1] schreibt Tegmark:

"...(Die Abbildung) zeigt, wie nur fünf Neuronen zwei beliebige Zahlen miteinander multiplizieren können ..."

Im Artikel [2] wird beschrieben, wie man durch eine elegante mathematische Herleitung zu diesem 5-Neuronen-Modell kommt.

Wir zeigen das NN hier nicht in der Originalabbildung aus [1] (s. dazu aber Bonustrack A) sondern der Verständlichkeit halber in einer einfacheren Form:

Abb. 4: Das NN von Tegmark [1] für die Multiplikation beliebiger Zahlen

Die “fünf Neuronen” sind die vier der ersten Schicht und das eine der zweiten Schicht. Pfeil und Box anschließend deuten an, dass die Summe am Ende noch mit einem Faktor g multipliziert werden muss. So gesehen also noch ein 6. Neuron für den endgültigen Output. Die Gewichte sind hier fest vorgegeben wie gezeigt. a ist der Bias-Wert für die Neuronen der ersten Schicht.

Das Diagramm repräsentiert eine einfache Berechnungsformel, nämlich

g*[f(a+u+v)+f(a-u-v)-f(a+u-v)-f(a-u+v)]

für eine beliebige Funktion f, sofern an der Stelle a die 2. Ableitung nicht Null ist. Das liegt daran, dass g = 1/(4*f''(a)) sein muß.

Die Formel ist tatsächlich eine Näherung für das Produkt u*v, d.h. ihre Berechnung liefert das Produkt der Eingabegrößen u,v; aber nicht genau, sondern mit einem Fehler. (Mathematisch gesehen entsteht die Formel durch die Taylor-Enwicklung der 4 f-Ausdrücke. S. Bonustrack A). Dieser Fehler kann beliebig klein gemacht werden, wenn die Eingabewerte nur hinreichend klein sind. Jedenfalls im Prinzip.

Aber was nützt die Formel (oder das NN), wenn man damit nur “beliebig kleine” Werte berechnen kann? Der Trick besteht darin, dass man zwei beliebige Faktoren x,y, deren Produkt man berechnen will, zunächst auf kleine Werte skaliert, z.B. u=x/100000, v=y/100000, das Produkt u*v mit der Formel berechnet und anschließend dieses wieder "hoch"-skaliert, d.h. mit 100000^2 multipliziert. Das Skalieren kann außerhalb des NN stattfinden oder innerhalb z.B. durch Einschieben eines Custom Layers vor und nach dem eigentlichen NN. Tegmark (in [1], [2]) steckt die Skalierung in die Kernel-Gewichte, was zum gleichen Ergebnis führt.

Das f nimmt im NN die Rolle einer Aktivierungsfunktion ein. Daher liegt es nahe (s. [2]), das Modell mit einer der typischen Aktivierungsfunktionen, z.B. der sigmoid-Funktion zu versehen. Mit a=1.0 ist die 2. Ableitung ungleich Null, also im NN verwendbar. Im Bonustrack A werden die Berechnungen und Trainings mit dieser Funktion durchgeführt.

Berechnung

Berechnungen mit diesem NN zeigen ein zunächst überraschendes Verhalten. Ist die Skalierung zu schwach, d.h. u,v werden nicht klein genug, stimmt das Ergebnis nicht - weil die Formel nur eine Näherung berechnet. Macht man mit stärkerer Skalierung die u,v immer kleiner, stimmt das Ergebnis ebenfalls nicht. Dazwischen gibt es einen Bereich der Skalierung, in dem das berechnete Ergebnis einigermaßen mit dem Produkt x*y übereinstimmt (3-4 Stellen). Das liegt daran, dass eine bessere Näherung der Formel mit starker Skalierung konterkariert wird durch den Einfluß von Rundungsfehlern (sog. Auslöschung) bei zu kleinen, d.h. sehr nahe beieinander liegenden Werte der f-Terme. Bonustrack A zeigt die Fehlereffekte auch in einer Grafik.

Zur Berechnung der Multiplikation beliebiger Zahlen ist dieses NN nur sehr beschränkt praktisch brauchbar.

Trainierbarkeit

Beim Training kommt ein weiterer Fehlereffekt hinzu, gemessen als loss, von dem man hofft, dass er im Laufe vieler Trainingsepochen gegen Null geht. Er entsteht dadurch, dass das Training nicht mit den fest vorgegebenen optimalen Gewichten startet, sondern z.B. mit normalverteilten Zufallswerten.

In Bonustrack A zeigen die Trainingsexperimente, dass nur unter sehr einschränkenden Bedingungen überhaupt eine gewisse Trainingsgenauigkeit erreicht wird (2–4 Stellen). Z.B. dürfen auch bei optimaler Skalierung die Startwerte nur etwa 0.001–0.01 Standardabweichung gegenüber den “Zielwerten” (s.o.) haben. Damit ist das Modell praktisch nicht trainierbar.

6.4.4 Ein nahezu perfektes Modell für die Multiplikation als Spezialfall

Bei der Umsetzung der Näherungsformel in das 5-Neuronen-NN nach Tegmark [1] spielt die Funktion f keine besondere Rolle als NN Komponente. Sie liefert lediglich die notwendige Nicht-Linearität für die Näherungsformel. Die einzige Anforderung ist, dass f(x) eine (stetige) 2. Ableitung hat, die ungleich Null ist für eine Stelle x=a, wobei der Werta geichzeitig das Bias-Gewicht für die Neuronen des ersten Layers sein muß.

Wenn wir für f einfach eine quadratische Funktion einsetzen (z.B. f(x)=1/8*x^2 statt der sigmoid-Funktion), so passiert Folgendes (s. Bonustrack A2):

  • Die 2. Ableitung ist konstant 1. Damit können wir das Bias-Gewicht weglassen (a=0) und die Multiplikation mit g.
  • Die Formel ist nicht mehr nur eine Näherung für x*y, sondern exakt. Denn der Restterm in der Näherung wird Null (alle höheren Ableitungen sind Null).
  • Alternativ kann man die Formel mit der Funktion f auch direkt (algebraisch) ausrechnen und erhält x*y
  • Die Notwendigkeit einer Vor- und Nachskalierung entfällt.

Berechnung

Berechnungen mit diesem NN haben also keinen Approximationsfehler, sondern liefern das Produkt von beliebigen x,y beliebig genau - naja, bis auf Maschinengenauigkeit. Das zeigen die Tests in Bonustrack A2.

Trainierbarkeit

Die Trainings-Testläufe (in Bonustrack A2) liefern bei diesem NN-Modell deutlich bessere Ergebnisse als für das “allgemeine” Tegmark-Modell oben. Die Genauigkeit von trainierten Modellen geht bis auf 6 Stellen bei den Testdaten, wobei die Startwerte für die Gewichte durchaus großzügig z.B. per Normalverteilung mit Standardabweicheung 1.0 um die theoretisch richtigen Werte oder auch per Default erzeugt werden können.

Dennoch variiert die Güte des “Lernerfolgs” noch unbestimmt mit der Auswahl der Trainingsdaten und z.T. auch mit der Anzahl Epochen. Das Training eines NN ist ja ebenfalls ein Approximationverfahren und dessen Fehler wird nicht generell beliebig klein.

6.4.4 Ein perfektes Modell abgeleitet aus den Binomischen Formeln

Im vorigen Abschnitt konnten wir die Formel mit dem quadrarischen f(x) auch direkt algebraisch ausrechnen und erhielten genau x*y

Das legt die Frage nahe: “Was ist die einfachste Formel, die beim Ausrechnen x*y ergibt (und die man in ein NN abbilden kann)?"

Wenn man x und y geschickt in die erste Binomische Formel einsetzt und umrechnet, erhält man tatsächlich eine noch einfachere Formel als vorher:

2*u*v = (u+v)^2 - u^2 - v^2

Diese entspricht der “NN-geeigneten” Formel

f(u+v) = f(u) + f(v) + 2*u*v mit f(x)=x**2

Damit konstruieren wir ein NN für das Lernen und Berechnen der Multiplikation mit nur 4 Neuronen (s. Bonustrack A3):

Abb. 5: Minimalmodell für die Multiplikation abgeleitet aus der 1. Binomischen Formel

Berechnung

Unter den gleichen Bedingungen wie oben liefert das Modell perfekte Berechnungsergebnisse (Beispiele s. Bonustrack A3)

Das wird verständlich aufgrund der Vermeidung von Fehlerquellen: Wir haben keinen Approximationfehler. Da wir nicht skalieren müssen, sind die rechten Seiten numerisch stabil, d.h. die Subtraktionen führen nicht zu Auslöschung, da die Summanden nicht nahezu gleich sind.

Trainierbarkeit

Das 4-Neuronen-Modell mit seinen (nur) 9 Gewichten lässt auch mit stark gestörtren Anfangswerten sehr gut trainieren. Die Testwerte ergeben hier perfekte oder nahezu perfekte Ergebnisse nach Training über 200 Epochen. Und obwohl wir nur mit 500 Gleitkommazahlen zwischen 0 und 10 trainiert haben, sind die Testmultiplikationen im Bereich -10 bis 100 gut. Ein Zeichen, dass wir es hier nicht mit einem Interpolations-Training zu tun haben.

Die Ergebnisse hängen aber tatsächlich nahezu chaotisch von den Startwerten für die Gewichte und der Anzahl der Trainingsschritte (Epochen) ab. Das Training mit gleichem Trainingset und gleichen Parametern über 250 Epochen endet bei gerade mal 1 Stelle Genauigkeit bei den Test-Multiplikationen, bei 150 (und natürlich anderen Startgewichten) nahezu perfekt, bei 160 Epochen wiederum nur bei 3–4 richtigen Stellen (s. Bonustrack A3).

Ausschlaggebend für die Güte der Testdaten-Ergebnisse sind die Gewichte am Ende des Trainings. Die zeigen, hier wie auch oben, keine Konvergenz gegen die theoretischen Werte. In den Beispiel-Läufen, die gleich gute Testergebnisse liefern, sehen die trainierten Gewichte dennoch völlig unterschiedlich aus. Siehe dazu die Grafiken zur Entwicklung der Gewichte beim Training und deren Erklärung im Bonustrack A3. Ein Beispiel:

Abb. 6: Training — Gewichte und Loss

(Legende: Blau — das Gewichte-Set von u ausgehend, Grün - das von v ausgehende Set, Rot - Die Gewichte der Ausgabe-Schicht. Die Linienart deutet die jeweiligen Einzelgewichte an, in der Grafik von oben nach unten: ----, ....., -.-.-.-.. Bias-Werte sind immer Null.)

Das chaotische Konvergenzverhalten bei den Trainings hat eine Ursache darin, dass Gewichte-Sets, die bei der Berechnung perfekte Ergebnisse liefern — also in diesem Sinne Lösungen darstellen, “dicht an dicht” liegen. D.h. in jeder noch so kleinen Umgebung einer Lösung gibt es weitere Lösungen. Ein “konsequentes” Konvergenzverhalten könnte man höchstens dann erwarten, wenn die Lösungen (optimale Gewichte-Sets) wenigstens in gewissem Abstand separiert voneinander liegen.

Dass das so ist, liegt daran, dass jeder Satz an Gewichten, mit dem drei bestimmte charakteristische Gleichungen erfüllt werden (Details dazu in Bonustrack A3) eine Lösung der Lernaufgabe liefern. Die drei kritischen Gleichungen für 9 Gewichte sind eine hinreichende Bedingung; die theoretischen Gewichte und auch die Gewichte nach erfolgreichem Training erfüllen diese Gleichungen. (Ob sie auch eine notwendige Bedignung ist mir noch nicht klar.) Es ist somit zu erwarten, dass ausgehend von unterschiedlichen Startwerten stets andere Lösungen erreicht werden bzw. in der Abfolge der Schritte im Backpropagation-Verfahren nahezu erratisch immer wieder andere Lösungen angestrebt werden.

Insgesamt bleibt die Multiplikation — in dieser rein numerischen Form — für NN eine problematische Aufgabe. Die bisherigen Ansätze machen alle irgendwie Abstriche bzgl. Verwendbarkeit, Genauikeit, Robustheit, Aufbereitungsbedarf der Faktoren und, vor allem, Trainierbarkeit. Beste Ergebnisse mit geringsten Einschränkungen gelingen mit Modell A3, wobei die eigentliche Multiplikation durch Quadrieren ersetzt wird.

Abgesehen davon, glaube ich nicht, dass das Multiplizieren Lernen bei Kindern auf ein Approximationsverfahren hinausläuft. Das Verfahren A3 lernt man als Schüler schon eher, nämlich als Muktiplikationstrick unter Anwendung der Binomischen Formeln: 17*23 ist "im Kopf" leichter über (20-3)*(20+3) = 20^2 - 3^2 = 400 - 9 zu berechnen.

Bonustrack A lesen: Formel-basierte Neuronale Netze zur Multiplikation

Weiter lesen: 6.5 Das sin**2 Problem revisited

Zurück auf Anfang

bernhard.thomas@becketal.com
www.becketal.com

--

--

Bernd Thomas
Beck et al.

Dr. Bernhard Thomas — Mathematics, Theor. Biology, Computational Sciences, AI and advanced Technologies for the Enterprise. Beck et al. Consultant