Modelado de sistemas dinámicos utilizando técnicas evolutivas y redes neuronales modulares
4.3 Técnicas evolutivas como herramientas de optimización y MANN
En el capítulo 2 se ha justificado la utilización de redes neuronales para la modelado e identificación de sistemas dinámicos. Se han sugerido las redes modulares como una alternativa interesante para minimizar algunos de los efectos menos deseables de las redes simples. También se ha descrito, en este capítulo, un algoritmo de aprendizaje, MBP, capaz de entrenar redes de módulos neuronales eficientemente.
Sin embargo, queda por resolver un problema fundamental para poder plantear un método integral de modelado de sistemas no lineales mediante MANN. Se trata de la determinación de la estructura modular del modelo. Es decir, queda por saber cuáles serán los NM que formarán parte del modelo y cómo estarán conectados entre ellos. Este problema es, probablemente, el más complejo de los que se plantean en este estudio. El espacio de búsqueda es enorme y la hipersuperficie de error poco regular, multimodal y difícil de caracterizar analíticamente. Es, en definitiva, el clásico problema en el que no existen métodos de búsqueda eficientes.
En esta sección se introducen las técnicas evolutivas de optimización, que son métodos frecuentemente útiles ante problemas como el planteado. También se esbozan las aplicaciones más frecuentes de las técnicas evolutivas en el diseño de redes neuronales y, finalmente, se describe la programación evolutiva como método para optimizar estructuras de redes modulares.
4.3.1 Introducción a las técnicas evolutivas de optimización
Las técnicas evolutivas son métodos de optimización inspirados en la evolución natural. Sus principales características son: operan sobre puntos del espacio de búsqueda (o codificaciones de éstos) en vez de operar sobre la función objetivo; utilizan simultáneamente la información asociada a un conjunto de posibles soluciones; son técnicas con reglas de transición estocásticas; y, por último, no garantizan la optimalidad de la solución final (en tiempo finito). Los primeros trabajos que describen técnicas evolutivas se publicaron a finales de los años 50 y principios de los 60, pero tuvieron poca repercusión debido, esencialmente, a la escasa potencia computacional del momento, que dificultaba la realización de experimentos. Durante los años 70 se dieron, de forma independiente, las bases de dos de las técnicas más conocidas actualmente: los algoritmos genéticos (Genetic Algorithms, GA) y las estrategias evolutivas
(Evolution Strategies, ES). Los resultados más interesantes, al respecto, son la demostración de convergencia en una solución óptima para ES, [Born-78], y el schema theorem para GA, [Hol-75]. Éste último fue reinterpretado en lo que se ha venido a llamar el principio del paralelismo implícito de los GA [Gol-89], en que se afirma que la evaluación de m soluciones candidatas está procesando paralela, e implícitamente, m3 soluciones candidatas.
En la actualidad, las técnicas evolutivas están bien fundamentadas (por ejemplo, todas tienen la convergencia demostrada) y son motivo de publicaciones periódicas y conferencias internacionales enteramente dedicadas a ellas. Se remite al lector a alguno de los libros sobre el tema (como [Bäck-96] y [Dav-91]) para profundizar en los resultados teóricos y aplicaciones usuales de las diferentes técnicas.
Seguidamente se explica el funcionamiento básico de un algoritmo genético. En primer lugar, es necesaria una función a optimizar, f(x), en la que x, que en este contexto se suele llamar individuo, puede tomar múltiples formas y representa un candidato a solución, o lo que es lo mismo, un punto del espacio de búsqueda. En los GA, x se codifica utilizando un vector binario o real. El conjunto Χ mantiene un número prefijado de soluciones y se suele denominar población de soluciones. El algoritmo consiste en la ejecución de los siguientes pasos:
Crear aleatoriamente la población inicial(Χ) Evaluar todos los individuos(f, x)
mientras condición de fin<>FALSO hacer Χ := selección(Χ)
Χ := recombinación(Χ) Χ := mutación(Χ)
Evaluar todos los individuos(f, x) Evaluar condición de fin
fmientras
En este algoritmo se destacan dos procesos diferentes: la evaluación de individuos y la aplicación de operadores genéticos. La evaluación consiste en obtener un índice de comportamiento, la bondad, asociado a cada individuo a partir de la función de evaluación f. Una característica muy interesante de las técnicas evolutivas es que la función de evaluación no está restringida en forma alguna, es decir, no necesita ser derivable o analítica como en otros métodos de optimización.
Los operadores genéticos de selección, mutación y recombinación tienen reglas de transición estocásticas y realizan las siguientes tareas: la selección escoge los individuos de mayor bondad para participar en la siguiente iteración, la mutación altera características de las soluciones; por ejemplo, en una codificación binaria cambiaría ceros por unos, y viceversa, en posiciones aleatorias de cada individuo; la recombinación permite combinar dos soluciones (padres) y obtener otras dos que contienen características de sus progenitoras.
4.3.2 Utilización de técnicas evolutivas en la optimización de redes neuronales
Las técnicas evolutivas se pueden aplicar en la optimización de redes neuronales a tres niveles conceptuales diferentes. El nivel más bajo es el paramétrico, que determina el comportamiento instantáneo de la red. El segundo nivel es el topológico, que define el rango de comportamientos alcanzable. Estos dos niveles corresponden a características estáticas de una ANN, pesos y topología. El tercero es el dinámico, que describe el mecanismo de adaptación de la red a su entorno, el conjunto de entradas y salidas que debe aprender. Este nivel se refiere al algoritmo o mecanismo de aprendizaje.
La utilización de técnicas evolutivas en la optimización de redes neuronales despertó gran interés a principios de los años 90. Se aplicaban algoritmos genéticos, más frecuentemente que las otras técnicas evolutivas, para substituir a los algoritmos de aprendizaje clásicos. Los resultados nunca fueron desalentadores, pero estudios más recientes ([Yao-93] y [Koehn-94]) demuestran que los algoritmos genéticos no superan a los algoritmos de aprendizaje basados en gradiente, sobre todo en problemas no triviales.
La optimización de topologías con algoritmos genéticos es un tema que se ha tratado largamente (tres ejemplos clásicos son [Harp-91], [McD-93], [Mil-89] y uno de los diversos repasos del estado del tema se da en [Kus-94]). Sin embargo, la optimización de topologías con este tipo de técnicas evolutivas da lugar a un problema de difícil solución. Es el problema de codificar la red neuronal de forma que el operador de recombinación genética tenga pleno sentido. Este problema, descrito en [Koehn-94], se ha estudiado (por ejemplo, en [Rad-93]) sin llegar a resultados concluyentes suficientemente generales. Aún así, existen otros métodos de codificación, como los que utilizan reglas para generar las ANN, con resultados positivos. Una aplicación que se ha estudiado poco, a pesar de su gran interés, es la optimización de algoritmos de aprendizaje con algoritmos genéticos. El experimento descrito en [Chal-90] fue, casi con certeza, el primero que se realizó al respecto, dando lugar a resultados muy interesantes, como el “redescubrimiento” de la conocida delta rule, aunque también se trata el tema en otros artículos, como [Yao-93].
4.3.3 Programación evolutiva
El problema de la codificación de las redes neuronales y, en general, de las estructuras de grafos dirigidos, ha planteado grandes controversias respecto a la aplicación de operadores de recombinación en estos tipos de estructuras, como se comenta en el precedente apartado. Ante esta situación, la programación evolutiva (EP, Evolutionary Programming) ha ido emergiendo como una alternativa válida a los algoritmos genéticos, puesto que ésta tiene como únicos operadores genéticos la selección y la mutación. La EP surgió a mediados de los años 60 ([Fog- 66]) como un método de “adquisición de inteligencia” en el que, de forma automática, se diseñaban autómatas de estado finito para reconocer secuencias de un alfabeto.
Un algoritmo de EP tiene como característica principal que no codifica las soluciones candidatas, sino que trabaja directamente con ellas. Por esta razón es, generalmente, más complicado plantear el operador de recombinación genética, de manera que el algoritmo resultante es el siguiente:
Crear aleatoriamente la población inicial(Χ) Evaluar todos los individuos(f, x ∈ X) mientras condición de fin<>FALSO hacer
ΧNueva := mutación(Χ)
Evaluar todos los individuos(f, x ∈ XNueva) Χ := selección(Χ, XNueva)
Evaluar condición de fin fmientras
Como se puede observar, toda la potencia de búsqueda se deja en manos del operador de mutación.
La EP se ha utilizado, con éxito, en la optimización de redes neuronales, especialmente en la optimización topológica porque resuelve, de forma natural, el problema de la codificación de la estructura neuronal.
En [McD-94] se propone un sistema, basado en EP, de optimización de los pesos de perceptrones (conectados entre sí de forma recurrente para formar filtros IIR) capaz de hacer predicción en series temporales. En [Ange-94] se describe un sistema que diseña redes
recurrentes (tanto la topología como los pesos) y se comprueba su funcionamiento en 3 problemas de creciente complejidad. Otro ejemplo interesante es [Fog-93]. Finalmente, es interesante mencionar [Yao-98] como un paso más allá en la optimización de redes neuronales con EP puesto que aquí se diseñan redes modulares, de tipo ensemble.
El operador de selección se realiza de diferentes formas pero, en general, parte de dos conjuntos de soluciones, de tamaño M, y devuelve un conjunto nuevo, de igual tamaño. Recordemos que, en este punto, las soluciones que recibe el operador de selección han sido evaluadas y, por tanto, es posible compararlas utilizando la bondad obtenida para cada una. Los dos métodos de selección típicos son el elitista y el competitivo. En el primero, se reciben 2·M soluciones, se ordenan, y se escogen las M mejores; el resto es descartado. El segundo consiste en generar M competiciones, de las que los ganadores formarán el conjunto seleccionado. Una competición se realiza comparando la bondad de dos o más soluciones extraídas al azar entre las 2·M iniciales. El operador de mutación suele comprender dos pasos: determinación de la severidad de la mutación y la propia mutación. La severidad se puede calcular como una función de la bondad óptima, de manera que para bondades lejanas a la óptima las mutaciones sean grandes y para bondades cercanas a la óptima las mutaciones sean pequeñas. Cuando el problema a optimizar es de tipo numérico, tanto la severidad como la mutación son calculables de forma directa. Por ejemplo, la mutación puede realizarse sumando a cada parámetro un valor aleatorio extraído de una distribución gaussiana centrada en cero y con desviación estándar proporcional a la severidad. Sin embargo, en otros tipos de problemas, como el de la optimización de topologías neuronales, es más complicado establecer una relación clara entre bondad y severidad.
En la siguiente sección se describe un algoritmo de programación evolutiva para la modelado e identificación de sistemas dinámicos no lineales con redes neuronales modulares. En ella se precisa cómo se han implementado tanto la selección como la mutación y cómo se evalúan las redes modulares resultantes.
4.4 Descripción de la herramienta de modelado de sistemas no lineales