Mg.Abraham Gamarra Moreno 165 CAPITULO CUATRO APRENDIZAJE CON REDES NEURONALES ARTIFICIALES Una red neuronal artificial es, básicamente, el resultado de los intentos por reproducir mediante computadores el funcionamiento del cerebro humano. Su principal aplicación es en torno a las tareas en que los seres humanos fácilmente superan a los computadores tradicionales, como en procesamiento de señales, procesamiento de imágenes, procesamiento de voz, en robótica y otros. Nuestro cerebro está formado por miles de millones de neuronas interconectadas entre sí en forma variable y compleja. Cada neurona recibe señales de las otras neuronas, o señales provenientes del exterior de la red, las procesa, ponderando o dándole distinta importancia a cada una de ellas, y genera una única señal de salida que se transmite a las otras neuronas. La información que procesa una red neuronal se encuentra dispersa entre todas sus interconexiones, lo que la hace fundamentalmente diferente a un computador tradicional, en que la información se encuentra totalmente localizada y no distribuida como en este caso. Esta cualidad hace que las redes neuronales posean una gran tolerancia a fallas. 4.1. FUNDAMENTOS BIOLÓGICOS La figura 4.1 muestra el modelo biológico de la neurona, elemento base de las redes de neuronas. 166 Tópicos y Aplicaciones de la Inteligencia Artificial Figura 4.1. Modelo de la Neurona Biológica Como se aprecia en esta figura, cada neurona en el cerebro está compuesta básicamente por un cuerpo, axones y dendritas. Las dendritas forman un "cepillo filamentoso" muy fino que rodea el cuerpo de la neurona. El axón puede considerarse como un tubo largo y fino que se subdivide en numerosas ramas que terminan en pequeños bulbos, los cuales tienen contacto con las dendritas de las otras células. La pequeña separación entre una terminación y una dendrita es llamada sinapsis. El axón de una neurona puede formar conexiones sinápticas con muchas otras neuronas. Funcionalmente, las dendritas reciben señales desde otras células a través de los puntos de conexión llamados sinapsis. La fuerza de una conexión dada es determinada por la eficiencia de la transmisión sináptica. Desde ahí las señales son pasadas al cuerpo de la célula. Las señales que llegan de las dendritas pueden ser excitatorias o inhibitorias, y si la suma ponderada de éstas, realizada dentro del cuerpo de la neurona, supera su "umbral de activación" dentro de un tiempo suficiente, la neurona se disparará, enviando un impulso nervioso a través de su axón. 4.2. LA NEURONA ARTIFICIAL En la figura 4.2 se presenta el esquema típico de la neurona artificial. W 1j W 2j W nj Zj= W ij X i X 1 X 2 X n Axones Sinapsis Dendritas Cuerpo de la Neurona Axón Y j . : : F ( Zj ) Figura 4.2: Modelo de la Neurona Artificial Mg. Abraham Gamarra Moreno 167 El cuerpo de la neurona será a menudo representada por la suma ponderada de las entradas, Zj, seguida por una función lineal o no lineal, Yj = F( Zj). La eficiencia sináptica es representada por los "pesos de interconexión", Wij. La función F(Zj) es llamada "función de activación", que usa los valores de entrada para determinar la actividad de la neurona. El modelo de la neurona es llamado neurona de McCulloch-Pitts . 4.2.1. PESOS DE INTERCONEXIÓN Los pesos de interconexión, representan la fuerza de interconexión entre las neuronas, y pueden ser positivos (excitatorios) o negativos (inhibitorios); además pueden ser fijos o adaptables. Las redes con pesos adaptables usan leyes de aprendizaje para ajustar los valores de la fuerza de interconexión. Si la red neuronal usa pesos fijos las tareas a ser ejecutadas deben estar bien definidas a priori. 4.2.2. FUNCIONES DE ACTIVACIÓN Existen distintos tipos de redes neuronales que usan diferentes funciones de activación, F(Z), pero la estructura interna de la neurona , es decir la suma ponderada seguida por la función F(Z), es común en la mayoría de las redes. Entre las funciones de activación más usadas y conocidas se encuentran las que se muestran en la figura 4.3. Figura 4.3. Funciones de Activación 168 Tópicos y Aplicaciones de la Inteligencia Artificial 4.3. REDES DE NEURONAS Una red de neuronas consiste en varios de estos elementos (neuronas) trabajando juntos. Usualmente estos elementos se organizan en grupos conocidos con el nombre de capas. Una red típica consiste en una sucesión de capas conectadas entre ellas en forma total o aleatoria. Estas redes poseen dos capas que tienen contacto con el exterior, que son la capa de entrada y la de salida. Las capas que no se conectan con el exterior reciben el nombre de capas ocultas. La figura 4.4 presenta el esquema típico de una red de neuronas. 4.3.1. REDES MONOCAPA (1 CAPA) En las redes monocapa, como la red de HOPFIELD y la red BRAIN-STATE-IN- A-BOX, se establecen conexiones laterales entre las neuronas que pertenecen a-la única capa que constituye la red. También pueden existir conexiones autorrecurrentes (salida de una neurona conectada a su propia entrada), aunque en algún modelo, como el de HOPFIELD, esta recurrencia no se utiliza. : : : : : : Capa de entrada Capa escondida Capa de salida Figura 4.4 Esquema típico de una red de neuronas Una topología equivalente a la de las redes de 1 capa es la denominada topología crossbar (barras cruzadas). Una red de este tipo (por ejemplo, la red LEARNING MATRIX) consiste en una matriz de terminales (de entrada y salida) o barras que se cruzan en unos puntos a los que se les asocia un peso. Esta representación crossbar suele utilizarse como etapa de transición cuando se pretende implementar físicamente una red monocapa, puesto que es relativamente sencillo desarrollar como hardware una estructura como la indicada (por ejemplo, las barras cruzadas serían cables, y los puntos de conexión, resistencias cuyos valores representarían los pesos de la red). Mg. Abraham Gamarra Moreno 169 Finalmente, hay que indicar que las redes monocapa se utilizan típicamente en tareas relacionadas con lo que se conoce como autoasociación; por ejemplo, para regenerar informaciones de entrada que se presentan a la red incompleta o distorsionada. En la tabla 4.1 se muestran las características topológicas de los modelos de redes monocapa más conocidos. Tabla 4.1. modelos de redes monocapa más conocidos. TIPOS DE CONEXIONES MODELO DE RED BRAIN-STATE-IN-A-BOX ADDITIVE GROSSBERG (AG) SHUNTING GROSSBERG (SG) CONEXIONES AUTORRE- CURRENTES OPTIMAL LINEAR ASOCIATIVE MEMORY HOPFIELD BOLTZMANN MACHINE CONEXIONES LATERALES EXPLÍCITAS NO AUTO- RECURRENTES CAUCHY MACHINE CROSSBAR LEARNING MATRIX (LM) La figura 4.5 muestra el modelo de red neuronal de Hopfield. Figura 4.5 Red de Hopfield 4.3.2. REDES NEURONALES MULTICAPAS En el caso de las redes multicapas, sus unidades se clasifican en tres tipos: 170 Tópicos y Aplicaciones de la Inteligencia Artificial • Unidades de entrada: al igual que el caso de la red de una sola capa, estas unidades son las que reciben el patrón de entrada directamente. • Unidades ocultas o escondidas: estas no reciben entradas directamente y no poseen realimentación directa. Ellas permiten tener una representación interna del patrón en cuestión. • Unidades de salida: estas son las que entregan el resultado de la red. Las redes multicapa son aquellas que disponen de conjuntos de neuronas agrupadas en varios (2, 3, etc.) niveles o capas. En estos casos, una forma para distinguir la capa a la que pertenece una neurona, consistiría en fijarse en el origen de las señales que recibe a la entrada y, el destino de la señal de salida. Normalmente, todas las neuronas de una capa reciben señales de entrada de otra capa anterior, más cercana a la entrada de la red, y envían las señales de salida a una capa posterior, más cercana a la salida de la red. A estas conexiones se les denomina conexiones hacia adelante o feedforward (Fig. 4.7). Sin embargo, en un gran número de estas redes también existe la posibilidad de conectar las salidas de las neuronas de capa posteriores a las entradas de las capas anteriores, a estas conexiones se les denomina conexiones hacia atrás o feedback (Fig. 4.6). Figura 4.6. Red feedback Un modelo de red neuronal multicapa es el Perceptron multinivel o multicapa (Figura 4.7), el cual es una red de tipo feedforward compuesta de varias capas de neuronas entre la entrada y la salida de la misma. Las capacidades del Perceptron con dos tres y cuatro niveles o capas y con una única neurona en el nivel de salida, se muestra en la figura 4.8. Mg. Abraham Gamarra Moreno 171 Figura 4.7 Perceptron multinivel (red feedforward multicapa) Figura 4.8 Distintas formas de las regiones generadas por un perceptron multinivel En la segunda columna se muestra el tipo de región de decisión que se puede formar con cada una de las configuraciones. En la siguiente columna se indica el tipo de región de decisión que se formaría para el problema de la XOR. En las dos últimas columnas se muestran las regiones formadas para resolver el 172 Tópicos y Aplicaciones de la Inteligencia Artificial problema de clases con regiones mezcladas y las formas de regiones más generales para cada uno de los casos. El Perceptron básico de dos capas (la de entrada con neuronas lineales y la de salida) sólo puede establecer dos regiones separadas por una frontera lineal en el espacio de patrones de entrada. Un Perceptron con tres niveles de neuronas puede formar cualquier región convexa en este espacio. La región de decisión resultante será regiones convexas con un número de lados a lo sumo igual al número de neuronas de la segunda capa. Un Perceptron con cuatro capas puede formar regiones de decisión arbitrariamente complejas. El proceso de separación en clases que se lleva a cabo consiste en la partición de la región deseada en pequeños hipercubos (cuadrados para dos entradas de la red). El análisis anterior demuestra que no se requieren más de cuatro capas en una red de tipo Perceptron, pues, como se ha visto una red con cuatro niveles, puede generar regiones de decisión arbitrariamente complejas. El Perceptron es de interés histórico, dado que ha abierto el camino para el desarrollo de otras redes neuronales, entre ellos el BackPropagation, que se analizará más adelante. 4.4. OPERACIÓN DE UNA RED NEURONAL Las redes neuronales operan en dos fases: aprendizaje y evocación o recuerdo. El aprendizaje es el proceso en el cual se adaptan o modifican los pesos de las conexiones en respuesta a un estímulo que ha sido presentado en sus entradas y opcionalmente a su salida. El estímulo presentado a la salida corresponde a la salida deseada para una determinada entrada; esta salida deseada debe ser entregada por un "instructor". En tal caso se habla de un aprendizaje supervisado o entrenamiento supervisado. La evocación o recuerdo se refiere a cómo la red procesa los estímulos presentados en sus entradas y genera una respuesta en su salida. A menudo la evocación o recuerdo es una parte del aprendizaje; esto sucede cuando la salida deseada debe ser comparada con la salida actual de la red para originar la señal de error. 4.5. ENTRENAMIENTO DE UNA RED NEURONAL El entrenamiento de una red es todo el proceso de aprendizaje que realiza una red neuronal. Su objetivo es lograr que la aplicación de un conjunto de entradas produzca el conjunto de salidas deseadas (o uno al menos consistente). Mg. Abraham Gamarra Moreno 173 Dicho entrenamiento se realiza aplicando secuencialmente vectores de entrada (patrones de entrenamiento), a la vez que se ajustan los pesos de la red de acuerdo a un procedimiento predeterminado (cada modelo define su procedimiento), los cuales convergen gradualmente a valores tales que cada vector de entrada produce el vector de salida deseado. En cuanto a los tipos de aprendizaje, existen dos tipos: el aprendizaje supervisado y el no supervisado. 4.5.1. ENTRENAMIENTO SUPERVISADO Se selecciona un número suficientemente grande de vectores de entrada con sus correspondientes vectores de salida. Cada vector de entrada se aplica a la red calculándose la salida, la que posteriormente se compara con la salida deseada, determinando el error. Dicho error es realimentado a través de la red, modificando los pesos de acuerdo a un algoritmo que lo minimice. Los vectores del conjunto de entrenamiento se aplican secuencialmente, calculando los errores y modificando los pesos hasta que el error del conjunto total de entrenamiento converja a un nivel aceptable. A continuación se muestra como se realiza el entrenamiento de una red neuronal multicapa: • Lo primero que necesitamos son patrones de entrenamiento (cada fila de la tabla) que contengan el conocimiento de algún dominio en particular. Para nuestro ejemplo (Tabla 4.2) tenemos patrones que permiten identificar si un animal es un mamífero (1) o un ave (0). • Ahora necesitamos una red neuronal que permita tomar los patrones de entrada y de salida para el entrenamiento, tal como se muestra en la figura 4.9. Los 6 primeros patrones (patrones de entrada) debe suministrar a las neuronas que están en la parte superior (neuronas de entrada) y la última columna se debe suministrarse como salida deseada. Se puede elaborar un programa que permita entrenar la red neuronal y luego de este entrenamiento, se debe probar si el aprendizaje fue correcto o no. Para el primer patrón de entrenamiento, la prueba consiste en ingresar el patrón de entrada (6 primeras columnas) y esperar que se tenga la salida deseada dada en el entrenamiento (última columna que debe ser igual o cercano a 1), vea la figura 4.10. Para esta ejecución se tiene que el valor devuelto por la red neuronal es muy cercano a 1, tal como se dio en el entrenamiento (la red neuronal aprendió). 174 Tópicos y Aplicaciones de la Inteligencia Artificial Tabla 4.2 Patrones de entrenamiento que permiten identificar si un animal es un mamífero (1) o un ave (0) 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 ¿Nada? 0 1 1 0 0 0 0 1 1 1 0 0 1 0 0 1 1 0 1 0 0 0 1 1 ¿Tiene plumas? ¿Pone huevos? ¿Vuela? ¿Toma leche? ¿Tiene pelo? Salida (1= Mamifer o 0=Ave) Entradas Entrenamiento de una red neuronal Entrenamiento de una red neuronal: ¿Tiene Pelo? ¿Toma leche? ¿Vuela? ¿Pone Huevos? ¿Tiene Plumas? ¿Nada? Salida Figura 4.9 Red neuronal que permite tomar los patrones de la tabla 4.2. Mg. Abraham Gamarra Moreno 175 Al ejecutar un programa que use el aprendizaje de esta red neuronal, con el último patrón de entrenamiento, se tiene que la salida también es correcta (figura 4.11). Figura 4.10 Resultado que muestra un programa que contiene a la red neuronal entrenada de la figura 4.9. Figura 4.11 Resultados que muestra otra ejecución del programa que contiene a la red neuronal entrenada de la figura 4.9. Para salidas binarias (0 ó 1), si la salida deseada es 1, un valor aceptable será cuando la salida sea mayor que 0.9 (salida>0.9); de la misma manera si la salida deseada es 0, un valor aceptable será cuando la salida sea menor que 0.1 (salida<0.1). Lo que debemos probar ahora es la capacidad de generalización de la red neuronal. Para realizar esta prueba, suministramos a la red neuronal, sólo la característica toma leche y la red neuronal generaliza e identifica a este como un mamífero (valor cercano o igual a 1). Debemos notar que estas entradas no han sido dadas en el entrenamiento, por lo que la respuesta que se obtiene, es por generalización, vea la figura 4.12. 176 Tópicos y Aplicaciones de la Inteligencia Artificial Figura 4.12 Resultados que muestra la genearlización del programa que contiene a la red neuronal entrenada de la figura 4.9. 4.5.2. ENTRENAMIENTO NO SUPERVISADO El aprendizaje no supervisado ocurre cuando la red es provista sólo de los valores de entrada, y la red ajusta la fuerza de interconexión basada solamente en los valores de la entrada y la salida de la red en progresión. En otras palabras, el proceso de entrenamiento extrae las propiedades estadísticas del conjunto de entrenamiento y agrupa vectores familiares en clases. Puesto que no es posible determinar el patrón de salida específico generado por una clase de vectores en forma previa al entrenamiento, se requiere transformar la salida generada por la red a una forma que sea comprensible. Este tipo de entrenamiento fue desarrollado por Kohonen (1984) y otros en lo que se conoce con el nombre de la teoría de la "autoorganización". 4.6. TIPOS DE REDES NEURONALES MÁS IMPORTANTES La tabla 4.3 muestra el resumen de los tipos de redes más conocidos, comentando esquemáticamente las aplicaciones más importantes de cada una, sus ventajas e inconvenientes y quién o quiénes fueron sus creadores y en qué año. Mg. Abraham Gamarra Moreno 177 Tabla 4.3. Tipos de redes más conocidos. 6 Nombre de la red Año Aplicaciones más importantes Comentarios Limitaciones Inventada/ Desarrollada por Avalancha 1967 Reconocimi ento de habla continua. Control brazos robot. Ninguna red sencilla puede hacer todo esto. No es fácil alterar la velocidad o interpolar el movimiento. Stephen Grossberg. Teoría resonancia adaptativa (ART) 1986 Reconocimiento de patrones (radar, Sonar, etc.). Sofisticada . Poco utilizada. Sensible a la translación, distorsión y escala. Gail Carpenter, Stephen Gressberg. ADALINE / MADALINE 1960 Filtrado de señales. Ecualizado r adaptativo. Modems. Rápida, fácil de implementar con circuitos analógicos o VLSI. Sólo es posible clasificar espacios linealmente separados. Bernand Widrow. Back propagation 1974- 85 Síntesis de voz desde texto. Control de robots. Predicción . Reconocimi ento de patrones. Red más popular. Numerosas aplicacione s con éxito. Facilidad de aprendizaje . Potente. Necesita mucho tiempo para el aprendizaje y muchos ejem- plos. Paul Werbos, David Parker, David Rumelhart. 6 Hilera J, Martinez V. Redes Neuronales Artificiales: Fundamentos, modelos y Aplicaciones. España: Editorial RA-MA; 1995. 178 Tópicos y Aplicaciones de la Inteligencia Artificial Tabla 4.3. Tipos de redes más conocidos (continuación) Nombre de la red Año Aplicaciones más importantes Comentarios Limitaciones Inventada/ Desarrollad a por Memoria asociativa bidireccional 1985 Memoria heteroasociat iva de acceso por contenido. Aprendiza.j e y arquitectur a simples. Baja capacidad de almacenamient o. Los datos deben ser codificados. Bart Kosko. Máquinas de Boltzmann y Cauchy 1985- 86 Reconocimi ento de patrones (imágenes, sonar y radar). Optimizaci ón. Redes simples. Capacidad de representac ión óptima de patrones. La máquina de Boltzmann necesita un tiempo muy largo de aprendizaje. Jeffrey Hinton, Terry Se- jnowski, Harold Szu. Brain-Estate-in-a- Box. 1977 Extracción de conocimiento de bases de datos Posiblement e mejor realización que las redes de Hopfield. Realización y potenciales aplicaciones no estudiadas totalmente. James Anderson Mg. Abraham Gamarra Moreno 179 Tabla 4.3. Tipos de redes más conocidos (continuación) Nombre de la red Año Aplicaciones más importantes Comentarios Limitaciones Inventada/ Desarrollad a por Cerebellatron 1969 Control del movimiento de los brazos de un robot. Semejante a Avalancha. Requiere complicadas entradas de control. David Marr, James Al- bus, Andres Pellionez. Counter- propagation 1986 Comprensión de imágenes. Combinación de Perceptron y TPM. Numerosas neuronas y conexiones. Robert Hecht- Nielsen Hopfield 1982 Reconstrucció n de patrones y optimización. Puede implementar se en VLSI. Fácil de conceptuali zar Capacidad y estabilidad. John Hopfield Neocognitron 1978- 84 Reconocimient o de caracteres manuscritos Insensible a la Translación , rotación y escala. Requiere muchos elementos de proceso, niveles y conexiones. K. Fukushima Perceptron 1957 Reconocimient o de caracteres impresos La red más antigua. Construida en HW. No puede reconocer caracteres complejos. Frank Rosenblatt 180 Tópicos y Aplicaciones de la Inteligencia Artificial Tabla 4.3. Tipos de redes más conocidos (continuación) Nombre de la red Año Aplicaciones más importantes Comentarios Limitaciones Inventada/ Desarrollad a por Self- Organizing-Map (SOM). Topology- Preserving- Map (TPM). 1980- 84 Reconocimient o de patrones, codificación de datos, optimización. Realiza mapas de característ icas comunes de los datos aprendidos. Requiere mucho entrenamiento . Teuvo Kohonen 4.7. APLICACIONES DE LAS REDES NEURONALES Las redes neuronales son una tecnología computacional emergente que puede utilizarse en un gran número y variedad de aplicaciones, tanto comerciales como militares. Se pueden desarrollar redes neuronales en un período de tiempo razonable y pueden realizar tareas concretas mejor que otras tecnologías convencionales, incluyendo los sistemas expertos. Cuando se implementan mediante hardware (redes neuronales en chips VLSI), presentan una alta tolerancia a fallos del sistema y proporcionan un grado de paralelismo en el proceso de datos muy grande. Eso hará posible insertar redes neuronales de bajo coste en sistemas existentes y recientemente desarrollados. Hay muchos tipos diferentes de redes neuronales, cada uno de los cuales tiene una aplicación particular más apropiada. Relacionamos ejemplos de algunas aplicaciones comerciales separándolas en grupos según las distintas disciplinas: Biología • Aprender más acerca del cerebro y otros sistemas. • Obtención de modelos de la retina. Empresa • Evaluación de probabilidad de formaciones geológicas y petrolíferas. • Identificación de candidatos para posiciones específicas. • Explotación de bases de datos. • Optimización de plazas y horarios en líneas de vuelo. • Reconocimiento de caracteres escritos. Mg. Abraham Gamarra Moreno 181 Medio ambiente • Analizar tendencias y patrones. • Previsión del tiempo. Finanzas • Previsión de la evolución de los precios. • Valoración del riesgo de los créditos. • Identificación de falsificaciones. • Interpretación de firmas. Manufacturación • Robots automatizados Y sistemas de control (visión artificial y sensores de presión, temperatura, gas, etc.) • Control de producción en líneas de proceso. • Inspecci6n de la calidad. Medicina • Analizadores del habla para la ayuda de audición de sordos profundos. • Diagnóstico y tratamiento a partir de síntomas y/o de datos analíticos (electrocardiograma, encefalograma, análisis sanguíneo, etc.). • Monitorización en cirugía. • Predicción de reacciones adversas a los medicamentos. • Lectores de rayos X. • Entendimiento de la causa de los ataques epilépticos. Militares • Clasificación de las señales de radar. • Creación de armas inteligentes. • Optimización del uso de recursos escasos. • Reconocimiento y seguimiento en el tiro al blanco. 182 Tópicos y Aplicaciones de la Inteligencia Artificial Podemos buscar hechos comunes en esta lista de aplicaciones; la mayoría de ellas consisten en realizar un reconocimiento de patrones: buscar un patrón en una serie de ejemplos, clasificar patrones, completar una señal a partir de valores parciales o reconstruir el patrón correcto partiendo de uno distorsionado. Muchos de los ejemplos tienen que trabajar con datos sensoriales y de percepción (señales visuales, auditivas y otras) y, otros realizan filtrado o mapeo de señales de entrada. En general, los ejemplos mostrados indican que son característicos más de las personas que de los ordenadores convencionales. 4.8. LA RED BACKPROPAGATION 6 En 1986, Rumelhart, Hinton y Williams, basándose en los trabajos de otros investigadores formalizaron un método para que una red neuronal aprendiera la asociación que existe entre los patrones de entrada a la misma y las clases correspondientes, utilizando más niveles de neuronas que los que utilizó Rosenblatt para desarrollar el Perceptron. Este método, conocido en general como backpropagation (propagación del error hacia atrás), está basado en la generalización de la regla delta y, a pesar de sus propias limitaciones, ha ampliado de forma considerable el rango de aplicaciones de las redes neuronales. El algoritmo de propagación hacia atrás. o retropropagación, es una regla de aprendizaje que se puede aplicar en modelos de redes con más de dos capas de células. Una característica importante de este algoritmo es la representación interna del conocimiento que es capaz de organizar en la capa intermedia de las células para conseguir cualquier correspondencia entre la entrada y la salida de la red. Ya se ha mostrado en este capítulo que en muchos casos, como la resolución del problema de la OR exclusiva, es imposible encontrar los pesos adecuados para establecer la correspondencia entre la entrada y la salida mediante una red sin capas intermedias. Con una capa de neuronas ocultas, sí es posible establecer dicha correspondencia. De forma simplificada, el funcionamiento de una red backpropagation (backpropagation net, BPN) consiste en un aprendizaje de un conjunto predefinido de pares de entradas-salidas dados como ejemplo, empleando un ciclo propagación-adaptación de dos fases: primero se aplica un patrón de entrada como estímulo para la primera capa de las neuronas de la red, se va propagando a través de todas las capas superiores hasta generar una salida, se compara el resultado obtenido en las neuronas de salida con la salida que se desea obtener y se calcula un valor del error para cada neurona de salida. A continuación, estos errores se transmiten hacia atrás, partiendo de la capa de salida, hacia todas las neuronas de la capa intermedia que contribuyan directamente a la salida, recibiendo el porcentaje de error aproximado a la participación de la neurona intermedia en la salida original. Este proceso se repite, capa por capa, hasta que todas las neuronas de la red hayan recibido un error que describa su aportación relativa al error total. Basándose en el valor del error recibido, se reajustan los pesos de conexión de cada neurona. de manera que en la siguiente vez que se presente el mismo patrón, la salida esté más cercana a la deseada; es decir, el error disminuya. Mg. Abraham Gamarra Moreno 183 La importancia de la red backpropagation consiste en su capacidad de autoadaptar los pesos de las neuronas de las capas intermedias para aprender la relación que existe entre un conjunto de patrones dados como ejemplo y sus salidas correspondientes. Para poder aplicar esa misma relación, después del entrenamiento, a nuevos vectores de entrada con ruido o incompletas, dando una salida activa si la nueva entrada es parecida a las presentadas durante el aprendizaje. Esta característica importante, que se exige a los sistemas de aprendizaje, es la capacidad de generalización, entendida como la facilidad de dar salidas satisfactorias a entradas que el sistema no ha visto nunca en su fase de entrenamiento. La red debe encontrar una representación interna que le permita generar las salidas deseadas cuando se le dan las entradas de entrenamiento, y que pueda aplicar, además, a entradas no presentadas durante la etapa de aprendizaje para clasificarlas según las características que compartan con los ejemplos de entrenamiento. 4.8.1. LA REGLA DELTA GENERALIZADA La regla propuesta por Widrow en 1960 (regla delta) ha sido extendida a redes con capas intermedias (regla delta generalizada) con conexiones hacia adelante (feedforward) y cuyas células tienen funciones de activación continuas (lineales o sigmoidales), dando lugar al algoritmo de retropropagación (backpropagation). Estas funciones continuas son no decrecientes y derivables. La función sigmoidal pertenece a este tipo de funciones, a diferencia de la función escalón que se utiliza en el Perceptron, ya que esta última no es derivable en el punto en el que se encuentra la discontinuidad. Este algoritmo utiliza también una función o superficie de error asociada a la red, buscando el estado estable de mínima energía o de mínimo error a través del camino descendente de la superficie del error. Por ello, realimenta el error del sistema para realizar la modificación de los pesos en un valor proporcional al gradiente decreciente de dicha función de error. FUNCIONAMIENTO DEL ALGORITMO El método que sigue la regla delta generalizada para ajustar los pesos es exactamente el mismo que el de la regla delta utilizada en el Perceptron y, ADALINE; es decir, los pesos se actualizan de forma proporcional a la delta, o diferencia entre la salida deseada y la obtenida (∂ = sal. deseada - sal. obtenida). Dada una neurona (unidad U i ) y la salida que produce, y i (Figura 4.13), el cambio que se produce en el peso de la conexión que une la salida de dicha neurona con la unidad U j (w ji ) para un patrón de aprendizaje p determinado es: ( ) pi pj ji y t w ∂ = + ∆ α 1 184 Tópicos y Aplicaciones de la Inteligencia Artificial En donde el subíndice p se refiere al patron de aprendizaje concreto, y ∝ es la constante o tasa de aprendizaje. Figura 4.13 Conexión entre una neurona de una capa oculta con una neurona de salida. El punto en el que difieren la regla delta Generalizada de la regla delta es en el valor concreto de ∂ pj . Por otro lado, en las redes multinivel, a diferencia de las redes sin neuronas ocultas, en principio no se puede conocer la salida deseada de las neuronas de las capas ocultas para poder determinar los pesos en función del error cometido. Sin embargo, inicialmente sí podemos conocer la salida deseada de las neuronas de salida. Según esto, si consideramos la unidad U j de salida (Figura 4.13), entonces definimos ( ) ( ) j pj pj pj net f y d 1 ⋅ − = ∂ donde d pj es la salida deseada de la neurona j para el patrón p y net j es la entrada neta que recibe la neurona j. Esta fórmula es como la de la regla delta, excepto en lo que se refiere a la derivada de la función de transferencia. Este término representa la modificación que hay que realizar en la entrada que recibe la neurona j. En el caso de que dicha neurona no sea de salida, el error que se produce estará en función del error que se cometa en las neuronas que reciban como entrada la salida de dicha neurona. Esto es lo que se denomina procedimiento de propagación del error hacia atrás. Según esto, en el caso de que U j no sea una neurona de salida (ver Figura 4.14), el error que se produce está en función del error que se comete en las neuronas que reciben como entrada la salida de Uj: Mg. Abraham Gamarra Moreno 185 ( ) j kj k pk pj net f w 1 ⋅ | ¹ | \ | ⋅ ∂ = ∂ ∑ donde el rango de k cubre todas aquellas neuronas a las que está conectada la salida de U j. De esta forma, el error que se produce en una neurona oculta es la suma de los errores que se producen en las neuronas a las que está conectada la salida de ésta, multiplicando cada uno de ellos por el peso de la conexión. Figura 4.14 Conexiones entre neuronas de la capa oculta con la capa de salida. ADICIÓN DE UN MOMENTO EN LA REGLA DELTA GENERALIZADA El método de retropropagación del error, también conocido como del gradiente descendente, requiere un importante número de cálculos para lograr el ajuste de los pesos de la red. En la implementación del algoritmo, se toma una amplitud de paso que viene dada por la tasa de aprendizaje ∝. A mayor tasa de aprendizaje, mayor es la modificación de los pesos en cada iteración, con lo que el aprendizaje será más rápido, pero, por otro lado. puede dar lugar a oscilaciones. Rumelhart, Hinton y Williams sugirieron que para filtrar estas oscilaciones se añada en la expresión del incremento de los pesos un término (momento), β, de manera que dicha expresión quede: 186 Tópicos y Aplicaciones de la Inteligencia Artificial ( ) ( ) ( ) ( ) ( ) = − − + ∂ + = + 1 1 t w t w y t w t w ji ji pi pj ji ji β α ( ) ( ) t w y t w ji pi pj ji ∆ + ∂ = + ∆ = β α 1 donde β es una constante (momento) que determínale efecto en t+1 del cambio de los pesos en el instante t. Con este momento se consigue la convergencia de la red en menor número de iteraciones, ya que si en t el incremento de un peso era positivo y en t+l también, entonces el descenso por la superficie de error en t+l es mayor. Sin embargo, si en t el incremento era positivo y en t+l es negativo, el paso que se da en t+1 es más pequeño, lo cual es adecuado, ya que eso significa que se ha pasado por un mínimo y que los pasos deben ser menores para poder alcanzarlo. Resumiendo, el algoritmo backpropagation queda finalmente: ( ) ( ) ( ) [ ] 1 1 + ∆ + = + t w t w t w ji ji ji ( ) ( ) ( ) ( ¸ ( ¸ ∆ + ∂ + = + ∆ t w y t w t w ji pi pj ji ji β α 1 donde: ( ) ( ) j pj pj pj net f y d 1 ⋅ − = ∂ si U j es una neurona de salida y ( ) j kj k pk pj net f w 1 ⋅ | ¹ | \ | ⋅ ∂ = ∂ ∑ si U j no es una neurona de salida. ESTRUCTURA Y APRENDIZAJE DE LA RED BACKPROPAGATION En una red backpropagation existe una capa de entrada con n neuronas y una capa de salida con m neuronas y al menos una capa oculta de neuronas internas. Cada neurona de una capa (excepto las de entrada) recibe entradas de todas las neuronas de la capa anterior y envía su salida a todas las Mg. Abraham Gamarra Moreno 187 neuronas de la capa posterior (excepto las de salida). No hay conexiones hacia atrás feedback ni laterales entre neuronas de la misma capa. La aplicación del algoritmo backpropagation tiene dos fases, una hacia adelante y otra hacia atrás. Durante la primera fase el patrón de entrada es presentado a la red y propagado a través de las capas hasta llegar a la capa de salida. Obtenidos los valores de salida de la red, se inicia la segunda fase, comparándose estos valores con la salida esperada para obtener el error. Se ajustan los pesos de la última capa proporcionalmente al error. Se pasa a la capa anterior con una retropropagación del error (backpropagation), ajustando convenientemente los pesos y continuando con este proceso hasta llegar a la primera capa. De esta manera se han modificado los pesos de las conexiones de la red para cada ejemplo o patrón de aprendizaje del problema, del que conocíamos su valor de entrada y la salida deseada que debería generar la red ante dicho patrón (fig. 4.15). A diferencia de la regla delta en el caso del Perceptron, la técnica backpropagation o generalización de la regla delta, requiere el uso de neuronas cuya función de activación sea continua, y por tanto, diferenciable. Generalmente, la función utilizada será del tipo sigmoidal (Fig. 4.16). A continuación se presentan, a modo de síntesis. los pasos y fórmulas a utilizar para aplicar el algoritmo de entrenamiento: Paso 1 Inicializar los pesos de la red con valores pequeños aleatorios. Paso 2 Presentar un patrón de entrada, Xp: xp1,.xp2,...,xpn, y especificar la salida deseada que debe generar la red: d1, d2,..., dM (si la red se utiliza como un clasificador, todas las salidas deseadas serán cero, salvo una, que será la de la clase a la que pertenece el patrón de entrada). Paso 3 Calcular la salida actual de la red, para ello presentamos las entradas a la red y vamos calculando la salida que presenta capa hasta llegar a la capa de salida ésta será la salida de la red y1, y2,...,yM. Los pasos son los siguientes: • Se calculan las entradas netas para las neuronas ocultas procedentes de las neuronas de entrada. Para una neurona j oculta: ∑ = + = N i h j pi h ji h pj x w net 1 θ 188 Tópicos y Aplicaciones de la Inteligencia Artificial en donde el índice h se refiere a magnitudes de la capa oculta (hidden); el subíndice p, al p-ésimo vector de entrenamiento, y j a la j-ésima neurona oculta. El término θ puede ser opcional, pues actúa como una entrada más. Figura 4.15 Modelo de arquitectura de una red backpropagation. Pueden existir neuronas ficticias de salida y pesos umbral θ θθ θ de entrada al resto de las neuronas de cada capa. Mg. Abraham Gamarra Moreno 189 Figura 4.16 Función de activación sigmoidal: y=1/1+e -x • Se calculan las salidas de las neuronas ocultas: ( ) h pj h j pj net f y = • Se realizan los mismos cálculos para obtener las salidas de las neuronas de salida (capa o: output) ∑ = + ⋅ = L j o k pj o kj o pk y w net 1 θ ( ) o pk o k pk net f y = Paso 4 Calcular los términos de error para todas las neuronas. Si la neurona k es una neurona de la capa de salida, el valor de la delta es: 190 Tópicos y Aplicaciones de la Inteligencia Artificial ( ) ( ) o pk o k pk pk o pk net f y d 1 ⋅ − = ∂ La función f, como se citó anteriormente, debe cumplir el requisito de ser derivable, lo que implica la imposibilidad de utilizar una función escalón. En general, disponemos de dos formas de función de salida que nos pueden servir: la función lineal de salida (f k (net jk ) = net jk ) y la función sigmoidal representada en la figura 4.16 y definida por la expresión: ( ) jk net jk k e net f − + = 1 1 La selección de la función de salida depende de la forma en que se decida representar los datos de salida: si se desea que las neuronas de salida sean binarias, se utiliza la función sigmoidal, puesto que esta función es casi biestable y, además, derivable. En otros casos es tan aplicable una función como otra. Para la función lineal, tenemos: 1 1 = o k f mientras que la derivada de una función f sigmoidal es: ( ) ( ) pk pk o k o k o k y y f f f − = − = 1 1 1 por lo que los términos de error para las neuronas de salida quedan: ( ) pk pk o pk y d − = ∂ para la salida lineal, y ( ) ( ) pk pk pk pk o pk y y y d − ⋅ − = ∂ 1 para la salida sigmoidal. Si la neurona j no es de salida, entonces la derivada parcial del error no puede ser evaluada directamente. Por tanto, se obtiene el desarrollo a partir de valores que son conocidos y otros que pueden ser evaluados. La expresión obtenida en este caso es: Mg. Abraham Gamarra Moreno 191 ( ) o kj k o pk h pj h j h pj w net f ⋅ ∂ = ∂ ∑ 1 donde observamos que el error en las capas ocultas depende de todos los términos de error de la capa de salida. De aquí surge el término de propagación hacia atrás. En particular, para la función sigmoidal: donde k se refiere a todas las neuronas de la capa superior a la de la neurona j. Así, el error que se produce en una neurona oculta es proporcional a la suma de los errores conocidos que se producen en las neuronas a las que está conectada la salida de ésta, multiplicado cada uno de ellos por el peso de la conexión. Los umbrales internos de las neuronas se adaptan de forma similar, considerando que están conectados con pesos desde entradas auxiliares de valor constante. Paso 5 Actualización de los pesos Para ello, utilizamos el algoritmo recursivo, comenzando por las neuronas de salida y trabajando hacia atrás hasta llegar a la capa de entrada, ajustando los pesos de la forma siguiente: Para los pesos de las neuronas de la capa de salida: ( ) ( ) ( ) 1 1 + ∆ + = + t w t w t w o kj o kj o kj ( ) pj o pk o kj y t w ⋅ ∂ ⋅ = + ∆ α 1 y para los pesos de las neuronas de la capa oculta: ( ) ( ) ( ) 1 1 + ∆ + = + t w t w t w h ji h ji h ji ( ) pi h pj h ji x t w ⋅ ∂ ⋅ = + ∆ α 1 En ambos casos, para acelerar el proceso de aprendizaje, se puede añadir un término momento de valor: ( ) ( ) ( ) 1 − − t w t w o kj o kj β ( ) o kj k o pk pj pj h pj w y y ⋅ ∂ − = ∂ ∑ 1 192 Tópicos y Aplicaciones de la Inteligencia Artificial en el caso de la neurona de salida, y ( ) ( ) ( ) 1 − − t w t w h ji h ji β cuando se trata de una neurona oculta. Paso 6 El proceso se repite hasta que el término de error ∑ = ∂ = M k pk p E 1 2 2 1 resulta aceptablemente pequeño para cada uno de los patrones aprendidos. 4.9. IMPLEMENTACIÓN DE APLICACIONES CON REDES NEURONALES Para la implementación de aplicaciones se utiliza el shell NEUROSHELL y el Visual Basic .NET. 4.9.1. DETECCIÓN DE OBSTÁCULOS POR MEDIO DE UN ROBOT Descripción del problema 7 : Un robot es un dispositivo automático que realiza acciones específicas, que dependen de las necesidades del proceso en que se encuentre involucrado, en este caso se tiene un robot que cuenta con cuatro sensores de proximidad en distintas ubicaciones que permanentemente detectan si hay objetos que se encuentren a una distancia superior o inferior a la preestablecida, con base en esto se decide si dar marcha adelante o atrás a cada uno de los dos motores que posee; en las lecturas de los sensores podrían darse 16 posibles combinaciones (16=2 4 ) y para cada combinación cada uno de los dos motores podría dar marcha adelante o marcha atrás (figura 4.17). El comportamiento del robot lo describe la tabla 4.4, cuando los sensores detecten un objeto que se encuentra a una distancia inferior a la predeterminada se dirá que el objeto se encuentra cerca y esto se representa por medio de un 1 y cuando se detecte un objeto que se encuentra a una distancia mayor que la predeterminada se dirá que el objeto esta lejos lo cual se indica con un –1; dependiendo de estas lecturas los motores podrán dar 7 Universidad Tecnológica de Pereira. Colombia. Mg. Abraham Gamarra Moreno 193 marcha adelante, lo que se representará por un 1 o dar marcha atrás con un – 1. Figura 4.17 Robot Tabla 4.4 Comportamiento del robot S1 S2 S3 S4 M1 M2 1 1 1 1 -1 -1 -1 1 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 1 -1 1 1 -1 1 -1 1 1 1 1 -1 1 -1 Justificación del tipo de red Este tipo de problema generalmente es resuelto suministrándole al robot una base de datos que contiene todas las posibles situaciones que se podrían presentarse y sus respectivas soluciones, en este caso se necesitaría almacenar las respuestas para ambos motores ante las 16 posibles combinaciones en las lecturas de los sensores, cuando el número de variables de entrada y el número de salidas es mucho mayor, la cantidad de datos necesarios para especificar cada posible situación crece indefinidamente, debido a esto se requerirían dispositivos con gran capacidad de 194 Tópicos y Aplicaciones de la Inteligencia Artificial almacenamiento; en contraste una red neuronal puede entrenarse con un número representativo de patrones y aprender el comportamiento del sistema utilizando dispositivos de menos capacidad de almacenamiento y costo. IMPLEMENTACION EN NEUROSHELL El ingreso al programa al NEUROSHELL se muestra en la figura 4.18. Figura 4.18 Ingreso al Neuroshell Luego del ingreso elija FILE, NEW e ingrese un nombre de archivo, como en la figura 4.19 (no escriba ninguna extensión para el archivo). Figura 4.19. Elija Beginner´s Neural Networks, realice click en el icono (figura 4.20). Mg. Abraham Gamarra Moreno 195 Figura 4.20 Seleccione Data Entry (figura 4.21) e ingrese los datos de la tabla 4.4, para entrenar la red neuronal (figura 4.22). Se sugiere para el entrenamiento duplicar estos datos dos veces salvo el titulo de cada columna. Figura 4.21 196 Tópicos y Aplicaciones de la Inteligencia Artificial Figura 4.22 Luego de ingresar los datos cierre la ventana después de haber grabado estos con File, Save File. Ahora elija el icono en la figura 4.21, en la lista desplegable variable type selection elija input y haga clic debajo del nombre de cada entrada, este quedará marcado con I, luego elija Actual Output en la lista desplegable anterior y haga clic en el nombre de cada salida para la red neuronal. Ahora elija Settings y Compute mins/maxs. Cierre la ventana. Las figuras 4.23 al 4.29 muestran el procedimiento a seguir hasta generar el código fuente en C o Visual Basic. En la figura 4.26 elija examinar datos para analizar los datos y los errores generados a la salida. El procedimiento de la figura 4.27 al 4.29 permite generar el código fuente en C. Para nuestro caso elegiremos Visual Basic source code. Mg. Abraham Gamarra Moreno 197 Figura 4.23 Figura 4.24 198 Tópicos y Aplicaciones de la Inteligencia Artificial Figura 4.25 Figura 4.26 Mg. Abraham Gamarra Moreno 199 Figura 4.27 Figura 4.28 200 Tópicos y Aplicaciones de la Inteligencia Artificial Figura 4.29 El codigo generado en Visual Basic se genera en un archivo que tiene la extensión .VB y es un procedimiento en Visual Basic; que contiene el conocimiento en una red neuronal. Para nuestro caso el archivo es ROBOT.VB y se encuentra en la carpeta APLICACIÓN ROBOT del CD que acompaña al libro, cuyo contenido es: ' Insert this code into your VB program to fire the D:\ABRAHAM\FILES2~2\EPG\MAESTA~1\IA\ROBOT network ' This code is designed to be simple and fast for porting to any machine. ' Therefore all code and weights are inline without looping or data storage ' which might be harder to port between compilers. Sub Fire_ROBOT (inarray(), outarray()) Dim netsum as double Static feature2(3) as double ' inarray(1) is S1 ' inarray(2) is S2 ' inarray(3) is S3 ' inarray(4) is S4 ' outarray(1) is M1 ' outarray(2) is M2 if (inarray(1)<-1) then inarray(1) = -1 if (inarray(1)> 1) then inarray(1) = 1 inarray(1) = (inarray(1) + 1) / 2 Mg. Abraham Gamarra Moreno 201 if (inarray(2)<-1) then inarray(2) = -1 if (inarray(2)> 1) then inarray(2) = 1 inarray(2) = (inarray(2) + 1) / 2 if (inarray(3)<-1) then inarray(3) = -1 if (inarray(3)> 1) then inarray(3) = 1 inarray(3) = (inarray(3) + 1) / 2 if (inarray(4)<-1) then inarray(4) = -1 if (inarray(4)> 1) then inarray(4) = 1 inarray(4) = (inarray(4) + 1) / 2 netsum = -.7532668 netsum = netsum + inarray(1) * 7.551737 netsum = netsum + inarray(2) * .2998328 netsum = netsum + inarray(3) * 7.341322 netsum = netsum + inarray(4) * -6.852577 feature2(1) = 1 / (1 + exp(-netsum)) netsum = -2.495483 netsum = netsum + inarray(1) * -5.648689 netsum = netsum + inarray(2) * 1.05053 netsum = netsum + inarray(3) * -5.979871 netsum = netsum + inarray(4) * 6.870361 feature2(2) = 1 / (1 + exp(-netsum)) netsum = -4.198974E-02 netsum = netsum + inarray(1) * 4.999131 netsum = netsum + inarray(2) * -3.897346 netsum = netsum + inarray(3) * 2.603323E-05 netsum = netsum + inarray(4) * -3.897321 feature2(3) = 1 / (1 + exp(-netsum)) netsum = .1287855 netsum = netsum + feature2(1) * -2.675452 netsum = netsum + feature2(2) * -2.65109 netsum = netsum + feature2(3) * 6.387748 outarray(1) = 1 / (1 + exp(-netsum)) netsum = 3.821959 netsum = netsum + feature2(1) * -6.030695 netsum = netsum + feature2(2) * 3.957484 netsum = netsum + feature2(3) * 8.61486E-03 outarray(2) = 1 / (1 + exp(-netsum)) outarray(1) = 2 * (outarray(1) - .1) / .8 + -1 if (outarray(1)<-1) then outarray(1) = -1 if (outarray(1)> 1) then outarray(1) = 1 outarray(2) = 2 * (outarray(2) - .1) / .8 + -1 if (outarray(2)<-1) then outarray(2) = -1 if (outarray(2)> 1) then outarray(2) = 1 End Sub 202 Tópicos y Aplicaciones de la Inteligencia Artificial Ahora debemos generar una aplicación en Visual Basic 6.0, que nos permita utilizar el código que contiene a la red neuronal. Iniciamos creando un formulario que permita manipular las entradas y salidas que tiene la red neuronal (figura 4.30). Figura 4.30. Formulario en Visual Basic que manipula las entradas y salidas de la red neuronal. Luego modificamos el código por defecto que tiene el formulario. El código modificado debe quedar tal como se muestra en el listado siguiente: Private Sub Command1_Click() Dim e(4) As Double Dim s(2) As Double ' Asignacion de entradas e(1) = Val(Text1.Text) e(2) = Val(Text2.Text) e(3) = Val(Text3.Text) e(4) = Val(Text4.Text) ' llamada a la red neuronal Call Fire_ROBOT(e, s) ' mostrar salida If (s(1) >= 0.9 And s(1) <= 1) Then Text5.Text = " motor gira hacia adelante" End If If (s(1) >= -1 And s(1) <= -0.9) Then Text5.Text = " motor gira hacia atrás" End If If (s(2) >= 0.9 And s(2) <= 1) Then Text6.Text = " motor gira hacia adelante" End If Mg. Abraham Gamarra Moreno 203 If (s(2) >= -1 And s(2) <= -0.9) Then Text6.Text = " motor gira hacia atrás" End If End Sub ' Insert this code into your VB program to fire the D:\ABRAHAM\FILES2~2\EPG\MAESTA~1\IA\ROBOT network ' This code is designed to be simple and fast for porting to any machine. ' Therefore all code and weights are inline without looping or data storage ' which might be harder to port between compilers. Sub Fire_ROBOT(inarray() As Double, outarray() As Double) Dim netsum As Double Static feature2(3) As Double ' inarray(1) is S1 ' inarray(2) is S2 ' inarray(3) is S3 ' inarray(4) is S4 ' outarray(1) is M1 ' outarray(2) is M2 If (inarray(1) < -1) Then inarray(1) = -1 If (inarray(1) > 1) Then inarray(1) = 1 inarray(1) = (inarray(1) + 1) / 2 If (inarray(2) < -1) Then inarray(2) = -1 If (inarray(2) > 1) Then inarray(2) = 1 inarray(2) = (inarray(2) + 1) / 2 If (inarray(3) < -1) Then inarray(3) = -1 If (inarray(3) > 1) Then inarray(3) = 1 inarray(3) = (inarray(3) + 1) / 2 If (inarray(4) < -1) Then inarray(4) = -1 If (inarray(4) > 1) Then inarray(4) = 1 inarray(4) = (inarray(4) + 1) / 2 netsum = -0.7532668 netsum = netsum + inarray(1) * 7.551737 netsum = netsum + inarray(2) * 0.2998328 netsum = netsum + inarray(3) * 7.341322 netsum = netsum + inarray(4) * -6.852577 feature2(1) = 1 / (1 + Exp(-netsum)) netsum = -2.495483 netsum = netsum + inarray(1) * -5.648689 netsum = netsum + inarray(2) * 1.05053 netsum = netsum + inarray(3) * -5.979871 netsum = netsum + inarray(4) * 6.870361 feature2(2) = 1 / (1 + Exp(-netsum)) netsum = -0.04198974 netsum = netsum + inarray(1) * 4.999131 netsum = netsum + inarray(2) * -3.897346 netsum = netsum + inarray(3) * 0.00002603323 netsum = netsum + inarray(4) * -3.897321 feature2(3) = 1 / (1 + Exp(-netsum)) netsum = 0.1287855 204 Tópicos y Aplicaciones de la Inteligencia Artificial netsum = netsum + feature2(1) * -2.675452 netsum = netsum + feature2(2) * -2.65109 netsum = netsum + feature2(3) * 6.387748 outarray(1) = 1 / (1 + Exp(-netsum)) netsum = 3.821959 netsum = netsum + feature2(1) * -6.030695 netsum = netsum + feature2(2) * 3.957484 netsum = netsum + feature2(3) * 0.00861486 outarray(2) = 1 / (1 + Exp(-netsum)) outarray(1) = 2 * (outarray(1) - 0.1) / 0.8 + -1 If (outarray(1) < -1) Then outarray(1) = -1 If (outarray(1) > 1) Then outarray(1) = 1 outarray(2) = 2 * (outarray(2) - 0.1) / 0.8 + -1 If (outarray(2) < -1) Then outarray(2) = -1 If (outarray(2) > 1) Then outarray(2) = 1 End Sub Private Sub Command2_Click() End End Sub Notese que también se ha agregado el código generado por el Neuroshell (contenido del archivo ROBOT.VB) Una vez modificado el código ejecutamos el programa e ingresamos las entradas de la red neuronal y al presionar el boton “Determinar la accion de los motores del robot con una red neuronal” se debe obtener la salida que ofrece la red neuronal. Para nuestro caso se ha realizado la ejecución con las entradas del último patrón de entrenamiento de la tabla 4.4, esta ejecución se muestra en la figura 4.31. Figura 4.31. Ejecución del programa que utiliza la red neuronal. Mg. Abraham Gamarra Moreno 205 Cabe mencionar que las salidas de la red neuronal son cercanas o iguales a 1 ó -1 y se debe aproximar estas salidas a estos valores. Esta aproximación se realiza a través del siguiente código: If (s(1) >= 0.9 And s(1) <= 1) Then Text5.Text = " motor gira hacia adelante" End If If (s(1) >= -1 And s(1) <= -0.9) Then Text5.Text = " motor gira hacia atrás" End If If (s(2) >= 0.9 And s(2) <= 1) Then Text6.Text = " motor gira hacia adelante" End If If (s(2) >= -1 And s(2) <= -0.9) Then Text6.Text = " motor gira hacia atrás" End If 4.9.2. APLICACIÓN PARA SÍNTOMAS Y DIAGNÓSTICOS DE AUTOMÓVILES Consideremos un ejemplo concreto de aplicación de síntomas y diagnósticos. Emplearemos Como base para nuestro ejemplo una aplicación de diagnóstico para automóviles. Concretamente, nos concentraremos en una aplicación que diagnostique por qué no arranca un coche. Primero se definen los distintos síntomas que hay que considerar: • No hace nada: no pasa nada cuando se hace girar la llave del contacto. • Hace clic: cuando se da vuelta a la llave, se oyen fuertes chasquidos. • Molinillo: cuando se da vuelta a la llave se oye un ruido parecido al de un molinillo. • Arranque: el motor gira como si intentase arrancar, pero no es capaz de funcionar por sí mismo. • Sin chispa: al sacar el cable de una bujía y acercarlo al bloque cuando se intenta arrancar, en el motor no saltan chispas. • Cable caliente: después de intentar arrancar el motor, el cable que va de la batería a la bobina del motor de arranque está caliente. • Sin gasolina: al sacar el tubo de gasolina del carburador (o inyector) e intentar arrancar el motor, no sale gasolina por el tubo. A continuación, se consideran las posibles causas del problema, basándose en los síntomas: • Batería: la batería está descargada 206 Tópicos y Aplicaciones de la Inteligencia Artificial • Bobina del motor de arranque: falla la bobina del motor de arranque. • Motor de arranque: falla el motor de arranque. • Cables: fallan los cables del encendido. • Distribuidor: el rotor o la tapa del distribuidor están corroídos. • Bomba de gasolina: falla la bomba de gasolina. Aunque nuestra lista no es una representación Completa de todos los posibles problemas, los síntomas podrían indicar alguno de estos problemas, o una combinación de ellos. Para completar el ejemplo vamos a construir una matriz que indica la correspondencia de los síntomas con sus causas probables. La matriz se ha ilustrado en la Tabla 4.5. Al inspeccionar la matriz se aprecia la variedad de problemas que puede indicar cualquier síntoma. La matriz también ilustra el problema que encontramos cuando se intenta programar un sistema para llevar a cabo la función de diagnóstico. Es raro que haya una correspondencia biunívoca entre síntomas y causas. Para tener éxito, nuestro sistema automatizado debe ser capaz de correlacionar muchos síntomas distintos, y, en el caso de que alguno de los síntomas no se aprecie o esté ausente, debe ser capaz de "llenar los espacios en blanco" del problema basándose solamente en los síntomas indicados. Tabla 4.5. Para el problema de diagnósticos del automóvil, se hacen corresponder los síntomas con las causas. Causas probables Síntomas Batería Bobina Motor de arranque Cables Distribuidor Bomba de gasolina No hace nada X Clics X X X Molinillo X X X X Gira X X X Sin chispa X X Cable caliente X X Sin gasolina X La solución Empleando los datos de nuestro ejemplo, será necesaria una red con siete unidades de entrada y seis unidades de salida. Esto deja únicamente sin determinar el número de unidades internas (ocultas). En este caso, no hay nada que indique cuántas unidades ocultas se van a necesitar para resolver el problema, y no hay consideraciones de interfaz externa que vayan a limitar el número de unidades ocultas. Mg. Abraham Gamarra Moreno 207 Una ecuación empírica según Sierra 8 , para calcular el número de neuronas de una capa oculta es: N M n N M * 2 * 2 < < donde: M: Es el número de ejemplos con que vamos a entrenar a la red. N: Es el número de unidades de entradas. n: Es el número de neuronas que vamos a situar en capas intermedias El shell Neuroshell calcula la cantidad de neuronas ocultas para la red neuronal que se esta implementando. A continuación, debemos definir los conjuntos de datos que serán utilizados para entrenar a la red. Volviendo de nuevo a la matriz de nuestro ejemplo, se pueden considerar los datos de los vectores fila de la matriz como tramas de entrada de siete dimensiones; esto es, para cada salida de causa probable que desearíamos que aprendiera la red, hay siete síntomas posibles que indican el problema por su presencia o ausencia. Esta aproximación proporcionará siete pares de vectores de entrenamiento, cada uno de los cuales consta de una trama de síntomas de siete elementos y de una trama de indicación de problema formada por seis elementos. Haremos que la existencia de un síntoma quede indicada por un 1, y que la ausencia de un síntoma sea representada mediante un 0. Para cualquier vector de entrada dado, la causa o causas correctas se indican mediante un 1 lógico en la posición correspondiente del vector de salida. Los pares de vectores de entrenamiento que se producen por la correspondencia de la matriz de síntomas y problemas para este ejemplo se muestran en la tabla 4.6. Si se comparan las tablas 4.5 y la tabla 4.6., se notarán pequeñas diferencias. Lo único que queda ahora es entrenar a la red con estos pares de datos. Una vez que está entrenada, la red producirá una salida que identifique a la causa probable indicada por el mapa de síntomas de entrada. La red hará esto cuando la entrada sea equivalente a una de las entradas de entrenamiento, tal como se esperaba, y además producirá una salida, indicando la causa probable del problema, cuando la entrada sea parecida a alguna de las entradas de entrenamiento, pero distinta de todas ellas. Esta aplicación ilustra la capacidad de la red para realizar la "mejor suposición" (generalización) y pone de manifiesto la capacidad de la red para enfrentarse a entradas de datos con ruido o incompletas. 1. 8 Sierra Molina, Guillermo y otros (1995). “Sistemas Expertos en Contabilidad y Administración de Empresas”. Editorial Addison Wesley. USA. 208 Tópicos y Aplicaciones de la Inteligencia Artificial Tabla 4.6. Estos pares de vectores de entrenamiento se utilizan para el problema de diagnósticos del automóvil. Entrada de síntomas Salida de causas probables N o h a c e n a d a C l i c s M o l i n i l l o G i r a S i n c h i s p a C a b l e c a l i e n t e S i n g a s o l i n a B a t e r í a B o b i n a M o t o r d e a r r a n q u e C a b l e s D i s t r i b u i d o r B o m b a d e g a s o l i n a 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 Se puede utilizar el Neuroshell, para entrenar a la red neuronal con los datos de la tabla 4.6 y se debe obtener también el codigo fuente en Visual Basic. La implementacion se encuentra en el CD que se adjunta al libro. El formulario y la ejecución del programa en Visual Basic 6.0, teniendo en cuenta el 4to patron de entrenamiento se muestra en la figura 4.32. Figura 4.32. Ejecución del programa en Visual Basic 6.0, teniendo en cuenta el 4 patron de entrenamiento de la tabla 4.6. El codigo del formulario debe ser modificado de la siguiente manera: Mg. Abraham Gamarra Moreno 209 Private Sub Command1_Click() Dim e(7) As Double Dim s(6) As Double e(1) = Val(Text1.Text) e(2) = Val(Text2.Text) e(3) = Val(Text3.Text) e(4) = Val(Text4.Text) e(5) = Val(Text5.Text) e(6) = Val(Text6.Text) e(7) = Val(Text7.Text) Call Fire_DIAGNOST(e, s) If (s(1) > 0.9 And s(1) <= 1) Then Text8.Text = "mal" End If If (s(1) >= 0 And s(1) < 0.1) Then Text8.Text = "bien" End If If (s(2) > 0.9 And s(2) <= 1) Then Text9.Text = "mal" End If If (s(2) >= 0 And s(2) < 0.1) Then Text9.Text = "bien" End If If (s(3) > 0.9 And s(3) <= 1) Then Text10.Text = "mal" End If If (s(3) >= 0 And s(3) < 0.1) Then Text10.Text = "bien" End If If (s(4) > 0.9 And s(4) <= 1) Then Text11.Text = "mal" End If If (s(4) >= 0 And s(4) < 0.1) Then Text11.Text = "bien" End If If (s(5) > 0.9 And s(5) <= 1) Then Text12.Text = "mal" End If If (s(5) >= 0 And s(5) < 0.1) Then Text12.Text = "bien" End If If (s(6) > 0.9 And s(6) <= 1) Then Text13.Text = "mal" End If If (s(6) >= 0 And s(6) < 0.1) Then Text13.Text = "bien" End If End Sub 210 Tópicos y Aplicaciones de la Inteligencia Artificial ' Insert this code into your VB program to fire the F:\FILES2~1\ANNOSA~1\ARCHIV~2\CAPITU~3\DIAGNO~1\DIAGNOST network ' This code is designed to be simple and fast for porting to any machine. ' Therefore all code and weights are inline without looping or data storage ' which might be harder to port between compilers. Sub Fire_DIAGNOST(inarray() As Double, outarray() As Double) Dim netsum As Double Static feature2(9) As Double ' inarray(1) is No_hace_Nada ' inarray(2) is Hace_Clics ' inarray(3) is Molinillo ' inarray(4) is Gira ' inarray(5) is Sin_chispa ' inarray(6) is Cable_caliente ' inarray(7) is Sin_gasolina ' outarray(1) is Batería ' outarray(2) is Bobina ' outarray(3) is Motor_de_arranque ' outarray(4) is Cables ' outarray(5) is Distribuidor ' outarray(6) is Bomba_de_gasolina If (inarray(1) < 0) Then inarray(1) = 0 If (inarray(1) > 1) Then inarray(1) = 1 inarray(1) = inarray(1) If (inarray(2) < 0) Then inarray(2) = 0 If (inarray(2) > 1) Then inarray(2) = 1 inarray(2) = inarray(2) If (inarray(3) < 0) Then inarray(3) = 0 If (inarray(3) > 1) Then inarray(3) = 1 inarray(3) = inarray(3) If (inarray(4) < 0) Then inarray(4) = 0 If (inarray(4) > 1) Then inarray(4) = 1 inarray(4) = inarray(4) If (inarray(5) < 0) Then inarray(5) = 0 If (inarray(5) > 1) Then inarray(5) = 1 inarray(5) = inarray(5) If (inarray(6) < 0) Then inarray(6) = 0 If (inarray(6) > 1) Then inarray(6) = 1 inarray(6) = inarray(6) If (inarray(7) < 0) Then inarray(7) = 0 If (inarray(7) > 1) Then inarray(7) = 1 inarray(7) = inarray(7) netsum = -0.3115481 netsum = netsum + inarray(1) * 0.7032344 netsum = netsum + inarray(2) * 0.1466639 netsum = netsum + inarray(3) * 2.036957 netsum = netsum + inarray(4) * -0.4733835 netsum = netsum + inarray(5) * -0.4653012 netsum = netsum + inarray(6) * -1.454124 netsum = netsum + inarray(7) * -0.7716009 Mg. Abraham Gamarra Moreno 211 feature2(1) = 1 / (1 + Exp(-netsum)) netsum = -0.007483043 netsum = netsum + inarray(1) * -0.7950581 netsum = netsum + inarray(2) * -1.6701 netsum = netsum + inarray(3) * 1.082342 netsum = netsum + inarray(4) * 0.8707346 netsum = netsum + inarray(5) * -0.3615806 netsum = netsum + inarray(6) * -0.6289499 netsum = netsum + inarray(7) * 0.9206671 feature2(2) = 1 / (1 + Exp(-netsum)) netsum = 0.3411922 netsum = netsum + inarray(1) * 1.407685 netsum = netsum + inarray(2) * 1.998027 netsum = netsum + inarray(3) * -1.747856 netsum = netsum + inarray(4) * -1.269704 netsum = netsum + inarray(5) * -2.329731 netsum = netsum + inarray(6) * 1.356552 netsum = netsum + inarray(7) * 1.647663 feature2(3) = 1 / (1 + Exp(-netsum)) netsum = -0.2768248 netsum = netsum + inarray(1) * 2.065744 netsum = netsum + inarray(2) * -1.146601 netsum = netsum + inarray(3) * -0.9325874 netsum = netsum + inarray(4) * -1.517177 netsum = netsum + inarray(5) * 0.2812504 netsum = netsum + inarray(6) * -0.6556798 netsum = netsum + inarray(7) * 1.173773 feature2(4) = 1 / (1 + Exp(-netsum)) netsum = -0.1239126 netsum = netsum + inarray(1) * -1.830723 netsum = netsum + inarray(2) * 0.8275196 netsum = netsum + inarray(3) * 0.2012251 netsum = netsum + inarray(4) * -0.7351373 netsum = netsum + inarray(5) * 0.5414248 netsum = netsum + inarray(6) * 2.384689 netsum = netsum + inarray(7) * -1.566727 feature2(5) = 1 / (1 + Exp(-netsum)) netsum = 0.0145554 netsum = netsum + inarray(1) * -0.4000922 netsum = netsum + inarray(2) * -1.257582 netsum = netsum + inarray(3) * 0.8750437 netsum = netsum + inarray(4) * 1.78116 netsum = netsum + inarray(5) * 1.741183 netsum = netsum + inarray(6) * -2.168171 netsum = netsum + inarray(7) * -0.9200088 feature2(6) = 1 / (1 + Exp(-netsum)) netsum = 0.3624522 netsum = netsum + inarray(1) * -1.666589 netsum = netsum + inarray(2) * -2.92119 netsum = netsum + inarray(3) * 1.415627 netsum = netsum + inarray(4) * 0.1193302 netsum = netsum + inarray(5) * 0.3643235 netsum = netsum + inarray(6) * 1.332756 netsum = netsum + inarray(7) * 1.651392 212 Tópicos y Aplicaciones de la Inteligencia Artificial feature2(7) = 1 / (1 + Exp(-netsum)) netsum = -0.08557819 netsum = netsum + inarray(1) * 0.3886256 netsum = netsum + inarray(2) * -2.094244 netsum = netsum + inarray(3) * -1.564476 netsum = netsum + inarray(4) * 1.770092 netsum = netsum + inarray(5) * 0.9950833 netsum = netsum + inarray(6) * -1.562377 netsum = netsum + inarray(7) * 1.671334 feature2(8) = 1 / (1 + Exp(-netsum)) netsum = -0.2997127 netsum = netsum + inarray(1) * 1.399435 netsum = netsum + inarray(2) * -0.1395936 netsum = netsum + inarray(3) * -1.913407 netsum = netsum + inarray(4) * -0.9458458 netsum = netsum + inarray(5) * 2.404087 netsum = netsum + inarray(6) * 0.6442617 netsum = netsum + inarray(7) * -1.377198 feature2(9) = 1 / (1 + Exp(-netsum)) netsum = 0.8538765 netsum = netsum + feature2(1) * 1.642975 netsum = netsum + feature2(2) * -1.08525 netsum = netsum + feature2(3) * 1.692052 netsum = netsum + feature2(4) * 0.5226364 netsum = netsum + feature2(5) * -1.016138 netsum = netsum + feature2(6) * 0.3381723 netsum = netsum + feature2(7) * -4.312466 netsum = netsum + feature2(8) * -0.8845294 netsum = netsum + feature2(9) * 0.3042739 outarray(1) = 1 / (1 + Exp(-netsum)) netsum = 0.6356097 netsum = netsum + feature2(1) * -1.699543 netsum = netsum + feature2(2) * -0.8347372 netsum = netsum + feature2(3) * 1.740408 netsum = netsum + feature2(4) * -2.244962 netsum = netsum + feature2(5) * 2.778615 netsum = netsum + feature2(6) * -1.380548 netsum = netsum + feature2(7) * -1.0302 netsum = netsum + feature2(8) * -1.023457 netsum = netsum + feature2(9) * -0.1288214 outarray(2) = 1 / (1 + Exp(-netsum)) netsum = 0.8881556 netsum = netsum + feature2(1) * 1.621511 netsum = netsum + feature2(2) * -0.03661929 netsum = netsum + feature2(3) * 0.1688382 netsum = netsum + feature2(4) * -1.013181 netsum = netsum + feature2(5) * 2.699184 netsum = netsum + feature2(6) * -1.219513 netsum = netsum + feature2(7) * 0.4337809 netsum = netsum + feature2(8) * -3.760823 netsum = netsum + feature2(9) * -1.450161 outarray(3) = 1 / (1 + Exp(-netsum)) netsum = -0.1752312 netsum = netsum + feature2(1) * 0.7248147 Mg. Abraham Gamarra Moreno 213 netsum = netsum + feature2(2) * 0.4916552 netsum = netsum + feature2(3) * -3.363693 netsum = netsum + feature2(4) * -1.489237 netsum = netsum + feature2(5) * 0.3150889 netsum = netsum + feature2(6) * 2.669589 netsum = netsum + feature2(7) * 0.2992842 netsum = netsum + feature2(8) * 0.4325282 netsum = netsum + feature2(9) * 0.1342072 outarray(4) = 1 / (1 + Exp(-netsum)) netsum = -0.2363798 netsum = netsum + feature2(1) * 0.8358494 netsum = netsum + feature2(2) * 0.6256061 netsum = netsum + feature2(3) * -3.400938 netsum = netsum + feature2(4) * -1.574203 netsum = netsum + feature2(5) * 0.3605849 netsum = netsum + feature2(6) * 2.502021 netsum = netsum + feature2(7) * 0.2546888 netsum = netsum + feature2(8) * 0.5457298 netsum = netsum + feature2(9) * 0.2242781 outarray(5) = 1 / (1 + Exp(-netsum)) netsum = -0.1454982 netsum = netsum + feature2(1) * 0.7328083 netsum = netsum + feature2(2) * 1.886714 netsum = netsum + feature2(3) * 0.05207601 netsum = netsum + feature2(4) * -1.110788 netsum = netsum + feature2(5) * -1.82287 netsum = netsum + feature2(6) * 0.5481207 netsum = netsum + feature2(7) * 1.574738 netsum = netsum + feature2(8) * 1.149344 netsum = netsum + feature2(9) * -4.210217 outarray(6) = 1 / (1 + Exp(-netsum)) outarray(1) = (outarray(1) - 0.1) / 0.8 If (outarray(1) < 0) Then outarray(1) = 0 If (outarray(1) > 1) Then outarray(1) = 1 outarray(2) = (outarray(2) - 0.1) / 0.8 If (outarray(2) < 0) Then outarray(2) = 0 If (outarray(2) > 1) Then outarray(2) = 1 outarray(3) = (outarray(3) - 0.1) / 0.8 If (outarray(3) < 0) Then outarray(3) = 0 If (outarray(3) > 1) Then outarray(3) = 1 outarray(4) = (outarray(4) - 0.1) / 0.8 If (outarray(4) < 0) Then outarray(4) = 0 If (outarray(4) > 1) Then outarray(4) = 1 outarray(5) = (outarray(5) - 0.1) / 0.8 If (outarray(5) < 0) Then outarray(5) = 0 If (outarray(5) > 1) Then outarray(5) = 1 outarray(6) = (outarray(6) - 0.1) / 0.8 If (outarray(6) < 0) Then outarray(6) = 0 If (outarray(6) > 1) Then outarray(6) = 1 End Sub 214 Tópicos y Aplicaciones de la Inteligencia Artificial 4.9.3. CONCESIÓN DE AYUDAS POR ESTUDIOS El problema consiste en determinar cuál es el tipo de ayuda, que se puede conceder por estudios a un trabajador en una empresa, en base a concesiones otorgadas en otros casos. Para la concesión se toman los siguientes atributos: • salario del trabajador, • tipo de estudios a realizar, y • antigüedad en la empresa. La empresa cuenta con la información de la tabla 4.7 referida a ayudas concedidas en ejercicios anteriores. Tabla 4.7. Ayudas concedidas con ejercicios anteriores Mg. Abraham Gamarra Moreno 215 Tabla 4.7. Ayudas concedidas con ejercicios anteriores (continuación) Tabla 4.7. Ayudas concedidas con ejercicios anteriores (continuación) 216 Tópicos y Aplicaciones de la Inteligencia Artificial Se puede utilizar el Neuroshell, para entrenar a la red neuronal con los datos de la tabla 4.7 y se debe obtener también el codigo fuente en Visual Basic. La implementacion se encuentra en el CD que se adjunta al libro. El formulario y la ejecución del programa en Visual Basic 6.0, teniendo en cuenta el 16 avo patrón de entrenamiento se muestra en la figura 4.33. Figura 4.33. Ejecución del programa en Visual Basic 6.0, teniendo en cuenta el 16 avo patrón de entrenamiento de la tabla 4.7. 4.9.4. IMPLEMENTACIÓN DE OTRAS APLICACIONES CON REDES NEURONALES ARTIFICIALES En el CD se encuentra la implementación del reconocimiento de los caracteres A y B, utilizando Neuroshell y Visual Basic .NET. Además se implementa el ejemplo de la identificación de animales de la tabla 4.2. Figura 4.1. Modelo de la Neurona Biológica Como se aprecia en esta figura, cada neurona en el cerebro está compuesta básicamente por un cuerpo, axones y dendritas. Las dendritas forman un "cepillo filamentoso" muy fino que rodea el cuerpo de la neurona. El axón puede considerarse como un tubo largo y fino que se subdivide en numerosas ramas que terminan en pequeños bulbos, los cuales tienen contacto con las dendritas de las otras células. La pequeña separación entre una terminación y una dendrita es llamada sinapsis. El axón de una neurona puede formar conexiones sinápticas con muchas otras neuronas. Funcionalmente, las dendritas reciben señales desde otras células a través de los puntos de conexión llamados sinapsis. La fuerza de una conexión dada es determinada por la eficiencia de la transmisión sináptica. Desde ahí las señales son pasadas al cuerpo de la célula. Las señales que llegan de las dendritas pueden ser excitatorias o inhibitorias, y si la suma ponderada de éstas, realizada dentro del cuerpo de la neurona, supera su "umbral de activación" dentro de un tiempo suficiente, la neurona se disparará, enviando un impulso nervioso a través de su axón. 4.2. LA NEURONA ARTIFICIAL En la figura 4.2 se presenta el esquema típico de la neurona artificial. X1 W 1j X2 W 2j : . : Xn W nj Sinapsis Dendritas Yj Zj= W ij Xi F ( Zj ) Axones Cuerpo de la Neurona Axón Figura 4.2: Modelo de la Neurona Artificial 166 Tópicos y Aplicaciones de la Inteligencia Artificial El cuerpo de la neurona será a menudo representada por la suma ponderada de las entradas, Zj, seguida por una función lineal o no lineal, Yj = F( Zj). La eficiencia sináptica es representada por los "pesos de interconexión", Wij. La función F(Zj) es llamada "función de activación", que usa los valores de entrada para determinar la actividad de la neurona. El modelo de la neurona es llamado neurona de McCulloch-Pitts . 4.2.1. PESOS DE INTERCONEXIÓN Los pesos de interconexión, representan la fuerza de interconexión entre las neuronas, y pueden ser positivos (excitatorios) o negativos (inhibitorios); además pueden ser fijos o adaptables. Las redes con pesos adaptables usan leyes de aprendizaje para ajustar los valores de la fuerza de interconexión. Si la red neuronal usa pesos fijos las tareas a ser ejecutadas deben estar bien definidas a priori. 4.2.2. FUNCIONES DE ACTIVACIÓN Existen distintos tipos de redes neuronales que usan diferentes funciones de activación, F(Z), pero la estructura interna de la neurona , es decir la suma ponderada seguida por la función F(Z), es común en la mayoría de las redes. Entre las funciones de activación más usadas y conocidas se encuentran las que se muestran en la figura 4.3. Figura 4.3. Funciones de Activación Mg. Abraham Gamarra Moreno 167 4.3. REDES DE NEURONAS Una red de neuronas consiste en varios de estos elementos (neuronas) trabajando juntos. Usualmente estos elementos se organizan en grupos conocidos con el nombre de capas. Una red típica consiste en una sucesión de capas conectadas entre ellas en forma total o aleatoria. Estas redes poseen dos capas que tienen contacto con el exterior, que son la capa de entrada y la de salida. Las capas que no se conectan con el exterior reciben el nombre de capas ocultas. La figura 4.4 presenta el esquema típico de una red de neuronas. 4.3.1. REDES MONOCAPA (1 CAPA) En las redes monocapa, como la red de HOPFIELD y la red BRAIN-STATE-INA-BOX, se establecen conexiones laterales entre las neuronas que pertenecen a-la única capa que constituye la red. También pueden existir conexiones autorrecurrentes (salida de una neurona conectada a su propia entrada), aunque en algún modelo, como el de HOPFIELD, esta recurrencia no se utiliza. : : : : : : Capa de entrada Capa escondida Capa de salida Figura 4.4 Esquema típico de una red de neuronas Una topología equivalente a la de las redes de 1 capa es la denominada topología crossbar (barras cruzadas). Una red de este tipo (por ejemplo, la red LEARNING MATRIX) consiste en una matriz de terminales (de entrada y salida) o barras que se cruzan en unos puntos a los que se les asocia un peso. Esta representación crossbar suele utilizarse como etapa de transición cuando se pretende implementar físicamente una red monocapa, puesto que es relativamente sencillo desarrollar como hardware una estructura como la indicada (por ejemplo, las barras cruzadas serían cables, y los puntos de conexión, resistencias cuyos valores representarían los pesos de la red). 168 Tópicos y Aplicaciones de la Inteligencia Artificial Finalmente, hay que indicar que las redes monocapa se utilizan típicamente en tareas relacionadas con lo que se conoce como autoasociación; por ejemplo, para regenerar informaciones de entrada que se presentan a la red incompleta o distorsionada. En la tabla 4.1 se muestran las características topológicas de los modelos de redes monocapa más conocidos. Tabla 4.1. modelos de redes monocapa más conocidos. TIPOS DE CONEXIONES CONEXIONES AUTORRECURRENTES CONEXIONES LATERALES EXPLÍCITAS NO AUTORECURRENTES CROSSBAR MODELO DE RED BRAIN-STATE-IN-A-BOX ADDITIVE GROSSBERG (AG) SHUNTING GROSSBERG (SG) OPTIMAL LINEAR ASOCIATIVE MEMORY HOPFIELD BOLTZMANN MACHINE CAUCHY MACHINE LEARNING MATRIX (LM) La figura 4.5 muestra el modelo de red neuronal de Hopfield. Figura 4.5 Red de Hopfield 4.3.2. REDES NEURONALES MULTICAPAS En el caso de las redes multicapas, sus unidades se clasifican en tres tipos: Mg. Abraham Gamarra Moreno 169 se muestra en la figura 4. Sin embargo.7).6.7). • Las redes multicapa son aquellas que disponen de conjuntos de neuronas agrupadas en varios (2. Ellas permiten tener una representación interna del patrón en cuestión. más cercana a la salida de la red. 170 Tópicos y Aplicaciones de la Inteligencia Artificial .• • Unidades de entrada: al igual que el caso de la red de una sola capa. Las capacidades del Perceptron con dos tres y cuatro niveles o capas y con una única neurona en el nivel de salida. estas unidades son las que reciben el patrón de entrada directamente. más cercana a la entrada de la red. y envían las señales de salida a una capa posterior. Figura 4. En estos casos. todas las neuronas de una capa reciben señales de entrada de otra capa anterior. Unidades ocultas o escondidas: estas no reciben entradas directamente y no poseen realimentación directa. Normalmente. una forma para distinguir la capa a la que pertenece una neurona. Unidades de salida: estas son las que entregan el resultado de la red. 4. 4. consistiría en fijarse en el origen de las señales que recibe a la entrada y. en un gran número de estas redes también existe la posibilidad de conectar las salidas de las neuronas de capa posteriores a las entradas de las capas anteriores. A estas conexiones se les denomina conexiones hacia adelante o feedforward (Fig. el cual es una red de tipo feedforward compuesta de varias capas de neuronas entre la entrada y la salida de la misma. etc. el destino de la señal de salida.8.) niveles o capas. Red feedback Un modelo de red neuronal multicapa es el Perceptron multinivel o multicapa (Figura 4. 3. a estas conexiones se les denomina conexiones hacia atrás o feedback (Fig.6). Figura 4.8 Distintas formas de las regiones generadas por un perceptron multinivel En la segunda columna se muestra el tipo de región de decisión que se puede formar con cada una de las configuraciones.7 Perceptron multinivel (red feedforward multicapa) Figura 4. Abraham Gamarra Moreno 171 . En la siguiente columna se indica el tipo de región de decisión que se formaría para el problema de la XOR. En las dos últimas columnas se muestran las regiones formadas para resolver el Mg. como se ha visto una red con cuatro niveles. entre ellos el BackPropagation. esto sucede cuando la salida deseada debe ser comparada con la salida actual de la red para originar la señal de error. A menudo la evocación o recuerdo es una parte del aprendizaje. esta salida deseada debe ser entregada por un "instructor". puede generar regiones de decisión arbitrariamente complejas. La evocación o recuerdo se refiere a cómo la red procesa los estímulos presentados en sus entradas y genera una respuesta en su salida. pues. Un Perceptron con cuatro capas puede formar regiones de decisión arbitrariamente complejas. dado que ha abierto el camino para el desarrollo de otras redes neuronales.4. En tal caso se habla de un aprendizaje supervisado o entrenamiento supervisado. 4. ENTRENAMIENTO DE UNA RED NEURONAL El entrenamiento de una red es todo el proceso de aprendizaje que realiza una red neuronal. que se analizará más adelante. 172 Tópicos y Aplicaciones de la Inteligencia Artificial . Su objetivo es lograr que la aplicación de un conjunto de entradas produzca el conjunto de salidas deseadas (o uno al menos consistente). OPERACIÓN DE UNA RED NEURONAL Las redes neuronales operan en dos fases: aprendizaje y evocación o recuerdo.problema de clases con regiones mezcladas y las formas de regiones más generales para cada uno de los casos.5. El Perceptron es de interés histórico. El estímulo presentado a la salida corresponde a la salida deseada para una determinada entrada. El proceso de separación en clases que se lleva a cabo consiste en la partición de la región deseada en pequeños hipercubos (cuadrados para dos entradas de la red). El Perceptron básico de dos capas (la de entrada con neuronas lineales y la de salida) sólo puede establecer dos regiones separadas por una frontera lineal en el espacio de patrones de entrada. El aprendizaje es el proceso en el cual se adaptan o modifican los pesos de las conexiones en respuesta a un estímulo que ha sido presentado en sus entradas y opcionalmente a su salida. La región de decisión resultante será regiones convexas con un número de lados a lo sumo igual al número de neuronas de la segunda capa. Un Perceptron con tres niveles de neuronas puede formar cualquier región convexa en este espacio. 4. El análisis anterior demuestra que no se requieren más de cuatro capas en una red de tipo Perceptron. Abraham Gamarra Moreno 173 . calculando los errores y modificando los pesos hasta que el error del conjunto total de entrenamiento converja a un nivel aceptable. la prueba consiste en ingresar el patrón de entrada (6 primeras columnas) y esperar que se tenga la salida deseada dada en el entrenamiento (última columna que debe ser igual o cercano a 1). En cuanto a los tipos de aprendizaje. vea la figura 4.1. determinando el error. se debe probar si el aprendizaje fue correcto o no. Ahora necesitamos una red neuronal que permita tomar los patrones de entrada y de salida para el entrenamiento. Dicho error es realimentado a través de la red. • Los 6 primeros patrones (patrones de entrada) debe suministrar a las neuronas que están en la parte superior (neuronas de entrada) y la última columna se debe suministrarse como salida deseada.9.5. los cuales convergen gradualmente a valores tales que cada vector de entrada produce el vector de salida deseado. existen dos tipos: el aprendizaje supervisado y el no supervisado. Para el primer patrón de entrenamiento. tal como se dio en el entrenamiento (la red neuronal aprendió). A continuación se muestra como se realiza el entrenamiento de una red neuronal multicapa: • Lo primero que necesitamos son patrones de entrenamiento (cada fila de la tabla) que contengan el conocimiento de algún dominio en particular. Para esta ejecución se tiene que el valor devuelto por la red neuronal es muy cercano a 1.Dicho entrenamiento se realiza aplicando secuencialmente vectores de entrada (patrones de entrenamiento). la que posteriormente se compara con la salida deseada.2) tenemos patrones que permiten identificar si un animal es un mamífero (1) o un ave (0). 4. modificando los pesos de acuerdo a un algoritmo que lo minimice.10. Se puede elaborar un programa que permita entrenar la red neuronal y luego de este entrenamiento. Mg. tal como se muestra en la figura 4. Cada vector de entrada se aplica a la red calculándose la salida. Los vectores del conjunto de entrenamiento se aplican secuencialmente. ENTRENAMIENTO SUPERVISADO Se selecciona un número suficientemente grande de vectores de entrada con sus correspondientes vectores de salida. Para nuestro ejemplo (Tabla 4. a la vez que se ajustan los pesos de la red de acuerdo a un procedimiento predeterminado (cada modelo define su procedimiento). 2 Patrones de entrenamiento que permiten identificar si un animal es un mamífero (1) o un ave (0) Entrenamiento de una red neuronal Entradas Salida (1= Mamifer o 0=Ave) ¿Tiene pelo? ¿Toma leche? ¿Vuela? ¿Pone ¿Tiene huevos? plumas? ¿Nada? 1 0 0 0 0 0 1 1 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 1 1 1 0 0 0 Entrenamiento de una red neuronal: ¿Tiene Pelo? ¿Toma leche? ¿Vuela? ¿Pone Huevos? ¿Tiene Plumas? ¿Nada? Salida Figura 4.9 Red neuronal que permite tomar los patrones de la tabla 4.Tabla 4. 174 Tópicos y Aplicaciones de la Inteligencia Artificial .2. un valor aceptable será cuando la salida sea menor que 0.1 (salida<0.Al ejecutar un programa que use el aprendizaje de esta red neuronal. vea la figura 4. Debemos notar que estas entradas no han sido dadas en el entrenamiento.9 (salida>0.10 Resultado que muestra un programa que contiene a la red neuronal entrenada de la figura 4.9.9).12. por lo que la respuesta que se obtiene. con el último patrón de entrenamiento. sólo la característica toma leche y la red neuronal generaliza e identifica a este como un mamífero (valor cercano o igual a 1). Lo que debemos probar ahora es la capacidad de generalización de la red neuronal. si la salida deseada es 1. es por generalización. Para realizar esta prueba. Para salidas binarias (0 ó 1).9. Figura 4. se tiene que la salida también es correcta (figura 4.11). Figura 4.11 Resultados que muestra otra ejecución del programa que contiene a la red neuronal entrenada de la figura 4. de la misma manera si la salida deseada es 0. Abraham Gamarra Moreno 175 . suministramos a la red neuronal. un valor aceptable será cuando la salida sea mayor que 0.1). Mg. 4.2. Puesto que no es posible determinar el patrón de salida específico generado por una clase de vectores en forma previa al entrenamiento. y la red ajusta la fuerza de interconexión basada solamente en los valores de la entrada y la salida de la red en progresión. 4.3 muestra el resumen de los tipos de redes más conocidos.9. sus ventajas e inconvenientes y quién o quiénes fueron sus creadores y en qué año. 176 Tópicos y Aplicaciones de la Inteligencia Artificial . En otras palabras. se requiere transformar la salida generada por la red a una forma que sea comprensible.5. comentando esquemáticamente las aplicaciones más importantes de cada una.12 Resultados que muestra la genearlización del programa que contiene a la red neuronal entrenada de la figura 4. Este tipo de entrenamiento fue desarrollado por Kohonen (1984) y otros en lo que se conoce con el nombre de la teoría de la "autoorganización". el proceso de entrenamiento extrae las propiedades estadísticas del conjunto de entrenamiento y agrupa vectores familiares en clases.6.Figura 4. TIPOS DE REDES NEURONALES MÁS IMPORTANTES La tabla 4. ENTRENAMIENTO NO SUPERVISADO El aprendizaje no supervisado ocurre cuando la red es provista sólo de los valores de entrada. ejem. 1986 Reconocimiento Sofisticada de patrones . Control robots. etc. Poco (radar. Sonar. interpolar el Control movimiento.6 Nombre de la red Avalancha Año Inventada/ Desarrollada por 1967 Reconocimi Ninguna red No es fácil Stephen alterar la Grossberg. 1995. brazos robot. aprendizaje y David muchos s con plos. Tipos de redes más conocidos.3. Abraham Gamarra Moreno 177 . . Numerosas de aplicacione tiempo David el Parker. clasificar espacios linealmente separados.Rumelhart. con circuitos Modems. Back propagation más Necesita mucho para Paul Werbos. todo esto. Mg.). texto. 197485 de Síntesis voz Red Sensible a la translación. Predicción . Potente. ento de habla sencilla puede hacer velocidad o continua. Filtrado de fácil de señales. analógicos o VLSI. España: Editorial RA-MA. 1960 Rápida. implementar Ecualizado r adaptativo. Martinez V. Aplicaciones más importantes Comentarios Limitaciones Teoría resonancia adaptativa (ART) ADALINE / MADALINE Sólo es Bernand posible Widrow. Gail Carpenter. desde popular. Redes Neuronales Artificiales: Fundamentos. distorsión y escala. Stephen Gressberg.Tabla 4. éxito. Facilidad Reconocimi de ento patrones. de aprendizaje 6 Hilera J. utilizada. modelos y Aplicaciones. a simples. de simples. Tipos de redes más conocidos (continuación) Nombre de la red Año Aplicaciones más importantes Memoria Comentarios Limitaciones Inventada/ Desarrollad a por Bart Kosko. Optimizaci de ón. de Harold Szu. Máquinas de Boltzmann y Cauchy 198586 Reconocimi Redes ento patrones (imágenes. un Terry muy jnowski. iva de acceso arquitectur por contenido. Realización y James Anderson Extracción de Posiblement conocimiento de bases e mejor potenciales aplicaciones de realización que redes Hopfield. Capacidad de y representac ión La máquina de Jeffrey Boltzmann necesita tiempo largo Hinton. 1977 patrones. Los datos deben ser codificados. Brain-Estate-in-aBox.j Baja heteroasociat e y capacidad de almacenamient o. Se- óptima aprendizaje.Tabla 4. 178 Tópicos y Aplicaciones de la Inteligencia Artificial . datos las no estudiadas de totalmente. sonar radar). Memoria asociativa bidireccional 1985 Aprendiza.3. Andres Pellionez. James Alde bus. Hopfield 1982 Reconstrucció Puede n de patrones implementar y se en VLSI. Combinación de Perceptron y TPM. los brazos de un robot. Counterpropagation 1986 Comprensión de imágenes. niveles y conexiones. y John Hopfield Numerosas neuronas conexiones. No puede reconocer caracteres complejos. K. Neocognitron Perceptron Requiere muchos elementos de proceso. Abraham Gamarra Moreno 179 . optimización. rotación y escala.3. movimiento de Avalancha. Fukushima Frank Rosenblatt Mg. Tipos de redes más conocidos (continuación) Nombre de la red Año Aplicaciones más importantes Control Comentarios Limitaciones Inventada/ Desarrollad a por David Marr. Construida en HW. Robert y HechtNielsen Cerebellatron 1969 del Semejante a Requiere complicadas entradas control.Reconocimient Insensible 84 o de a la caracteres Translación manuscritos .Tabla 4. Fácil conceptuali zar 1978. de Capacidad estabilidad. 1957 Reconocimient o de caracteres impresos La red más antigua. Explotación de bases de datos. Requiere Teuvo mucho Kohonen entrenamiento . Map (TPM). tanto comerciales como militares. Hay muchos tipos diferentes de redes neuronales.Tabla 4. Optimización de plazas y horarios en líneas de vuelo. Se pueden desarrollar redes neuronales en un período de tiempo razonable y pueden realizar tareas concretas mejor que otras tecnologías convencionales. Eso hará posible insertar redes neuronales de bajo coste en sistemas existentes y recientemente desarrollados. Topologycodificación Preservingde datos. APLICACIONES DE LAS REDES NEURONALES Las redes neuronales son una tecnología computacional emergente que puede utilizarse en un gran número y variedad de aplicaciones. 4. Realiza mapas de característ icas comunes de los datos aprendidos.Reconocimient Organizing-Map 84 o de (SOM). Relacionamos ejemplos de algunas aplicaciones comerciales separándolas en grupos según las distintas disciplinas: Biología • • Aprender más acerca del cerebro y otros sistemas. Empresa • • • • • Evaluación de probabilidad de formaciones geológicas y petrolíferas. Identificación de candidatos para posiciones específicas.7. patrones. presentan una alta tolerancia a fallos del sistema y proporcionan un grado de paralelismo en el proceso de datos muy grande. 180 Tópicos y Aplicaciones de la Inteligencia Artificial . Reconocimiento de caracteres escritos. Obtención de modelos de la retina. Cuando se implementan mediante hardware (redes neuronales en chips VLSI). incluyendo los sistemas expertos. Tipos de redes más conocidos (continuación) Nombre de la red Año Aplicaciones más importantes Comentarios Limitaciones Inventada/ Desarrollad a por Self1980. optimización.3. cada uno de los cuales tiene una aplicación particular más apropiada. Previsión del tiempo. Mg. Predicción de reacciones adversas a los medicamentos. etc. encefalograma. Diagnóstico y tratamiento a partir de síntomas y/o de datos analíticos (electrocardiograma. Lectores de rayos X. Valoración del riesgo de los créditos. Abraham Gamarra Moreno 181 . temperatura.). etc.) Control de producción en líneas de proceso. Reconocimiento y seguimiento en el tiro al blanco. gas. Monitorización en cirugía. Medicina • • • • • • Analizadores del habla para la ayuda de audición de sordos profundos.Medio ambiente • • Analizar tendencias y patrones. Interpretación de firmas. análisis sanguíneo. Finanzas • • • • Previsión de la evolución de los precios. Entendimiento de la causa de los ataques epilépticos. Creación de armas inteligentes. Militares • • • • Clasificación de las señales de radar. Identificación de falsificaciones. Optimización del uso de recursos escasos. Manufacturación • • • Robots automatizados Y sistemas de control (visión artificial y sensores de presión. Inspecci6n de la calidad. 182 Tópicos y Aplicaciones de la Inteligencia Artificial . basándose en los trabajos de otros investigadores formalizaron un método para que una red neuronal aprendiera la asociación que existe entre los patrones de entrada a la misma y las clases correspondientes. Una característica importante de este algoritmo es la representación interna del conocimiento que es capaz de organizar en la capa intermedia de las células para conseguir cualquier correspondencia entre la entrada y la salida de la red. partiendo de la capa de salida. conocido en general como backpropagation (propagación del error hacia atrás). sí es posible establecer dicha correspondencia. En general. Este método. De forma simplificada. de manera que en la siguiente vez que se presente el mismo patrón. Con una capa de neuronas ocultas. Hinton y Williams. es una regla de aprendizaje que se puede aplicar en modelos de redes con más de dos capas de células. es decir. los ejemplos mostrados indican que son característicos más de las personas que de los ordenadores convencionales. Ya se ha mostrado en este capítulo que en muchos casos. como la resolución del problema de la OR exclusiva. capa por capa. auditivas y otras) y. LA RED BACKPROPAGATION6 En 1986. Basándose en el valor del error recibido. completar una señal a partir de valores parciales o reconstruir el patrón correcto partiendo de uno distorsionado.Podemos buscar hechos comunes en esta lista de aplicaciones. empleando un ciclo propagación-adaptación de dos fases: primero se aplica un patrón de entrada como estímulo para la primera capa de las neuronas de la red. es imposible encontrar los pesos adecuados para establecer la correspondencia entre la entrada y la salida mediante una red sin capas intermedias. A continuación. el funcionamiento de una red backpropagation (backpropagation net. hasta que todas las neuronas de la red hayan recibido un error que describa su aportación relativa al error total. estos errores se transmiten hacia atrás. Muchos de los ejemplos tienen que trabajar con datos sensoriales y de percepción (señales visuales. está basado en la generalización de la regla delta y. la mayoría de ellas consisten en realizar un reconocimiento de patrones: buscar un patrón en una serie de ejemplos. utilizando más niveles de neuronas que los que utilizó Rosenblatt para desarrollar el Perceptron. ha ampliado de forma considerable el rango de aplicaciones de las redes neuronales. BPN) consiste en un aprendizaje de un conjunto predefinido de pares de entradas-salidas dados como ejemplo. o retropropagación. 4. Este proceso se repite.8. se va propagando a través de todas las capas superiores hasta generar una salida. a pesar de sus propias limitaciones. recibiendo el porcentaje de error aproximado a la participación de la neurona intermedia en la salida original. clasificar patrones. hacia todas las neuronas de la capa intermedia que contribuyan directamente a la salida. Rumelhart. la salida esté más cercana a la deseada. el error disminuya. se reajustan los pesos de conexión de cada neurona. se compara el resultado obtenido en las neuronas de salida con la salida que se desea obtener y se calcula un valor del error para cada neurona de salida. El algoritmo de propagación hacia atrás. otros realizan filtrado o mapeo de señales de entrada. dando lugar al algoritmo de retropropagación (backpropagation). a nuevos vectores de entrada con ruido o incompletas. realimenta el error del sistema para realizar la modificación de los pesos en un valor proporcional al gradiente decreciente de dicha función de error. FUNCIONAMIENTO DEL ALGORITMO El método que sigue la regla delta generalizada para ajustar los pesos es exactamente el mismo que el de la regla delta utilizada en el Perceptron y. a diferencia de la función escalón que se utiliza en el Perceptron. y que pueda aplicar. La función sigmoidal pertenece a este tipo de funciones. que se exige a los sistemas de aprendizaje. obtenida). 4. Para poder aplicar esa misma relación. LA REGLA DELTA GENERALIZADA La regla propuesta por Widrow en 1960 (regla delta) ha sido extendida a redes con capas intermedias (regla delta generalizada) con conexiones hacia adelante (feedforward) y cuyas células tienen funciones de activación continuas (lineales o sigmoidales).La importancia de la red backpropagation consiste en su capacidad de autoadaptar los pesos de las neuronas de las capas intermedias para aprender la relación que existe entre un conjunto de patrones dados como ejemplo y sus salidas correspondientes. deseada .1.sal. Abraham Gamarra Moreno 183 . Por ello. el cambio que se produce en el peso de la conexión que une la salida de dicha neurona con la unidad Uj (wji) para un patrón de aprendizaje p determinado es: ∆w ji (t + 1) = α ∂ pj y pi Mg. o diferencia entre la salida deseada y la obtenida (∂ = sal. Este algoritmo utiliza también una función o superficie de error asociada a la red. La red debe encontrar una representación interna que le permita generar las salidas deseadas cuando se le dan las entradas de entrenamiento. Dada una neurona (unidad Ui) y la salida que produce. ya que esta última no es derivable en el punto en el que se encuentra la discontinuidad. yi (Figura 4. es decir. Estas funciones continuas son no decrecientes y derivables. a entradas no presentadas durante la etapa de aprendizaje para clasificarlas según las características que compartan con los ejemplos de entrenamiento.8. es la capacidad de generalización. dando una salida activa si la nueva entrada es parecida a las presentadas durante el aprendizaje. después del entrenamiento. ADALINE. los pesos se actualizan de forma proporcional a la delta. entendida como la facilidad de dar salidas satisfactorias a entradas que el sistema no ha visto nunca en su fase de entrenamiento. Esta característica importante. buscando el estado estable de mínima energía o de mínimo error a través del camino descendente de la superficie del error. además.13). Esto es lo que se denomina procedimiento de propagación del error hacia atrás. Esta fórmula es como la de la regla delta. en el caso de que Uj no sea una neurona de salida (ver Figura 4. Por otro lado. en las redes multinivel. En el caso de que dicha neurona no sea de salida. El punto en el que difieren la regla delta Generalizada de la regla delta es en el valor concreto de ∂pj. Figura 4. Este término representa la modificación que hay que realizar en la entrada que recibe la neurona j. Según esto. a diferencia de las redes sin neuronas ocultas.13 Conexión entre una neurona de una capa oculta con una neurona de salida. si consideramos la unidad Uj de salida (Figura 4. el error que se produce está en función del error que se comete en las neuronas que reciben como entrada la salida de Uj: 184 Tópicos y Aplicaciones de la Inteligencia Artificial . excepto en lo que se refiere a la derivada de la función de transferencia. entonces definimos ∂ pj = (d pj − y pj )⋅ f 1 (net j ) donde dpj es la salida deseada de la neurona j para el patrón p y netj es la entrada neta que recibe la neurona j. inicialmente sí podemos conocer la salida deseada de las neuronas de salida. Sin embargo.13). Según esto.En donde el subíndice p se refiere al patron de aprendizaje concreto. y ∝ es la constante o tasa de aprendizaje.14). en principio no se puede conocer la salida deseada de las neuronas de las capas ocultas para poder determinar los pesos en función del error cometido. el error que se produce estará en función del error que se cometa en las neuronas que reciban como entrada la salida de dicha neurona. En la implementación del algoritmo. β. Rumelhart. con lo que el aprendizaje será más rápido. requiere un importante número de cálculos para lograr el ajuste de los pesos de la red. por otro lado. pero. Hinton y Williams sugirieron que para filtrar estas oscilaciones se añada en la expresión del incremento de los pesos un término (momento). mayor es la modificación de los pesos en cada iteración. A mayor tasa de aprendizaje. ADICIÓN DE UN MOMENTO EN LA REGLA DELTA GENERALIZADA El método de retropropagación del error. ∂ pj = ∑ ∂ pk ⋅ wkj ⋅ f 1 (net j ) k donde el rango de k cubre todas aquellas neuronas a las que está conectada la salida de Uj. Figura 4. puede dar lugar a oscilaciones. De esta forma. se toma una amplitud de paso que viene dada por la tasa de aprendizaje ∝. también conocido como del gradiente descendente.14 Conexiones entre neuronas de la capa oculta con la capa de salida. Abraham Gamarra Moreno 185 . de manera que dicha expresión quede: Mg. multiplicando cada uno de ellos por el peso de la conexión. el error que se produce en una neurona oculta es la suma de los errores que se producen en las neuronas a las que está conectada la salida de ésta. lo cual es adecuado. entonces el descenso por la superficie de error en t+l es mayor. ESTRUCTURA Y APRENDIZAJE DE LA RED BACKPROPAGATION En una red backpropagation existe una capa de entrada con n neuronas y una capa de salida con m neuronas y al menos una capa oculta de neuronas internas. el paso que se da en t+1 es más pequeño. Con este momento se consigue la convergencia de la red en menor número de iteraciones. Sin embargo. Cada neurona de una capa (excepto las de entrada) recibe entradas de todas las neuronas de la capa anterior y envía su salida a todas las 186 Tópicos y Aplicaciones de la Inteligencia Artificial .w ji (t + 1) = w ji (t ) + α ∂ pj y pi + β (w ji (t ) − w ji (t − 1)) = = ∆w ji (t + 1) = α ∂ pj y pi + β ∆w ji (t ) donde β es una constante (momento) que determínale efecto en t+1 del cambio de los pesos en el instante t. si en t el incremento era positivo y en t+l es negativo. ya que si en t el incremento de un peso era positivo y en t+l también. Resumiendo. ya que eso significa que se ha pasado por un mínimo y que los pasos deben ser menores para poder alcanzarlo. el algoritmo backpropagation queda finalmente: w ji (t + 1) = w ji (t ) + ∆w ji (t + 1) [ ] ∆w ji (t + 1) = w ji (t ) + α ∂ pj y pi + β ∆w ji (t ) donde: ∂ pj = (d pj − y pj ) ⋅ f 1 (net j ) si Uj es una neurona de salida y ∂ pj = ∑ ∂ pk ⋅ wkj ⋅ f 1 (net j ) k si Uj no es una neurona de salida. Se ajustan los pesos de la última capa proporcionalmente al error. A continuación se presentan.yM. todas las salidas deseadas serán cero. diferenciable.. d2. la función utilizada será del tipo sigmoidal (Fig. Abraham Gamarra Moreno 187 . No hay conexiones hacia atrás feedback ni laterales entre neuronas de la misma capa.. 4. la técnica backpropagation o generalización de la regla delta. y especificar la salida deseada que debe generar la red: d1. De esta manera se han modificado los pesos de las conexiones de la red para cada ejemplo o patrón de aprendizaje del problema.. del que conocíamos su valor de entrada y la salida deseada que debería generar la red ante dicho patrón (fig. dM (si la red se utiliza como un clasificador.15). Obtenidos los valores de salida de la red.. ajustando convenientemente los pesos y continuando con este proceso hasta llegar a la primera capa. Paso 3 Calcular la salida actual de la red. Paso 2 Presentar un patrón de entrada. Los pasos son los siguientes: • Se calculan las entradas netas para las neuronas ocultas procedentes de las neuronas de entrada. a modo de síntesis. una hacia adelante y otra hacia atrás.neuronas de la capa posterior (excepto las de salida). La aplicación del algoritmo backpropagation tiene dos fases. Durante la primera fase el patrón de entrada es presentado a la red y propagado a través de las capas hasta llegar a la capa de salida. se inicia la segunda fase..16).. que será la de la clase a la que pertenece el patrón de entrada).xpn.. y2. Xp: xp1. para ello presentamos las entradas a la red y vamos calculando la salida que presenta capa hasta llegar a la capa de salida ésta será la salida de la red y1... Se pasa a la capa anterior con una retropropagación del error (backpropagation). y por tanto.xp2. los pasos y fórmulas a utilizar para aplicar el algoritmo de entrenamiento: Paso 1 Inicializar los pesos de la red con valores pequeños aleatorios.. 4. requiere el uso de neuronas cuya función de activación sea continua. Para una neurona j oculta: net = ∑ wh ji h pj i =1 N x pi + θ jh Mg. Generalmente.. salvo una.. A diferencia de la regla delta en el caso del Perceptron.. comparándose estos valores con la salida esperada para obtener el error. 15 Modelo de arquitectura de una red backpropagation. el subíndice p. Pueden existir neuronas ficticias de salida y pesos umbral θ de entrada al resto de las neuronas de cada capa. y j a la j-ésima neurona oculta. El término θ puede ser opcional. 188 Tópicos y Aplicaciones de la Inteligencia Artificial . pues actúa como una entrada más. Figura 4.en donde el índice h se refiere a magnitudes de la capa oculta (hidden). al p-ésimo vector de entrenamiento. Abraham Gamarra Moreno 189 .Figura 4.16 Función de activación sigmoidal: y=1/1+e-x • Se calculan las salidas de las neuronas ocultas: y pj = f jh net h pj • ( ) Se realizan los mismos cálculos para obtener las salidas de las neuronas de salida (capa o: output) o = ∑ wkj ⋅ y pj + θ ko j =1 L net o pk y pk = f ko net o pk ( ) Paso 4 Calcular los términos de error para todas las neuronas. Si la neurona k es una neurona de la capa de salida. el valor de la delta es: Mg. lo que implica la imposibilidad de utilizar una función escalón. Por tanto. además. La expresión obtenida en este caso es: 190 Tópicos y Aplicaciones de la Inteligencia Artificial .16 y definida por la expresión: f k (net jk ) = 1 − net 1 + e jk La selección de la función de salida depende de la forma en que se decida representar los datos de salida: si se desea que las neuronas de salida sean binarias. y ∂ o = (d pk − y pk )⋅ y pk (1 − y pk ) pk para la salida sigmoidal. Si la neurona j no es de salida. puesto que esta función es casi biestable y. En general. tenemos: función f sigmoidal es: 1 f ko = 1 1 mientras que la derivada de una f ko = f ko 1 − f ko = y pk (1 − y pk ) por lo que los términos de error para las neuronas de salida quedan: ( ) ∂ o = (d pk − y pk ) pk para la salida lineal. entonces la derivada parcial del error no puede ser evaluada directamente. debe cumplir el requisito de ser derivable. se utiliza la función sigmoidal. En otros casos es tan aplicable una función como otra. como se citó anteriormente. disponemos de dos formas de función de salida que nos pueden servir: la función lineal de salida (fk(netjk) = netjk) y la función sigmoidal representada en la figura 4.∂ o pk = (d pk − y pk )⋅ f o1 k (net ) o pk La función f. se obtiene el desarrollo a partir de valores que son conocidos y otros que pueden ser evaluados. derivable. Para la función lineal. Abraham Gamarra Moreno o o β (wkj (t ) − wkj (t − 1)) 191 . el error que se produce en una neurona oculta es proporcional a la suma de los errores conocidos que se producen en las neuronas a las que está conectada la salida de ésta. De aquí surge el término de propagación hacia atrás. para la función sigmoidal: o ∂ h = y pj (1 − y pj )∑ ∂ o ⋅ wkj pj pk k donde k se refiere a todas las neuronas de la capa superior a la de la neurona j. multiplicado cada uno de ellos por el peso de la conexión. Paso 5 Actualización de los pesos Para ello.∂ h = f jh net h pj pj 1 ( )∑ ∂ k o pk o ⋅ wkj donde observamos que el error en las capas ocultas depende de todos los términos de error de la capa de salida. utilizamos el algoritmo recursivo. comenzando por las neuronas de salida y trabajando hacia atrás hasta llegar a la capa de entrada. Así. para acelerar el proceso de aprendizaje. considerando que están conectados con pesos desde entradas auxiliares de valor constante. En particular. Los umbrales internos de las neuronas se adaptan de forma similar. se puede añadir un término momento de valor: Mg. ajustando los pesos de la forma siguiente: Para los pesos de las neuronas de la capa de salida: o o o wkj (t + 1) = wkj (t ) + ∆wkj (t + 1) o ∆wkj (t + 1) = α ⋅ ∂ o ⋅ y pj pk y para los pesos de las neuronas de la capa oculta: w h (t + 1) = w h (t ) + ∆w h (t + 1) ji ji ji ∆w h (t + 1) = α ⋅ ∂ h ⋅ x pi ji pj En ambos casos. en este caso se tiene un robot que cuenta con cuatro sensores de proximidad en distintas ubicaciones que permanentemente detectan si hay objetos que se encuentren a una distancia superior o inferior a la preestablecida. 4. cuando los sensores detecten un objeto que se encuentra a una distancia inferior a la predeterminada se dirá que el objeto se encuentra cerca y esto se representa por medio de un 1 y cuando se detecte un objeto que se encuentra a una distancia mayor que la predeterminada se dirá que el objeto esta lejos lo cual se indica con un –1.NET.1. dependiendo de estas lecturas los motores podrán dar 7 Universidad Tecnológica de Pereira. El comportamiento del robot lo describe la tabla 4. con base en esto se decide si dar marcha adelante o atrás a cada uno de los dos motores que posee. IMPLEMENTACIÓN DE APLICACIONES CON REDES NEURONALES Para la implementación de aplicaciones se utiliza el shell NEUROSHELL y el Visual Basic . en las lecturas de los sensores podrían darse 16 posibles combinaciones (16=24) y para cada combinación cada uno de los dos motores podría dar marcha adelante o marcha atrás (figura 4.9. y β (wh (t ) − wh (t − 1)) ji ji cuando se trata de una neurona oculta.en el caso de la neurona de salida. Colombia.9.17).4. Tópicos y Aplicaciones de la Inteligencia Artificial 192 . que dependen de las necesidades del proceso en que se encuentre involucrado. Paso 6 El proceso se repite hasta que el término de error Ep = 1 2 ∂2 ∑ pk k =1 M resulta aceptablemente pequeño para cada uno de los patrones aprendidos. 4. DETECCIÓN DE OBSTÁCULOS POR MEDIO DE UN ROBOT Descripción del problema7: Un robot es un dispositivo automático que realiza acciones específicas. 4 Comportamiento del robot S1 1 -1 1 -1 1 1 1 S2 1 1 1 -1 -1 1 1 S3 1 1 -1 -1 1 -1 1 S4 1 1 -1 -1 1 1 -1 M1 -1 -1 1 1 1 -1 1 M2 -1 1 -1 1 -1 1 -1 Justificación del tipo de red Este tipo de problema generalmente es resuelto suministrándole al robot una base de datos que contiene todas las posibles situaciones que se podrían presentarse y sus respectivas soluciones. Abraham Gamarra Moreno 193 . en este caso se necesitaría almacenar las respuestas para ambos motores ante las 16 posibles combinaciones en las lecturas de los sensores. debido a esto se requerirían dispositivos con gran capacidad de Mg. la cantidad de datos necesarios para especificar cada posible situación crece indefinidamente. cuando el número de variables de entrada y el número de salidas es mucho mayor.17 Robot Tabla 4. Figura 4.marcha adelante. lo que se representará por un 1 o dar marcha atrás con un – 1. Figura 4.20). como en la figura 4.18. Figura 4. en contraste una red neuronal puede entrenarse con un número representativo de patrones y aprender el comportamiento del sistema utilizando dispositivos de menos capacidad de almacenamiento y costo. Elija Beginner´s Neural Networks. 194 Tópicos y Aplicaciones de la Inteligencia Artificial .18 Ingreso al Neuroshell Luego del ingreso elija FILE. IMPLEMENTACION EN NEUROSHELL El ingreso al programa al NEUROSHELL se muestra en la figura 4.19.almacenamiento.19 (no escriba ninguna extensión para el archivo). NEW e ingrese un nombre de archivo. realice click en el icono (figura 4. Abraham Gamarra Moreno 195 .4.21) e ingrese los datos de la tabla 4.21 Mg.Figura 4. para entrenar la red neuronal (figura 4.22). Figura 4.20 Seleccione Data Entry (figura 4. Se sugiere para el entrenamiento duplicar estos datos dos veces salvo el titulo de cada columna. Ahora elija Settings y Compute mins/maxs. Ahora elija el icono en la figura 4. Cierre la ventana.29 permite generar el código fuente en C.29 muestran el procedimiento a seguir hasta generar el código fuente en C o Visual Basic.26 elija examinar datos para analizar los datos y los errores generados a la salida.21. El procedimiento de la figura 4.22 Luego de ingresar los datos cierre la ventana después de haber grabado estos con File. Save File. Las figuras 4.Figura 4. en la lista desplegable variable type selection elija input y haga clic debajo del nombre de cada entrada. En la figura 4.23 al 4. este quedará marcado con I. 196 Tópicos y Aplicaciones de la Inteligencia Artificial .27 al 4. Para nuestro caso elegiremos Visual Basic source code. luego elija Actual Output en la lista desplegable anterior y haga clic en el nombre de cada salida para la red neuronal. Abraham Gamarra Moreno 197 .Figura 4.24 Mg.23 Figura 4. 26 198 Tópicos y Aplicaciones de la Inteligencia Artificial .Figura 4.25 Figura 4. Figura 4. Abraham Gamarra Moreno 199 .28 Mg.27 Figura 4. Para nuestro caso el archivo es ROBOT. ' Therefore all code and weights are inline without looping or data storage ' which might be harder to port between compilers.VB y se encuentra en la carpeta APLICACIÓN ROBOT del CD que acompaña al libro. cuyo contenido es: ' Insert this code into your VB program D:\ABRAHAM\FILES2~2\EPG\MAESTA~1\IA\ROBOT network ' This code is designed to be simple and fast for porting to any machine. Sub Fire_ROBOT (inarray(). outarray()) Dim netsum as double Static feature2(3) as double ' inarray(1) is S1 ' inarray(2) is S2 ' inarray(3) is S3 ' inarray(4) is S4 ' outarray(1) is M1 ' outarray(2) is M2 if (inarray(1)<-1) then inarray(1) = -1 if (inarray(1)> 1) then inarray(1) = 1 inarray(1) = (inarray(1) + 1) / 2 to fire the 200 Tópicos y Aplicaciones de la Inteligencia Artificial .VB y es un procedimiento en Visual Basic. que contiene el conocimiento en una red neuronal.Figura 4.29 El codigo generado en Visual Basic se genera en un archivo que tiene la extensión . 897346 netsum = netsum + inarray(3) * 2.8 + -1 if (outarray(1)<-1) then outarray(1) = -1 if (outarray(1)> 1) then outarray(1) = 1 outarray(2) = 2 * (outarray(2) .979871 netsum = netsum + inarray(4) * 6.852577 feature2(1) = 1 / (1 + exp(-netsum)) netsum = -2.870361 feature2(2) = 1 / (1 + exp(-netsum)) netsum = -4.8 + -1 if (outarray(2)<-1) then outarray(2) = -1 if (outarray(2)> 1) then outarray(2) = 1 End Sub Mg..603323E-05 netsum = netsum + inarray(4) * -3.387748 outarray(1) = 1 / (1 + exp(-netsum)) netsum = 3..198974E-02 netsum = netsum + inarray(1) * 4.1) / .2998328 netsum = netsum + inarray(3) * 7.341322 netsum = netsum + inarray(4) * -6.1287855 netsum = netsum + feature2(1) * -2.05053 netsum = netsum + inarray(3) * -5.648689 netsum = netsum + inarray(2) * 1.7532668 netsum = netsum + inarray(1) * 7.675452 netsum = netsum + feature2(2) * -2.1) / .821959 netsum = netsum + feature2(1) * -6.999131 netsum = netsum + inarray(2) * -3.957484 netsum = netsum + feature2(3) * 8.897321 feature2(3) = 1 / (1 + exp(-netsum)) netsum = .61486E-03 outarray(2) = 1 / (1 + exp(-netsum)) outarray(1) = 2 * (outarray(1) .551737 netsum = netsum + inarray(2) * .030695 netsum = netsum + feature2(2) * 3.495483 netsum = netsum + inarray(1) * -5.if (inarray(2)<-1) then inarray(2) = -1 if (inarray(2)> 1) then inarray(2) = 1 inarray(2) = (inarray(2) + 1) / 2 if (inarray(3)<-1) then inarray(3) = -1 if (inarray(3)> 1) then inarray(3) = 1 inarray(3) = (inarray(3) + 1) / 2 if (inarray(4)<-1) then inarray(4) = -1 if (inarray(4)> 1) then inarray(4) = 1 inarray(4) = (inarray(4) + 1) / 2 netsum = -.65109 netsum = netsum + feature2(3) * 6. Abraham Gamarra Moreno 201 . Luego modificamos el código por defecto que tiene el formulario.9 And s(2) <= 1) Then Text6. Figura 4. Iniciamos creando un formulario que permita manipular las entradas y salidas que tiene la red neuronal (figura 4.Text) ' llamada a la red neuronal Call Fire_ROBOT(e.9 And s(1) <= 1) Then Text5.Text = " motor gira hacia adelante" End If If (s(1) >= -1 And s(1) <= -0.Text) e(2) = Val(Text2.Text) e(4) = Val(Text4.30.Text = " motor gira hacia atrás" End If If (s(2) >= 0.Ahora debemos generar una aplicación en Visual Basic 6.30). que nos permita utilizar el código que contiene a la red neuronal.0. Formulario en Visual Basic que manipula las entradas y salidas de la red neuronal. s) ' mostrar salida If (s(1) >= 0.Text) e(3) = Val(Text3. El código modificado debe quedar tal como se muestra en el listado siguiente: Private Sub Command1_Click() Dim e(4) As Double Dim s(2) As Double ' Asignacion de entradas e(1) = Val(Text1.Text = " motor gira hacia adelante" End If 202 Tópicos y Aplicaciones de la Inteligencia Artificial .9) Then Text5. 04198974 netsum = netsum + inarray(1) * 4. ' Therefore all code and weights are inline without looping or data storage ' which might be harder to port between compilers.897346 netsum = netsum + inarray(3) * 0. Sub Fire_ROBOT(inarray() As Double. outarray() As Double) Dim netsum As Double Static feature2(3) As Double ' inarray(1) is S1 ' inarray(2) is S2 ' inarray(3) is S3 ' inarray(4) is S4 ' outarray(1) is M1 ' outarray(2) is M2 If (inarray(1) < -1) Then inarray(1) = -1 If (inarray(1) > 1) Then inarray(1) = 1 inarray(1) = (inarray(1) + 1) / 2 If (inarray(2) < -1) Then inarray(2) = -1 If (inarray(2) > 1) Then inarray(2) = 1 inarray(2) = (inarray(2) + 1) / 2 If (inarray(3) < -1) Then inarray(3) = -1 If (inarray(3) > 1) Then inarray(3) = 1 inarray(3) = (inarray(3) + 1) / 2 If (inarray(4) < -1) Then inarray(4) = -1 If (inarray(4) > 1) Then inarray(4) = 1 inarray(4) = (inarray(4) + 1) / 2 netsum = -0.852577 feature2(1) = 1 / (1 + Exp(-netsum)) netsum = -2.999131 netsum = netsum + inarray(2) * -3.897321 feature2(3) = 1 / (1 + Exp(-netsum)) netsum = 0.If (s(2) >= -1 And s(2) <= -0.979871 netsum = netsum + inarray(4) * 6.495483 netsum = netsum + inarray(1) * -5. Abraham Gamarra Moreno to fire the 203 .00002603323 netsum = netsum + inarray(4) * -3.648689 netsum = netsum + inarray(2) * 1.870361 feature2(2) = 1 / (1 + Exp(-netsum)) netsum = -0.2998328 netsum = netsum + inarray(3) * 7.551737 netsum = netsum + inarray(2) * 0.1287855 Mg.7532668 netsum = netsum + inarray(1) * 7.341322 netsum = netsum + inarray(4) * -6.9) Then Text6.05053 netsum = netsum + inarray(3) * -5.Text = " motor gira hacia atrás" End If End Sub ' Insert this code into your VB program D:\ABRAHAM\FILES2~2\EPG\MAESTA~1\IA\ROBOT network ' This code is designed to be simple and fast for porting to any machine. 387748 outarray(1) = 1 / (1 + Exp(-netsum)) netsum = 3.821959 netsum = netsum + feature2(1) * -6. esta ejecución se muestra en la figura 4. Figura 4.675452 netsum = netsum + feature2(2) * -2.0.8 + -1 If (outarray(2) < -1) Then outarray(2) = -1 If (outarray(2) > 1) Then outarray(2) = 1 End Sub Private Sub Command2_Click() End End Sub Notese que también se ha agregado el código generado por el Neuroshell (contenido del archivo ROBOT.1) / 0.00861486 outarray(2) = 1 / (1 + Exp(-netsum)) outarray(1) = 2 * (outarray(1) .netsum = netsum + feature2(1) * -2.65109 netsum = netsum + feature2(3) * 6.1) / 0. Ejecución del programa que utiliza la red neuronal.VB) Una vez modificado el código ejecutamos el programa e ingresamos las entradas de la red neuronal y al presionar el boton “Determinar la accion de los motores del robot con una red neuronal” se debe obtener la salida que ofrece la red neuronal. 204 Tópicos y Aplicaciones de la Inteligencia Artificial .030695 netsum = netsum + feature2(2) * 3.31. Para nuestro caso se ha realizado la ejecución con las entradas del último patrón de entrenamiento de la tabla 4.957484 netsum = netsum + feature2(3) * 0.4.31.0.8 + -1 If (outarray(1) < -1) Then outarray(1) = -1 If (outarray(1) > 1) Then outarray(1) = 1 outarray(2) = 2 * (outarray(2) . Text = " motor gira hacia atrás" End If If (s(2) >= 0. Hace clic: cuando se da vuelta a la llave. no sale gasolina por el tubo. Arranque: el motor gira como si intentase arrancar. basándose en los síntomas: • Batería: la batería está descargada 205 Mg.Text = " motor gira hacia adelante" End If If (s(1) >= -1 And s(1) <= -0. Molinillo: cuando se da vuelta a la llave se oye un ruido parecido al de un molinillo. Cable caliente: después de intentar arrancar el motor. Emplearemos Como base para nuestro ejemplo una aplicación de diagnóstico para automóviles. A continuación.9) Then Text5.9 And s(2) <= 1) Then Text6. el cable que va de la batería a la bobina del motor de arranque está caliente. Sin gasolina: al sacar el tubo de gasolina del carburador (o inyector) e intentar arrancar el motor. nos concentraremos en una aplicación que diagnostique por qué no arranca un coche. Sin chispa: al sacar el cable de una bujía y acercarlo al bloque cuando se intenta arrancar.2. se consideran las posibles causas del problema. Primero se definen los distintos síntomas que hay que considerar: • • • • • • • No hace nada: no pasa nada cuando se hace girar la llave del contacto.Cabe mencionar que las salidas de la red neuronal son cercanas o iguales a 1 ó -1 y se debe aproximar estas salidas a estos valores.9) Then Text6. en el motor no saltan chispas. APLICACIÓN PARA AUTOMÓVILES SÍNTOMAS Y DIAGNÓSTICOS DE Consideremos un ejemplo concreto de aplicación de síntomas y diagnósticos. pero no es capaz de funcionar por sí mismo.9.Text = " motor gira hacia atrás" End If 4. Abraham Gamarra Moreno . Esta aproximación se realiza a través del siguiente código: If (s(1) >= 0. se oyen fuertes chasquidos.Text = " motor gira hacia adelante" End If If (s(2) >= -1 And s(2) <= -0. Concretamente.9 And s(1) <= 1) Then Text5. Bomba de gasolina: falla la bomba de gasolina. Esto deja únicamente sin determinar el número de unidades internas (ocultas). Para el problema de diagnósticos del automóvil. será necesaria una red con siete unidades de entrada y seis unidades de salida. o una combinación de ellos. Tabla 4. en el caso de que alguno de los síntomas no se aprecie o esté ausente. Para tener éxito. debe ser capaz de "llenar los espacios en blanco" del problema basándose solamente en los síntomas indicados. Motor de arranque: falla el motor de arranque. La matriz se ha ilustrado en la Tabla 4.5.• • • • • Bobina del motor de arranque: falla la bobina del motor de arranque. se hacen corresponder los síntomas con las causas. y no hay consideraciones de interfaz externa que vayan a limitar el número de unidades ocultas. y. En este caso.5. Es raro que haya una correspondencia biunívoca entre síntomas y causas. Aunque nuestra lista no es una representación Completa de todos los posibles problemas. Para completar el ejemplo vamos a construir una matriz que indica la correspondencia de los síntomas con sus causas probables. Cables: fallan los cables del encendido. no hay nada que indique cuántas unidades ocultas se van a necesitar para resolver el problema. 206 Tópicos y Aplicaciones de la Inteligencia Artificial . nuestro sistema automatizado debe ser capaz de correlacionar muchos síntomas distintos. Distribuidor: el rotor o la tapa del distribuidor están corroídos. Al inspeccionar la matriz se aprecia la variedad de problemas que puede indicar cualquier síntoma. los síntomas podrían indicar alguno de estos problemas. La matriz también ilustra el problema que encontramos cuando se intenta programar un sistema para llevar a cabo la función de diagnóstico. Causas probables Síntomas Batería Bobina X Motor de Cables arranque X X X X X X X Distribuidor Bomba de gasolina X X No hace nada X Clics X Molinillo Gira Sin chispa Cable caliente Sin gasolina X X X X La solución Empleando los datos de nuestro ejemplo. La red hará esto cuando la entrada sea equivalente a una de las entradas de entrenamiento. para calcular el número de neuronas de una capa oculta es: M 2*M <n< 2* N N donde: M: Es el número de ejemplos con que vamos a entrenar a la red. debemos definir los conjuntos de datos que serán utilizados para entrenar a la red. se notarán pequeñas diferencias. “Sistemas Expertos en Contabilidad y Administración de Empresas”. cada uno de los cuales consta de una trama de síntomas de siete elementos y de una trama de indicación de problema formada por seis elementos. 1. tal como se esperaba. pero distinta de todas ellas. USA. Esta aproximación proporcionará siete pares de vectores de entrenamiento. A continuación. Abraham Gamarra Moreno 207 . indicando la causa probable del problema.6. N: Es el número de unidades de entradas. Haremos que la existencia de un síntoma quede indicada por un 1. n: Es el número de neuronas que vamos a situar en capas intermedias El shell Neuroshell calcula la cantidad de neuronas ocultas para la red neuronal que se esta implementando. Para cualquier vector de entrada dado. y además producirá una salida.. hay siete síntomas posibles que indican el problema por su presencia o ausencia. Mg. la causa o causas correctas se indican mediante un 1 lógico en la posición correspondiente del vector de salida. la red producirá una salida que identifique a la causa probable indicada por el mapa de síntomas de entrada. cuando la entrada sea parecida a alguna de las entradas de entrenamiento. y que la ausencia de un síntoma sea representada mediante un 0. Si se comparan las tablas 4. Editorial Addison Wesley. 8 Sierra Molina.5 y la tabla 4. esto es. Los pares de vectores de entrenamiento que se producen por la correspondencia de la matriz de síntomas y problemas para este ejemplo se muestran en la tabla 4. Esta aplicación ilustra la capacidad de la red para realizar la "mejor suposición" (generalización) y pone de manifiesto la capacidad de la red para enfrentarse a entradas de datos con ruido o incompletas. para cada salida de causa probable que desearíamos que aprendiera la red. Guillermo y otros (1995).6. Una vez que está entrenada. se pueden considerar los datos de los vectores fila de la matriz como tramas de entrada de siete dimensiones. Lo único que queda ahora es entrenar a la red con estos pares de datos. Volviendo de nuevo a la matriz de nuestro ejemplo.Una ecuación empírica según Sierra8. 32.6.Tabla 4. Ejecución del programa en Visual Basic 6. para entrenar a la red neuronal con los datos de la tabla 4. Estos pares de vectores de entrenamiento se utilizan para el problema de diagnósticos del automóvil.32. El formulario y la ejecución del programa en Visual Basic 6.6 y se debe obtener también el codigo fuente en Visual Basic. Figura 4. El codigo del formulario debe ser modificado de la siguiente manera: 208 Tópicos y Aplicaciones de la Inteligencia Artificial Bomba de gasolina Motor de arranque Cable caliente No hace nada Sin gasolina Distribuidor Sin chispa Molinillo Batería Bobina Cables Clics Gira .6. La implementacion se encuentra en el CD que se adjunta al libro. Entrada de síntomas Salida de causas probables 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 Se puede utilizar el Neuroshell.0.0. teniendo en cuenta el 4to patron de entrenamiento se muestra en la figura 4. teniendo en cuenta el 4 patron de entrenamiento de la tabla 4. Text) e(7) = Val(Text7.Text = "bien" End If If (s(4) > 0.Text) Call Fire_DIAGNOST(e.Text = "mal" End If If (s(3) >= 0 And s(3) < 0.Text = "mal" End If If (s(6) >= 0 And s(6) < 0.1) Then Text9.Text = "bien" End If End Sub Mg.1) Then Text10. Abraham Gamarra Moreno 209 .1) Then Text13.Text = "bien" End If If (s(3) > 0.9 And s(2) <= 1) Then Text9.Text = "bien" End If If (s(5) > 0.Private Sub Command1_Click() Dim e(7) As Double Dim s(6) As Double e(1) = Val(Text1.Text = "mal" End If If (s(2) >= 0 And s(2) < 0.1) Then Text11.9 And s(4) <= 1) Then Text11. s) If (s(1) > 0.Text) e(4) = Val(Text4.1) Then Text8.Text = "mal" End If If (s(5) >= 0 And s(5) < 0.Text = "bien" End If If (s(6) > 0.Text = "mal" End If If (s(1) >= 0 And s(1) < 0.9 And s(3) <= 1) Then Text10.9 And s(5) <= 1) Then Text12.9 And s(1) <= 1) Then Text8.Text) e(3) = Val(Text3.Text) e(5) = Val(Text5.Text) e(6) = Val(Text6.Text) e(2) = Val(Text2.9 And s(6) <= 1) Then Text13.Text = "bien" End If If (s(2) > 0.1) Then Text12.Text = "mal" End If If (s(4) >= 0 And s(4) < 0. Sub Fire_DIAGNOST(inarray() As Double.4733835 netsum = netsum + inarray(5) * -0.7716009 210 the Tópicos y Aplicaciones de la Inteligencia Artificial .' Insert this code into your VB program to fire F:\FILES2~1\ANNOSA~1\ARCHIV~2\CAPITU~3\DIAGNO~1\DIAGNOST network ' This code is designed to be simple and fast for porting to any machine. ' Therefore all code and weights are inline without looping or data storage ' which might be harder to port between compilers.4653012 netsum = netsum + inarray(6) * -1. outarray() As Double) Dim netsum As Double Static feature2(9) As Double ' inarray(1) is No_hace_Nada ' inarray(2) is Hace_Clics ' inarray(3) is Molinillo ' inarray(4) is Gira ' inarray(5) is Sin_chispa ' inarray(6) is Cable_caliente ' inarray(7) is Sin_gasolina ' outarray(1) is Batería ' outarray(2) is Bobina ' outarray(3) is Motor_de_arranque ' outarray(4) is Cables ' outarray(5) is Distribuidor ' outarray(6) is Bomba_de_gasolina If (inarray(1) < 0) Then inarray(1) = 0 If (inarray(1) > 1) Then inarray(1) = 1 inarray(1) = inarray(1) If (inarray(2) < 0) Then inarray(2) = 0 If (inarray(2) > 1) Then inarray(2) = 1 inarray(2) = inarray(2) If (inarray(3) < 0) Then inarray(3) = 0 If (inarray(3) > 1) Then inarray(3) = 1 inarray(3) = inarray(3) If (inarray(4) < 0) Then inarray(4) = 0 If (inarray(4) > 1) Then inarray(4) = 1 inarray(4) = inarray(4) If (inarray(5) < 0) Then inarray(5) = 0 If (inarray(5) > 1) Then inarray(5) = 1 inarray(5) = inarray(5) If (inarray(6) < 0) Then inarray(6) = 0 If (inarray(6) > 1) Then inarray(6) = 1 inarray(6) = inarray(6) If (inarray(7) < 0) Then inarray(7) = 0 If (inarray(7) > 1) Then inarray(7) = 1 inarray(7) = inarray(7) netsum = -0.1466639 netsum = netsum + inarray(3) * 2.3115481 netsum = netsum + inarray(1) * 0.7032344 netsum = netsum + inarray(2) * 0.454124 netsum = netsum + inarray(7) * -0.036957 netsum = netsum + inarray(4) * -0. 0145554 netsum = netsum + inarray(1) * -0.356552 netsum = netsum + inarray(7) * 1.329731 netsum = netsum + inarray(6) * 1.3643235 netsum + inarray(6) * 1.407685 netsum = netsum + inarray(2) * 1.082342 netsum = netsum + inarray(4) * 0.2768248 netsum = netsum + inarray(1) * 2.feature2(1) = 1 / (1 + Exp(-netsum)) netsum = -0.8707346 netsum = netsum + inarray(5) * -0.3411922 netsum = netsum + inarray(1) * 1.3624522 netsum + inarray(1) * -1.7950581 netsum = netsum + inarray(2) * -1.517177 netsum = netsum + inarray(5) * 0.6701 netsum = netsum + inarray(3) * 1.741183 netsum = netsum + inarray(6) * -2.257582 netsum = netsum + inarray(3) * 0.8750437 netsum = netsum + inarray(4) * 1.332756 netsum + inarray(7) * 1.5414248 netsum = netsum + inarray(6) * 2.146601 netsum = netsum + inarray(3) * -0.168171 netsum = netsum + inarray(7) * -0.651392 211 Mg. Abraham Gamarra Moreno .384689 netsum = netsum + inarray(7) * -1.747856 netsum = netsum + inarray(4) * -1.6289499 netsum = netsum + inarray(7) * 0.566727 feature2(5) = 1 / (1 + Exp(-netsum)) netsum = 0.1239126 netsum = netsum + inarray(1) * -1.3615806 netsum = netsum + inarray(6) * -0.007483043 netsum = netsum + inarray(1) * -0.92119 netsum + inarray(3) * 1.6556798 netsum = netsum + inarray(7) * 1.4000922 netsum = netsum + inarray(2) * -1.2812504 netsum = netsum + inarray(6) * -0.9325874 netsum = netsum + inarray(4) * -1.065744 netsum = netsum + inarray(2) * -1.9206671 feature2(2) = 1 / (1 + Exp(-netsum)) netsum = 0.7351373 netsum = netsum + inarray(5) * 0.2012251 netsum = netsum + inarray(4) * -0.666589 netsum + inarray(2) * -2.830723 netsum = netsum + inarray(2) * 0.415627 netsum + inarray(4) * 0.9200088 feature2(6) = 1 / (1 + Exp(-netsum)) netsum = netsum = netsum = netsum = netsum = netsum = netsum = netsum = 0.8275196 netsum = netsum + inarray(3) * 0.173773 feature2(4) = 1 / (1 + Exp(-netsum)) netsum = -0.269704 netsum = netsum + inarray(5) * -2.1193302 netsum + inarray(5) * 0.998027 netsum = netsum + inarray(3) * -1.647663 feature2(3) = 1 / (1 + Exp(-netsum)) netsum = -0.78116 netsum = netsum + inarray(5) * 1. 4337809 netsum = netsum + feature2(8) * -3.404087 netsum = netsum + inarray(6) * 0.7248147 212 Tópicos y Aplicaciones de la Inteligencia Artificial .08557819 netsum = netsum + inarray(1) * 0.760823 netsum = netsum + feature2(9) * -1.770092 netsum = netsum + inarray(5) * 0.562377 netsum = netsum + inarray(7) * 1.2997127 netsum = netsum + inarray(1) * 1.377198 feature2(9) = 1 / (1 + Exp(-netsum)) netsum = 0.9458458 netsum = netsum + inarray(5) * 2.1688382 netsum = netsum + feature2(4) * -1.778615 netsum = netsum + feature2(6) * -1.699543 netsum = netsum + feature2(2) * -0.450161 outarray(3) = 1 / (1 + Exp(-netsum)) netsum = -0.312466 netsum = netsum + feature2(8) * -0.740408 netsum = netsum + feature2(4) * -2.023457 netsum = netsum + feature2(9) * -0.8347372 netsum = netsum + feature2(3) * 1.6356097 netsum = netsum + feature2(1) * -1.1752312 netsum = netsum + feature2(1) * 0.244962 netsum = netsum + feature2(5) * 2.913407 netsum = netsum + inarray(4) * -0.671334 feature2(8) = 1 / (1 + Exp(-netsum)) netsum = -0.8845294 netsum = netsum + feature2(9) * 0.621511 netsum = netsum + feature2(2) * -0.1395936 netsum = netsum + inarray(3) * -1.564476 netsum = netsum + inarray(4) * 1.219513 netsum = netsum + feature2(7) * 0.016138 netsum = netsum + feature2(6) * 0.0302 netsum = netsum + feature2(8) * -1.9950833 netsum = netsum + inarray(6) * -1.08525 netsum = netsum + feature2(3) * 1.3042739 outarray(1) = 1 / (1 + Exp(-netsum)) netsum = 0.feature2(7) = 1 / (1 + Exp(-netsum)) netsum = -0.699184 netsum = netsum + feature2(6) * -1.6442617 netsum = netsum + inarray(7) * -1.8538765 netsum = netsum + feature2(1) * 1.380548 netsum = netsum + feature2(7) * -1.692052 netsum = netsum + feature2(4) * 0.5226364 netsum = netsum + feature2(5) * -1.3381723 netsum = netsum + feature2(7) * -4.013181 netsum = netsum + feature2(5) * 2.03661929 netsum = netsum + feature2(3) * 0.094244 netsum = netsum + inarray(3) * -1.1288214 outarray(2) = 1 / (1 + Exp(-netsum)) netsum = 0.3886256 netsum = netsum + inarray(2) * -2.399435 netsum = netsum + inarray(2) * -0.642975 netsum = netsum + feature2(2) * -1.8881556 netsum = netsum + feature2(1) * 1. Abraham Gamarra Moreno 213 .0.8 If (outarray(1) < 0) Then outarray(1) = 0 If (outarray(1) > 1) Then outarray(1) = 1 outarray(2) = (outarray(2) .0.8 If (outarray(5) < 0) Then outarray(5) = 0 If (outarray(5) > 1) Then outarray(5) = 1 outarray(6) = (outarray(6) .5481207 netsum = netsum + feature2(7) * 1.502021 netsum = netsum + feature2(7) * 0.6256061 netsum = netsum + feature2(3) * -3.05207601 netsum = netsum + feature2(4) * -1.3605849 netsum = netsum + feature2(6) * 2.1) / 0.5457298 netsum = netsum + feature2(9) * 0.489237 netsum = netsum + feature2(5) * 0.1454982 netsum = netsum + feature2(1) * 0.4916552 netsum = netsum + feature2(3) * -3.1) / 0.0.8 If (outarray(6) < 0) Then outarray(6) = 0 If (outarray(6) > 1) Then outarray(6) = 1 End Sub Mg.0.1) / 0.2992842 netsum = netsum + feature2(8) * 0.1) / 0.7328083 netsum = netsum + feature2(2) * 1.1342072 outarray(4) = 1 / (1 + Exp(-netsum)) netsum = -0.400938 netsum = netsum + feature2(4) * -1.2242781 outarray(5) = 1 / (1 + Exp(-netsum)) netsum = -0.1) / 0.886714 netsum = netsum + feature2(3) * 0.0.210217 outarray(6) = 1 / (1 + Exp(-netsum)) outarray(1) = (outarray(1) .82287 netsum = netsum + feature2(6) * 0.2363798 netsum = netsum + feature2(1) * 0.3150889 netsum = netsum + feature2(6) * 2.574203 netsum = netsum + feature2(5) * 0.8 If (outarray(2) < 0) Then outarray(2) = 0 If (outarray(2) > 1) Then outarray(2) = 1 outarray(3) = (outarray(3) .110788 netsum = netsum + feature2(5) * -1.8358494 netsum = netsum + feature2(2) * 0.2546888 netsum = netsum + feature2(8) * 0.8 If (outarray(4) < 0) Then outarray(4) = 0 If (outarray(4) > 1) Then outarray(4) = 1 outarray(5) = (outarray(5) .574738 netsum = netsum + feature2(8) * 1.0.netsum = netsum + feature2(2) * 0.669589 netsum = netsum + feature2(7) * 0.149344 netsum = netsum + feature2(9) * -4.8 If (outarray(3) < 0) Then outarray(3) = 0 If (outarray(3) > 1) Then outarray(3) = 1 outarray(4) = (outarray(4) .363693 netsum = netsum + feature2(4) * -1.4325282 netsum = netsum + feature2(9) * 0.1) / 0. 7 referida a ayudas concedidas en ejercicios anteriores. que se puede conceder por estudios a un trabajador en una empresa. CONCESIÓN DE AYUDAS POR ESTUDIOS El problema consiste en determinar cuál es el tipo de ayuda. Tabla 4.3. en base a concesiones otorgadas en otros casos.7.4. tipo de estudios a realizar. Ayudas concedidas con ejercicios anteriores 214 Tópicos y Aplicaciones de la Inteligencia Artificial . La empresa cuenta con la información de la tabla 4.9. y antigüedad en la empresa. Para la concesión se toman los siguientes atributos: • • • salario del trabajador. Tabla 4. Abraham Gamarra Moreno 215 . Ayudas concedidas con ejercicios anteriores (continuación) Tabla 4.7. Ayudas concedidas con ejercicios anteriores (continuación) Mg.7. 9. IMPLEMENTACIÓN DE OTRAS APLICACIONES CON REDES NEURONALES ARTIFICIALES En el CD se encuentra la implementación del reconocimiento de los caracteres A y B.33.0. Ejecución del programa en Visual Basic 6. 216 Tópicos y Aplicaciones de la Inteligencia Artificial . teniendo en cuenta el 16 avo patrón de entrenamiento se muestra en la figura 4.2. 4.33.7 y se debe obtener también el codigo fuente en Visual Basic.4. teniendo en cuenta el 16 avo patrón de entrenamiento de la tabla 4. Además se implementa el ejemplo de la identificación de animales de la tabla 4.NET. utilizando Neuroshell y Visual Basic . La implementacion se encuentra en el CD que se adjunta al libro.7. Figura 4. para entrenar a la red neuronal con los datos de la tabla 4.0. El formulario y la ejecución del programa en Visual Basic 6.Se puede utilizar el Neuroshell.