Showing posts with label sistemas expertos. Show all posts
Showing posts with label sistemas expertos. Show all posts

Saturday, September 26, 2015

Sistemas expertos: tecnología obsoleta



En Inteligencia Artificial (IA) se trabaja en muchos frentes. Pueden ser redes neuronales, o quizás programas que hacen búsquedas exhaustivas sobre un árbol de posibilidades. También pueden usarse los sistemas expertos, que pretenden lidiar con las incertidumbres asociadas con la información en prácticamente todo el ámbito humano. Así, por ejemplo, podemos pensar en las heurísticas, una manera de manejar un problema para el cual no siempre hay una solución exacta. Una heurística es una regla general, que funciona la mayoría de las veces o en la mayoría de los casos, pero bien podría no trabajar correctamente en un caso particular.

Los sistemas expertos son una rama de la IA que pretende describir un problema con base en reglas del tipo IF-THEN, es decir, SI ocurre un fenómeno en particular ENTONCES tomaremos la siguiente acción. Por ejemplo, si pensamos en un sistema de diagnóstico médico, podríamos tener este tipo de reglas:

SI el paciente presenta fiebre, estornuda, cuerpo cortado ENTONCES tiene gripa.

Esta regla es muy evidente por sí misma pero muchas veces en el mundo real las cosas son menos sencillas. Por ejemplo, podríamos decir:

SI el cielo está nublado ENTONCES llevaré mi paraguas.

Aunque la regla podría funcionar considerando que al estar el cielo nublado, entonces podría llover, pues no parece ser mala idea llevar consigo el paraguas. La pregunta que surge, sin embargo, es: ¿Cuál es la probabilidad de que vaya a llover? Si dicha probabilidad es 10% o menos que eso, a lo mejor no tiene sentido cargar con el paraguas aunque sí, podría eventualmente caer una lluvia.

Este tipo de criterios hacen que los sistemas expertos se conformen de muchas reglas CAUSA-EFECTO y que estas se encadenen para llegar a una conclusión. Existen dos tipos de encadenamiento, hacia atrás (backward chaining) y hacia adelante (forward chaining). El primero es más o menos lo que hace un médico que nos ve por primera vez. Nos preguntará en cómo nos puede ayudar y le diremos, por ejemplo, que nos sentimos mal. Entonces el médico preguntará por los posibles síntomas: ¿le duele la cabeza? ¿le duele alguna otra parte del cuerpo? Y entonces el médico buscará encadenar de alguna manera los síntomas que presenta el enfermo para así llegar a un diagnóstico.

En el caso de forward chaining, el médico cuando ve al paciente piensa para sí en un posible diagnóstico, por ejemplo, observa al paciente y decide que éste se ve agripado. Entonces, las preguntas ya están orientadas sobre qué puede tener. Empieza el interrogatorio con una posible hipótesis de la enfermedad del paciente. Si acaso éste le contesta no a un síntoma que debiese ser sí, el galeno entonces buscará una nueva hipótesis. ¿Cuál es la mejor manera de encadenar la información en un sistema experto? No sé, depende del problema que se planteé.

Otro punto a considerar es la incertidumbre en la información. Muchas veces, cuando vamos al médico, éste nos pregunta: ¿qué tanto le duele la cabeza? ¿Mucho? ¿Poco? Defínalo de 1 al 10, donde 1 es que le duele muy poco. Y esto en un sistema experto debe ser validado. ¿Qué pasa si hay diversas incertidumbres asociadas a diferentes preguntas? Las matemáticas tienen la solución, usar el teorema de Bayes, el cual permite combinar adecuadamente las probabilidades asociadas a eventos para saber la probabilidad final deque un evento pueda ocurrir.

Cabe decir que los sistemas expertos contienen tres elementos básicos:
  1. La interfaz con el usuario
  2. La base de reglas causa-efecto
  3. El motor de inferencias
El primer punto permite tener una manera de comunicación entre el usuario y el sistema. La base de reglas, en cambio, debe armarse de acuerdo a consultas que harán los programadores del sistema experto. Finalmente, el motor de inferencias es el que nos dice si haremos encadenamiento hacia adelante o hacia atrás.

Todo esto está muy bien, pero los sistemas expertos parecen ser ya una tecnología obsoleta, por decir lo menos. Definir todo en términos de predicados causa-efecto no parece ser siempre una buena idea e incluso, con el manejo de las incertidumbres, el resultado final parece acartonado. Tal vez -para colmo- los programas de IA que lidian con este tema de los sistemas expertos, decidan cambiar el enfoque a una búsqueda por demás exhaustiva. Y entonces las heurísticas pasan a un segundo plano porque ya se puede tener una solución clara y más precisa.

Un ejemplo de ello es el propio ajedrez por computadora. Los programas tienen una función de evaluación que informan qué posición es mejor y por qué. Un sistema experto con reglas para jugar bien parece resultar por una parte, difícil de generar y por otra, de aplicar en la gran cantidad de posiciones que pueden darse. Es claro que los sistemas expertos no sirven por ejemplo, en el dominio del ajedrez.

Los sistemas expertos tuvieron un inicio interesante e incluso hubo sistemas que permitían vender equipos de cómputo y organizar cómo se pondrían en la empresa del cliente. este tipo de sistemas estaba hecho con una centena de reglas pero incluso, tenía un sistema experto (con más reglas), que buscaba que éstas no tuviesen contradicciones evidentes. Sin embargo, sus limitaciones fueron saliendo a la luz.

Hoy en día no hay quien decida armar un sistema experto, en el tema que sea, porque probablemente quedará siempre limitado. Pienso pues que esta tecnología es obsoleta y habrá que considerarla como un interesante esfuerzo que no prosperó. Así pasa contínuamente en la ciencia. Tampoco es algo que haya que alarmarnos.

Sunday, November 20, 2011

Inteligencia artificial y sistemas expertos


La inteligencia artificial, término que acuñó John McCarthy me parece, se basa en la idea de hacer sistemas inteligentes, tan capaces como los que puede lograr el cerebro humano. Sin embargo, se halló, después de los primeros años frustrantes, que la inteligencia humano no sólo era complicada, sino mucho más complicada de lo que habíamos pensado. Por ello, hubo una división natural de tareas: visión por computadora; sistemas expertos; reconocimiento de patrones; entre otros.



Uno de los temas que por algunos años estuvieron en boga, pero que probablemente han caído en el desuso es el de los sistemas expertos, el cual se basa en escribir software que fuese tan bueno como un experto humano en un tema particular. En ese sentido por ejemplo, un programa de ajedrez como los actuales, que le ganan al 99.99% de los jugadores humanos,  es un sistema experto muy exitoso, pero las técnicas de programación para jugar tan bien están lejos de la teoría tradicional de los sistemas expertos. En este caso las cosas son así. Un sistema experto se basa en tres subtemas:

  • Interfaz con el usuario
  • Base de conocimientos (reglas de producción)
  • Motor de inferencias

En ese sentido, cuando se va a trabajar con un sistema experto hay que reconocer cómo se diseñará cada parte. En el caso de la interfaz del usuario, aunque hay muchas alternativas, la más común es responder "sí" o "no" a las preguntas que hace el sistema. esto -desde luego- no es tan poderoso como aquellos sistemas que además de responder a preguntas con "sí" o "no", también puedes darle un valor de confiabilidad a la respuesta. Por ejemplo,

Pregunta: "¿Te duele la cabeza"
Respuesta: "sí"
Pregunta: Del 1 al 10, ¿cuánto te duele? (donde 10 es el dolor más fuerte)

este tipo de sistemas usan probabilidad para decidir el margen de confiabilidad de las respuestas que entrega el sistema experto, basado en las confiabilidades que se dieron en las diferentes respuestas por parte del usuario. Para ello se usa el teorema de Bayes Sin embargo, para poner las cosas de la manera más simple, muchos sistemas expertos solamente permiten responder "sí" o "no".

Pues bien, una vez hecho esto, tenemos que describir la base de conocimientos, la cual es la que nos dará información sobre el tema que nos ocupa. Por ejemplo, en el programa muestra que te mando, la base de conocimientos es la información sobre los diferentes perros que existen. Así, un snauzer será un perro pequeño, con cola y orejas cortas, de buen talante, etc. En esta base se definen algunos perros y sus características. La idea del sistema experto es que el programa vaya pidiéndole información al usuario para que éste pueda concluir de qué perro se trata. Las bases de conocimiento están puestas en general como predicados "causa - efecto". Así, una regla en general podría ser: "si te duele la cabeza es que tienes gripe". La causa: el tener gripe; el efecto: el dolor de cabeza.

El motor de inferencias es quien pregunta al usuario basándose en esas cláusulas causa - efecto. Los sistemas expertos usan tres posibles motores de inferencia:

  • encadenamiento hacia atrás (backward chaining)
  • encadenamiento hacia adelante (forward chaining)
  • sistema de borrador (blackboard system)

El primer caso funciona así: Imagina que vas con el médico porque te sientes mal. Él te ve y te empieza a preguntar cosas sobre tus malestares. Sin embargo, antes de empezar las preguntas, las dirige asumiendo que tienes gripe, por ejemplo. Entonces te preguntará síntomas asociados de la gripe. Si le das más de una respuesta que no es presumiblemente de la gripe, se formulará mentalmente otra hipótesis y de nuevo empezará el interrogatorio.

El segundo caso es el encadenamiento hacia adelante. Siguiendo el ejemplo anterior, vas al médico y éste comienza a preguntarte qué te duele, pero no asume que tiene gripe o cualquier otra enfermedad. Lo que hace es acumular datos (respuestas) y entonces busca en su base de conocimientos qué es lo que más se parece a lo que puedes tener.

El sistema de borrador ya es obsoleto. Imagina un salón de clases lleno de expertos humanos en alguna materia. Entonces se plantea un problema y cada experto tiene un pedazo del borrador en la pared para poner su solución. Después de que todos hayan puesto su posible solución, un supervisor lee todas las respuestas y arma la respuesta final. Así funcionaba HearSay, un sistema de reconocimiento de voz de los años ochentas, actualmente en desuso.

Cabe señalar que los sistemas expertos deben estar construídos para no repetir hasta el hartazgo la misma pregunta. Por ejemplo, imagina que un sistema de encadenamiento hacia atrás te pregunta si te duele la cabeza y le contestas que no. Si es así, probablemente la primera hipótesis, la de tener gripe, no funcione. Entonces el sistema crea a través de la siguiente regla la nueva hipótesis. Si en esta nueva regla hay que preguntar de nuevo si te duele la cabeza, sería poco inteligente y serio de un sistema que te volviese a preguntar lo mismo. Así, el sistema experto (como el que te mando), guarda las respuestas del usuario y checa antes si ya respondiste a la pregunta para no volverla a preguntar.

Otra cuestión, que no está considerada en el sistema experto es la de explicar su funcionamiento. Es decir, ¿por qué el sistema experto llegó a las conclusiones y diagnósticos a los que llegó? Hay muchas maneras de hacer esto pero una de ellas es simplemente avisarle al programador, vía mensajes a la pantalla, en qué regla está trabajando. Otrso sistemas expertos pueden trazar la ruta de desarrollo. Por ejemplo, pueden decirte: "primero usé la regla 4, la cual me remitió a la regla 92 y por las respuestas del usuario tuve que probar las reglas 153 y 25", etc. Pero esto es mucho más sofisticado y difícil de programar.



/*      Program: Dog Expert        */
/* Purpose: To show the working of */
/* an expert system. It is a pro-  */
/* duction rule-based system.      */
/*                                 */
/* Remarks: This is a dog classi-  */
/* cation expert system. It uses a */
/* set of production rules for the */
/* purpose of inferring.           */

domains

database

   xpositive(symbol,symbol)
   xnegative(symbol,symbol)


predicates

   do_expert_job
   do_consulting
   ask(symbol,symbol)
   dog_is(symbol)
   it_is(symbol)
   positive(symbol,symbol)
   negative(symbol,symbol)
   remember(symbol,symbol,symbol)
   clear_facts

goal

   do_expert_job.


clauses

/*  User Interface System (UIS) */

do_expert_job :-
     makewindow(1,7,7,"An Expert System",1,16,22,58),
     nl, write(" ************************************"),
     nl, write("    Welcome to a Dog Expert System"),
     nl, write("                                 "),
     nl, write(" This is a dog identification system"),
     nl, write(" Please, respond by typing in 'yes'"),
     nl, write(" or 'no'.            Thank you.    "),
     nl,nl,
     do_consulting,
     write("Press space bar..."), nl,
     readchar(_),
     clearwindow,
     exit.

do_consulting :-
     dog_is(X), !,
     nl, write(" Your dog may be a(n) ",X,"."),
     clear_facts.

do_consulting :-
     nl, write("Sorry, unable to determine the dog."),nl,
     clear_facts.

ask(X,Y) :-
     write("   Question :- ",X," it, ",Y," ? "),
     readln(Reply),
     remember(X,Y,Reply).


/* Inference Engine (INE) */

positive(X,Y) :-
     xpositive(X,Y),!.

positive(X,Y) :-
     not(negative(X,Y)),!,
     ask(X,Y).

negative(X,Y) :-
     xnegative(X,Y),!.

remember(X,Y,yes) :-
     asserta(xpositive(X,Y)).

remember(X,Y,no) :-
     asserta(xnegative(X,Y)),
     fail.

clear_facts :-
     retract(xpositive(_,_)),
     fail.

clear_facts :-
     retract(xnegative(_,_)),
     fail.


/* Production Rules */


dog_is("English Bulldog") :-
     it_is("short-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("Beagle") :-
     it_is("short-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"long ears"),
     positive(has,"good natured personality"),!.

dog_is("Great Dane") :-
     it_is("short-haired dog"),
     positive(has,"low-set tail"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),
     positive(has,"weight over 100 lb"),!.

dog_is("American Foxhound") :-
     it_is("short-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),!.
    
dog_is("Cocker Spaniel") :-
     it_is("long-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"low-set tail"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),!.

dog_is("Irish Setter") :-
     it_is("long-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("Collie") :-
     it_is("long-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("St. Bernard") :-
     it_is("long-haired dog"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),
     positive(has,"weight over 100 lb"),!.
    
it_is("short-haired dog") :-
     positive(has,"short-haired"),!.
    
it_is("long-haired dog") :-         
     positive(has,"long-haired"),!.

Este sistema experto está escrito para turbo prolog, que funciona bajo MsDOS y está sacado del libro -si mal no recuerdo- Exploring Artificial Intelligence With Turbo PROLOG por Keith Weiskamp, el cual no sé dónde está. No lo halló más.