Redes neuronales con conexiones hacia adelante


Las redes de prealimentación con niveles fueron estudiadas por primera vez a finales de la década de los 50 bajo el nombre de perceptrones. Si bien se sometieron a estudio redes de todos los tamaños y topologías, el único elemento de aprendizaje efectivo en esa época fueron las redes de un solo nivel. Actualmente el término perceptrón es sinónimo de una red de prealimentación de un solo nivel.

El perceptrón

Fué el primer modelo de red neuronal artificial desarrollado en 1958 por Rosenblatt. Despertó un enorme interés en los años 60 debido a su capacidad para aprender a reconocer patrones sencillos.

Está formado por varias neuronas para recibir las entradas a la red y una neurona de salida que es capaz de decidir cuándo una entrada a la red pertenece a una de las dos clases que es capaz de reconocer.

La neurona de salida del Perceptrón realiza la suma ponderada de las entradas, resta el umbral y pasa el resultado a una función de transferencia de tipo escalón. La regla de decisión es responder +1 si el patrón presentado pertenece a la clase A, o -1 si el patrón pertenece a la clase B.

Qué pueden representar los perceptrones

Al constar sólo de una capa de entrada y otra de salida con una única neurona, tiene una capacidad de representación bastante limitada. Sólo es capaz de discriminar patrones muy sencillos y linealmente separables en el plano. Es incapaz, por ejemplo, de representar la función OR-EXCLUSIVA.

La separabilidad lineal limita a las redes con sólo dos capas a la resolución de problemas en los cuáles el conjunto de puntos (valores de entrada) sean separables geométricamente. En el caso de dos entradas, la separación se lleva a cabo mediante una línea recta. Para tres entradas, la separación se realiza mediante un plano en el espacio tridimensional y así sucesivamente hasta el caso de N entradas, en el cuál el espacio N-dimensional es dividido en un hiperplano.

El hecho de que el perceptrón sólo es capaz de representar funciones linealmente separables se deduce de la expresión

salida = W E


dónde :  
  W es el vector de los pesos de las conexiones con la neurona de salida
  E es el vector de las entradas a la neurona de salida

Este produce un 1 sólo si W.E > 0 Esto significa que todo el espacio de entradas se divide en dos a lo largo de un límite definido por W.E = 0, es decir, un plano en el espacio de entrada con coeficientes definidos por los pesos.


Regla de aprendizaje

El algoritmo de aprendizaje del Perceptrón es de tipo supervisado, lo que requiere que sus resultados sean evaluados y se realicen las oportunas modificaciones de los pesos si fuera necesario.

Para entender el mecanismo de aprendizaje del perceptrón nos basaremos en la función OR. Lo que se pretende al modificar los pesos es encontrar una recta que divida el plano en dos espacios de las dos clases de valores de entrada: las que producen un 1 a la salida y las entradas que producen un 0 a la salida. Concretamente deberá separar las entradas 01, 10, 11 de la entrada 00.






Función OR: produce 0 cuando las dos entradas son 0. En cualquier otro caso produce 1.

La ecuación de salida vendrá dada por

y = f ( w1x1+ w2x2)

donde wi representa el peso de la conexión, xi la entrada y f la función de transferencia o de salida que en este caso es la función identidad.
Si la suma anterior es mayor que 0, la salida será 1 y en caso contrario, -1 (función escalón).

Se supone también que se añade una neurona con una entrada fija a 1 y peso w0 igual al opuesto del valor del umbral y que deberá ser ajustado durante la etapa de aprendizaje.

A continuación se expone el algoritmo y posteriormente un ejemplo que aclara el funcionamiento.

Algoritmo

1. Inicialización de los pesos y del umbral : inicialmente se asigna valores aleatorios a cada uno de los pesos w1, w2 yw0 = umbral.

2. Presentación de un nuevo par (Entrada, Salida esperada) :

3. Cálculo de la salida actual
 
y(t) = f [ Sum (wi(t) xi(t)) - umbral]

4. Adaptación de los pesos
 
wi(t+1) = wi(t) + ß [d(t) - y(t)] xi(t)

donde d(t) representa la salida deseada y ß es un factor de ganancia (velocidad de aprendizaje), en el rango 0.0 a 1.0. En la función OR ß=1

5. Volver al paso 2

Ejemplo

a) Sean inicialmente los valores aleatorios :
 
w0 = 1.5 w1 = 0.5 w2 = 1.5

b) Se van tomando uno a uno los cuatro patrones de entrada

b.1) Patrón 00
 
Entradas : xo = 1; x1 = 0; x2 = 0
Pesos : wo(t) = 1.5 ; w1(t) = 0.5; w2(t) = 1.5
Net i : 1 (1.5)+ 0 (0.5) + 0 (1.5) = 1.5
Salida que produce f : 1, puesto que Neti > 0
Salida deseada : 0, puesto que OR(00) = 0
Pesos modificados : wo(t+1) = 0.5 ; w1(t+1) = 0.5 ; w2(t+1) = 1.5
b.2) Patrón 01
 
Entradas : xo = 1; x1 = 0; x2 = 1
Pesos : wo(t) = 0.5 ; w1(t) = 0.5; w2(t) = 1.5
Net i : 1 (0.5)+ 0 (0.5) + 1 (1.5) = 2
Salida que produce f : 1, puesto que Neti > 0
Salida deseada : 1, puesto que OR(01) = 1
Error (deseada - obtenida) = 0
Pesos no modificados : wi(t+1) = wi(t)
b.3) Patrones 10 y 11 : la salida obtenida es igual que la deseada por lo que no varían los pesos.
c) Se toman de nuevo los cuatro patrones de entrada
c.1) Patrón 00
 
Entradas : xo = 1; x1 = 0; x2 = 0
Pesos : wo(t) = 0.5 ; w1(t) = 0.5; w2(t) = 1.5
Net i : 1 (0.5)+ 0 (0.5) + 0 (1.5) = 0.5
Salida que produce f : 1, puesto que Neti > 0
Salida deseada : 0, puesto que OR(00) = 0
Pesos modificados : wo(t+1) = -0.5 ; w1(t+1) = 0.5 ; w2(t+1) = 1.5
c.2) Patrón 01
 
Entradas : xo = 1; x1 = 0; x2 = 1
Pesos : wo(t) = -0.5 ; w1(t) = 0.5; w2(t) = 1.5
Net i : 1 (-0.5)+ 0 (0.5) + 1 (1.5) = 2
Salida que produce f : 1, puesto que Neti > 0
Salida deseada : 1, puesto que OR(01) = 1
Error (deseada - obtenida) = 0
Pesos no modificados : wi(t+1) = wi(t)
c.3) Patrones 10 y 11 : la salida obtenida es igual que la deseada por lo que no varían los pesos.
d) Se toman de nuevo los cuatro patrones de entrada
d.1) Patrón 00
 
Entradas : xo = 1; x1 = 0; x2 = 0
Pesos : wo(t) = -0.5 ; w1(t) = 0.5; w2(t) = 1.5
Net i : 1 (-0.5)+ 0 (0.5) + 0 (1.5) = -0.5
Salida que produce f : 0, puesto que Neti < 0
Salida deseada : 0, puesto que OR(00) = 01
Error (deseada - obtenida) = 0
Pesos no modificados : wi(t+1) = wi(t)
d.2) Patrones 01, 10 y 11 : la salida obtenida es igual que la deseada por lo que no varían los pesos.
Con estos nuevos pesos, al calcular la salida que se obtiene para cualqueiera de los cuatro patrones de entrada ya no se comete ningún error, por lo que la etapa de aprendizaje concluye.

Problema de la separabilidad lineal

Como se ha comentado con anterioridad, la función XOR no es representable con un perceptrón bicapa. En el caso de esta función se pretende que para los valores de entrada 00 y 11 se devuelva la clase 0 y para los patrones de entrada 01 y 10, devuelva la clase 1. El problema radica en que no existe ninguna recta que separe lo patrones de ambas clases. La solución podría darse si descompusieramos el espacio en tres regiones: una región contendría una clase de salida y las otras dos regiones contendrían a la otra clase.






Para poder trazar dos rectas en el espacio habría que añadir a la capa de salida otra neurona y para elegir entre una u otra zona de las tres, es necesario utilizar una nueva capa con una neurona (capa de salida) cuyas entradas serían las salidas de las dos neuronas anteriores(capa oculta). Resumiendo, hemos pasado de un perceptrón bicapa a uno con tres capas (neuronas de entrada, capa oculta con dos neuronas y capa de salida con una neurona). Las dos zonas o regiones que contienen los puntos (0,0) y (1,1) se asocian a una salida nula de la red y la zona central con la salida 1.

Queda claro que el proceso de aprendizaje del perceptrón consiste en la modificación de los pesos de las conexiones de acuerdo a la diferencia existente entre la salida deseada y la obtenida. Por otro lado, no se tiene por qué conocer cuál debe ser la salida deseada de las células de la capa oculta, por lo que el método utilizado en la función OR no es aplicable a la XOR.
 

Redes de prealimentación con varios niveles

Rosenblatt y otros más describieron a finales de los 50 las redes de prealimentación con varios niveles, aunque sus trabajos de investigación se concentraron en los perceptrones de un solo nivel. Esto se debió a la dificultad de encontrar un método razonable de actualizar los pesos entre las entradas y las unidades ocultas; si bien es posible calcular el error en las unidades de salida, es más dificil definir la señal de error en el caso de las unidades ocultas. Aunque existen algoritmos que en parte tratan de resolver este problema, muchos de ellos ni son eficientes ni garantizan su convergencia en un óptimo global.

El método de aprendizaje más popular en las redes de varios niveles se conoce como propagación posterior o retropropagación. Fué inventada por Bryson y Ho en 1969 pero permaneció ignorada hasta mediados de los 80.

Aprendizaje por propagación posterior

El aprendizaje en este tipo de red se efectúa de la misma manera que en los perceptrones: se le presenta a la red las entradas de los ejemplos, y si ésta calcula un vector de salida que coincida con el objetivo, no hay nada que hacer. Pero si existe un error (diferencia entre la salida y la meta), los pesos se ajustan para disminuirlo. El secreto radica en evaluar las consecuencias de un error y dividirlo entre todos los pesos contribuyentes. En los perceptrones, la modificación de los pesos es fácil ya que sólo hay uno entre cada entrada y la salida. Pero en las redes multinivel hay muchos pesos que conectan cada entrada con una salida, contribuyendo cada peso en más de una salida.

Este algoritmo lo que hace es distribuir la contribución de cada uno de los pesos en la generación de la salida. Se trata de reducir al mínimo el error.

Modificación de los pesos para el nivel de salida

El proceso para la capa de salida es lo mismo que en el perceptrón; sólo se cambian las entradas en éste por el valor de activación de la unidad oculta, aj, conectada a la salida y que también se añade un término para el gradiente de la función de activación. Si Erries el error del nodo de salida, la regla de actualización de los pesos desde la unidad j hasta la unidad i es:

wji = wji + ß . aj . Erri . g'(enti)

donde g' es la derivada de la función de activación. Podemos definir un nuevo término de error en el nivel de salida como la agrupación de los dos últimos términos de la regla anterior

Deltai = Erri . g'(enti)

Modificación de los pesos entre las entradas y el nivel oculto

Para actualizar las conexiones entre las unidades de entrada y las ocultas hay que definir una cantidad análoga al término de error de los nodos de salida, Deltai. Es aquí donde tiene lugar la propagación posterior. El nodo oculto j es responsable de una parte del error Deltai en cada uno de los nodos de salida con los que conecta. Por lo tanto, los valores deltai son divididos de acuerdo con la intensidad de la conexión entre el nodo oculto y el nodo de salida y se propagan hacia atrás para proporcionar los valores Deltaj de la capa oculta. La regla de propagación es la siguiente:

Deltaj = g'(entj). Sum(wji . Deltai)

La regla de actualización de pesos es parecida a la regla de actualización de salida:

wkj = wkj + ß . aj . Ik . Deltaj

Algoritmo de propagación posterior para actualizar los pesos de una red con varios niveles

función Actualización pro-posterior(red, ejemplos)
 
entradas:  red una red con varios niveles
  ejemplos un conjunto de pares entrada/salida
  ß, la velocidad de aprendizaje
salida:   una red con pesos modificados
repetir
  por cada e de ejemplos hacer
 
 
/* Calcular la salida de este ejemplo */
O = EjecutarRed( red, I)
/* Calcular el error y Delta en el nivel de salida donde T= salida deseada */
Err = T - O
/* Actualizar los pesos que conducen al nivel de salida */
wji = wji + ß . aj . Erri . g'(enti
 
por cada nivel subsecuente en la red hacer
 
/* Calcular el error en cada uno de los nodos */
Deltaj = g'(entj). Sum(wji . Deltai)
/* Actualizar los pesos que conducen al nivel */
wkj = wkj + ß . aj . Ik . Deltaj
fin
  fin
hasta que red tenga convergencia
responder con red
 

La red ADALINE

Fueron desarrolladas por Bernie Widrow en la Universidad de Stanford poco después de que Ronsenblatt desarrollara el Perceptron. Las arquitecturas de ambas redes son las mismas que la de su antecesor: utilización de neuronas con funciones de transferencia escalón. La red ADALINE utiliza una única neurona de salida, mientras que MADALINE puede tener varias. La diferencia fundamental con respecto al perceptrón se refiere al mecanismo de aprendizaje. Estas redes utilizan la denominada regla Delta de Hidrow-Hoff o regla del mínimo error cuadrado medio, basada en la búsqueda del mínimo de una expresión del error entre la salida deseada y la salida lineal obtenida antes de aplicarle la función de activación escalón (frente a la salida binaria utilizada en el Perceptron). Por tanto, estas redes pueden procesar información analógica, tanto de entrada como de salida, utilizando una función de activación lineal o sigmoidal.

En cuanto a la estructura de la red ADALINE, que es casi idéntica a la del Perceptrón, sus autores la consideran formada por un elemento denominado combinador adaptativo lineal (ALC), que obtiene una salida lineal que puede ser aplicada a otro elemento de conmutación bipolar, de forma que si la salida del ALC es positiva, la salida de la red es +1 y -1 en el caso contrario.

Para no abrumar al intrépido lector, no voy a entrar en más detalles sobre estas redes. Si se desea un conocimiento más profundo se recomienda leer el libro Redes Neuronales Artificiales de José Hilera y Víctor J. Martínez de la Editorial ra-ma.
 

Aplicaciones de la red ADALINE

Sin duda la principal aplicación está en el campo del procesamiento de señales, en concreto, para el diseño y realización de filtros que elimine el ruido en señales  portadoras de información. Destaca su uso como filtros de ecualización adaptativos en modems de alta velocidad y canceladores adaptativos del eco para el filtrado de señales en comunicaciones telefónicas de larga distancia y comunicaciones via satélite.
 

La red Backpropagation

Fué creada en 1986 por Rumelhart, Hinton y Williams. El trabajo de la red consistía en aprender la asociación que existe entre los patrones de entrada y las clases correspondientes. Este método está basado en la generalización de la regla delta.
El algoritmo backpropagation (propagación del error hacia atrás) es una regla de aprendizaje que se puede aplicar en modelos de redes con más de dos capas de neuronas. Una característica importante de este algorimo 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.

La importancia de esta red 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, exigida en 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.

Estructura y aprendizaje

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 todasl las neuronas de la capa posterior (excepto las de salida). No hay conexiones hacia atrás ni laterales entre neuronas  de la misma capa.

El funcionamiento de la red 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:

  1. 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.
  2. 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 neuornas 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 (disminuya el error).
A diferencia de la regla delta en el caso del Perceptron, esta técnica requiere el uso de neuronas cuya función de activación sea contínua y por tanto diferenciable. Generalmente la función será de tipo sigmoidal.



Algoritmo de entrenamiento

Paso 1
    Inicializar los pesos con valores aleatorios pequeños
Paso 2
    Presentar el patrón de entrada, Xp : xp1, ..., xpn, y especificar la salida deseada : d1,..., dm.
Paso 3
    Calcular la salida actual de la red : y1, ..., ym
    Para ello :

Paso 4
    Calcular los términos de error para todas las neuronas
Paso 5
    Actualización de los pesos
Paso 6
    Repetición del proceso hasta que el término de error resulte aceptablemente paqueño para cada uno de los patrones aprendidos.

Para más detalles y ver las reglas aplicadas en cada paso del algoritmo se puede consultar el libro Redes Neuronales Artificiales de José Hilera y Víctor J. Martínez de la Editorial ra-ma, págs. 138-142.
 

Aplicaciones de las redes backpropagation

Este tipo de redes se están aplicando a distintas clases de problemas. Esta versatilidad se debe a la naturaleza general de su proceso de aprendizaje ya que solamente se necesitan dos ecuaciones para propagar las señales de error hacia atrás. La utilización de una u otra ecuación sólo depende de si la unidad de proceso es o no de salida. Algunos de los campos de aplicación más representativos son :