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 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 estudiar 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: combina los dos lados iguales de un triángulo isósceles y el ángulo recto del triángulo rectángulo. |
|
Triángulo... |
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, queriendo decir que deben ser ciertas todas ellas para poder aplicar la regla.
Si la regla requiere 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 pueden obtenerse bajo...
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 en la base de 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 en base a 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 para...
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. Vamos, por ello, 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 es primordial, sobre todo si está compuesto por muchas reglas. 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. Dado el número de reglas, hay pocas posibilidades 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 a 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 ahora se basan en reglas seguras, y los hechos eran, necesariamente, verdaderos o falsos. No obstante, en la vida real, las cosas son a menudo más complejas. Conviene pensar, por lo tanto, en gestionar la incertidumbre.
1. Agregar incertidumbre
En un sistema experto destinado a identificar animales en función de características físicas, puede resultar difícil estimar exactamente el número de dedos que tiene el animal en cada pata, o bien el color de su vientre. Sobre todo, si se trata de un depredador o de un animal venenoso, puede resultar complicado examinarlo desde todos los ángulos necesarios para poder responder a las preguntas del sistema.
En estos casos, puede resultar interesante agregar incertidumbre a 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 experto médico, puede parecer peligroso decir que, si los síntomas de una enfermedad son dolores en todo el cuerpo, fiebre y una gran fatiga, entonces seguro que es una gripe. En efecto, existen enfermedades mucho más peligrosas que podrían esconderse tras estos síntomas.
En esta ocasión, son las propias reglas las que resultan inciertas: existe una elevada probabilidad de que se trate de una gripe, pero no es la única explicación...
Campos 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 del mismo.
Después, los sistemas expertos se han desarrollado en numerosos campos y están presentes hasta en algunos dispositivos de uso cotidiano.
1. Ayuda al diagnóstico
El primer gran campo 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, se los encuentra en otras aplicaciones médicas: cálculo de la edad de los huesos partiendo de una radiografía (Seok, 2016) o incluso la clasificación de medidas de glicemia 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 C#
Codificar un motor de inferencia genérico y completo en C# es una tarea compleja. Además, existen motores disponibles (gratuitos o no) que fácilmente pueden adaptarse a un 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 C# es compatible con Windows 8, Windows 10 (aplicaciones universales), el framework .NET 4 y versiones superiores. Puede utilizarse en otros destinos si se instalan en el equipo de desarrollo, sin modificar el código (por ejemplo, para Windows Phone, Xbox, Xamarin, Azure, Unity…). El programa principal es un programa de consola para Windows.
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, será también 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"...
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 se encuentra 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 C#. 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...