Para cooperar, puede comunicarse con serge dot rogatch en gmail dot com.
.NET: https://github.com/srogatch/ProbQA/tree/master/ProbQA/ProbQANetCore
Python: https://github.com/srogatch/ProbQA/tree/master/Interop/Python/ProbQAInterop
También puedes ver los ejemplos de uso de Python en el código fuente del sitio web: https://github.com/srogatch/probqa-web
Una aplicación del sistema probabilístico de preguntas ya está disponible como sitio web (código fuente: https://github.com/srogatch/probqa-web): http://probqa.com/ o http://best-games .info, un motor de recomendación interactivo para juegos. Aquí los usuarios pueden encontrar el próximo juego para jugar sin saber su nombre o palabras clave. Los usuarios sólo necesitan responder preguntas y el programa enumera las principales recomendaciones para cada usuario. Se supone que el motor que impulsa el sitio web funciona de manera similar al popular juego Akinator, donde el usuario piensa en un personaje y el programa hace preguntas para adivinar sobre el personaje secreto del usuario.
En ProbQA no hay ningún secreto: el usuario simplemente no sabe exactamente lo que quiere. Entonces el programa hace preguntas para encontrar algo adecuado para el usuario.
Después de probar el motor de recomendaciones interactivo, puede realizar una encuesta https://www.surveymonkey.com/r/SMJ2ZRZ
En términos de objetivos de IA aplicada, es un sistema experto. En concreto, se trata de un sistema probabilístico de respuesta a preguntas: el programa pregunta, los usuarios responden. El objetivo mínimo del programa es identificar lo que el usuario necesita (un objetivo), incluso si el usuario no es consciente de la existencia de tal cosa/producto/servicio. Es sólo un backend en C++. Depende de los demás implementar interfaces para sus necesidades. El backend se puede aplicar a algo como este http://en.akinator.com/, o para vender productos y servicios en algunas tiendas de Internet (como un chatbot que ayuda a los usuarios a determinar lo que necesitan, incluso si no pueden formular las palabras clave o incluso sus deseos específicamente).
A continuación se muestran las curvas de aprendizaje del programa para un tamaño de matriz de 5 000 000: son 1000 preguntas multiplicadas por 5 opciones de respuesta para cada pregunta, multiplicadas por 1000 objetivos. En este experimento entrenamos el programa para búsqueda binaria: el rango de objetivos Tj es de 0 a 999, y cada pregunta Qi es "¿Cómo se compara tu conjetura con Qi?". Las opciones de respuesta son 0 - "La suposición es mucho menor que Qi", 1 - "La suposición es un poco más baja que Qi", 2 - "La suposición es exactamente igual a Qi", 3 - "La suposición es un poco más alta que Qi " y 4 - "La suposición es mucho mayor que la del Qi".
El eje X contiene el número de preguntas formuladas y respondidas (hasta 5 millones). El eje Y contiene, para cada 256 pruebas seguidas, el porcentaje de veces que el programa incluyó correctamente el objetivo adivinado entre los 10 objetivos más probables. Tenga en cuenta que las pruebas siempre se realizan con datos nuevos: primero elegimos un número aleatorio, luego dejamos que el programa lo adivine haciendo preguntas y obteniendo respuestas nuestras, luego, después de que el programa haya adivinado correctamente o haya hecho más de 100 preguntas (lo que significa un fracaso). , le enseñamos al programa, revelándole nuestro número aleatorio seleccionado.
A partir de los datos y el diagrama, parece que el programa aprende más rápido y alcanza una mayor precisión para las funciones prioritarias que dan más preferencia a las opciones de menor entropía. Entonces, quizás alguna función de prioridad exponencial pueda dar resultados superiores. Pero hasta ahora no sé cómo implementarlo sin desbordamiento. La función de prioridad está en el archivo ProbQAProbQAPqaCoreCEEvalQsSubtaskConsider.cpp, cerca del final actualmente.
También hay una falla actualmente en la teoría clave, lo que hace que el programa sea obstinado (creo que está cerca del término "sobreadaptado" del aprendizaje automático). Después de que el programa selecciona erróneamente algún objetivo como el más probable, comienza a hacer preguntas que le permitan atenerse a su error, en lugar de preguntas que le permitirían al programa ver que otros objetivos son más probables. Aunque es lo que sucede en la vida, técnicamente es un error en el algoritmo/teoría clave detrás del programa.
En la sección anterior describí un problema de la obstinación del programa: después de convencerse a sí mismo de que algún objetivo equivocado era el más probable, el programa comenzaba a hacer preguntas que le permitían atenerse a su error, en lugar de aprender la verdad. Creo que he resuelto este problema cambiando la función de prioridad de basada solo en entropía a basada en distancia y entropía. En lugar de limitarse a minimizar la entropía de las probabilidades posteriores, ahora también tiene en cuenta la distancia euclidiana entre los vectores de probabilidad anteriores y posteriores. Esto ha permitido que el programa aprenda 20 veces más rápido. Ahora comienza a incluir en el top 10 el objetivo adivinado en casi el 100% de los casos después de aproximadamente 125 000 preguntas formuladas y respondidas (para una matriz de 1000 preguntas por 5 respuestas por 1000 objetivos). Vea el gráfico de Precisión.
Después de la formación inicial antes mencionada, se alcanza un resultado positivo de media en 4,3 preguntas formuladas (por el programa) y respondidas (por el usuario). Vea el gráfico a continuación.
Eso es bastante competitivo con el algoritmo de búsqueda binaria programado por un humano. Para reducir el rango de búsqueda de 1000 a 10 objetivos, un algoritmo de búsqueda binaria programado por humanos requeriría 3,32 pasos en promedio (es un logaritmo en base 4 de 100, porque tenemos 5 opciones de respuesta, de las cuales una es solo la igualdad estricta).
Sin embargo, el algoritmo de búsqueda binaria programado por humanos no tolera errores y no clasifica los objetivos según su probabilidad de ser el deseado. Y, por supuesto, no aprende en el camino. Mientras que el sistema probabilístico de preguntas y respuestas hace esto.
Además, creo que hay margen de mejora en la función de prioridad. Actualmente uso prioridad polinómica: pow(distance, 12) / pow(nExpectedTargets, 6), que empíricamente mostró los mejores resultados en mi número limitado de funciones de prioridad con las que experimenté. Aún así, creo que se pueden producir resultados aún mejores con una función de prioridad exponencial. Ahora veamos si es mejor idear y probar algunas funciones exponenciales ahora, o continuar con tareas de ingeniería (menos emocionantes) como guardar y cargar la base de conocimientos en y desde un archivo, etc.
Recientemente se finalizó la implementación de carga y guardado de la base de conocimientos. El entrenamiento y la predicción se terminaron hace más de un mes y luego se probaron, arreglaron y ajustaron.
Lo que aún no ha terminado es cambiar el tamaño de la KB. No será posible cambiar la cantidad de opciones de respuesta después de crear una KB. Sin embargo, todavía tengo que implementar el cambio del número de preguntas y objetivos.
Puede intentar integrar el motor en sus sistemas.
Para compilar necesita MSVS2017 v15.4.2 o superior. Una dependencia externa es gtest: https://github.com/google/googletest (solo si desea ejecutar pruebas o no le gustan demasiado los errores de compilación en proyectos no relacionados).
Anteriormente publiqué los resultados de experimentos para los 10 objetivos principales (donde se considera que un objetivo ha sido adivinado correctamente si figura entre los 10 objetivos más probables). Aquí está el resultado de una tarea más desafiante: adivinar los objetivos entre los 1 primeros, es decir, debe seleccionarse como el objetivo más probable. Después de muchos experimentos y ajustes, actualmente la curva de aprendizaje de precisión se parece a la siguiente para aprender el algoritmo de búsqueda binaria:
Entonces, para KB de tamaño 1000 preguntas por 5 opciones de respuesta por 1000 objetivos, la precisión alcanza el 100% después de aproximadamente 4,5 millones de preguntas respondidas, y luego también se mantiene en el 100%.
Estoy analizando pérdidas de memoria con Deleaker: https://www.deleaker.com/