Articles

El problema XOR en las redes neuronales.

Introducción
Este es el primero de una serie de posts que exploran las implementaciones de redes neuronales artificiales (RNA). El propósito del artículo es ayudar al lector a intuir los conceptos básicos antes de pasar a las implementaciones algorítmicas que vendrán a continuación.

No se asumen conocimientos previos, aunque, en aras de la brevedad, no se explica toda la terminología en el artículo. En su lugar, se proporcionan hipervínculos a Wikipedia y a otras fuentes en las que puede ser necesaria una lectura adicional.

Este es un gran tema. Las RNA tienen una gran variedad de aplicaciones y pueden utilizarse para el aprendizaje supervisado, no supervisado, semisupervisado y de refuerzo. Eso antes de entrar en las arquitecturas de problemas específicos dentro de esas categorías. Pero hay que empezar por algún sitio, así que para reducir el alcance, empezaremos con la aplicación de las RNA a un problema sencillo.

El problema XOr
El problema XOr, o «exclusivo o», es un problema clásico en la investigación de las RNA. Es el problema de utilizar una red neuronal para predecir las salidas de las puertas lógicas XOr dadas dos entradas binarias. Una función XOr debe devolver un valor verdadero si las dos entradas no son iguales y un valor falso si son iguales. Todas las entradas posibles y las salidas predichas se muestran en la figura 1.

XOr es un problema de clasificación y uno para el que las salidas esperadas se conocen de antemano. Por lo tanto, es apropiado utilizar un enfoque de aprendizaje supervisado.

En la superficie, XOr parece ser un problema muy simple, sin embargo, Minksy y Papert (1969) demostraron que éste era un gran problema para las arquitecturas de redes neuronales de la década de 1960, conocidas como perceptrones.

Perceptrones
Como todas las RNA, el perceptrón está compuesto por una red de unidades, que son análogas a las neuronas biológicas. Una unidad puede recibir una entrada de otras unidades. Al hacerlo, toma la suma de todos los valores recibidos y decide si va a transmitir una señal a otras unidades a las que está conectada. Esto se llama activación. La función de activación utiliza un medio u otro para reducir la suma de los valores de entrada a un 1 o a un 0 (o a un valor muy cercano a un 1 o a un 0) para representar la activación o la falta de ella. Otra forma de unidad, conocida como unidad de sesgo, siempre se activa, normalmente enviando un 1 codificado a todas las unidades a las que está conectada.

Los perceptrones incluyen una sola capa de unidades de entrada -incluyendo una unidad de sesgo- y una sola unidad de salida (ver figura 2). Aquí una unidad de sesgo se representa con un círculo discontinuo, mientras que las otras unidades se muestran como círculos azules. Hay dos unidades de entrada no sesgadas que representan los dos valores binarios de entrada para XOr. Se puede incluir cualquier número de unidades de entrada.

El perceptrón es un tipo de red feed-forward, lo que significa que el proceso de generación de una salida -conocido como propagación hacia adelante- fluye en una dirección desde la capa de entrada a la capa de salida. No hay conexiones entre las unidades de la capa de entrada. En su lugar, todas las unidades de la capa de entrada están conectadas directamente a la unidad de salida.

Una explicación simplificada del proceso de propagación hacia adelante es que los valores de entrada X1 y X2, junto con el valor de sesgo de 1, se multiplican por sus respectivos pesos W0..W2, y se analizan en la unidad de salida. La unidad de salida toma la suma de esos valores y emplea una función de activación -típicamente la función escalonada de Heavside- para convertir el valor resultante en un 0 o un 1, clasificando así los valores de entrada como 0 o 1.

Es el ajuste de las variables de peso lo que da al autor de la red el control sobre el proceso de conversión de los valores de entrada en un valor de salida. Son los pesos los que determinan dónde se dibuja la línea de clasificación, la línea que separa los puntos de datos en grupos de clasificación. Si a todos los puntos de datos de un lado de una línea de clasificación se les asigna la clase 0, todos los demás se clasifican como 1.

Una limitación de esta arquitectura es que sólo es capaz de separar los puntos de datos con una sola línea. Esto es desafortunado porque las entradas XOr no son linealmente separables. Esto es particularmente visible si usted traza los valores de entrada XOr a un gráfico. Como se muestra en la figura 3, no hay manera de separar las predicciones 1 y 0 con una sola línea de clasificación.

Perceptrones multicapa
La solución a este problema es ampliar más allá de la arquitectura de una sola capa mediante la adición de una capa adicional de unidades sin ningún acceso directo al mundo exterior, conocida como una capa oculta. Este tipo de arquitectura -que se muestra en la figura 4- es otra red de avance conocida como perceptrón multicapa (MLP).

Cabe destacar que un MLP puede tener cualquier número de unidades en sus capas de entrada, oculta y de salida. También puede haber cualquier número de capas ocultas. La arquitectura utilizada aquí está diseñada específicamente para el problema XOr.

De manera similar al perceptrón clásico, la propagación hacia adelante comienza con los valores de entrada y la unidad de sesgo de la capa de entrada que se multiplican por sus respectivos pesos, sin embargo, en este caso hay un peso para cada combinación de entrada (incluyendo la unidad de sesgo de la capa de entrada) y unidad oculta (excluyendo la unidad de sesgo de la capa oculta). Los productos de los valores de la capa de entrada y sus respectivos pesos se analizan como entrada a las unidades no sesgadas de la capa oculta. Cada unidad oculta no sesgada invoca una función de activación -normalmente la clásica función sigmoidea en el caso del problema XOr- para aplastar la suma de sus valores de entrada hasta un valor que caiga entre 0 y 1 (normalmente un valor muy cercano a 0 o 1). Las salidas de cada unidad de la capa oculta, incluida la unidad de sesgo, se multiplican por otro conjunto de pesos respectivos y se analizan en una unidad de salida. La unidad de salida también analiza la suma de sus valores de entrada a través de una función de activación -de nuevo, la función sigmoide es apropiada en este caso- para devolver un valor de salida que cae entre 0 y 1. Esta es la salida predicha.

Esta arquitectura, aunque más compleja que la de la red perceptrón clásica, es capaz de lograr una separación no lineal. Por lo tanto, con el conjunto correcto de valores de peso, puede proporcionar la separación necesaria para clasificar con precisión las entradas XOr.

Backpropagación
El elefante en la habitación, por supuesto, es cómo se podría llegar a un conjunto de valores de peso que aseguren que la red produce la salida esperada. En la práctica, tratar de encontrar manualmente un conjunto aceptable de pesos para una red MLP sería una tarea increíblemente laboriosa. De hecho, es NP-completa (Blum y Rivest, 1992). Sin embargo, afortunadamente es posible aprender un buen conjunto de valores de peso automáticamente a través de un proceso conocido como retropropagación. Rumelhart et al. (1985) demostraron por primera vez que funcionaba bien para el problema XOr.

El algoritmo de retropropagación comienza comparando el valor real obtenido por el proceso de propagación hacia delante con el valor esperado y luego se mueve hacia atrás a través de la red, ajustando ligeramente cada uno de los pesos en una dirección que reduce el tamaño del error en un pequeño grado. Tanto la propagación hacia delante como hacia atrás se repiten miles de veces en cada combinación de entrada hasta que la red puede predecir con precisión la salida esperada de las posibles entradas utilizando la propagación hacia delante.

Para el problema xOr, el 100% de los posibles ejemplos de datos están disponibles para su uso en el proceso de entrenamiento. Por lo tanto, podemos esperar que la red entrenada sea 100% precisa en sus predicciones y no hay necesidad de preocuparse por cuestiones como el sesgo y la varianza en el modelo resultante.

Conclusión
En este post, se exploró el problema clásico de la RNA XOr. El problema en sí se describió en detalle, junto con el hecho de que las entradas para XOr no son linealmente separables en sus categorías de clasificación correctas. Se exploró una solución no lineal -que implica una arquitectura MLP- a alto nivel, junto con el algoritmo de propagación hacia adelante utilizado para generar un valor de salida de la red y el algoritmo de retropropagación, que se utiliza para entrenar la red.

El próximo post de esta serie presentará una implementación en Java de la arquitectura MLP descrita aquí, incluyendo todos los componentes necesarios para entrenar la red para que actúe como una puerta lógica XOr.

Blum, A. Rivest, R. L. (1992). El entrenamiento de una red neuronal de 3 nodos es NP-completo. Neural Networks, 5(1), 117-127.