สำหรับความร่วมมือ โปรดติดต่อ 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
ในส่วนของ Applied AI Goal ก็คือระบบผู้เชี่ยวชาญ โดยเฉพาะอย่างยิ่ง มันเป็นระบบการตอบคำถามที่น่าจะเป็น: โปรแกรมถาม ผู้ใช้ตอบ เป้าหมายขั้นต่ำของโปรแกรมคือการระบุสิ่งที่ผู้ใช้ต้องการ (เป้าหมาย) แม้ว่าผู้ใช้จะไม่รู้ว่ามีสิ่งนั้น/ผลิตภัณฑ์/บริการอยู่ก็ตาม มันเป็นเพียงแบ็กเอนด์ใน C ++ ขึ้นอยู่กับคนอื่นๆ ที่จะปรับใช้ส่วนหน้าตามความต้องการของพวกเขา แบ็กเอนด์สามารถนำไปใช้กับ http://en.akinator.com/ นี้ หรือสำหรับการขายผลิตภัณฑ์และบริการในร้านอินเทอร์เน็ตบางแห่ง (เป็นแชทบอทที่ช่วยให้ผู้ใช้ระบุสิ่งที่พวกเขาต้องการ แม้ว่าพวกเขาจะไม่สามารถกำหนดได้ คำหลักหรือแม้แต่ความปรารถนาโดยเฉพาะ)
ด้านล่างนี้คือกราฟการเรียนรู้ของโปรแกรมสำหรับเมทริกซ์ขนาด 5 000 000: เป็นคำถาม 1,000 ข้อ คูณ 5 ตัวเลือกคำตอบสำหรับแต่ละคำถาม คูณ 1,000 เป้าหมาย ในการทดลองนี้ เราฝึกโปรแกรมสำหรับการค้นหาแบบไบนารี โดยช่วงของเป้าหมาย Tj คือ 0 ถึง 999 และแต่ละคำถาม Qi คือ "การคาดเดาของคุณเปรียบเทียบกับ Qi ได้อย่างไร" ตัวเลือกคำตอบคือ 0 - "การเดานั้นต่ำกว่า Qi มาก", 1 - "การเดานั้นต่ำกว่า Qi เล็กน้อย", 2 - "การเดานั้นเท่ากับ Qi อย่างแน่นอน", 3 - "การเดานั้นสูงกว่า Qi เล็กน้อย" " และ 4 - "การเดานั้นสูงกว่า Qi มาก"
แกน X มีจำนวนคำถามที่ถามและตอบ (มากถึง 5 ล้าน) แกน Y ประกอบด้วยคำถาม 256 ข้อติดต่อกัน เปอร์เซ็นต์ของครั้งที่โปรแกรมแสดงรายการเป้าหมายที่เดาได้อย่างถูกต้องในเป้าหมายที่เป็นไปได้มากที่สุด 10 อันดับแรก โปรดทราบว่าการทดสอบนั้นใช้ข้อมูลใหม่ๆ เสมอ: ขั้นแรกเราเลือกตัวเลขสุ่ม จากนั้นให้โปรแกรมเดาโดยการถามคำถามและรับคำตอบจากเรา จากนั้นหลังจากที่โปรแกรมเดาถูกหรือถามคำถามมากกว่า 100 ข้อ (หมายถึงความล้มเหลว) เราสอนโปรแกรมโดยเปิดเผยเลขสุ่มที่เราเลือก
จากข้อมูลและแผนภาพ ดูเหมือนว่าโปรแกรมจะเรียนรู้ได้เร็วขึ้นและมีความแม่นยำสูงกว่าสำหรับฟังก์ชันที่มีลำดับความสำคัญซึ่งให้ความสำคัญกับตัวเลือกเอนโทรปีที่ต่ำกว่า ดังนั้นบางทีฟังก์ชันลำดับความสำคัญแบบเอ็กซ์โปเนนเชียลก็สามารถให้ผลลัพธ์ที่เหนือกว่าได้ แต่จนถึงตอนนี้ฉันยังไม่รู้วิธีใช้งานโดยไม่ล้น ฟังก์ชันลำดับความสำคัญอยู่ในไฟล์ ProbQAProbQAPqaCoreCEEvalQsSubtaskConsider.cpp ใกล้ถึงจุดสิ้นสุดของฟังก์ชันในปัจจุบัน
ขณะนี้ยังมีข้อบกพร่องในทฤษฎีหลัก ซึ่งทำให้โปรแกรมดื้อรั้น (ฉันคิดว่ามันใกล้เคียงกับคำว่า "overfitting" ของ Machine Learning) หลังจากที่โปรแกรมเลือกเป้าหมายบางเป้าหมายที่เป็นไปได้มากที่สุดโดยไม่ได้ตั้งใจ โปรแกรมจะเริ่มถามคำถามที่ปล่อยให้โปรแกรมยึดติดกับข้อผิดพลาด แทนที่จะเป็นคำถามที่จะทำให้โปรแกรมเห็นว่าเป้าหมายอื่น ๆ นั้นน่าจะเป็นไปได้มากกว่า แม้ว่าจะเป็นสิ่งที่เกิดขึ้นในชีวิต แต่ในทางเทคนิคแล้ว มันเป็นข้อผิดพลาดในอัลกอริธึม/ทฤษฎีสำคัญที่อยู่เบื้องหลังโปรแกรม
ในส่วนก่อนหน้านี้ ฉันได้อธิบายปัญหาของโปรแกรมที่ดื้อรั้น: หลังจากโน้มน้าวตัวเองราวกับว่ามีเป้าหมายที่ผิดที่เป็นไปได้มากที่สุด โปรแกรมก็เริ่มถามคำถามซึ่งปล่อยให้มันยึดติดกับความผิดพลาด แทนที่จะเรียนรู้ความจริง ฉันคิดว่าฉันได้แก้ไขปัญหานี้แล้วโดยการเปลี่ยนฟังก์ชันลำดับความสำคัญจากอิงตามเอนโทรปีเท่านั้นเป็นตามระยะทาง&เอนโทรปี แทนที่จะแค่ลดเอนโทรปีของความน่าจะเป็นด้านหลังให้เหลือน้อยที่สุด ตอนนี้ยังคำนึงถึงระยะห่างแบบยุคลิดระหว่างเวกเตอร์ความน่าจะเป็นก่อนหน้าและหลังด้วย สิ่งนี้ทำให้โปรแกรมเรียนรู้เร็วขึ้น 20 เท่า ตอนนี้เริ่มแสดงรายการเป้าหมายที่เดาได้ 10 อันดับแรกในกรณีเกือบ 100% หลังจากมีคำถามถามและตอบประมาณ 125,000 ข้อ (สำหรับเมทริกซ์คำถาม 1,000 ข้อคูณคำตอบ 5 ข้อคูณเป้าหมาย 1,000 ข้อ) ดูกราฟความแม่นยำ
หลังจากการฝึกอบรมเบื้องต้นข้างต้น จะได้ผลบวกโดยเฉลี่ยในคำถาม 4.3 ข้อที่ถาม (โดยโปรแกรม) และตอบ (โดยผู้ใช้) ดูกราฟด้านล่าง
นั่นค่อนข้างจะแข่งขันกับอัลกอริธึมการค้นหาแบบไบนารีที่มนุษย์ตั้งโปรแกรมไว้ หากต้องการจำกัดช่วงการค้นหาให้แคบลงจาก 1,000 เป้าหมายให้เหลือ 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 อันดับแรก กล่าวคือ ต้องเลือกเป้าหมายเดียวที่น่าจะเป็นเป้าหมายเดียวมากที่สุด หลังจากการทดลองและปรับแต่งมาหลายครั้ง ปัจจุบันเส้นโค้งการเรียนรู้ความแม่นยำมีลักษณะดังต่อไปนี้สำหรับการเรียนรู้อัลกอริธึมการค้นหาแบบไบนารี:
ดังนั้นสำหรับ KB ขนาด 1,000 คำถาม x 5 ตัวเลือกคำตอบ x 1,000 เป้าหมาย ความแม่นยำจะถึง 100% หลังจากตอบคำถามไปแล้วประมาณ 4.5 ล้านคำถาม จากนั้นจะอยู่ที่ 100% เช่นกัน
ฉันกำลังวิเคราะห์หน่วยความจำรั่วด้วย Deleaker: https://www.deleaker.com/