ChatGPT generiert Machine Learning Modelle, die gerade / ungerade unterscheiden lernen sollen

Ref.: https://interscience-akademie.de/2021/05/04/six-not-so-easy-pieces-for-ai/

Aufgabe: Die Aufgabe, ein Programm zu erstellen, das lernt, gerade und ungerade Zahlen zu unterscheiden, führt hier zu einer Abfolge von Versuchen (Teilaufgaben). ChatGPT findet zunächst keine brauchbare Lösung. Es braucht zusätzliche Hinweise im Prompt (Prompt Engineering), um ChatGPT “auf die richtige Spur“ zu bringen. Wir stellen hier nur ausgewählte (schöne)  Ergebnisse der Teilaufgaben ausführlich dar.  Zu jeder Teilaufgabe gibt es

  • die Aufgabenbeschreibung
  • einen Kommentar zu ChatGPT-Dialog und Ergebnis
  • den eigentlichen Original-Dialog, wobei die Prompts wieder kursiv gesetzt sind
  • die generierten Programme – alle jeweils im Anhang wiedergegeben.

Aufgabe 1: Kann ChatGPT erklären, wie z.B. Kinder lernen gerade und ungerade Zahlen zu unterscheiden?

Kommentar: Die mathematische Formel-Darstellung in der Antwort ist sicher nicht der  Weg, wie Kinder gerade/ungerade Zahlen erkennen lernen. Das setzt bereits etwa das Dividieren durch 2 mit Rest voraus. Die spielerische Version (Paarbildung) von Objekten ist dagegen ein didaktisch durchaus erprobtes Vorgehen – allerdings fehlt die Repräsentation durch Zahlen. Man erkennt hier die “dominierenden” Texte der ChatGPT-Trasiningsbasis (Internet) zur Definition von gerade und ungerade wieder, die das „Verständnis“ von ChatGPT für diese Unetrscheidung bestimmten. ( S. auch #14.1).

Dialog:

Wie lernt ein Kind gerade und ungerade zahlen zu unterscheiden

Ein Kind lernt gerade und ungerade Zahlen durch Wiederholung und Beispiele. Lehrer und Eltern können ihnen beibringen, dass gerade Zahlen durch das Zahlzeichen „2n“ dargestellt werden können (wobei n eine beliebige natürliche Zahl ist), während ungerade Zahlen durch das Zahlzeichen „2n + 1“ dargestellt werden können. Sie können auch Beispiele geben und das Kind auffordern, bestimmte Zahlen als gerade oder ungerade zu kennzeichnen. Praktische Aktivitäten wie das Zählen von Gegenständen in Paaren und das Erkennen von Mustern in der Anordnung von Gegenständen können auch dazu beitragen, das Verständnis des Kindes für gerade und ungerade Zahlen zu vertiefen.

 

Aufgabe 2: ChatGPT soll ein Programm generieren, das lernt, gerade und ungerade zu unterscheiden. Ohne weitere Vorgaben.

Kommentar: Bei einer Reihe von Wiederholungen der Aufforderung generiert das Sprachmodell Python-Code, der unterschiedliche Machine Learning bzw. Data Analytics Ansätze implementiert. U.a. Decision Tree,  logistische Regression, Nearest-Neighbor Clustering und per Hinweise im Prompt Naive Bayes – die aber überwiegend nicht lauffähig sind aufgrund von Programmierfehlern. Zur Korrektur konnte man entweder ChatGPT auffordern, den Fehler zu finden und zu korrigieren, was gelegentlich erfolgreich war, oder den Fehler von Hand korrigieren. Die Programme waren dann ablauffähig in Google Colab und in diesem Sinne korrekt. Sie erfüllten aber nie die Aufgabe: Auch nach dem Training mit Trainingsdaten war die Fehlklassifikationsrate hoch (typisch 50%).

Hier detailliert dargestellt wird ein schönes und auf Anhieb korrektes Ergebnis. Das Programm modelliert ein typisches, mehr-schichtiges Neuronales Netz (NN), wie man es für Klassifikationsaufgaben einsetzt und das so in der Trainingsbasis von Open AI’s GPT3.5 sicher häufig vorkommt.

Das NN lernt aber die Unterscheidung nicht; auch nicht durch händische Änderung z.B. der Anzahl Iterationen (epochs).  Selbst Trainingsdaten werden fehl-klassifiziert. Output-Beispiele s.u. im Anschluss an das Programm.

Die Ursache: Zahlen werden typischerweise “numerisch” verwendet. Mit diesem Input kann die Klassifikation nicht gelingen (s. Six not so easy pieces for AI). Die Alternative, Zahlen ziffernweise zu sehen und den Fokus auf die Einer-Stelle zu legen, macht das Lernen von Gerade / Ungerade leichter – für Kind und KI (s. unten).

Dialog:

Schreibe ein Programm, das lernt gerade und ungerade Zahlen zu unterscheiden

Hier ist ein Beispielprogramm in Python, das lernt, gerade und ungerade Zahlen zu unterscheiden:

[Programm 1: Zahlen numerisch, NN-Modell (Code s. Anhang)]

Das Programm verwendet ein neuronales Netzwerk mit einer Eingabeschicht von einer Neuron, einer versteckten Schicht mit zehn Neuronen und einer Ausgabeschicht mit zwei Neuronen. Die Eingabe ist eine einzelne Zahl, und die Ausgabe besteht aus einem Vektor mit zwei Elementen, wobei das erste Element die Wahrscheinlichkeit angibt, dass die Zahl gerade ist, und das zweite Element die Wahrscheinlichkeit, dass die Zahl ungerade ist.

Das Programm erstellt dann 1000 Trainingsdaten, indem es zufällige Zahlen generiert und kennzeichnet, ob sie gerade oder ungerade sind. Das Netzwerk wird mit diesen Daten trainiert, indem es die Trainingsdaten durch das Netzwerk rückwärts propagiert und die Gewichte anpasst.

Schließlich testet das Programm das trainierte Netzwerk mit einigen Testdaten, um zu überprüfen, ob es richtig vorhersagt, ob die Zahlen gerade oder ungerade sind. Wenn die Wahrscheinlichkeit für die geraden Zahlen höher ist als die für die ungeraden, sagt das Programm voraus, dass die Zahl gerade ist, und umgekehrt.

 

Aufgabe 3: ChatGPT soll ein ML Programm generieren, das lernt, gerade und ungerade zu unterscheiden. Der Prompt enthält den Hinweis,  die Zahlen als Ziffernfolgen zu behandeln.

Kommentar: Auch mit diesem Hinweis erzeugt das Sprachmodell wiederholt Programmvarianten, die fehlerhaft sind bzw. nicht zielführend trainiert werden.

Einen erfolgreichen Ansatz stellen wir hier dar: Das Sprachmodell  generiert ein typisches Machine Learning Programm auf Basis eines klassifizierenden zwei-schichtigen Neuronalen Netzes, ähnlich dem in Aufgabe 2 gezeigten (32 statt 10 Neuronen in der ersten Schicht). Es konvertiert dabei die zum Training ausgewählten Zahlen in Ziffernfolgen. Näherer Erklärung des NN-Modells liefert ChatGPT selbst im Anschluß an das Programm.

Das generierte Programm (s. Programm 2) ist auf Anhieb fehlerfrei (in Google Colab ausführbar), es liefert aber keine korrekte Unterscheidung (s. Output-Beispiel am Ende des Programmcodes). Die “Accuracy” liegt nach Training bei etwa 50-60% und lässt sich auch nicht mehr verbessern durch Erhöhung der Iterationen (100 statt 50 im generierten Code).

In einem anschließenden Prompt “informieren” wir ChatGPT, dass die Vorhersagegenauigkeit zu gering ist, und fragen nach Verbesserung.

Wir bekommen  ein erstaunlich gutes Ergebnis.

Zunächst beschreibt die Antwort einige prinzipielle Möglichkeiten, den Trainingserfolg zu verbessern. Das ist nicht erstaunlich, da solche Informationen im Netz massenhaft zu finden sind.

Anders als in vielen Versuchen zuvor, ist ChatGPT in diesem Dialog sogar konstruktiv: Es beschreibt und liefert ein fehlerfreies Programm (s. Programm 3) für ein deutlich komplexeres NN-Modell (s. Abschnitt “Neuronales Netz definieren” im Programmcode 3).

In Testläufen steigt die Accuracy auf über  95% und die Testbeispiele werden richtig als gerade bzw. ungerade Zahlen erkannt. Die Zahl der Iterationen spielt hier eine Rolle. Das generierte Programm setzt 100 Iterationen (epochs) fest. Versuchsweise setzen wir diese  auf 50, wie in der ersten Version. Hier steigt die Accuracy nur auf etwa 85%. Mit Konsequenzen für die Vorhersage: In einem Beispielfall wurden systematisch die Zahlen, die auf 6 endeten, als ungerade klassifiziert.

Auch die Zahl der Trainingsbeispiele spielt eine Rolle. Das Programm setzt die Anzahl auf 10.000. D.h. bis auf “Zufallslücken” decken die Trainingszahlen fast den ganzen vierstelligen Zahlenbereich von 1000 bis 9998 ab. Bei weniger “dichten” Trainingsdaten, z.B. 1000, fällt die Accuracy deutlich ab (ca. 65 %)

Das Modell hat immerhin schon über 9000 Parameter (Gewichte).

Dialog:

Schreibe ein python programm, das lernt, gerade und ungerade zahlen zu unterscheiden. Tipp: Erzeuge 4-stellige ganze Zahlen, wandele sie in Ziffernfolgen und verwende die Ziffernfolgen als Input 

Gerne! Hier ist ein Beispielprogramm, das lernt, gerade und ungerade Zahlen zu unterscheiden, indem es zufällige 4-stellige Zahlen generiert und die Ziffernfolgen als Input verwendet:

[Programm 2: Zahlen als Ziffernfolge, NN-Modell (Code s. Anhang)]

Das Programm generiert zuerst 1000 zufällige 4-stellige Zahlen und wandelt diese in Ziffernfolgen um. Wenn die Zahl gerade ist, wird sie als [1, 0] gekennzeichnet, wenn sie ungerade ist, wird sie als [0, 1] gekennzeichnet. Diese Paare von Ziffernfolgen und Labeln werden als Trainingsdaten verwendet, um ein neuronales Netzwerk zu trainieren, das gerade und ungerade Zahlen unterscheiden kann.

Das neuronale Netzwerk besteht aus zwei Dense-Layern: einem Eingabe-Layer mit 32 Neuronen und einem Ausgabe-Layer mit 2 Neuronen (eins für gerade, eins für ungerade). Das Netzwerk wird mit der categorical_crossentropy-Loss-Funktion und dem Adam-Optimizer kompiliert.

Das trainierte Modell wird dann anhand einiger Testdaten getestet, die als Ziffernfolgen eingegeben werden. Das Modell gibt eine Vorhersage aus, ob die Zahl gerade oder ungerade ist, und gibt diese Vorhersage als Ausgabe aus.

Ich hoffe, das hilft weiter!

Das trainierte Modell liefert zur Hälfte falsche Vorhersagen. Kannst du das verbessern?

Ja, ich kann versuchen, das Modell zu verbessern. Es gibt mehrere Möglichkeiten, wie das Modell verbessert werden kann, zum Beispiel:

    1. Mehr Trainingsdaten: Durch die Verwendung von mehr Trainingsdaten kann das Modell möglicherweise eine bessere Generalisierung erreichen.
    2. Verwendung von tieferen oder breiteren Netzwerken: Ein tieferes oder breiteres neuronales Netzwerk kann möglicherweise komplexere Muster erfassen und bessere Vorhersagen liefern.
    3. Verwendung von Dropout oder anderen Regularisierungstechniken: Dropout oder andere Regularisierungstechniken können Overfitting reduzieren und die Fähigkeit des Modells verbessern, auf neuen Daten zu generalisieren.
    4. Anpassung der Hyperparameter: Die Hyperparameter des Modells, wie z.B. die Anzahl der Epochen oder die Batch-Größe, können angepasst werden, um eine bessere Leistung zu erzielen.

Hier ist ein Beispiel, das auf der Verwendung von tieferen und breiteren Netzwerken sowie Regularisierungstechniken basiert. Dieses Modell verwendet ein tieferes Netzwerk mit mehr Neuronen, Dropout-Regularisierung und einer L2-Regularisierung. Es wird auch mit mehr Epochen trainiert:

[Programm 3: Zahlen als Ziffernfolge, komplexeres NN-Modell (Code s. Anhang)]

In diesem Beispiel wird das

[Hier bricht der Dialog ab]

 

Aufgabe 4:  Die einfachste und schnellste Methode basiert auf einem statistischen Verfahren – Naive Bayes genannt. ChatGPT findet diese Möglichkeit aber erst, nachdem der entsprechende Hinweis im Prompt aufgenommen wird. Zunächst wird ChatGPT überlassen, welches Naive Bayes Modell es verwendet. Danach wird (das richtige) Categorical Naive Bayes im Prompt vorgegeben.

Anm.: Auch wenn man – als Mensch – wissen muss, wie ein vielversprechender Modellansatz aussehen könnte, bekommt man mit einem geeigneten Prompt (Prompt Engineering) zumindest einen Vorschlag für den Programmcode. Ähnlich wie bei einer Übersetzung mit z.B. DeepL kann dieser oft als “Rohling” für eine brauchbare Programmversion sein.

Kommentar: ChatGPT wählt als mögliches Naive Bayes (NB) Verfahren “GaussianNB” aus. Eine Erklärung bleibt uns das Sprachmodell dieses Mal schuldig. Das Programm ist fehlerfrei lauffähig. Es generiert Trainingsdaten und Testdaten getrennt und verwendet die Testdaten zur Bewertung der Vorhersage-Genauigkeit (Accuracy).

Mit 60% Genauigkeit liefert diese Methode offenbar kein brauchbares Entscheidungsmodell, von dem wir eigentlich mathematische Eindeutigkeit erwarten.

Da wir wissen (s. Link ISAfA Web), dass die Categorical Variante die bessere, sogar perfekte Methode ist, wiederholen wir die Aufforderung und verlangen dabei “Categorical Naive Bayes” explizit.

ChatGPT erklärt, warum dies die bessere Variante ist. Tatsächlich liefert das trainierte Modell eine perfekte Unterscheidung von geraden und ungeraden Zahlen (accuracy = 1.0) – wie man es auch von Schulkindern erwarten würde.

Auch hier werden im generierten Original 10.000 Trainingsdaten generiert – unnötig viele. Schon mit 200 Daten erreicht das Verfahren 100% Genauigkeit.

Das CategoricalNB “lernt” statistisch, dass gerade / ungerade bei Zahlen mit bestimmten Ziffern in der Einer-Stelle korrelieren. Schulkinder benötigen dazu keine Statistik, sie merken sich die geraden / ungeraden Ziffern und lernen, dass sie nur auf die Ziffer ganz rechts achten müssen.

Dialog:

Schreibe ein python programm, das lernt, gerade und ungerade zahlen zu unterscheiden. Tipp: Erzeuge 4-stellige ganze Zahlen, wandele sie in Ziffernfolgen und verwende die Ziffernfolgen als Input und verwende ein Naive Bayes Verfahren

Hier ist ein Beispielprogramm, das mithilfe des Naive Bayes Algorithmus lernt, gerade und ungerade Zahlen zu unterscheiden:

[Programm 4: Zahlen als Ziffernfolge, GaussianNB-Modell (Code s. Anhang)]

Das Programm erzeugt zunächst Trainings- und Testdaten, indem es 4-stellige Zahlen zufällig generiert und in Ziffernfolgen umwandelt. Dann wird für jede Zahl festgestellt, ob sie gerade oder ungerade ist, und das Ergebnis als Label gespeichert. Anschließend wird ein Naive Bayes Klassifikator trainiert und auf den Testdaten angewendet. Die Genauigkeit wird am Ende ausgegeben.

Schreibe ein python programm, das lernt, gerade und ungerade zahlen zu unterscheiden. Tipp: Erzeuge 4-stellige ganze Zahlen, wandele sie in Ziffernfolgen und verwende die Ziffernfolgen als Input und verwende das Categorical Naive Bayes Verfahren

Hier ist ein Beispielprogramm, das mithilfe des Categorical Naive Bayes Algorithmus lernt, gerade und ungerade Zahlen zu unterscheiden:

Programm 5: Zahlen als Ziffernfolge, CategoricalNB-Modell (Code s. Anhang)

Das Programm ist ähnlich wie das vorherige Beispiel, aber anstatt des Gaussian Naive Bayes Algorithmus verwenden wir hier den Categorical Naive Bayes Algorithmus, da die Eingabevariablen (Ziffernfolgen) kategorial sind. Der Rest des Codes ist fast identisch mit dem vorherigen Beispiel.

17.02.2023

bernhard.thomas@interscience.de


Anhang: Generierte Programme

Programm 1: Zahlen numerisch, NN-Modell (Prompt Aufgabe 2)

Programm 2: Zahlen als Ziffernfolge, NN-Modell (Prompt Aufgabe 3)

Programm 3: Zahlen als Ziffernfolge, komplexeres NN-Modell (Prompt Aufgabe 3 Nachfrage)

Programm 4: Zahlen als Ziffernfolge, GaussianNB-Modell (Prompt Aufgabe 4)

Programm 5: Zahlen als Ziffernfolge, CategoricalNB-Modell (Prompt Aufgabe 4 Nachfrage)

Änderung gegenüber Programm 4