Untuk kerjasamanya anda dapat menghubungi Serge dot rogatch di gmail dot com.
.NET: https://github.com/srogatch/ProbQA/tree/master/ProbQA/ProbQANetCore
Python: https://github.com/srogatch/ProbQA/tree/master/Interop/Python/ProbQAInterop
Anda juga dapat melihat contoh penggunaan dari Python di kode sumber situs web: https://github.com/srogatch/probqa-web
Penerapan sistem tanya jawab probabilistik kini tersedia di situs web (kode sumber: https://github.com/srogatch/probqa-web ): http://probqa.com/ atau http://best-games .info , mesin rekomendasi interaktif untuk game. Di sini pengguna dapat menemukan game berikutnya untuk dimainkan tanpa mengetahui nama atau kata kuncinya. Pengguna hanya perlu menjawab pertanyaan, dan program ini mencantumkan rekomendasi teratas untuk setiap pengguna. Mesin yang menggerakkan situs web ini seharusnya bekerja serupa dengan permainan populer Akinator, di mana pengguna memikirkan sebuah karakter, dan program mengajukan pertanyaan untuk menebak karakter rahasia pengguna.
Di ProbQA tidak ada rahasia: pengguna tidak tahu persis apa yang dia inginkan. Jadi program mengajukan pertanyaan untuk menghasilkan sesuatu yang cocok bagi pengguna.
Setelah mencoba mesin rekomendasi interaktif, Anda dapat mengikuti survei https://www.surveymonkey.com/r/SMJ2ZRZ
Dalam hal tujuan AI Terapan, ini adalah sistem pakar. Secara khusus, ini adalah sistem penjawab pertanyaan probabilistik: program bertanya, pengguna menjawab. Tujuan minimal dari program ini adalah untuk mengidentifikasi apa yang dibutuhkan pengguna (target), meskipun pengguna tidak mengetahui keberadaan benda/produk/jasa tersebut. Ini hanyalah backend di C++. Terserah pihak lain untuk menerapkan front-end untuk kebutuhan mereka. Backend dapat diterapkan pada sesuatu seperti ini http://en.akinator.com/ , atau untuk menjual produk & layanan di beberapa toko internet (sebagai chat-bot yang membantu pengguna menentukan apa yang mereka butuhkan, meskipun mereka tidak dapat merumuskannya kata kunci atau bahkan keinginan mereka secara spesifik).
Di bawah ini adalah kurva pembelajaran program untuk ukuran matriks 5 000 000: 1000 pertanyaan dikalikan 5 pilihan jawaban untuk setiap pertanyaan, dikalikan 1000 target. Dalam percobaan ini kami melatih program untuk pencarian biner: rentang target Tj adalah 0 hingga 999, dan setiap pertanyaan Qi adalah "Bagaimana tebakan Anda dibandingkan dengan Qi?". Pilihan jawabannya adalah 0 - "Tebakannya jauh lebih rendah dari Qi", 1 - "Tebakannya sedikit lebih rendah dari Qi", 2 - "Tebakannya persis sama dengan Qi", 3 - "Tebakannya sedikit lebih tinggi dari Qi " dan 4 - "Tebakannya jauh lebih tinggi dari Qi".
Sumbu X berisi jumlah pertanyaan yang diajukan & dijawab (hingga 5 juta). Sumbu Y berisi untuk setiap 256 kuis berturut-turut persentase berapa kali program mencantumkan target yang ditebak dengan benar di antara 10 target yang paling mungkin. Perhatikan bahwa pengujian selalu pada data baru: pertama-tama kita memilih nomor acak, kemudian membiarkan program menebaknya dengan mengajukan pertanyaan dan mendapatkan jawaban dari kami, kemudian setelah program menebak dengan benar atau mengajukan lebih dari 100 pertanyaan (artinya gagal) , kami mengajarkan program tersebut, mengungkapkannya nomor acak yang kami pilih.
Dari data & diagram nampaknya program belajar lebih cepat dan mencapai presisi lebih tinggi untuk fungsi prioritas yang memberikan preferensi lebih pada opsi entropi rendah. Jadi mungkin beberapa fungsi prioritas eksponensial dapat memberikan hasil yang lebih baik. Namun sejauh ini saya belum tahu bagaimana cara mengimplementasikannya tanpa overflow. Fungsi prioritas ada dalam file ProbQAProbQAPqaCoreCEEvalQsSubtaskConsider.cpp , di dekat bagian akhir saat ini .
Ada juga kelemahan saat ini dalam teori kunci, yang membuat program menjadi keras kepala (menurut saya ini mendekati istilah "overfitting" dalam Machine Learning). Setelah program salah dalam memilih beberapa target sebagai target yang paling mungkin, program akan mulai menanyakan pertanyaan-pertanyaan yang membuat program tetap pada kesalahannya, dibandingkan pertanyaan yang membuat program melihat bahwa target lain lebih mungkin terjadi. Meskipun hal ini terjadi dalam kehidupan, secara teknis hal tersebut merupakan kesalahan dalam algoritma/teori kunci di balik program.
Pada bagian sebelumnya saya menjelaskan masalah dari program yang keras kepala: setelah meyakinkan dirinya sendiri seolah-olah kemungkinan besar ada yang salah sasaran, program tersebut mulai mengajukan pertanyaan-pertanyaan yang membiarkannya tetap pada kesalahannya, daripada mengetahui kebenarannya. Saya rasa saya telah memecahkan masalah ini dengan mengubah fungsi prioritas dari berbasis entropi saja menjadi berbasis jarak & entropi. Daripada hanya meminimalkan entropi probabilitas posterior, kini juga memperhitungkan jarak Euclidean antara vektor probabilitas sebelumnya dan posterior. Hal ini memungkinkan program untuk belajar 20 kali lebih cepat. Sekarang ia mulai mendaftar di 10 teratas target tebakan di hampir 100% kasus setelah sekitar 125.000 pertanyaan diajukan & dijawab (untuk matriks 1000 pertanyaan dikalikan 5 jawaban dikalikan 1000 target). Lihat grafik Akurasi.
Setelah pelatihan awal di atas, rata-rata mencapai hasil positif dalam 4,3 pertanyaan yang diajukan (oleh program) dan dijawab (oleh pengguna). Lihat grafik di bawah ini.
Sehingga cukup bersaing dengan algoritma pencarian biner yang diprogram oleh manusia. Untuk mempersempit rentang pencarian dari 1000 menjadi 10 target, algoritma pencarian biner yang diprogram oleh manusia memerlukan rata-rata 3,32 langkah (logaritma basis 4 dari 100, karena kita memiliki 5 opsi jawaban, yang salah satunya hanyalah persamaan ketat).
Namun, algoritma pencarian biner yang diprogram oleh manusia tidak menoleransi kesalahan dan tidak menilai target berdasarkan kemungkinannya menjadi target yang diinginkan. Dan tentu saja hal itu tidak dipelajari sepanjang perjalanan. Sementara sistem tanya jawab probabilistik melakukan hal ini.
Selain itu, menurut saya masih ada ruang untuk perbaikan pada fungsi prioritas. Saat ini saya menggunakan prioritas polinomial: pow(distance, 12) / pow(nExpectedTargets, 6), yang secara empiris menunjukkan hasil terbaik dalam jumlah terbatas fungsi prioritas yang saya uji. Namun menurut saya, hasil yang lebih baik dapat dihasilkan dengan fungsi prioritas eksponensial. Sekarang mari kita lihat apakah lebih baik merancang dan mencoba beberapa fungsi eksponensial sekarang, atau melanjutkan dengan tugas teknik (yang kurang menarik) seperti menyimpan & memuat basis pengetahuan ke & dari file, dll.
Baru-baru ini penerapan pemuatan dan penyimpanan basis pengetahuan telah selesai. Pelatihan dan prediksi telah selesai lebih dari sebulan yang lalu, dan diuji/diperbaiki dan disetel setelah itu.
Yang belum selesai adalah resize KBnya. Jumlah pilihan jawaban tidak dapat diubah setelah KB dibuat. Namun, saya tetap akan menerapkan perubahan jumlah soal dan target.
Anda dapat mencoba mengintegrasikan mesin ke dalam sistem Anda.
Untuk mengkompilasi Anda memerlukan MSVS2017 v15.4.2 atau lebih tinggi. Ketergantungan eksternal adalah gtest: https://github.com/google/googletest (hanya jika Anda ingin menjalankan tes atau terlalu tidak menyukai kesalahan kompilasi dalam proyek yang tidak terkait).
Sebelumnya saya mempublikasikan hasil percobaan untuk 10 target teratas (di mana suatu target dianggap telah dapat ditebak dengan benar jika termasuk di antara 10 target yang paling mungkin). Inilah hasil untuk tugas yang lebih menantang - menebak target di antara 1 teratas, yaitu target tersebut harus dipilih sebagai satu-satunya target yang paling mungkin. Setelah banyak percobaan dan penyetelan, saat ini kurva pembelajaran akurasi terlihat seperti berikut untuk mempelajari algoritma pencarian biner:
Jadi untuk KB ukuran 1000 soal dengan 5 pilihan jawaban dengan 1000 target, keakuratannya mencapai 100% setelah sekitar 4,5 juta soal terjawab, dan kemudian tetap di 100% juga.
Saya menganalisis kebocoran memori dengan Deleaker: https://www.deleaker.com/