ML: Was ist der Perzeptron Lernalgorithmus?

Der Perzeptron Lernalgorithmus ist der typische Einstieg in das Thema Machine Learning. Aber selbst bei diesem musste ich mit meinen bisherigen Python Kenntnissen schon ein wenig beissen, bis ich den Code verstanden habe – Ständig war mein Kopf voller Fragen wie „Huh, was ist denn das schon wieder für eine neue Funktion?“ oder „Ist das jetzt ein Vektor oder eine Matrize? Oder ein einzelner Wert?“

Ich werde in diesem Artikel keinen Code verwenden, sondern diesen in einem separaten Artikel hinzufügen. Hier geht es mal nur um die grundsätzliche Theorie.

Die Implementierung in Python können sie hier finden: ML: Perzeptron Lernalgorithmus in Python

Was ist der Perzeptron Lernalgorithmus?

Die Anfänge des Algorithmus gehen zurück ins Jahr 1943, wo Warren McCulloch und Walter Pitts eine künstliche Intelligenz entwickeln wollten. Zu dieser Zeit wurde das erste Konzept für eine Hirnzelle veröffentlicht, das sogenannte MCP-Neuron (McCulloch-Pitts-Neuron). Neuronen sind miteinander verknüpfte Gehirnzellen, die eine binäre Ausgabe haben. Das bedeutet, entweder sie feuern (ja das nennt man so) oder sie feuern nicht.

Frank Rosenblatt hat dann 1957 auf Basis dieses Neurons die Perzeptron Lernregel veröffentlicht. Er schlug vor, jedes Eingabemerkmal mit einer Gewichtung zu multiplizieren, um zu entscheiden, ob das Neuron feuert oder nicht. Die Gewichtung wird dabei im Laufe des Algorithmus angepasst, bis entschieden werden kann, zu welcher der beiden Klassen ein Objekt gehört.

Perzeptron Lernalgorithmus hat eine binäre Ausgabe!

Das ist übrigens enorm wichtig, darum sage ich es nochmal: Der Perzeptron Lernalgorithmus ist ein binärer Algorithmus und kann ein Objekt nur in zwei Klassen einteilen! Ob diese zwei Klassen mit -1 und 1 oder mit schwarz und weiss betitelt werden ist schlussendlich nicht so relevant. Ich verwende in meinem Beispielen 1 und -1.

Wir schauen hier zum Beginnen nur ein einzelnes Neuron an. Es gibt fortgeschrittene Techniken, bei denen man Neuronen miteinander vernetzt, zuerst braucht man die Theorie für ein einzelnes Neuron.

Die Aktivierungsfunktion entscheidet über die Klasse

Für den Algorithmus wird eine Aktivierungsfunktion definiert, die dann entscheidet, ob das Objekt ein Elefant oder ein Tiger ist. Diese Funktion heisst auch Sprungfunktion oder Heavyside-Funktion.

Warum? Ganz einfach: Entweder ist das Objekt eine -1 und wenn nicht springt die Funktion direkt zu 1. Es gibt keine anderen Ausgabewerte!

In diesem Fall ist die konkrete Aktivierungsfunktion ganz simpel: Ist der Wert grösser als 0, kommt eine 1 heraus, ansonsten eine -1.

Anhand von was entscheidet die Aktivierungsfunktion?

  • Plus 1 = Elefant
  • Minus 1 = Tiger

Die Aktivierungsfunktion gibt also 1 oder -1 aus – Elefant oder Tiger. Aber anhand von was?

Sie entscheidet anhand der sogenannten Nettoeingabe. Die Nettoeingabe z ist die Linearkombination von den Merkmalen x und den Gewichtungen w.

z = x1*w1 + x2*w2 + x3*w3 + ... + xn*wn

Also jedes Merkmal multipliziert mit seinem Gewicht und dann alles aufaddiert gibt die Nettoeingabe, und wenn diese grösser ist als ein gewisser Schwellwert – in unserem Fall nehmen wir einfach 0 – dann ist es ein Elefant und sonst ein Tiger.

Für die Darstellung dieser Algorithmen verwendet man oft folgende Darstellung:
perzeptron.png

Das Herzstück des Perzeptron

Schlussendlich geht aber alles zurück die folgende Logik. Ob jetzt die Nettoeingabe grosse oder kleine Zahlen generiert, ist eigentlich nicht so relevant, da sowieso einfach eine 1 oder -1 herauskommt.

Die Gewichtungen w werden, wie wir gesehen haben, bei der Berechnung der Nettoeingabe verwendet: x * w und so. Diese Gewichtungen werden nun bei jeder Bearbeitung eines Objektes aktualisiert, nämlich folgendermassen:

Neue_Gewichtung = Aktuelle_Gewichtung + Änderung_der_Gewichtung

Gut, das ist jetzt keine grosse Kunst und auch noch nicht das Herzstück. Diese verbirgt sich hinter der Änderung_der_Gewichtung:

Änderung_der_Gewichtung = Lernrate * (effektive_Klasse - vorhergesagte_Klasse) 
* aktuelles_x

Die Lernrate kann irgendein Faktor sein, etwa 0.01. Lassen wir mal die Lernrate und das aktuelle_x beiseite und konzentrieren uns auf den simpel ausschauenden Ausruck

Änderung_der_Gewichtung = effektive_Klasse - vorhergesagte_Klasse

Wie Sie im Artikel Welche drei Arten des Machine Learnings gibt es? lesen können, ist einer der drei Typen des Machine Learnings das überwachte Lernen. Beim überwachten Lernen müssen bereits Daten vorhanden sein, anhand deren die Maschine trainieren können – Also etwa Tierdaten, bei denen hinten schon steht, ob es sich jetzt um einen Elefanten oder einen Tiger handelt. Und genau dieser Wert steht hier hinter effektive_Klasse. Da das Perzeptron binär ist, kann hier nur eine 1 oder eine -1 stehen.

Und was verbirgt sich hinter vorhergesagte_Klasse? Genau das, was ich im ersten Teil des Artikels erklärt habe: Die Nettoeingabe wird durch die Linearkombination von den Merkmalen und den Gewichten ein Wert berechnet, etwa 5. Dieser Wert kommt in die Aktivierungsfunktion, welche schaut: Ist der Wert grösser als Null? Dies wird bejaht und heraus kommt eine „1„. Wie gesagt, es ist unerheblich, ob es sich um eine 5 oder eine 500’000 handelt, die Aktivierungsfunktion münzt diesen Wert in 1 oder -1.

Und warum soll das nun so genial sein?

Bei effektive_Klasse und vorhergesagte_Klasse steht also entweder 1 oder -1. Für die Änderung_der_Gewichtung gibt es also nur vier Möglichkeiten:

1 – 1 = 0

1 – (-1) = 1 + 1 = 2

(-1) – 1 = -2

(-1) – (-1) = (-1) + 1 = 0

Und gemäss der Formel für die Neue_Gewichtung wird diese Änderung_der_Gewichtung nun hinzuaddiert bzw. subtrahiert. Die Neue_Gewichtung wird dann bei der nächsten Iteration als normales w verwendet, um wieder die Nettoeingabe zu berechnen etc. Wenn Sie sich die vier Möglichkeiten oben nochmals ansehen, werden Sie feststellen, dass sich die Gewichtung nicht ändert, wenn die effektive_Klasse und die vorhergesagte_Klasse gleich sind. Nur wenn diese sich unterscheiden, wird die Gewichtung entweder nach oben oder nach unten korrigiert. So nähert sich nach etlichen Iterationen die Nettoeingabe entweder der 1 oder der -1.

Vielleicht bin ich auch der einzige Mensch auf dieser Welt, der dieses Verfahren so genial findet, gerade weil es so simpel ist. Aber ich finde es echt genial!

Die maximale Anzahl von Iterationen nennt man übrigens Epochen.

Kurz ein Wort zu den Gewichten

Nur damit das klar ist: Nehmen wir an, Sie haben eine Liste von tausend Objekten und 500 davon sind Elefanten und 500 sind Tiger. Und es hat zwei Merkmale, zum Beispiel Anzahl Füsse und Länge, dann ergibt das eine Eingabematrix von 500*2 Einträgen.

Der Witz ist aber, insgesamt hat es pro Merkmal genau ein Gewicht, egal wieviele Objekte dahinterstecken!

Es ist also egal, ob man 500 oder 5 Millionen Daten analysiert, man hat in diesem Fall immer 2 Gewichte w1 und w2, die man aktualisiert.

Linear trennbar ist wichtig

Wenn Sie in betracht ziehen, ein eigenes Perzeptron zu bauen, denken Sie einfach immer daran, dass die Daten linear trennbar sein müssen. Das bedeutet, wenn Sie die Daten in einem Diagramm anzeigen, dürfen sich die Daten des Elefanten und die der Tiger nicht mischen – es muss möglich sein, eine Gerade zwischen den Daten zu ziehen.

Wo ist jetzt hier das „Machine Learning“?

Sie haben den Text oben zum Perzeptron gelesen und verstanden, fragen sich aber nun: „Uhm okay, alles schön und gut, aber wie helfen diese Informationen der Machine, etwas zu lernen? Oder wo ist hier das Lernen versteckt? Bei dem gezeigten Algorithmus ist ja die Klasse bereits im Voraus bekannt…“

Sie haben recht, das habe ich mich auch gefragt.

Ich fasse den Perzeptron kurz zusammen: Man hat zwei Klassen, die entweder 1 oder -1 sind. Dann multipliziert und summiert man Alles irgendwie zusammen und aktualisiert die Gewichte, wenn die vorhergesagte Klasse nicht der effektiven Klasse entspricht.

Das Lernen ist tatsächlich bei der Aktualisierung der Gewichte versteckt!

Die Gewichte initialisiert man ja mit Null. Dann ändert man die Gewichte entweder in positiver Richtung oder negativer Richtung. Und hat man alle Daten durchgearbeitet, bekommt man einen Schlusswert für diese Gewichte. Man kann die Daten auch 10 oder 100 Mal durcharbeiten, am Ende haben die Gewichte einen bestimmten Wert.

Und genau dieser Wert ist das Lernen der Maschine!

Beispiel:
Nach 1000 Durchläufen haben wir zwei Gewichte w1 = 0.21 und w2 = -1.5 berechnet. Nun bekommen wir ein neues Objekt, und wissen nicht, ob es ein Elefant oder ein Tiger ist.

Nun können wir einfach die Nettoeingabe berechnen z = x1*w1 + x2*w2 und erhalten eine Zahl. Ist diese Zahl grösser als 0, besteht eine hohe Chance, dass das Tier ein Elefant und kein Tiger ist. Denn genau um diese zwei Gewichte herauszufinden haben wir überhaupt den ganzen Spass gemacht.

Ich denke, dass ist alles, was man zum Einstieg zum Perzeptron sagen kann. Sie können jetzt losziehen und beim nächsten Bier im Pub die Leute fragen, ob Sie wissen, was ein Perzeptron ist und ihnen sagen, dass es sich nicht um den Transformer Kollege von Megatron handelt.

Werbeanzeigen