如需合作,您可以聯絡 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
您也可以在網站原始碼中查看Python的使用範例:https://github.com/srogatch/probqa-web
機率提問系統的應用程式現已作為網站提供(原始碼:https://github.com/srogatch/probqa-web):http://probqa.com/ 或 http://best-games .info ,遊戲的互動式推薦引擎。在這裡,用戶可以找到下一個要玩的遊戲,而無需知道其名稱或關鍵字。用戶只需回答問題,程式就會為每個用戶列出最熱門的推薦。為該網站提供支援的引擎的工作原理應該類似於流行的遊戲 Akinator,用戶想到一個角色,程式會提出問題來猜測用戶的秘密角色。
在 ProbQA 中沒有秘密:使用者根本不知道他/她到底想要什麼。因此,程式會提出問題,以提出適合使用者的內容。
嘗試互動式推薦引擎後,您可以參加調查 https://www.surveymonkey.com/r/SMJ2ZRZ
就應用人工智慧目標而言,它是一個專家系統。具體來說,它是一個機率問答系統:程式提問,使用者回答。該程式的最低目標是識別用戶需要什麼(目標),即使用戶不知道這樣的東西/產品/服務的存在。它只是 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-“猜測比齊高得多」。
X 軸包含提出和回答的問題數量(最多 500 萬個)。 Y 軸包含連續 256 次測驗中程式正確列出前 10 個最可能目標中猜測目標的次數百分比。請注意,測試總是基於新穎的數據:我們首先選擇一個隨機數,然後讓程式透過提出問題並從我們那裡得到答案來猜測它,然後在程式猜測正確或詢問超過100 個問題之後(意味著失敗) ,我們教授該程序,向其顯示我們選擇的隨機數。
從數據和圖表來看,程式似乎學習得更快,優先函數的精確度更高,這些函數更傾向於低熵選項。因此,也許某些指數優先權函數可以給出更好的結果。但到目前為止我不知道如何實現它而不溢出。優先權函數位於檔案 ProbQAProbQAPqaCoreCEEvalQsSubtaskConsider.cpp 中,目前接近結尾。
目前關鍵理論還存在一個缺陷,這使得該程式變得頑固(我認為它接近機器學習的「過度擬合」術語)。在程式錯誤地選擇某個目標作為最有可能的目標後,它開始提出這樣的問題,讓它堅持自己的錯誤,而不是讓程式看到其他目標更有可能的問題。雖然這是生活中發生的事情,但從技術上講,這是程式背後的關鍵演算法/理論的錯誤。
在上一節中,我描述了程序頑固的一個問題:在說服自己好像某個錯誤的目標最有可能出現之後,程序開始提出問題,讓它堅持自己的錯誤,而不是了解真相。我想我已經通過將優先級函數從僅基於熵更改為基於距離和熵來解決了這個問題。現在它不只是最小化後驗機率的熵,還考慮先驗機率向量和後驗機率向量之間的歐幾里德距離。這使得程式的學習速度提高了 20 倍。現在,在詢問和回答了大約125,000 個問題(對於1000 個問題乘以5 個答案乘以1000 個目標的矩陣)後,它開始在幾乎100% 的情況下將猜測的目標列在前10 名中。請參閱準確度圖。
經過上述初步訓練後,(程序)提出並(使用者)回答的問題平均達到 4.3 個正面結果。參見下圖。
因此,這與人類編寫的二分搜尋演算法相當有競爭力。為了將搜尋範圍從1000 個目標縮小到10 個目標,人工編程的二分搜尋演算法平均需要3.32 步(它是以100 為底的4 對數,因為我們有5 個答案選項,其中一個只是嚴格相等) 。
然而,人工編程的二分搜尋演算法不能容忍錯誤,也不能根據目標成為所需目標的機率來對目標進行評級。當然,它不會一路學習。而機率問答系統就是這樣做的。
而且,我認為優先級功能還有一些改進的空間。目前我使用多項式優先權:pow(distance, 12) / pow(nExpectedTargets, 6),它根據經驗顯示了在我試驗的有限數量的優先權函數中的最佳結果。儘管如此,我仍然認為使用指數優先級函數可以產生更好的結果。現在讓我們看看現在是否最好設計並嘗試一些指數函數,或者繼續執行(不那麼令人興奮的)工程任務,例如將知識庫保存到文件或從文件加載知識庫等。
最近完成了知識庫的載入和保存的實作。訓練和預測在一個多月前完成,之後進行了測試/修復和調整。
尚未完成的是調整 KB 的大小。建立知識庫後,將無法變更答案選項的數量。不過,我還是要實施題目數和目標的改變。
您可以嘗試將引擎整合到您的系統中。
要編譯,您需要 MSVS2017 v15.4.2 或更高版本。外部依賴項是 gtest:https://github.com/google/googletest (只有當您想要執行測試或太不喜歡不相關專案中的編譯錯誤時)。
早些時候,我發布了前 10 個目標的實驗結果(如果某個目標列在 10 個最可能的目標中,則認為該目標被正確猜測)。這是更具挑戰性的任務的結果 - 猜測前 1 個目標,即必須將其選為單一最可能的目標。經過多次實驗與調優,目前學習二分查找演算法的準確率學習曲線如下:
因此,對於 1000 個問題、5 個答案選項、1000 個目標的 KB 大小,在回答大約 450 萬個問題後,準確率達到 100%,然後也保持在 100%。
我正在使用 Deleaker 分析記憶體洩漏:https://www.deleaker.com/