للتعاون يمكنك الاتصال بـ serge dot rogatch على gmail dot com.
.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
فيما يتعلق بأهداف الذكاء الاصطناعي التطبيقي، فهو نظام خبير. على وجه التحديد، إنه نظام احتمالي للإجابة على الأسئلة: البرنامج يسأل، والمستخدمون يجيبون. الحد الأدنى من هدف البرنامج هو تحديد ما يحتاجه المستخدم (الهدف)، حتى لو لم يكن المستخدم على علم بوجود مثل هذا الشيء/المنتج/الخدمة. إنها مجرد واجهة خلفية في 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 على عدد الأسئلة المطروحة والإجابة عليها (ما يصل إلى 5 ملايين). يحتوي المحور Y على كل 256 اختبارًا متتاليًا على النسبة المئوية للمرات التي أدرج فيها البرنامج الهدف الذي تم تخمينه بشكل صحيح ضمن أفضل 10 أهداف محتملة. لاحظ أن الاختبار يكون دائمًا على بيانات جديدة: نختار أولاً رقمًا عشوائيًا، ثم ندع البرنامج يخمنه عن طريق طرح الأسئلة والحصول على الإجابات منا، ثم إما بعد أن يكون البرنامج قد خمن بشكل صحيح أو طرح أكثر من 100 سؤال (يعني فشل) ، نقوم بتدريس البرنامج، ونكشف عنه الرقم العشوائي الذي اخترناه.
من البيانات والرسم البياني يبدو أن البرنامج يتعلم بشكل أسرع ويصل إلى دقة أعلى للوظائف ذات الأولوية التي تعطي تفضيلاً أكبر للخيارات ذات الإنتروبيا المنخفضة. لذلك ربما يمكن لبعض وظائف الأولوية الأسية أن تعطي نتائج أفضل. لكن حتى الآن لا أعرف كيفية تنفيذه دون تجاوز السعة. وظيفة الأولوية موجودة في الملف ProbQAProbQAPqaCoreCEEvalQsSubtaskConsider.cpp، بالقرب من نهايته حاليًا.
يوجد أيضًا خلل حاليًا في النظرية الأساسية، مما يجعل البرنامج عنيدًا (أعتقد أنه قريب من مصطلح "التجاوز" في التعلم الآلي). بعد أن يختار البرنامج عن طريق الخطأ بعض الأهداف باعتبارها الأكثر احتمالا، فإنه يبدأ في طرح مثل هذه الأسئلة التي تسمح له بالاستمرار في خطأه، بدلا من الأسئلة التي من شأنها أن تجعل البرنامج يرى أن الأهداف الأخرى أكثر احتمالا. على الرغم من أن هذا ما يحدث في الحياة، إلا أنه من الناحية الفنية يعد خطأً في الخوارزمية/النظرية الرئيسية وراء البرنامج.
في القسم السابق، وصفت مشكلة عناد البرنامج: بعد إقناع نفسه بأن هناك هدفًا خاطئًا هو الأكثر احتمالاً، بدأ البرنامج في طرح الأسئلة التي جعلته يتمسك بخطئه، بدلاً من معرفة الحقيقة. أعتقد أنني قد قمت بحل هذه المشكلة عن طريق تغيير وظيفة الأولوية من الاعتماد على الإنتروبيا فقط إلى الاعتماد على المسافة والانتروبيا. بدلاً من مجرد تقليل إنتروبيا الاحتمالات الخلفية، فإنه يأخذ الآن في الاعتبار أيضًا المسافة الإقليدية بين متجهات الاحتمالية السابقة والخلفية. وقد سمح هذا للبرنامج بالتعلم بشكل أسرع 20 مرة. يبدأ الآن في إدراج الأهداف العشرة الأولى في 100% تقريبًا من الحالات بعد حوالي 125000 سؤال تم طرحها والإجابة عليها (لمصفوفة مكونة من 1000 سؤال × 5 إجابات × 1000 هدف). انظر الرسم البياني الدقة.
بعد التدريب الأولي المذكور أعلاه، يصل إلى نتيجة إيجابية في المتوسط في 4.3 سؤال تم طرحها (من قبل البرنامج) والإجابة عليها (من قبل المستخدم). انظر الرسم البياني أدناه.
وهذا يعد منافسًا تمامًا لخوارزمية البحث الثنائية التي يبرمجها الإنسان. لتضييق نطاق البحث من 1000 إلى 10 أهداف، تتطلب خوارزمية البحث الثنائية المبرمجة بواسطة الإنسان 3.32 خطوة في المتوسط (إنها لوغاريتم أساسي 4 لـ 100، لأن لدينا 5 خيارات للإجابة، واحدة منها هي مجرد المساواة الصارمة).
ومع ذلك، فإن خوارزمية البحث الثنائي التي يبرمجها الإنسان لا تتسامح مع الأخطاء ولا تقيم الأهداف حسب احتمالية كونها الهدف المطلوب. وبالطبع لا يتعلم على طول الطريق. بينما يقوم نظام طرح الأسئلة/الإجابة الاحتمالي بذلك.
وعلاوة على ذلك، أعتقد أن هناك مجالاً للتحسين في المهمة ذات الأولوية. أستخدم حاليًا أولوية متعددة الحدود: pow(distance, 12) / pow(nExpectedTargets, 6)، والتي أظهرت تجريبيًا أفضل النتائج في العدد المحدود من الوظائف ذات الأولوية التي جربتها. ما زلت أعتقد أنه يمكن تحقيق نتائج أفضل باستخدام وظيفة الأولوية الأسية. الآن دعونا نرى ما إذا كان من الأفضل ابتكار بعض الوظائف الأسية وتجربتها الآن، أو المضي قدمًا في المهام الهندسية (الأقل إثارة) مثل حفظ وتحميل قاعدة المعرفة من وإلى ملف، وما إلى ذلك.
تم مؤخرًا الانتهاء من تنفيذ تحميل قاعدة المعرفة وحفظها. تم الانتهاء من التدريب والتنبؤ منذ أكثر من شهر، وتم اختبارهما/إصلاحهما وضبطهما بعد ذلك.
ما لم ينته بعد هو تغيير حجم كيلوبايت. لن يكون من الممكن تغيير عدد خيارات الإجابة بعد إنشاء قاعدة المعارف. ومع ذلك، لا يزال يتعين علي تنفيذ تغيير عدد الأسئلة والأهداف.
يمكنك محاولة دمج المحرك في أنظمتك.
للتجميع، تحتاج إلى MSVS2017 v15.4.2 أو أعلى. التبعية الخارجية هي gtest: https://github.com/google/googletest (فقط إذا كنت تريد إجراء الاختبارات أو لا تحب أخطاء الترجمة في المشاريع غير ذات الصلة كثيرًا).
لقد قمت في وقت سابق بنشر نتائج التجارب لأفضل 10 أهداف (حيث يعتبر الهدف قد تم تخمينه بشكل صحيح إذا كان مدرجًا ضمن 10 أهداف محتملة). هذه هي نتيجة المهمة الأكثر تحديًا - تخمين الأهداف من بين أعلى 1، أي يجب تحديدها كهدف واحد أكثر احتمالًا. بعد العديد من التجارب والضبط، يبدو منحنى التعلم للدقة حاليًا كما يلي لتعلم خوارزمية البحث الثنائي:
لذلك بالنسبة لحجم كيلوبايت 1000 سؤال × 5 خيارات إجابة × 1000 هدف، تصل الدقة إلى 100% بعد الإجابة عن حوالي 4.5 مليون سؤال، ثم تظل عند 100% أيضًا.
أقوم بتحليل تسرب الذاكرة باستخدام Deleaker: https://www.deleaker.com/