Für eine Zusammenarbeit können Sie Serge Dot Rogatch unter Gmail Dot Com kontaktieren.
.NET: https://github.com/srogatch/ProbQA/tree/master/ProbQA/ProbQANetCore
Python: https://github.com/srogatch/ProbQA/tree/master/Interop/Python/ProbQAInterop
Sie können sich die Anwendungsbeispiele von Python auch im Quellcode der Website ansehen: https://github.com/srogatch/probqa-web
Eine Anwendung des probabilistischen Fragesystems ist jetzt als Website verfügbar (Quellcode: https://github.com/srogatch/probqa-web): http://probqa.com/ oder http://best-games .info, eine interaktive Empfehlungsmaschine für Spiele. Hier können Benutzer das nächste Spiel finden, das sie spielen möchten, ohne dessen Namen oder Schlüsselwörter zu kennen. Die Nutzer müssen lediglich Fragen beantworten und das Programm listet für jeden Nutzer die Top-Empfehlungen auf. Die Engine, die die Website antreibt, soll ähnlich wie das beliebte Spiel Akinator funktionieren, bei dem der Benutzer an einen Charakter denkt und das Programm Fragen stellt, um den geheimen Charakter des Benutzers zu erraten.
Bei ProbQA gibt es kein Geheimnis: Der Benutzer weiß einfach nicht genau, was er will. Das Programm stellt also Fragen, um etwas Passendes für den Benutzer zu finden.
Nachdem Sie die interaktive Empfehlungsmaschine ausprobiert haben, können Sie an einer Umfrage teilnehmen: https://www.surveymonkey.com/r/SMJ2ZRZ
Im Hinblick auf die Ziele der angewandten KI handelt es sich um ein Expertensystem. Konkret handelt es sich um ein probabilistisches Frage-Antwort-System: Das Programm fragt, die Benutzer antworten. Das minimale Ziel des Programms besteht darin, zu identifizieren, was der Benutzer benötigt (ein Ziel), auch wenn der Benutzer sich der Existenz eines solchen Produkts/einer solchen Dienstleistung nicht bewusst ist. Es ist nur ein Backend in C++. Es liegt an den anderen, Frontends für ihre Bedürfnisse zu implementieren. Das Backend kann auf etwas wie dieses http://en.akinator.com/ oder für den Verkauf von Produkten und Dienstleistungen in einigen Internet-Shops angewendet werden (als Chat-Bot, der Benutzern hilft, herauszufinden, was sie brauchen, auch wenn sie es nicht formulieren können). die Schlüsselwörter oder sogar ihre Wünsche speziell).
Unten sind die Lernkurven des Programms für die Matrixgröße 5.000.000 aufgeführt: 1.000 Fragen mal 5 Antwortoptionen für jede Frage, mal 1.000 Ziele. In diesem Experiment trainieren wir das Programm für die binäre Suche: Der Zielbereich Tj liegt zwischen 0 und 999, und jede Frage Qi lautet „Wie schneidet Ihre Schätzung im Vergleich zu Qi ab?“. Die Antwortmöglichkeiten sind 0 – „Die Schätzung ist viel niedriger als Qi“, 1 – „Die Schätzung ist etwas niedriger als Qi“, 2 – „Die Schätzung entspricht genau Qi“, 3 – „Die Schätzung ist etwas höher als Qi“. " und 4 - „Die Schätzung ist viel höher als Qi“.
Die X-Achse enthält die Anzahl der gestellten und beantworteten Fragen (bis zu 5 Millionen). Die Y-Achse enthält für jeweils 256 Tests in Folge den Prozentsatz, wie oft das Programm das erratene Ziel richtig unter den zehn wahrscheinlichsten Zielen aufgeführt hat. Beachten Sie, dass Tests immer auf neuartigen Daten basieren: Wir wählen zunächst eine Zufallszahl aus, lassen sie dann vom Programm erraten, indem wir Fragen stellen und Antworten von uns erhalten, und dann entweder, nachdem das Programm richtig geraten hat oder mehr als 100 Fragen gestellt hat (was einen Fehler bedeutet). , wir bringen dem Programm bei, indem wir ihm unsere ausgewählte Zufallszahl offenbaren.
Aus den Daten und dem Diagramm geht hervor, dass das Programm schneller lernt und eine höhere Präzision für Prioritätsfunktionen erreicht, die Optionen mit niedrigerer Entropie stärker bevorzugen. Vielleicht kann eine Funktion mit exponentieller Priorität bessere Ergebnisse liefern. Aber bisher weiß ich nicht, wie ich es ohne Überlauf umsetzen kann. Die Prioritätsfunktion befindet sich derzeit in der Datei ProbQAProbQAPqaCoreCEEvalQsSubtaskConsider.cpp am Ende.
Es gibt derzeit auch einen Fehler in der Schlüsseltheorie, der das Programm hartnäckig macht (ich denke, es kommt dem Begriff „Überanpassung“ des maschinellen Lernens nahe). Nachdem das Programm fälschlicherweise ein Ziel als das wahrscheinlichste ausgewählt hat, beginnt es, solche Fragen zu stellen, die es bei seinem Fehler belassen, anstatt Fragen, die das Programm erkennen lassen würden, dass andere Ziele wahrscheinlicher sind. Obwohl es im Leben passiert, handelt es sich technisch gesehen um einen Fehler im Schlüsselalgorithmus/der Schlüsseltheorie hinter dem Programm.
Im vorherigen Abschnitt habe ich ein Problem beschrieben, bei dem das Programm hartnäckig ist: Nachdem es sich selbst davon überzeugt hatte, dass ein falsches Ziel am wahrscheinlichsten sei, begann das Programm, Fragen zu stellen, die es dazu brachten, bei seinem Fehler zu bleiben, anstatt die Wahrheit zu erfahren. Ich glaube, ich habe dieses Problem gelöst, indem ich die Prioritätsfunktion von rein entropiebasiert auf distanz- und entropiebasiert geändert habe. Anstatt nur die Entropie der Posterior-Wahrscheinlichkeiten zu minimieren, berücksichtigt es nun auch den euklidischen Abstand zwischen Prior- und Posterior-Wahrscheinlichkeitsvektoren. Dadurch konnte das Programm 20-mal schneller lernen. Nach etwa 125.000 gestellten und beantworteten Fragen (für eine Matrix aus 1.000 Fragen mal 5 Antworten mal 1.000 Zielen) wird das geschätzte Ziel nun in fast 100 % der Fälle in den Top 10 aufgeführt. Siehe Genauigkeitsdiagramm.
Nach der oben genannten Erstschulung kommt es bei durchschnittlich 4,3 gestellten (vom Programm) und beantworteten (vom Benutzer) Fragen zu einem positiven Ergebnis. Siehe die Grafik unten.
Das ist also ziemlich konkurrenzfähig mit dem von einem Menschen programmierten binären Suchalgorithmus. Um den Suchbereich von 1000 auf 10 Ziele einzugrenzen, würde ein vom Menschen programmierter binärer Suchalgorithmus durchschnittlich 3,32 Schritte erfordern (es ist der Logarithmus zur Basis 4 von 100, da wir 5 Antwortoptionen haben, von denen eine nur die strikte Gleichheit ist).
Der vom Menschen programmierte binäre Suchalgorithmus toleriert jedoch keine Fehler und bewertet die Ziele nicht nach ihrer Wahrscheinlichkeit, das gewünschte Ziel zu finden. Und natürlich lernt es nicht nebenbei. Während das probabilistische Frage-Antwort-System dies tut.
Darüber hinaus denke ich, dass es bei der Prioritätsfunktion noch Verbesserungspotenzial gibt. Derzeit verwende ich die Polynompriorität: pow(distance, 12) / pow(nExpectedTargets, 6), die empirisch die besten Ergebnisse in meiner begrenzten Anzahl experimentierter Prioritätsfunktionen zeigte. Dennoch denke ich, dass mit der exponentiellen Prioritätsfunktion noch bessere Ergebnisse erzielt werden können. Sehen wir uns nun an, ob es besser ist, jetzt einige Exponentialfunktionen zu entwickeln und auszuprobieren oder mit (weniger aufregenden) technischen Aufgaben wie dem Speichern und Laden der Wissensdatenbank in eine Datei usw. fortzufahren.
Kürzlich wurde die Implementierung des Ladens und Speicherns der Wissensdatenbank abgeschlossen. Training und Vorhersage wurden vor mehr als einem Monat abgeschlossen und anschließend getestet/repariert und optimiert.
Was noch nicht abgeschlossen ist, ist die Größenänderung der KB. Es ist nicht möglich, die Anzahl der Antwortoptionen zu ändern, nachdem eine KB erstellt wurde. Allerdings muss ich die Änderung der Anzahl der Fragen und Ziele noch umsetzen.
Sie können versuchen, die Engine in Ihre Systeme zu integrieren.
Zum Kompilieren benötigen Sie MSVS2017 v15.4.2 oder höher. Eine externe Abhängigkeit ist gtest: https://github.com/google/googletest (nur wenn Sie Tests ausführen möchten oder Kompilierungsfehler in nicht verwandten Projekten zu sehr ablehnen).
Zuvor habe ich die Ergebnisse von Experimenten für die Top-10-Ziele veröffentlicht (wobei ein Ziel als richtig erraten gilt, wenn es unter den 10 wahrscheinlichsten Zielen aufgeführt ist). Hier ist das Ergebnis für eine anspruchsvollere Aufgabe – das Erraten der Ziele unter den Top 1, dh es muss als das wahrscheinlichste Ziel ausgewählt werden. Nach vielen Experimenten und Optimierungen sieht die Lernkurve der Genauigkeit derzeit für das Erlernen des binären Suchalgorithmus wie folgt aus:
Bei einer KB mit einer Größe von 1000 Fragen mal 5 Antwortoptionen mal 1000 Zielen erreicht die Genauigkeit also 100 %, nachdem etwa 4,5 Millionen Fragen beantwortet wurden, und bleibt dann auch bei 100 %.
Ich analysiere Speicherlecks mit Deleaker: https://www.deleaker.com/