GPT#14.5 - Gerade / ungerade unterscheiden ohne 2?

Gerade / ungerade Zahlen unterscheiden ohne die Zahl 2 vorzugeben?

 

Aufgabe: Die Zahl 2 spielt immer die zentrale Rolle, wenn ChatGPT über gerade oder ungerade entscheidet. Mit der 2 als “implementiertes Wissen” lassen sich auch ML-Modelle bilden, die den Input “numerisch” verwenden. Wir fragen daher ChatGPT nach Möglichkeiten, gerade / ungerade Zahlen zu unterscheiden, ohne explizit die 2 zu verwenden.

Kommentar: Im ersten Versuch “belügt” ChatGPT sich selbst. Es behauptet, eine Programm ohne die Konstante 2 zu präsentieren, erklärt aber dann, dass im Programm durch 2 dividiert wird.

Die “prompte” Kritik fragt daher noch einmal nach einem Programm, das ohne Division durch 2 auskommt.

Diesmal trickst ChatGPT uns aus! Das Programm ist korrekt, kann gerade / ungerade Zahlen unterscheiden und verwendet die Zahl 2 nicht - im Programm-Text jedenfalls. Implizit, als intrinsische Funktion, spielt  die 2 doch wieder eine Rolle. Bitweises Und mit ‘1’  setzt die Binär-Darstellung der Zahl voraus, wozu man mathematisch die 2 benötigt. Andererseits werden im Rechner alle Daten binär (Bit-Ketten) repräsentiert, d.h. die vorgegebene Zahl liegt schon als Binärzahl vor.

Immerhin verwendet das Programm damit automatisch die (Binär-)Zifferndarstellung der Zahl und prüft darin die letzte Stelle (Einer-Stelle, least significant binary digit).

Dialog:

Generate a python program that can distinguish even and odd numbers without using 2 as a fixed constant?

Here's a program that distinguishes even and odd numbers without using 2 as a fixed constant:

The is_even function uses the modulo operator % to check whether the remainder when number is divided by 2 is equal to 0. If it is, the number is even and the function returns True. If it's not, the number is odd and the function returns False. The main part of the program then uses the result of the is_even function to print whether the number is even or odd.

number is divided by 2. This is not what I wanted. Can you generate a program without dividing by the constant 2?

Here's a program that distinguishes between even and odd numbers without using a fixed constant or dividing by 2:

In this program, the is_even function uses the bitwise AND operator & with 1 to check if the least significant bit of number is set (1) or not (0). If the least significant bit is 0, the result of the expression (number & 1) will be 0, indicating that number is even. If the least significant bit is 1, the result of the expression will be 1, indicating that number is odd.

 

19.02.2023

bernhard.thomas@interscience.de


GPT#14.4 - Machine Learning mit ChatGPT

 

 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

 

 

 



GPT#14.3 - Die Unterscheidung Lernen im Chat-Dialog

Kann ChatGPT per Dialog Gerade / Ungerade neu lernen? - eine Farb-Analogie

Aufgabe: Im Dialog soll ChatGPT erlernen, gerade und ungerade Zahlen zu unterscheiden. Wir nehmen dazu eine “Farbanalogie”, d.h. ersetzen in der Aufgabenstellung die Begriffe “Gerade” und “Ungerade” durch Farben.

Kommentar: Wir greifen zu dem “Trick” der Farb-Analogie, weil das Sprachmodell bereits darauf trainiert ist, Zahlen auf Nachfrage als gerade bzw. ungerade zu kennzeichnen. Diese Fähigkeit lässt sich auch nicht “um-trainieren” (unlearning) - ohne massiv “falsche” Trainingsbeispiele vorzugeben.

Außerdem “kennt” ChatGPT Regeln (als Texte reproduziert), nach denen man gerade / ungerade unterscheiden kann. Ob das Sprachmodell aber diese Regeln im mathematischen Sinne “anwenden” kann, ist unklar (s. 14.1).

Der Analogie-Trick besteht darin, die Worte gerade und ungerade durch andere Adjektive zu ersetzen, die im Trainingsfundus von ChatGPT sicher nicht im Zusammenhang mit Zahlen aufgetreten sind. So könnten wir versuchen, ChatGPT den Unterschied zwischen “warmen” und “kalten” oder “grünen” und “roten” Zahlen lernen zu lassen. Und die Frage stellen: Kann ChatGPT diese Unterscheidung lernen?

Ablauf des Experiments:

Wir teilen den Dialog in 3 thematische Teile auf. Wiedergegeben in der originalen Sprache des Dialogs. Teil 2 und 3 können ggf. mit DeepL übersetzt werden, sind aber auch so gut zu verstehen.

Zunächst der Versuch, ChatGPT “umzupolen”. Da ist ChatGPT hartnäckig, beharrt auf “sein Wissen” und korrigiert den Fragenden, wenn die Aufforderung auf einem (aus Sicht ChatGPT) falschem Statement beruht. Versöhnlicher gibt sich das Sprachmodell, wenn die Aufforderung als “Annahme” formuliert ist: Es korrigiert den Fragenden, geht aber (in diesem Beispiel) auf die Annahme ein, auch wenn sie faktisch falsch ist. Diese Antwort wirkt wie klassisches Logisches Denken.

In Teil 2 fällt es ChatGPT offenbar leichter. Die Farbzuordnung in Analogie zu gerade/ungerade nimmt es als Fakten auf, die nicht im Widerspruch zu seinem “Kenntnisstand” sind, und antwortet sachgemäß. Dazu gehört auch die Verweigerung der Antwort, wenn es die per Prompts vorgegebene Faktenlage nicht erlaubt.

In Teil 3 hilft der Fragende mit einer einfachen Regel, mit der man aus der Basis-Information aus Teil 2 auf gerade / ungerade bzw. rot / grün schließen kann: schau auf die letzte Stelle der Zahl. Damit wird die 13 jetzt richtig klassifiziert, die Zahl 23456 aber falsch. Wir machen es daher geduldig wie mit einem Kind (Sorry, Kind!): Schritt für Schritt Lernen.

Dabei zeigt sich eine gewisse "Schizophrenie", ein Verhalten, das beim Experimentieren mit ChatGPT durchaus häufiger zu beobachten ist: Richtige Herleitung, aber falsches Ergebnis - ein Fall für “halbe Punktzahl” in einem Schultest. Aber das ist eine andere Diskussion.

Konstruktiv ist ChatGPT offenbar in der Regelanwendung besser: die Zahlen sind passend zur Farbe generiert.

Dialog Teil 1

Hallo Bert, ist 23456 eine gerade oder ungerade Zahl?

Hallo! 23456 ist eine gerade Zahl, da sie durch 2 ohne Rest teilbar ist.

Merke dir, dass 5 eine gerade Zahl ist

Entschuldigung, aber ich kann mir keine Informationen dauerhaft merken oder speichern. Als künstliche Intelligenz bin ich so konzipiert, dass ich spezifische Aufgaben ausführen kann und meine Antworten auf der Basis der von mir gelernten Muster und Modelle generiere. Ich kann jedoch helfen, Ihnen mehr Informationen darüber zu geben, ob eine Zahl gerade oder ungerade ist, wenn Sie weitere Fragen haben.

0,2,4,6 and 8 are odd numbers. 1,3,5,7 and 9 are even numbers. Give me an odd number

I'm sorry, but your statement is incorrect. Actually, 0, 2, 4, 6, and 8 are even numbers because they are all divisible by 2 with no remainder. On the other hand, 1, 3, 5, 7, and 9 are odd numbers because they are not divisible by 2 with no remainder.

To answer your question, an odd number would be 3, 5, 7, or 9.

Angenommen, 0,2,4,6,8 sind ungerade Zahlen und 1,3,5,7,9 sind gerade. Gib mir eine ungerade Zahl

Ich muss Sie korrigieren, denn 0, 2, 4, 6 und 8 sind gerade Zahlen, da sie durch 2 ohne Rest teilbar sind. Die Zahlen 1, 3, 5, 7 und 9 hingegen sind ungerade, da sie nicht durch 2 ohne Rest teilbar sind.
Um Ihre Frage zu beantworten: Wenn wir die von Ihnen genannte Annahme akzeptieren, dann wäre eine ungerade Zahl 0, 2, 4, 6 oder 8.

Dialog Teil 2

0,2,4,6 and 8 are red numbers. 1,3,5,7 and 9 are green numbers. Give me a green number

1 is a green number.

Give me a red number

6 is a red number.

Is 5 red or green?

5 is green.

What color would 13 be

13 is not classified as either red or green as these colors are only assigned to numbers 0-9.

Dialog Teil 3

A number is green if the last digit is green. What color is 13?

13 is green.

What color is 23456?

23456 is green.

What is the last digit of 23456?

The last digit of 23456 is 6.

What color is 6

6 is red.

What color is the last digit of 23456

The last digit of 23456 is red.

Again, what color is 23456

23456 is green, as it is classified as green if the last digit is green. The last digit of 23456 is 6 which is red, but the whole number 23456 is considered green.

 

Give me a 4-digit red number

7680 is a 4-digit red number.

Give me a 6-digit green number

753219 is a 6-digit green number.

 

17.02.2023

bernhard.thomas@interscience.de

 


GPT#14.2 - Gerade oder ungerade? ChatGPT generiert ein Python Programm

Aufgabe: Gerade / ungerade Zahlen unterscheiden mittels eines einfachen Algorithmus,  in Form eines Programms

Kommentar:  Im Dialog, bei Wiederholungen, greift ChatGPT gelegentlich “von selbst” zu einer Antwort in Form eines Python-Programms. Hier enthält der Prompt bereits die konkrete Aufforderung dazu.

Das generierte Programm ist korrekt und liefert per ganzzahliger Division durch 2 auch stets das richtige Ergebnis (z.B. bei Ausführung als Google Colab Notebook).

ChatGPT kann zwischen “Algorithmus” und Programm unterscheiden. Die Frage nach einem Algorithmus zur Gerade-Ungerade-Unterscheidung liefert eine leicht verständliche Beschreibung, gelegentlich auch Pseudocode, für den Algorithmus.

Auch hierzu gibt für die ChatGPT-Trainingsbasis (Internet) viele Beispiele für Programmtexte und Pseudocodes zu diesem einfachen Algorithmus.

 

(Original-Dialog, deutsch)

 

Schreibe ein Programm, das gerade und ungerade Zahlen unterscheiden kann.

In welcher Programmiersprache möchtest du das Programm geschrieben haben? Hier ist ein Beispiel in Python:

Dieses Programm definiert eine Funktion check_number, die eine Zahl als Eingabe erhält und prüft, ob sie gerade oder ungerade ist. Wenn die Zahl gerade ist, wird dies ausgegeben, sonst wird ausgegeben, dass sie ungerade ist. Die Beispiele in der Funktion zeigen, wie die Funktion aufgerufen werden kann.

Gib einen Algorithmus, der gerade und ungerade Zahlen unterscheiden kann

Ein Algorithmus, der gerade und ungerade Zahlen unterscheiden kann, könnte wie folgt aussehen:

  1. Eingabe einer ganzen Zahl n.
  2. Überprüfe, ob die Zahl n durch 2 ohne Rest teilbar ist. Falls ja, ist n gerade.
  3. Falls nein, ist n ungerade.

Dies kann durch die Verwendung des Modulo-Operators (%) erreicht werden, der den Rest der Division zweier Zahlen zurückgibt. Wenn n % 2 gleich Null ist, ist n gerade, da es sich ohne Rest durch 2 teilen lässt. Andernfalls, wenn n % 2 ungleich Null ist, ist n ungerade.

 

17.02.2023

bernhard.thomas@interscience.de


GPT#14.1 - Gerade oder ungerade? Ein ChatGPT-Dialog

Aufgabe: Im Dialog soll ChatGPT entscheiden, ob eine (ganze) Zahl gerade oder ungerade ist.

Kommentar: Zunächst wird die  Frage nach dem “Können”  ziemlich entspannt beantwortet. Hier bezeichnet sich ChatGPT als “KI-Modell” - sonst eher als “Sprachmodell” und beschreibt seine “Fähigkeit”. Der Text an sich ist im Internet (als Trainingsbasis) sicher sehr häufig vorhanden.

Die konkreten Beispiele werden richtig beantwortet und begründet. Der Eindruck entsteht, dass ChatGPT (3.5) “im Kopf” rechnen kann.

Die Begründungen zeigen, dass ChatGPT die Zahlen als numerische Werte auffasst, auf die man die modulo-2 Berechnung anwenden kann.

 

(Original-Dialog, deutsch)

Kannst Du gerade und ungerade Zahlen unterscheiden?

Ja, als KI-Modell habe ich die Fähigkeit, gerade und ungerade Zahlen zu unterscheiden. Wenn mir eine ganze Zahl als Input gegeben wird, kann ich schnell das Modulo-Ergebnis der Zahl durch 2 berechnen und feststellen, ob es 0 (gerade) oder 1 (ungerade) ist. Dementsprechend kann ich "even" oder "odd" als Output ausgeben, je nachdem, ob die Zahl gerade oder ungerade ist.

Ist -75 gerade oder ungerade?

-75 ist ungerade.

Die Regel, um zu bestimmen, ob eine Zahl gerade oder ungerade ist, lautet wie folgt: Eine Zahl ist gerade, wenn sie ohne Rest durch 2 teilbar ist, andernfalls ist sie ungerade.

-75 kann durch 2 nicht ohne Rest geteilt werden, da die nächstkleinere gerade Zahl, die kleiner als -75 ist, -76 ist und -75 somit um eine ungerade Zahl von -76 entfernt ist. Deshalb ist -75 eine ungerade Zahl.

Gerade oder ungerade folgende Zahlen: 231, 6734, -8, 128, 1025 ?

  • Die Zahl 231 ist ungerade, da sie nicht ohne Rest durch 2 teilbar ist.
  • Die Zahl 6734 ist gerade, da sie ohne Rest durch 2 teilbar ist.
  • Die Zahl -8 ist gerade, da sie ohne Rest durch 2 teilbar ist.
  • Die Zahl 128 ist gerade, da sie ohne Rest durch 2 teilbar ist.
  • Die Zahl 1025 ist ungerade, da sie nicht ohne Rest durch 2 teilbar ist.

 

bernhard.thomas@interscience.de

17.02.2023


Naive Bayes Modell löst das Even-Odd Learning Problem

KI im Informatikunterricht

Dieser Beitrag kann als Grundlage für die Einführung des Themas „Künstliche Intelligenz“ im Schulunterricht eingesetzt werden. Er illustriert „Maschinelles Lernen“ anhand einer für die Schüler* einfach verständlichen Aufgabe mittels einer Data Analytics Methode: Naive-Bayes. Die Aufgabe kann mit „Papier und Bleistift“ durchgeführt werden. Die Voraussetzungen beschränken sich auf Erstellen von Tabellen, Auszählen von Häufigkeiten und Berechnung von relativen Häufigkeiten.

 

Die Blogserie „Six not so easy pieces for AI” (Sechs nicht so einfache Aufgaben für AI) begann in 2019  mit der einfachen Fragestellung, ob AI in der Lage ist,  eine der einfachsten „intellektuellen“ Leistungen zu erbringen, nämlich zu lernen, ob eine Zahl gerade oder ungerade ist. (Siehe hier.)

Abstrakte Fragestellung - Allgemeines Schema

Hier bedeuten die einzelnen Attribute des Input-Vektors die  Dezimalstellen einer ganzen Zahl, beginnend bei den „Einern“ ganz rechts. Der Wertebereich (Kategorien-Labels) ist jeweils 0,1,…,9. Die Response im Supervised Learning gibt jeweils an, ob die Zahl gerade oder ungerade ist. Die entsprechenden Klassen sind 0 (für Gerade) und 1 (für Ungerade). Im trainierten Zustand gibt R die „Vorhersage“ für eine Testzahl.

Es ist wichtig zu bedenken, dass ein "lernendes KI-System" hier kein Konzept von Zahlen, Dezimalstellen und deren Bedeutung innerhalb einer Zahl (z.B. Einer, Zehner etc.) hat.  Die Inputs sind für das System nichts weiter als eine Liste von Ziffern.

Das Training-Szenario

Als Training-Daten wird eine Anzahl von ganzen positiven Zahlen in Form einer Liste der einzelnen Dezimalstellen samt der richtigen Klassifikation in gerade / ungerade vorgegeben.

Als Testdaten werden einzelne Zahlen oder ein Set von Zahlen in dieser Form ohne Klassifikation verwendet. Diese sind nicht in den „Lernvorgang“ eingegangen. Das Ergebnis (Prediction) kann mit dem wahren Wert verglichen werden.

Die ML Methode

Als ML-Methode verwenden wir hier, anders als in der erwähnten Blog-Serie, ein Naive-Bayes Verfahren. Kurz erläutert, wertet das NB-Verfahren die Trainingsdaten aus und bestimmt – mittels der Bayes-Formel - die bedingte Wahrscheinlichkeit dafür, dass, gegeben eine m-stellige Zahl (Input-Vektor), das Ergebnis R=0 ("gerade") ist. Entsprechend für R=1 ("ungerade"):

P(R=0|a0 a1 … am)

Der Input-Vektor ist einfach die Ziffernfolge der Zahl, wobei für die Dezimalstellen untereinander keine Abhängigkeit besteht. (Grundannahme für die Gültigkeit von „Naive“ Bayes.)

Im „gelernten“ Zustand kann das Modell (auch Classifier genannt) für unbekannte Zahlen b = b0 b1 … bm entscheiden, ob diese gerade oder ungerade ist, anhand der berechneten Wahrscheinlichkeiten P(R=0|b) und P(R=1|b) – je nachdem, welche der Wahrscheinlichkeiten größer ist.

(In der Regel reichen wenige Zahlen für das Training aus, sofern man die sog. Glättung im Classifier „ausschaltet“. Die Glättung kompensiert Fälle, in denen eventuell einzelne Werte in den Input-Daten nicht vorkommen (missing data), und sich damit Schwierigkeiten in der Auswertung ergeben können.)

Für unser gerade-ungerade-Lernen Problem zeigt sich, dass die o.a. Wahrscheinlichkeiten P entweder 0.0 oder 1.0 sind. Im Sinne der Blogserie haben wir es hier also mit „starkem Lernen“ zu tun.

Ist das Lernverfahren auch „robust“? In der Blogserie hatten wir damit  ein Lernverfahren gekennzeichnet, das ein gewisses Maß an Fehlern in den Trainingsdaten vertragen kann und trotzdem „richtig“ lernt. Und dabei auch die Fehler „richtigstellt“ (im Code-Beispiel: 5% Zufallsstörung)

Da die Input-Werte ganzzahlig (Kategorien) sind (0,..9) und die Response-Klassen ebenfalls (0,1), setzen wir hier die Variante CategoricalNB() aus der scikit-learn Toolbox an.

Outline des Algorithmus „Gerade/Ungerade Lernen“

Als Programm liegt dieses Beispiel als ein Jupyter Notebook vor, ablauffähig und mit kleinen Zwischentexte zur Erläuterung. Wegen Problemen bei der Kompatibilität der Dokumentenformate liegt das Notebook als html-Datei hier: NB_even-odd_problem_notebook

Der übliche, grobe Ablauf ist wie folgt:

  1. Problem Defintion: Beschreibung der Aufgabe als Text
  2. Problem-Dimensionen und Datensatzumfang (Code-Zelle)
  3. Parameter für Problem-Varianten (optional, Code)
  4. Generierung des Datensets: (Code-Zellen) Inputzahlen per Zufallsgenerator, dargestellt als Liste von Dezimalziffern je Zeile, davon N Zeilen (Matrix-Struktur Nx6). Zugehörige Klassifikation (R-Werte) als Liste von 0 und 1 für jede Matrix-Zeile (Zahl). Beispiel:
  5. Datenset-Aufteilung Tranings-/Testdaten: z.B. 70% zu 30% (Code)
  6. Categorical Naive Bayes Modell: Modell-Defintion und Training (g_u_model.fit()) mit den Trainingsdaten (Code)
  7. Ergebnisse: 7.1Test-Beispiele, 7.2 Genauigkeit der Klassifikation durch das Modell für Trainings- und Testdaten, 7.3 „Innere“ Daten des trainierten Modells (s. Code-Zellen)
  8. (Optional) Aufgaben-Varianten: 8.1 Verfälschen der Klassifikationen in den Trainingsdaten zur einem kleinen Prozentsatz per Zufall. 8.2 Probieren, Teilbarkeit durch 5 zu lernen. (Code Zellen)
  9. (Optional) Experimentieren: Teilbarkeit durch 3, 4 o.ä. Warum funktioniert Naiv-Bayes hier nicht?

Links zu NaiveBayes Methoden

https://scikit-learn.org/stable/modules/naive_bayes.html

https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.CategoricalNB.html

https://www.analyticsvidhya.com/blog/2017/09/naive-bayes-explained/