Pour coopérer, vous pouvez contacter serge dot rogatch à gmail dot com.
.NET : https://github.com/srogatch/ProbQA/tree/master/ProbQA/ProbQANetCore
Python : https://github.com/srogatch/ProbQA/tree/master/Interop/Python/ProbQAInterop
Vous pouvez également consulter les exemples d'utilisation de Python dans le code source du site : https://github.com/srogatch/probqa-web
Une application du système de questions probabilistes est désormais disponible sous forme de site Web (code source : https://github.com/srogatch/probqa-web ) : http://probqa.com/ ou http://best-games .info , un moteur de recommandation interactif de jeux. Ici, les utilisateurs peuvent trouver le prochain jeu auquel jouer sans connaître son nom ou ses mots-clés. Les utilisateurs n'ont qu'à répondre aux questions et le programme répertorie les principales recommandations pour chaque utilisateur. Le moteur qui alimente le site Web est censé fonctionner de la même manière qu'un jeu populaire, Akinator, dans lequel l'utilisateur pense à un personnage et le programme pose des questions pour deviner le personnage secret de l'utilisateur.
Dans ProbQA, il n'y a pas de secret : l'utilisateur ne sait tout simplement pas exactement ce qu'il veut. Le programme pose donc des questions pour proposer quelque chose qui convienne à l'utilisateur.
Après avoir essayé le moteur de recommandation interactif, vous pouvez répondre à une enquête https://www.surveymonkey.com/r/SMJ2ZRZ
En termes d'objectifs d'IA appliquée, il s'agit d'un système expert. Plus précisément, il s'agit d'un système de questions-réponses probabiliste : le programme demande, les utilisateurs répondent. L'objectif minimal du programme est d'identifier ce dont l'utilisateur a besoin (une cible), même si l'utilisateur n'est pas conscient de l'existence d'une telle chose/produit/service. C'est juste un backend en C++. C'est aux autres d'implémenter des front-ends adaptés à leurs besoins. Le backend peut être appliqué à quelque chose comme ceci http://en.akinator.com/ , ou pour vendre des produits et services dans certaines boutiques Internet (en tant que chatbot aidant les utilisateurs à déterminer ce dont ils ont besoin, même s'ils ne peuvent pas formuler les mots-clés ou encore leurs envies spécifiquement).
Vous trouverez ci-dessous les courbes d'apprentissage du programme pour une taille de matrice de 5 000 000 : c'est 1 000 questions multipliées par 5 options de réponse pour chaque question, multipliées par 1 000 cibles. Dans cette expérience, nous entraînons le programme à la recherche binaire : la plage de cibles Tj est de 0 à 999, et chaque question Qi est "Comment votre estimation se compare-t-elle à Qi ?". Les options de réponse sont 0 - "La supposition est bien inférieure à Qi", 1 - "La supposition est un peu inférieure à Qi", 2 - "La supposition est exactement égale à Qi", 3 - "La supposition est un peu supérieure à Qi". " et 4 - "La supposition est bien supérieure au Qi".
L'axe X contient le nombre de questions posées et répondues (jusqu'à 5 millions). L'axe Y contient pour chaque 256 quiz consécutifs le pourcentage de fois où le programme a correctement répertorié la cible devinée parmi les 10 cibles les plus probables. Notez que les tests portent toujours sur des données nouvelles : nous choisissons d'abord un nombre aléatoire, puis laissons le programme le deviner en posant des questions et en obtenant des réponses de notre part, puis soit après que le programme ait deviné correctement ou ait posé plus de 100 questions (ce qui signifie un échec). , nous enseignons le programme, lui révélant notre nombre aléatoire sélectionné.
D'après les données et le diagramme, il semble que le programme apprend plus rapidement et atteint une plus grande précision pour les fonctions prioritaires qui donnent davantage de préférence aux options à faible entropie. Alors peut-être qu’une fonction de priorité exponentielle peut donner des résultats supérieurs. Mais pour l’instant je ne sais pas comment l’implémenter sans débordement. La fonction prioritaire se trouve actuellement dans le fichier ProbQAProbQAPqaCoreCEEvalQsSubtaskConsider.cpp , vers la fin.
Il y a aussi actuellement une faille dans la théorie des clés, qui rend le programme têtu (je pense que c'est proche du terme "surajustement" du Machine Learning). Après que le programme a sélectionné par erreur une cible comme étant la plus probable, il commence à poser des questions qui lui permettent de s'en tenir à son erreur, plutôt que des questions qui permettraient au programme de voir que d'autres cibles sont plus probables. Bien que ce soit ce qui arrive dans la vie, techniquement, il s’agit d’une erreur dans l’algorithme/théorie clé derrière le programme.
Dans la section précédente, j'ai décrit un problème d'entêtement du programme : après s'être convaincu que si une mauvaise cible était la plus probable, le programme commençait à poser des questions qui lui permettaient de s'en tenir à son erreur, plutôt que d'apprendre la vérité. Je pense avoir résolu ce problème en changeant la fonction de priorité de basée uniquement sur l'entropie à basée sur la distance et l'entropie. Plutôt que de simplement minimiser l’entropie des probabilités a posteriori, il prend désormais également en compte la distance euclidienne entre les vecteurs de probabilité a priori et a posteriori. Cela a permis au programme d'apprendre 20 fois plus rapidement. Il commence désormais à lister dans le top 10 la cible estimée dans presque 100 % des cas après environ 125 000 questions posées et répondues (pour une matrice de 1 000 questions multipliées par 5 réponses multipliées par 1 000 cibles). Voir le graphique de précision.
Après la formation initiale mentionnée ci-dessus, on obtient un résultat positif en moyenne dans 4,3 questions posées (par le programme) et répondues (par l'utilisateur). Voir le graphique ci-dessous.
C’est donc assez compétitif avec l’algorithme de recherche binaire programmé par un humain. Pour réduire la plage de recherche de 1 000 à 10 cibles, un algorithme de recherche binaire programmé par l'homme nécessiterait 3,32 étapes en moyenne (il s'agit d'un logarithme en base 4 de 100, car nous avons 5 options de réponse, dont l'une est simplement l'égalité stricte).
Cependant, l'algorithme de recherche binaire programmé par l'homme ne tolère pas les erreurs et n'évalue pas les cibles en fonction de leur probabilité d'être celle souhaitée. Et bien sûr, on n’apprend pas en cours de route. Alors que le système probabiliste de questions/réponses fait cela.
Par ailleurs, je pense qu'il y a des marges d'amélioration dans la fonction prioritaire. Actuellement, j'utilise la priorité polynomiale : pow(distance, 12) / pow(nExpectedTargets, 6), qui a montré empiriquement les meilleurs résultats dans mon nombre limité de fonctions prioritaires expérimentées. Je pense néanmoins que des résultats encore meilleurs peuvent être produits avec une fonction de priorité exponentielle. Voyons maintenant s'il est préférable de concevoir et d'essayer des fonctions exponentielles maintenant, ou de procéder à des tâches d'ingénierie (moins excitantes) comme sauvegarder et charger la base de connaissances vers et depuis un fichier, etc.
Récemment, la mise en œuvre du chargement et de la sauvegarde de la base de connaissances a été terminée. La formation et les prédictions ont été terminées il y a plus d'un mois et ont ensuite été testées/corrigées et ajustées.
Ce qui n'est pas encore terminé, c'est le redimensionnement de la Ko. Il ne sera pas possible de modifier le nombre d'options de réponse après la création d'une base de connaissances. Cependant, je dois encore mettre en œuvre la modification du nombre de questions et d'objectifs.
Vous pouvez essayer d'intégrer le moteur dans vos systèmes.
Pour compiler, vous avez besoin de MSVS2017 v15.4.2 ou supérieur. Une dépendance externe est gtest : https://github.com/google/googletest (uniquement si vous souhaitez exécuter des tests ou si vous n'aimez pas trop les erreurs de compilation dans des projets non liés).
Plus tôt, j'ai publié les résultats d'expériences sur les 10 principales cibles (où une cible est considérée comme ayant été devinée correctement si elle figure parmi les 10 cibles les plus probables). Voici le résultat d'une tâche plus difficile : deviner les cibles parmi les premières, c'est-à-dire qu'elles doivent être sélectionnées comme la cible la plus probable. Après de nombreuses expériences et réglages, la courbe d'apprentissage de la précision ressemble actuellement à ce qui suit pour l'apprentissage de l'algorithme de recherche binaire :
Ainsi, pour un Ko d'une taille de 1 000 questions avec 5 options de réponse pour 1 000 cibles, la précision atteint 100 % après environ 4,5 millions de questions répondues, puis reste également à 100 %.
J'analyse les fuites de mémoire avec Deleaker : https://www.deleaker.com/