Entorno de desarrollo Xfuzzy 3

Herramienta de aprendizaje supervisado - Xfsl

xfsl es una herramienta que permite al usuario aplicar algoritmos de aprendizaje supervisado para ajustar sistemas difusos desarrollados en el flujo de diseño de Xfuzzy 3. La herramienta puede ser ejecutada en modo gráfico o en modo de comando. El modo gráfico se emplea cuando se ejecuta la herramienta desde la ventana principal del entorno (usando la opción "Supervised learning" del menú Tuning. El modo de comando se utiliza cuando se ejecuta la herramienta desde la línea de comandos con la expresión "xfsl file.xfl [file.cfg]", donde el primer fichero contiene la definición del sistema en formato XFL3 y el segundo la configuración del proceso de aprendizaje (ver sección Fichero de configuración).

La figura anterior ilustra la ventana principal de xfsl. Esta ventana está dividida en cuatro partes. La parte superior izquierda corresponde a la zona utilizada para configurar el proceso de aprendizaje. El estado del proceso de aprendizaje se muestra en la parte superior derecha. La zona central muestra de forma gráfica la evolución del aprendizaje. La parte inferior de la ventana contiene varios botones de control para iniciar o parar el proceso, salvar los resultados y salir de la aplicación.

Para configurar el proceso de aprendizaje, el primer paso es seleccionar un fichero de entrenamiento que contenga los datos de entrada/salida correspondientes al comportamiento deseado. También puede seleccionarse un fichero de test cuyos datos se emplean para comprobar la capacidad de generalización del aprendizaje. El formato de ambos ficheros de patrones consiste en una serie de valores numéricos que son asignados a las variables de entrada y salida en el mismo orden que aparecen en la definición del módulo system de la descripción XFL3. Un ejemplo de fichero de patrones para un sistema difuso con dos entradas y usa salida se muestra a continuación:

 0.00 0.00 0.5
 0.00 0.05 0.622459
 0.00 0.10 0.731059 
 ...   

La selección de un fichero de log permite salvar la evolución del aprendizaje en un fichero externo. El empleo de este campo es opcional.

El siguiente paso en la configuración del proceso de ajuste es la selección del algoritmo de aprendizaje. xfsl permite el uso de muchos algoritmos diferentes (ver sección algoritmos). Entre los algoritmos básicos de descenso por el gradiente pueden seleccionarse: Steepest Descent, Backpropagation, Backpropagation with Momentum, Adaptive Learning Rate, Adaptive Step Size, Manhattan, QuickProp y RProp. Se incluyen asimismo los siguientes algoritmos de gradiente conjugado: Polak-Ribiere, Fletcher-Reeves, Hestenes-Stiefel, One-step Secant y Scaled Conjugate Gradient. Los algoritmos de segundo orden disponibles son: Broyden-Fletcher-Goldarfb-Shanno, Davidon-Fletcher-Powell, Gauss-Newton y Mardquardt-Levenberg. Con respecto a los algoritmos sin derivadas, pueden aplicarse: Downhill Simplex y Powell's method. Por último los algoritmos estadísticos incluidos son: Blind Search y Simulated Annealing (con esquemas de enfriamiento lineal, exponencial, clásico, rápido y adaptativo).

Una vez que el algoritmo ha sido seleccionado, debe elegirse una función de error. La herramienta ofrece varias funciones de error que pueden usarse para calcular la desviación entre el comportamiento actual y el deseado. (ver sección función de error). Por defecto se utiliza el error cuadrático medio (Mean Square Error).

xfsl dispone de dos algoritmos de procesado para simplificar el sistema difuso diseñado. El primero de ellos "poda" las reglas y elimina las funciones de pertenencia que no alcanzan un grado de activación o de pertenencia significativo. Existen tres variantes del algoritmo: podar todas las reglas que nunca se activan por encima de un determinado umbral, podar las N peores reglas y podar todas las reglas excepto las N mejores. El segundo algoritmo busca asociaciones o clusters de las funciones de pertenencia de las variables de salida. El número de clusters puede ser fijado de antemano o calculado automáticamente. Estos dos algoritmos de procesado pueden ser aplicados al sistema antes del proceso de ajuste (opción de preprocesado) o después de él (opción de postprocesado).

Para terminar el proceso de aprendizaje es necesario especificar una condición de fin. Dicha condición consiste en un límite impuesto sobre el número de iteraciones, el error máximo obtenido o la desviación máxima absoluta o relativa (considerando tanto los errores asociados a los datos de entrenamiento como a los de test).

La herramienta permite que el usuario seleccione los parámetros del sistema que deben ser ajustados. La siguiente ventana se utiliza para habilitar o deshabilitar el ajuste de parámetros. Las tres listas de la parte superior se emplean para seleccionar un parámetro o un conjunto de parámetros, seleccionando el tipo de la variable, la función de pertenencia de ese tipo y el índice del parámetro de esa función de pertenencia. La lista de la parte inferior de la ventana muestra la configuración actual. Las distintas líneas de configuración son interpretadas en el orden en que aparecen en la lista. En este ejemplo todos los parámetros son inicialmente deshabilitados y posteriormente se habilitan los parámetros del tipo Tout, de forma que sólo serán ajustados los parámetros correspondientes a este tipo.

La configuración completa del proceso de aprendizaje puede salvarse en un fichero externo que estará disponible para usos posteriores. El formato de este fichero se describe en la sección fichero de configuración.

xfsl puede aplicarse a cualquier sistema difuso descrito por el lenguaje XFL3, incluso a sistemas que emplean funciones particulares definidas por el usuario. Lo que debe ser considerado es que las características del sistema pueden imponer limitaciones sobre los algoritmos de aprendizaje a utilizar (por ejemplo, un sistema no derivable no puede ser ajustado mediante algoritmos basados en descenso por el gradiente).

Algoritmos

Ya que el objetivo de los algoritmos de aprendizaje supervisado consiste en minimizar una función de error que cuantifica la desviación entre el comportamiento actual y el deseado del sistema, estos algoritmos pueden ser considerados como algoritmos de optimización de funciones. xfsl incluye muchos algoritmos de aprendizaje supervisado que son brevemente descritos a continuación.

A) Algoritmos de descenso por el gradiente

La equivalencia entre sistemas difusos y redes neuronales motivó el empleo de las técnicas de aprendizaje usadas en redes neuronales a los sistemas de inferencia difusos. En este sentido, uno de los algoritmos más conocidos empleados en sistemas difusos es el algoritmo de BackPropagation, que modifica los valores de los parámetros proporcionalmente al gradiente de la función de error con objeto de alcanzar un mínimo local. Ya que la velocidad de convergencia de este algoritmo es lenta, se han propuesto varias modificaciones como usar una razón de aprendizaje diferente para cada parámetro o adaptar heurísticamente las variables de control del algoritmo. Una modificación interesante que mejora en gran medida la velocidad de convergencia consiste en tener en cuenta el valor del gradiente en dos iteraciones sucesivas, lo que proporciona información sobre la curvatura de la función de error. Los algoritmos QuickProp y RProp siguen esta idea.

xfsl admite Backpropagation, Backpropagation with Momentum, Adaptive Learning Rate, Adaptive Step Size, Manhattan, QuickProp y RProp.

B) Algoritmos de gradiente conjugado

Los algoritmos de descenso por el gradiente generan un cambio en los valores de los parámetros que es función del valor del gradiente en cada iteración (y posiblemente en iteraciones previas). Ya que el gradiente indica la dirección de máxima variación de la función, puede resultar conveniente generar no un único paso sino varios pasos que minimicen la función de error en esa dirección. Esta idea, que es la base del algoritmo steepest-descent, presenta el inconveniente de producir un avance en zig-zag, porque la optimización en una dirección puede deteriorar el resultado de optimizaciones previas. La solución consiste en avanzar por direcciones conjugadas que no interfieran entre sí. Los distintos algoritmos de gradiente conjugado reportados en la literatura difieren en la ecuación utilizada para calcular las direcciones conjugadas.

El principal inconveniente de los algoritmos de gradiente conjugado es la implementación de una búsqueda lineal en cada dirección, lo que puede resultar costoso en términos de evaluaciones de la función. La búsqueda lineal puede evitarse utilizando información de segundo orden, es decir, aproximando la derivada segunda mediante dos derivadas primeras próximas. El algoritmo scaled conjugate gradient está basado en esta idea.

Los siguientes algoritmos de gradiente conjugado están incluidos en xfsl: Steepest Descent, Polak-Ribiere, Fletcher-Reeves, Hestenes-Stiefel, One-step Secant y Scaled Conjugate Gradient.

C) Algoritmos de segundo orden

Un paso adicional para acelerar la convergencia de los algoritmos de aprendizaje es hacer uso de información de segundo orden de la función de error, esto es, de sus derivadas segundas o, en forma matricial, de su Hesiano. Ya que el cálculo de las derivadas segundas es complejo, una posible solución es aproximar el Hesiano mediante valores del gradiente en iteraciones sucesivas. Esta es la idea de los algoritmos Broyden-Fletcher-Goldarfb-Shanno y Davidon-Fletcher-Powell.

Un caso particular importante es aquél en que la función de error a minimizar es cuadrática porque el Hesiano puede ser aproximado usando sólo las derivadas primeras de las salidas del sistema, como hace el algoritmo Gauss-Newton. Ya que este algoritmo puede presentar inestabilidad cuando la aproximación del Hesiano no es definida positiva, el algoritmo Marquardt-Levenberg resuelve este problema introduciendo un término adaptativo.

Los algoritmos de segundo orden incluidos en la herramienta son: Broyden-Fletcher-Goldarfb-Shanno, Davidon-Fletcher-Powell, Gauss-Newton y Mardquardt-Levenberg.

D) Algoritmos sin derivadas

No siempre es posible calcular el gradiente de la función de error, ya que dicho gradiente puede no estar definido o su cálculo puede resultar extremadamente costoso. En estos casos pueden emplearse algoritmos de optimización que no utilicen derivadas. Un ejemplo de este tipo de algoritmos es el algoritmo Downhill Simplex, que considera un conjunto de evoluciones de la función para decidir el cambio en los parámetros. Otro ejemplo es el Powell's method, que implementa búsquedas lineales mediante un conjunto de direcciones que tienden a ser conjugadas. Los algoritmos de este tipo son mucho más lentos que los anteriores. Una solución más eficiente puede ser estimar las derivadas a partir de las secantes o emplear el signo de la derivada en lugar de su valor (como hace RProp), el cual puede ser estimado a partir de pequeñas perturbaciones de los parámetros.

Todos los algoritmos comentados hasta el momento no alcanzan el mínimo global sino un mínimo local de la función de error. Los algoritmos estadísticos pueden descubrir el mínimo global porque generan diferentes configuraciones del sistema que expanden el espacio de búsqueda. Un modo de ampliar el espacio explorado es generar configuraciones aleatorias y elegir las mejores. Esta es la estrategia seguida por el algoritmo Blind Search, cuya velocidad de convergencia es extremadamente lenta. Otra alternativa consiste en realizar pequeñas perturbaciones de los parámetros hasta encontrar una solución mejor, como hacen los algoritmos de mejora iterativa. Una opción mejor es emplear algoritmos de enfriamiento simulado (Simulated Annealing). Estos algoritmos están basados en la analogía entre el proceso de aprendizaje, que intenta minimizar la función de error, y la evolución de un sistema físico, que tiende a disminuir su energía cuando se decrementa la temperatura. Los algoritmos de enfriamiento simulado proporcionan buenos resultados cuando el número de parámetros a ajustar es bajo. Cuando este número es alto, la velocidad de convergencia puede ser tan lenta que puede ser preferible generar configuraciones aleatorias, aplicar algoritmos de descenso por el gradiente y seleccionar la mejor solución.

Los algoritmos sin derivadas que puede aplicar xfsl son: Downhill Simplex y Powell's method. Los algoritmos estadísticos incluidos en la herramienta son: Blind Search y Simulated Annealing (con esquemas de enfriamiento lineal, exponencial, clásico, rápido y adaptativo).

Cuando se optimiza un sistema derivable los algoritmos Broyden-Fletcher-Goldarfb-Shanno (BFGS) y Mardquardt-Levenberg (ML) son los más adecuados. Una buena elección para los valores de control de BFGS puede ser (0.1,10). Para el algoritmo ML los valores de control (0.1,10,0.1) son una buena elección inicial. Si no es posible calcular las derivadas del sistema, como ocurre en los sistemas jerárquicos, la mejor elección es emplear algoritmos que permitan estimar la derivada. Los algoritmos de enfriamiento simulado sólo son recomendables cuando existan pocos parámetros a ajustar y los algoritmos de segundo orden lleven al sistema hasta un mínimo local no óptimo.

Función de error

La función de error expresa la desviación entre el comportamiento actual del sistema difuso y el deseado, comparando los patrones de entarda/salida con los valores de salida del sistema para los correspondientes valores de entrada. xfsl define siete funciones de error: mean_square_error (MSE), weighted_mean_square_error (WMSE), mean_absolute_error (MAE), weighted_mean_absolute_error (WMAE), classification_error (CE), advanced_classification_error (ACE), y classification_square_error (CSE).

Todas estas funciones están normalizadas con respecto al número de patrones, al número de variables de salida y al rango de cada variable de salida, de forma que cualquier función de error puede tomar valores entre 0 y 1. Las cuatro primeras funciones son adecuadas para sistemas con variables de salida continuas, mientras que las tres últimas son específicas para sistemas de clasificación. Las ecuaciones que describen a las primeras funciones son las siguientes:

MSE = Sum( ((Y-y)/range)**2 )/(num_pattern*num_output)
WMSE = Sum( w * ((Y-y)/range)**2 )/(num_pattern*Sum(w))
MAE = Sum( |((Y-y)/range)| )/(num_pattern*num_output)
WMAE = Sum( w * |((Y-y)/range)| )/(num_pattern*Sum(w))

La salida de un sistema difuso para clasificación es la etiqueta lingüística que tiene el mayor grado de activación. La forma habitual de expresar la desviación de estos sistemas respecto al comportamiento deseado es mediante el número de fallos de clasificación (classification_error, CE). Sin embargo esta elección no resulta muy adecuada para ajustar el sistema, ya que muchas configuraciones diferentes del mismo pueden producir el mismo número de fallos. Una modificación útil es añadir un término que mida la distancia entre la etiqueta seleccionada y la esperada (advanced_classification_error, ACE). Las dos funciones de error anteriores no son derivables, por lo que no pueden ser usadas con algoritmos de aprendizaje basados en derivadas (que son los más rápidos). Una elección que evita este inconveniente es considerar el grado de activación de cada etiqueta como la salida actual del sistema y la salida deseada como 1 para la etiqueta correcta y 0 para todas las demás. En este caso la función de error puede calcularse como el error cuadrático del sistema (classification_square_error, CSE), que es una función derivable con la que sí pueden usarse los algoritmos de aprendizaje basados en derivadas.

Fichero de configuración

La configuración de un proceso de ajuste puede ser guardada en y cargada desde un fichero externo. El contenido de este fichero está formado por las siguientes directivas:

 xfsl_training("file_name")
 xfsl_test("file_name")
 xfsl_log("file_name")
 xfsl_output("file_name")
 xfsl_algorithm(algorithm_name,value,value,...)
 xfsl_option(option_name,value,value,...)
 xfsl_errorfunction(function_name,value,value,...)
 xfsl_preprocessing(process_name,value,value,...)
 xfsl_postprocessing(process_name,value,value,...)
 xfsl_endcondition(condition_name,value,value,...)
 xfsl_enable(type.mf.number)
 xfsl_disable(type.mf.number)

Las directivas xfsl_training y xfsl_test seleccionan los ficheros de patrones para entrenamiento y test del sistema. El fichero de log para almacenar la evolución del aprendizaje se selecciona mediante la directiva xfsl_log. La directiva xfsl_output contiene el nombre del fichero XFL3 donde se salvará el sistema una vez ajustado. Por defecto el nombre de este fichero es "xfsl_out.xfl".

El algoritmo de aprendizaje se define con la directiva xfsl_algorithm. Los valores se refieren a las variables de control del algoritmo. Una vez elegido el algoritmo, la directiva xfsl_option permite seleccionar cualquiera de sus opciones específicas.

La selección de la función de error se realiza mediante la directiva xfsl_errorfunction. Los valores contienen los pesos de las variables de salida utilizados para ponderar las funciones de error.

Las directivas xfsl_preprocessing y xfsl_postprocessing especifican los procesos que deben llevarse a cabo antes y después del ajuste. Las opciones posibles son: prune_threshold, prune_worst, prune_except y output_clustering. Cuando la opción output_clustering contiene un valor este valor indica el número de clusters que serán creados. En caso contrario dicho número es calculado de forma automática.

La condición de fin, seleccionada mediante xfsl_endcondition, puede ser una de las siguientes: epoch, training_error, training_RMSE, training_MXAE, training_variation, test_error, test_RMSE, test_MXAE, y test_variation.

La selección de los parámetros a ajustar se realiza mediante las directivas xfsl_enable y xfsl_disable. Los campos type, mf, y number indican el tipo de la variable, la función de pertenencia y el índice del parámetro. Estos campos pueden contener también la expresión "ANY".

Ejemplo

El directorio de ejemplos de la distribución de Xfuzzy contiene distintos ejemplos de procesos de ajuste. La configuración inicial del sistema se especifica en un fichero XFL3, que define un sistema difuso con dos variables de entrada y una de salida. Las funciones de pertenencia de las variables de salida son idénticas, de manera que el comportamiento entrada/salida de esta configuración inicial corresponde a una superficie plana.

La siguiente tabla muestra los resultados obtenidos en uno de los casos, en el que se utilizó un fichero de aprendizaje con patrones que describen la superficie dada por la expresión:

 z = 1 / ( 1 + exp(10*(x-y)) ) 

tras emplear el algoritmo de aprendizaje Marquardt-Levenberg y aplicar, como postprocesado, técnicas de clustering para reducir el número de funciones.


------------------------------------------------------------------------
F. J. Moreno-Velo, I. Baturone, A. Barriga, S. Sánchez-Solano
Automatic Tuning of Complex Fuzzy Systems with Xfuzzy
Fuzzy Sets and Systems 2007 
DOI: 10.1016/j.fss.2007.03.006

Para comentarios, sugerencias, notificación de bugs, etc. contacte con nosotros en:   xfuzzy-team@imse-cnm.csic.es

©IMSE-CNM 2018