협력을 원하시면 gmail dot com으로 serge dot rogatch에게 연락하실 수 있습니다.
.NET: https://github.com/srogatch/ProbQA/tree/master/ProbQA/ProbQANetCore
파이썬: 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 설문조사에 참여하실 수 있습니다.
응용 AI 목표 측면에서는 전문가 시스템이다. 특히 이는 확률론적 질문 답변 시스템입니다. 프로그램이 질문하고 사용자가 답변합니다. 프로그램의 최소한의 목표는 사용자가 그러한 것/제품/서비스의 존재를 인식하지 못하더라도 사용자에게 필요한 것(타겟)을 식별하는 것입니다. C++의 백엔드일 뿐입니다. 필요에 따라 프런트 엔드를 구현하는 것은 다른 사람들의 몫입니다. 백엔드는 http://en.akinator.com/ 과 같은 곳에 적용하거나 일부 인터넷 상점에서 제품 및 서비스를 판매하기 위해 적용할 수 있습니다(사용자가 공식화할 수 없더라도 필요한 것을 결정하도록 돕는 채팅 봇). 키워드 또는 심지어 그들의 욕구까지 구체적으로).
다음은 매트릭스 크기 5 000 000에 대한 프로그램의 학습 곡선입니다. 1000개의 질문 x 각 질문에 대한 5개의 답변 옵션 x 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개의 질문 x 5개의 답변 x 1000개의 목표 매트릭스의 경우). 정확도 그래프를 참조하세요.
위에서 언급한 초기 훈련 후, 질문(프로그램)과 답변(사용자)에서 평균 4.3개의 질문에서 긍정적인 결과를 얻었습니다. 아래 그래프를 참조하세요.
따라서 이는 인간이 프로그래밍한 이진 검색 알고리즘과 상당히 경쟁적입니다. 검색 범위를 1000개에서 10개 대상으로 좁히려면 인간이 프로그래밍한 이진 검색 알고리즘에 평균 3.32단계가 필요합니다(기본 4 로그는 100입니다. 왜냐하면 5개의 답변 옵션이 있고 그 중 하나는 엄밀한 동일이기 때문입니다).
그러나 인간이 프로그래밍한 이진 검색 알고리즘은 실수를 용납하지 않으며 원하는 대상이 될 확률을 기준으로 대상을 평가하지 않습니다. 물론 그 과정에서 배우지는 않습니다. 확률론적 질문/답변 시스템이 이를 수행합니다.
게다가 우선순위 기능에도 개선의 여지가 좀 있다고 생각합니다. 현재 나는 다항식 우선순위를 사용합니다: pow(distance, 12) / pow(nExpectedTargets, 6). 이것은 경험적으로 실험된 제한된 수의 우선순위 함수에서 최상의 결과를 보여주었습니다. 그래도 지수 우선순위 함수를 사용하면 훨씬 더 좋은 결과를 얻을 수 있다고 생각합니다. 이제 몇 가지 지수 함수를 고안하고 시도하는 것이 더 나은지, 아니면 지식 기반을 파일에 저장하고 로드하는 것과 같은 (덜 흥미로운) 엔지니어링 작업을 진행하는 것이 더 나은지 살펴보겠습니다.
최근 지식베이스 로딩 및 저장 구현이 완료되었습니다. 훈련과 예측은 한 달 이상 전에 완료되었으며 그 후 테스트/수정 및 조정이 이루어졌습니다.
아직 완료되지 않은 작업은 KB 크기를 조정하는 것입니다. 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/