DeepCoder: KI programmiert



  • Gerade gelesen:

    http://www.gulli.com/news/28171-deepcoder-ki-programmiert-indem-code-von-anderen-programmen-geklaut-wird-2017-02-23

    Was haltet Ihr davon, eine KI, die mehr oder weniger selbstständig Programme schreibt? Kann das funktionieren?


  • Global Moderator

    Gefühlte 90% der menschlichen Programmierer gehen so vor. Bei KIs dieser Sorte ist es oft eine gute Idee, erst nachzumachen, was der Mensch tun würde, und dann von dort aus zu verbessern.



  • Hi,

    natürlich kann man auch KI zum schreiben konkreter Programme nutzen. Aber aleine entstehen die Programme dadurch auch nicht. Und erst recht nicht werden dadurch die Softwareentwickler überflüsig.
    Vielleicht passiert das mal in fernerer Zukunft, wenn es androide Roboter gibt, die wie wir in die Welt gehen und dort die Aufgabenfinden und Umsetzen (siehe Ltn. Comander Data aus Raumschiff Enterprise).
    Als ich angefangen habe gab es immer jede Menge Wunschträume von Sprachen der 3. und 4. und 5. Generation und noch weiter, die dann fast alles von alleine machen. Als Beispiel sei hier nur mal Prolog genannt. Wobei das noch eine sehr zurückhaltende Hoffnung war. Weitergehende Ideen gingen z.B. von der Sprache Mandala aus, wo man die Programme oder in dem Fall besser die Aufgaben als Bilder entwerfen sollte und der Computer dann danach arbeitete. Alles träumte von High-Level-Sprachen und deren wundersamer Wirksamkeit. Nur, wer von Euch kennt Prolog und hat schon mal damit gearbeitet? Und gibt es in diesem Forum (außer mir) überhaupt noch einen, der schon mal was von der Programmiersprache Mandala gehört hat?
    Obwohl die Rechner immer leistungsfähiger werden, programmieren wir immer mehr mit Low-Level-Sprachen wie C und den davon abgeleiteten Produkten C++, C#, Java...
    Für streng schematisierte Aufgaben wie Datenbankabfragen wird auch gerne mal eine höher angesiedelte Abfragesprache wie SQL benutzt, aber kaum einer würde auf den Gedankenkommen einen Compiler oder ein Betriebssystem in SQL zu programmieren.
    Der Grund ist ein ganz einfacher. Der Mensch ist ein handelndes Wesen. Sein Denken ist auf das Handeln und nicht auf das Wünschen ausgerichtet (Fruaen beim Shoppe mal eindeutig ausgenommen 😉 ).
    Es fällt den Menschen einfach leichter, zuu beschreiben, wie etwas zu tun ist, als einen Ist-Zustand und einen Soll-Zustand zu beschreibern und dann die entsprehcenden Transfgormationsbedingungen festzuzurren damit das eine eindeutig aus dem anderen generiert wird.
    Auf gar keinen Fall kommt man damit zum Überflüssig werden der Softwareentwickler, denn anstatt zu sagen wie es gamcht wird muss nun auf einer viel höheren Abstraktionsebene der Soll und Ist-Zustand und die Rahmenbedingungen beschrieben werden. Für die meisten Menschen vermutlich nicht realisierbar.

    Gruß Mümmel



  • Was haltet Ihr davon, eine KI, die mehr oder weniger selbstständig Programme schreibt? Kann das funktionieren?

    Ich bin da ein wenig skeptisch.

    Leider kann ein Computer nicht kombinieren. Also müsste ein Computer mittels Brute Force solange Kombinationen von Anweisungen und Softwarefragmenten durchprobieren, bis das gewünschte Ergebnis herauskommt. Und hier kommt der Fluch der Komplexität. Der Suchraum ist gewaltig. Ein Programm aus 20 Anweisungen hat einen Suchraum von 20! = 2.43*10^17, 30 Anweisungen einen Suchraum von 2.65*10^32. Ab einer gewissen Größe wird jeder Rechner streiken. Sei er auch noch so groß...

    Bei einigen Spielen (Go, N-Dame Problem) kann man den Suchraum sehr gut eingrenzen. Wohl auch weil ein Greedy Ansatz (weniger Steine im Feld = schlechterer Zug) einigermaßen greift und die Anzahl von Zügen pro Zug sich in Grenzen hält.

    Aber bei der Programmierung gibt es keine solche Ansätze. Weder ist die Anzahl der (möglichen) Züge relativ gering, noch kann man ein gutes Programm (=gute Stellung) schwer von einem schlechtem Programm (=schlechte Stellung) unterscheiden und so den Fortschritt bewerten.


  • Global Moderator

    Bitte ein Bit schrieb:

    Aber bei der Programmierung gibt es keine solche Ansätze. Weder ist die Anzahl der (möglichen) Züge relativ gering, noch kann man ein gutes Programm (=gute Stellung) schwer von einem schlechtem Programm (=schlechte Stellung) unterscheiden und so den Fortschritt bewerten.

    😕 Du hast in der Programmierung in aller Regel doch ein genau definiertes Ergebnis zu dem du möchtest. Das kann man doch super testen, ob man sich diesem nähert.



  • Du hast in der Programmierung in aller Regel doch ein genau definiertes Ergebnis zu dem du möchtest. Das kann man doch super testen, ob man sich diesem nähert.

    Genau da liegt der Hund begraben.

    Was heißt nähern?

    Nehmen wir mal an ich möchte das meine KI ein Programm entwickelt, welches einfache mathematische Ausdrücke (Beispiel: 1+2*7+3*4) auswertet. Nun möchte ich dies (bitte verzeih mir) auf einer mehrbändigen Turing Maschine laufen lassen. Nun startet die KI mit drei Teilprogrammen. Das erste Programm schiebt das Band um 1 vorwärts, das zweite Programm schreibt eine 1 auf das Band, das dritte Programm liest die Zelle. Welches Programm ist nun näher am Ergebnis?

    Logisch würde man erst einmal sagen, das die komplette Eingabe eingelesen werden muss. Aber dies stimmt so nicht ganz. Erst muss 2*7 ausgelesen, berechnet und durch 14 ersetzt werden. Danach muss 3*4 ausgewertet werden und durch 12 ersetzt werden und danach die einzelnen Additionen berechnet werden.

    Deswegen die Frage: Was heißt nähern? Wie lautet eine gute Heuristik?



  • Nehmen wir mal an ich möchte das meine KI ein Programm entwickelt, welches einfache mathematische Ausdrücke (Beispiel: 1+2*7+3*4) auswertet. Nun möchte ich dies (bitte verzeih mir) auf einer mehrbändigen Turing Maschine laufen lassen. Nun startet die KI mit drei Teilprogrammen. Das erste Programm schiebt das Band um 1 vorwärts, das zweite Programm schreibt eine 1 auf das Band, das dritte Programm liest die Zelle. Welches Programm ist nun näher am Ergebnis?

    letztlich geht es ja auch darum, einen Parse Tree zu erstellen.
    Ein ähnliches Problem stellt ja NLP dar. Und dafür wird meines Wissens bereits mit Deep Learning Ansätzen gearbeitet. Man braucht halt eine Form von rekursiven Strukturen, aber auch das gibt es ja mittlerweile in Form von Recurrent NN bzw. deren praktikablere Ausformung als LSTM vorhanden.
    Klar, zum Trainieren braucht man irgendeine Loss Funktion, die angibt, wie "schlecht/gut" das Ergebnis derzeit ist, um dann die Parameter des NN nachjustieren zu können. Aber eventuell wirst du ja fündig wie das bei NLP gemacht wird, und so ähnlich könnte ich mir das auch bei mathematischen Ausdrücken vorstellen. Wenn man erstmal einen mathematischen Ausdruck geparst hat, so ist das Ausrechnen dann ja ziemlich einfach.