Sistemas expertos
Presentación del capítulo
Con frecuencia, nos gustaría que un ordenador fuera capaz de darnos cierta información que no conocemos a partir de hechos conocidos.
Los propios seres humanos no siempre son capaces de deducir nuevos hechos a partir de otros conocidos y necesitan la ayuda de un experto. Por ejemplo, en el caso de un fallo en el automóvil, la mayoría de las personas no son capaces de determinar el origen de la avería y se dirigen al mecánico (el experto). Este, gracias a su conocimiento, encontrará el problema (y lo reparará, por lo general).
Muchos puestos de trabajo los ocupan estos expertos. Los médicos, los consultores o los agentes inmobiliarios no son más que algunos ejemplos.
La inteligencia artificial puede ayudarnos creando un programa informático llamado sistema experto que jugará el rol de este profesional. En ciertos casos, como en medicina, esta herramienta podrá convertirse en una ayuda para el propio especialista, puesto que el campo de estudio es muy vasto. Es poco habitual, en efecto, que el experto humano pueda remplazarse por completo, y estará ahí, a menudo, para confirmar la conclusión del sistema, ahorrándole en cualquier caso un tiempo precioso. En otros casos, el sistema proporcionará un primer diagnóstico, que complementará una persona física en caso de que el error sea desconocido...
Ejemplo: un sistema experto en polígonos
Esta sección permite ver el funcionamiento detallado de un sistema experto cuyo objetivo es determinar el nombre de un polígono (por ejemplo, un rectángulo) en función de características relativas a su forma (el número de lados, los ángulos rectos...). Este capítulo empieza con un breve repaso de geometría.
Un polígono se define como una forma geométrica que posee al menos tres lados. El orden de un polígono se corresponde con su número de lados.
1. Triángulos
Si el orden de un polígono vale 3, entonces posee tres lados y se trata de un triángulo. Puede tratarse de un triángulo cualquiera: rectángulo, isósceles, rectángulo isósceles o equilátero.
Las siguientes figuras nos recuerdan las particularidades de cada uno.
|
Triángulo cualquiera: posee tres lados de tamaños diferentes y ningún ángulo recto. |
|
Triángulo rectángulo: posee tres lados de tamaños diferentes y un ángulo recto. |
|
Triángulo isósceles: posee dos lados del mismo tamaño, pero ningún ángulo recto. |
|
Triángulo rectángulo isósceles: conjuga los dos lados iguales de un triángulo isósceles y el ángulo recto del triángulo rectángulo. |
|
Triángulo equilátero: posee tres lados... |
Contenido de un sistema experto
Un sistema experto está formado por diferentes partes vinculadas entre sí:
-
Una base de reglas que representa el conocimiento experto.
-
Una base de hechos que representa el conocimiento actual del sistema acerca de un caso concreto.
-
Un motor de inferencia que permite aplicar las reglas.
-
Una interfaz de usuario.
El siguiente esquema indica los vínculos entre las distintas partes, que se detallan a continuación.
1. Base de reglas
Un sistema experto contiene un conjunto de reglas llamado base de reglas. Estas representan el conocimiento del experto en el dominio.
Estas reglas son siempre de la forma:
SI (conjunto de condiciones) ENTONCES nuevo conocimiento
Las condiciones de aplicación de una regla se denominan las premisas. Pueden existir varias premisas, en cuyo caso están vinculadas por una coordinación Y, lo que quiere decir que deben ser ciertas todas ellas para poder aplicar la regla.
Si la regla necesita una coordinación O, se dividirá en dos reglas distintas equivalentes. Así, la regla:
Si (A O B) entonces C
Se convertirá en:
Si A entonces C
Si B entonces C
Los nuevos conocimientos se denominan conclusiones.
Para nuestro sistema experto relativo a las formas geométricas, he aquí las reglas correspondientes a los triángulos:
SI (orden vale 3) ENTONCES es un triángulo
SI (triángulo Y 1 ángulo recto) ENTONCES es un triángulo rectángulo
SI (triángulo Y 2 lados del mismo tamaño) ENTONCES es un triángulo isósceles
SI (triángulo rectángulo Y triángulo isósceles) ENTONCES es un triángulo rectángulo isósceles
SI (triángulo Y lados todos iguales) ENTONCES es un triángulo equilátero
Existirán otras reglas para los cuadriláteros y los polígonos de orden superior. Vemos rápidamente que el número de reglas puede ser importante.
Además, según el sistema utilizado, cada regla debe seguir una sintaxis precisa e impuesta.
En particular, las premisas y las conclusiones...
Tipos de inferencia
Los motores de inferencia pueden encadenar las reglas de diversas maneras: es lo que se denomina el método de razonamiento. Los dos principales métodos de razonamiento son el razonamiento deductivo y el razonamiento inductivo, aunque existen motores que poseen un método de razonamiento mixto.
1. Razonamiento deductivo
a. Principio
Un motor de razonamiento deductivo también se denomina motor de inferencia dirigido por los datos.
En este tipo de motor se parte de los datos disponibles basándose en los hechos, y se comprueba para cada regla si se puede aplicar o no. Si se puede, se aplica y se agrega la conclusión a la base de hechos.
El motor explora, entonces, todas las posibilidades, hasta encontrar el hecho buscado o hasta que no puede aplicar nuevas reglas.
Este modo de razonamiento se propone por defecto en lenguajes del tipo CLIPS (C Language Integrated Production System), especializados en la construcción de sistemas expertos.
b. Aplicación a un ejemplo
En el caso de nuestro sistema experto relativo a los polígonos, supongamos que partimos de los hechos siguientes:
-
El orden vale 3.
-
Existe un ángulo recto.
-
Dos lados son del mismo tamaño.
Empezaremos aplicando la siguiente regla, que agrega a la base de hechos que la forma es un triángulo:
SI (orden vale 3) ENTONCES es un triángulo
A continuación podemos deducir que se trata de un triángulo rectángulo gracias a la regla siguiente:
SI (triángulo Y 1 ángulo recto) ENTONCES es un triángulo rectángulo
Además, sabemos que es un triángulo isósceles:
SI (triángulo Y 2 lados del mismo tamaño) ENTONCES es un triángulo isósceles...
Etapas de construcción de un sistema
Para crear íntegramente un sistema experto, es muy importante seguir distintas etapas que requerirán competencias y, por tanto, perfiles profesionales diferentes.
En términos generales, existen cuatro etapas que se presentan en la siguiente figura, junto a los principales roles necesarios en cada etapa:
1. Extracción del conocimiento
La primera etapa consiste en extraer el conocimiento. Para ello, es necesario encontrar a un experto al que se le preguntará para comprender las reglas subyacentes en las que se basa su trabajo. Esta fase puede parecer sencilla, pero es de hecho muy compleja. En efecto, un experto no reflexiona basándose en reglas, sino que se basa en ciertos automatismos que tendrá que llegar a explicitar.
Tomemos, como ejemplo, los insectos. Si nos centramos en insectos poco comunes o desconocidos, parece bastante sencillo determinar las reglas que permiten llegar al resultado deseado. Pero ¿qué reglas podemos aplicar para diferenciar una mosca de un mosquito, un caracol de una babosa, una hormiga de una cochinilla, o incluso una mariquita de un zapatero?
Planteando diversas cuestiones al experto podremos ayudarle a determinar las reglas que aplica, a menudo de manera inconsciente. El trabajo del interrogador es, de este modo, primordial, y está encargado de indicar las zonas de sombra, donde existen reglas que no son lo suficientemente específicas...
Rendimiento y mejoras
Hay un aspecto que no se ha tenido en cuenta hasta ahora: el rendimiento. Se trata de un aspecto primordial para el éxito del sistema. Por ello, vamos a ver cuáles son los criterios de rendimiento y cómo construir un sistema que permita mejorarlo.
1. Criterios de rendimiento
El rendimiento de un sistema experto, sobre todo si está compuesto por muchas reglas, es primordial. El primer criterio de rendimiento es el tiempo de respuesta. En efecto, debe ser capaz de dar una respuesta al usuario en un espacio de tiempo aceptable.
Este tiempo depende del problema planteado. Por ejemplo, en nuestro sistema experto de geometría, el tiempo de respuesta será aceptable si se mantiene en el orden de un segundo. Visto el número de reglas, hay pocos riesgos de tener un tiempo superior.
En un sistema experto médico, o para ayudar a un mecánico, el tiempo no es la prioridad, siempre y cuando se mantenga en unos pocos segundos.
Sin embargo, si el sistema experto debe utilizarse en un entorno peligroso para tomar una decisión (por ejemplo, para detener o no una máquina) o debe comunicarse con otros sistemas, el tiempo de respuesta se convertirá en un criterio esencial para el éxito del proyecto.
Además del tiempo de respuesta, existe un segundo criterio de rendimiento: el uso de la memoria. En efecto, la base de hechos va a aumentar conforme se apliquen las reglas. En un motor de razonamiento inductivo, el número de objetivos que hay que alcanzar puede ocupar cada vez más espacio. Si el sistema debe instalarse en un dispositivo que posea poca memoria (como un robot), será necesario tener en cuenta este aspecto.
Por último, generalmente todos los medios implementados para optimizar el tiempo de respuesta tendrán un impacto negativo en la memoria, y viceversa. Es preciso, por tanto, encontrar un compromiso en función de las necesidades.
2. Mejorar el rendimiento...
Agregar incertidumbre y probabilidades
Los sistemas expertos vistos hasta el momento se basaban en reglas seguras, y los hechos eran necesariamente verdaderos o falsos. Sin embargo, en la vida real, las cosas son a menudo más complejas. Conviene pensar, por lo tanto, en gestionar la incertidumbre.
1. Incorporar incertidumbre
En un sistema experto destinado a identificar los animales en función de sus características físicas, puede resultar complicado estimar exactamente el número de dedos en las patas del animal o el color de su vientre. Sobre todo si se trata de un depredador o de un animal venenoso, puede resultar difícil examinarlo bajo todos los ángulos para responder a las preguntas del sistema.
En este caso, puede resultar interesante agregar incertidumbre sobre los hechos: el usuario podrá decir que le parece que el animal tiene el vientre blanco, pero que no está del todo seguro.
Además, en un sistema médico experto, parecería peligroso decir que si los síntomas de una enfermedad son dolor en todo el cuerpo, fiebre y un gran cansancio, entonces se trata necesariamente de una gripe. En efecto, existen enfermedades mucho más raras y más peligrosas que podrían esconderse detrás de estos síntomas.
Esta vez, son las propias reglas las que resultan inciertas: hay una gran posibilidad de que se trate de una gripe, pero no es la única explicación...
Dominios de aplicación
El primer sistema experto apareció en 1965. Llamado Dendral, permitía encontrar componentes de un determinado material a partir de información acerca de su resonancia magnética y el espectrograma de masa de este.
Después, los sistemas expertos se han desarrollado en numerosos dominios y están presentes hasta en algunos dispositivos de uso cotidiano.
1. Ayuda al diagnóstico
El primer gran dominio de aplicación de los sistemas expertos es la ayuda al diagnóstico. En efecto, gracias a su base de reglas, permiten comprobar y descartar distintas posibilidades hasta encontrar una o varias probables.
Los encontramos, de este modo, en aplicaciones médicas para asistir al diagnóstico de ciertas enfermedades. Podemos citar MYCIN, que permite determinar qué bacteria se encuentra en el cuerpo de un paciente y qué tratamiento (tipo de antibiótico y posología) administrarle para que mejore, o CADUCEUS, una extensión de MYCIN, que permite diagnosticar más de 1000 enfermedades de la sangre. Existen otras aplicaciones que permiten asistir al diagnóstico de enfermedades a partir de radiografías o de imágenes médicas. Más recientemente, las encontramos en otras aplicaciones médicas: determinación de la edad de los huesos a partir de un radio (Seok, 2016) o incluso clasificación de las medidas de glucemia en el marco de una diabetes gestacional (Caballero-Ruiz, 2016).
Resultan muy prácticas para ayudar en la búsqueda de fallos mecánicos (como ocurre en los coches) o en electrónica (para reparar electrodomésticos), acotando las piezas potencialmente defectuosas....
Creación de un sistema experto en Java
Codificar un motor de inferencia genérico y completo en Java es una tarea compleja de realizar. Además, existen motores disponibles (gratuitos o no) que fácilmente pueden adaptarse a nuestro problema.
Vamos a interesarnos, sin embargo, en la creación del sistema experto que permite determinar el nombre de un polígono partiendo de sus características.
Este sistema experto será, no obstante, fácil de adaptar a otros problemas similares. Además, el código Java será portable sobre todos los equipos que posean una máquina virtual (JVM). Las salidas se harán por consola.
1. Definición de requisitos
Este sistema debe ser capaz de adaptarse a muchos problemas equivalentes, de tipo identificación, a partir de información introducida por el usuario.
Aquí, el sistema parte de los datos proporcionados por el usuario para intentar determinar la forma que desea reconocer. No tenemos un objetivo preciso. Conviene, por tanto, utilizar un motor de razonamiento deductivo para este problema, que además es más sencillo de implementar.
Además, partiendo de nuestras reglas, tendremos dos tipos de hechos:
-
Hechos cuyo valor es un número entero, como el orden del polígono o el número de lados del mismo tamaño.
-
Hechos cuyo valor es un valor booleano, como la presencia o no de un ángulo recto, o el hecho de ser un triángulo.
Nuestro sistema experto deberá, por lo tanto, tener en cuenta estos dos tipos de hechos.
El usuario debe, también, poder utilizar fácilmente el sistema experto. Las reglas tendrán que escribirse en un lenguaje cercano al lenguaje natural, y la interfaz de usuario tendrá que gestionarse por separado del motor para hacerla más genérica (aquí realizaremos únicamente una interfaz en modo consola).
Por último, también será interesante conocer el último nombre encontrado para la forma y los nombres intermedios que se han utilizado (por ejemplo, se ha utilizado "Triángulo", a continuación "Triángulo rectángulo" y "Triángulo isósceles" y por último se ha terminado con un "Triángulo rectángulo isósceles"). Trataremos de implementar, entonces, una manera...
Uso de Prolog
Es posible codificar un sistema experto en programación orientada a objetos, pero no es el paradigma de programación mejor adaptado. Los lenguajes de programación lógica están construidos para ejecutar este tipo de tarea. La escritura de código será más sencilla, pues toda la lógica del motor ya está implementada en el núcleo del lenguaje.
1. Presentación del lenguaje
Prolog, de PROgrammation LOGique, es uno de los primeros lenguajes de este paradigma, creado en 1972 por dos franceses: Alain Colmerauer y Philippe Roussel.
No es, no obstante, el único lenguaje de programación lógica. Podemos citar también Oz o CLIPS. Estos lenguajes son próximos a los de la programación funcional (LISP, Haskell...), que pueden utilizarse en sistemas expertos.
Prolog contiene un motor de inferencia de razonamiento inductivo, con backtracking. Se le define un objetivo (que debe ser un hecho) que intentará resolver. Si el objetivo contiene alguna variable, buscará todos los valores posibles para dicha variable. Si el objetivo contiene un atributo, confirmará o descartará el hecho.
Prolog funciona sobre la base de predicados. Cada predicado puede ser un hecho comprobado, o bien un hecho inferido gracias a las reglas. Por ejemplo, orden(3) es un predicado con un parámetro que es un hecho definido por el usuario. Por el contrario, nombre (triángulo) será un hecho inferido por la regla "SI orden(3) ENTONCES nombre(triángulo)".
El lenguaje contiene también predicados predefinidos que permiten, por ejemplo, escribir y leer en la consola de Prolog, cargar un archivo o manipular listas.
En lo sucesivo, utilizaremos el SWI-Prolog, que puede descargar gratuitamente del sitio web http://www.swi-prolog.org/ y que está disponible para Windows, Mac OS X o Linux.
2. Sintaxis del lenguaje
Aquí se detalla únicamente la sintaxis necesaria para la comprensión de los ejemplos. No dude en consultar la documentación de su implementación de Prolog para saber más. Además, según la función utilizada, la sintaxis puede variar ligeramente. En el anexo hallará una explicación del uso de SWI-Prolog para Windows.
a. Generalidades
En Prolog, deben diferenciarse dos partes:
-
El archivo que contiene las reglas y los hechos...
Resumen
Un sistema experto permite partir de hechos y aplicar reglas para obtener nuevos hechos, llamados hechos inferidos. Reemplazan o complementan el conocimiento del experto, según el caso.
Están compuestos por una base de reglas que contiene todas las reglas conocidas por el experto y que permite llegar a conclusiones. Se componen también de una base de hechos que representan todo lo que se conoce por parte del usuario, así como los hechos inferidos hasta el momento. Una interfaz de usuario permitirá comunicarse de forma clara con las distintas personas que utilicen el sistema.
El núcleo del sistema experto es su motor de inferencia. Es el que va a escoger y aplicar las reglas, y ejecutar las interacciones con el usuario. Puede ser de razonamiento deductivo si parte de los hechos para obtener otros nuevos o de razonamiento inductivo si parte de un objetivo y busca cómo alcanzarlo.
La creación de este motor no es una tarea sencilla, pero es posible implementarlo en todos los lenguajes. Los motores de razonamiento deductivo son, sin embargo, mucho más fáciles de codificar, por ejemplo en Java. Existen lenguajes particulares, propios de la programación funcional o lógica, como Prolog, que permiten simplificar la implementación de sistemas expertos. En efecto, el motor es una parte integrante del lenguaje.
Por último, es posible agregar la gestión de incertidumbre, tanto...