協力が必要な場合は、gmail dot com の serge dot rogatch までご連絡ください。
.NET: https://github.com/srogatch/ProbQA/tree/master/ProbQA/ProbQANetCore
Python: https://github.com/srogatch/ProbQA/tree/master/Interop/Python/ProbQAInterop
Web サイトのソース コードで Python の使用例を確認することもできます: https://github.com/srogatch/probqa-web
確率的質問システムのアプリケーションが Web サイト (ソース コード: https://github.com/srogatch/probqa-web ) として利用できるようになりました: http://probqa.com/ または http://best-games .info 、ゲーム用のインタラクティブな推奨エンジン。ここでは、ユーザーは名前やキーワードを知らなくても、次にプレイするゲームを見つけることができます。ユーザーは質問に答えるだけでよく、プログラムは各ユーザーに対する最優先の推奨事項をリストします。このウェブサイトを動かしているエンジンは、ユーザーがキャラクターを思い浮かべると、プログラムが質問をしてユーザーの秘密のキャラクターを推測するという、人気ゲームの Akinator と同様に動作することになっています。
ProbQA には秘密はありません。ユーザーは自分が何を望んでいるのか正確にわかっていないだけです。したがって、プログラムはユーザーに適したものを見つけるために質問をします。
インタラクティブなレコメンデーション エンジンを試した後、アンケート https://www.surveymonkey.com/r/SMJ2ZRZ に参加できます。
応用 AI の目標に関して言えば、これはエキスパート システムです。具体的には、これは確率論的な質問応答システムです。プログラムが質問し、ユーザーが答えます。プログラムの最低限の目標は、たとえユーザーがそのようなもの/製品/サービスの存在に気づいていなくても、ユーザーが必要とするもの (ターゲット) を特定することです。これは単なる C++ のバックエンドです。ニーズに合わせてフロントエンドを実装するかどうかは他の人次第です。バックエンドは http://en.akinator.com/ のようなものに適用したり、一部のインターネット ショップで製品やサービスを販売したりするために適用できます (ユーザーが必要なものを明確にできなくても、チャットボットとして支援します)キーワードや具体的な希望など)。
以下は、マトリックス サイズ 5 000 000 のプログラムの学習曲線です。これは、1000 の質問×各質問の 5 つの回答オプション×1000 のターゲットです。この実験では、プログラムを二分探索用にトレーニングします。ターゲットの範囲 Tj は 0 ~ 999 で、各質問 Qi は「あなたの推測は Qi と比べてどうですか?」です。答えの選択肢は、0 - 「推測は Qi よりもかなり低いです」、1 - 「推測は Qi より少し低いです」、2 - 「推測は Qi とまったく同じです」、3 - 「推測は Qi より少し高いです」です。 」と4 - 「推測はQiよりもはるかに高いです」。
X 軸には、質問と回答の数が含まれます (最大 500 万件)。 Y 軸には、連続した 256 個のクイズごとに、プログラムが最も可能性の高いターゲットの上位 10 個のうち、推測されたターゲットを正しくリストした回数の割合が含まれます。テストは常に新しいデータに対して行われることに注意してください。最初に乱数を選択し、次に質問して答えを得ることでプログラムにそれを推測させます。次に、プログラムが正しく推測するか、100 を超える質問をした後 (失敗を意味します) 、プログラムに教えて、選択した乱数を明らかにします。
データと図から、プログラムはより高速に学習し、低エントロピーのオプションをより優先する優先関数の精度が高くなるように見えます。したがって、おそらく、指数関数的な優先関数によって優れた結果が得られる可能性があります。しかし、今のところ、オーバーフローせずにそれを実装する方法はわかりません。優先関数はファイル ProbQAProbQAPqaCoreCEEvalQsSubtaskConsider.cpp にあり、現在はその終わり近くにあります。
現在、キー理論にも欠陥があり、それがプログラムを頑固なものにしています (機械学習の用語の「過剰適合」に近いと思います)。プログラムが誤ってあるターゲットを最も可能性の高いものとして選択した後、他のターゲットの可能性がより高いとプログラムに認識させる質問ではなく、その間違いを固執させるような質問をし始めます。それは人生で起こることですが、技術的には、プログラムの背後にある主要なアルゴリズム/理論のエラーです。
前のセクションで、プログラムが頑固であるという問題について説明しました。プログラムは、あたかも間違ったターゲットが最も可能性が高いかのように自分自身を納得させた後、真実を学ぶのではなく、その間違いを固執させる質問をし始めていました。優先順位関数をエントロピーのみベースから距離とエントロピーベースに変更することで、この問題を解決できたと思います。事後確率のエントロピーを最小限に抑えるだけでなく、事前確率ベクトルと事後確率ベクトルの間のユークリッド距離も考慮されるようになりました。これにより、プログラムの学習速度が 20 倍速くなりました。約 125,000 件の質問と回答を経た後、ほぼ 100% のケースで、推測されたターゲットがトップ 10 にリストされるようになりました (質問 1000 × 回答 5 × ターゲット 1000 のマトリックスの場合)。精度グラフを参照してください。
上記の初期トレーニングの後、(プログラムによって) 質問され、(ユーザーによって) 回答された 4.3 の質問において、平均して肯定的な結果に達しました。以下のグラフを参照してください。
したがって、これは人間がプログラムした二分探索アルゴリズムと非常に競争力があります。検索範囲を 1000 から 10 のターゲットに絞り込むには、人間がプログラムしたバイナリ検索アルゴリズムでは平均 3.32 ステップが必要になります (これは、100 の底 4 の対数です。5 つの回答オプションがあり、そのうちの 1 つは完全に等価です)。
ただし、人間がプログラムした二分探索アルゴリズムは間違いを許容せず、目的のターゲットである確率によってターゲットを評価しません。そしてもちろん、途中で学習することはありません。一方、確率的質問/応答システムはこれを行います。
また、優先機能については改善の余地があると思います。現在、私は多項式の優先度 pow( distance, 12) / pow(nExpectedTargets, 6) を使用しています。これは、実験した限られた数の優先度関数の中で最良の結果を経験的に示しました。それでも、指数優先関数を使用すると、さらに良い結果が得られると思います。ここで、いくつかの指数関数を考案して試したほうがよいのか、それともナレッジ ベースをファイルに保存したり、ファイルからロードしたりするなどの (あまり面白くない) エンジニアリング タスクを続行したほうがよいのかを見てみましょう。
最近、ナレッジ ベースのロードと保存の実装が完了しました。トレーニングと予測は 1 か月以上前に完了し、その後テスト/修正と調整が行われました。
まだ完了していないのは、KB のサイズ変更です。 KB の作成後に回答の選択肢の数を変更することはできません。ただし、出題数や目標の変更などは今後の課題です。
エンジンをシステムに統合してみることができます。
コンパイルするには、MSVS2017 v15.4.2 以降が必要です。外部依存関係は gtest: https://github.com/google/googletest (テストを実行したい場合、または無関係なプロジェクトでのコンパイル エラーをあまり嫌う場合のみ) です。
以前に、上位 10 のターゲットに関する実験の結果を公開しました (ターゲットが最も可能性の高い 10 のターゲットにリストされている場合、そのターゲットは正しく推測されたと見なされます)。これは、上位 1 つのターゲットの中からターゲットを推測するという、より困難なタスクの結果です。つまり、最も可能性の高い単一のターゲットとして選択する必要があります。多くの実験と調整を経て、現在、二分探索アルゴリズムの学習における精度の学習曲線は次のようになります。
したがって、KB サイズが 1000 の質問、5 つの回答オプション、1000 のターゲットの場合、約 450 万の質問が回答された後に精度は 100% に達し、その後も 100% のままになります。
Deleaker を使用してメモリ リークを分析しています: https://www.deleaker.com/