REDES NEURONALES - PERCEPTRON MULTICAPA

IMPLEMENTACION EXPERIMENTAL EN NePic DEL
"CEREBRO DE UN ROBOT MOVIL"

La navegación autónoma de robots en entornos desconocidos constituye uno de los mayores retos tecnológicos en el campo de la robótica móvil. Se han realizado muchas investigaciones centrando su atención en el desarrollo de técnicas de control y navegación de robots. Entre varios enfoques para resolver este problema se encuentran las Redes Neuronales. Aquí se emplean un tipo muy conocido de las mismas, llamadas "Perceptrones Multicapa", para un acercamiento a este problema.

INTRODUCCION

En el artículo anterior vimos nuestra primera “red” neuronal, el Perceptrón simple (PS). Este consiste en una suma de las señales de entrada, multiplicadas por unos valores de pesos escogidos inicialmente en forma aleatoria. En una fase en la que éste aprende, la entrada es comparada con un patrón preestablecido para determinar la salida de la red. Si en la comparación, la suma de las entradas multiplicadas por los pesos es mayor o igual que el patrón preestablecido, la salida de la red es uno (1), en caso contrario la salida es cero (0). El Perceptrón es un dispositivo que, en su configuración inicial, no está en capacidad de distinguir patrones de entrada muy complejos, sin embargo, mediante un proceso de aprendizaje es apto para adquirir esta capacidad. En esencia, el entrenamiento implica un proceso de refuerzo, mediante el cual los pesos que codifican las sinapsis, se incrementan o se decrementan. Esto dependiendo de si las dendritas contribuyen o no a las respuestas correctas del Perceptrón. La red tipo Perceptrón fue inventada por el psicólogo Frank Rosenblatt en el año 1957. Su intención era ilustrar algunas propiedades fundamentales de los sistemas inteligentes en general, sin entrar en mayores detalles con respecto a condiciones específicas y desconocidas para organismos biológicos concretos. Al inicio del desarrollo de los sistemas de inteligencia artificial, se encontró gran similitud entre su comportamiento y el de los sistemas biológicos y en principio se creyó que este modelo podía computar cualquier función aritmética o lógica.

En 1969 Marvin Minsky y Seymour Papert publicaron su libro: "Perceptrons: An introduction to Computacional Geometry", el cual para muchos, significó el final de las redes neuronales. En él se presentaba un análisis detallado del Perceptrón, en términos de sus capacidades y limitaciones, en especial en cuanto a las restricciones que existen para los problemas que una red tipo Perceptrón puede resolver; la mayor desventaja de este tipo de redes es su incapacidad para solucionar problemas que no sean linealmente separables. Como dijimos, no ahondaremos en álgebra, sino veremos casos prácticos, así en el artículo anterior vimos cómo entrenar un PS, para resolver la operación lógica OR, ahora podemos verificar que éste es incapaz de resolver por ejemplo la operación lógica XOR (OR Exclusivo), para esto sólo tendríamos que repetir el experimento del artículo anterior con la tabla 1.

Y notar que no la aprende. Bueno, veamos entonces qué se propuso frente a estas limitaciones.

 
EL PERCEPTRON MULTICAPA (MLP)

Primero cabe mencionar, como es obvio, que para tener varias entradas y salidas, se pueden conectar Perceptrones simples como vemos en la figura 1.

Pero con esto no se amplía el tipo de funciones que puede aprender la red. Así es como nace la idea ( proveniente también de copiar los sistemas biológicos), de hacer redes que tengan más de una capa de neuronas, ver figura 2.

A partir de ahora, a cada neurona de la red, algunas veces la llamaremos nodo.

Así, por ejemplo, a una red multicapa con dos neuronas de entrada, dos ocultas y dos de salida, la podemos graficar como sigue (figura 3).

El entrenamiento de esta red neuronal consistirá, al igual que en el perceptrón simple, en presentar las entradas, junto con las salidas deseadas para cada una de ellas, y modificar los pesos de acuerdo al error (diferencia entre la salida deseada y la obtenida).

La principal dificultad en el entrenamiento de redes de varias capas es encontrar los errores asociados con las capas ocultas; es decir, en las capas que no son la de salida (sólo se tiene salida deseada en las capas de salida).

Esto es debido a que los errores son necesarios para el aprendizaje, para saber cómo modificar los pesos de las neuronas en la capas ocultas. Así se da origen a algoritmos muy ingeniosos, el precursor y más conocido por su simplicidad, es el que recibió el nombre de retropropagación del error (backpropagation).

Así el funcionamiento de un PMC es básicamente: se aplica una entrada cuya salida se conoce, luego se calcula primero la salida de las neuronas de entrada, estas salidas son las entradas de las neuronas de la capa oculta, con estas entradas se calcula la salida de las neuronas ocultas, y con éstas como entrada para las neuronas de salida, se calculan las salidas finales.

Esta es la fase hacia delante, por así decirlo, en la red.

Luego se obtiene el error con respecto a la señal deseada y finalmente este error se retro propaga (de atrás hacia delante) modificando los pesos.

No trataremos la parte matemática de cómo se hace esto, pero mencionaremos que las neuronas de la capa oculta usan como regla de propagación, la suma ponderada de las entradas con los pesos sinápticos wij y sobre esa suma ponderada se aplica una función de transferencia de tipo sigmoide (figura 4) (recordemos que en el PS, era simplemente un umbral), que es acotada en respuesta. Similarmente en la retropropagación, el error en los nodos de las capas ocultas es proporcional a la sumatoria de los gradientes de los nodos de la capa siguiente pesados por los pesos de conexión.

La aparición de una función de activación del tipo sigmoide es debido a restricciones analíticas en los algoritmos de entrenamiento. Una función de activación de este tipo es:

 
 
donde x es la sumatoria de las entradas al nodo pesadas por los pesos de conexión y y(p) la salida del nodo correspondiente (o sea si recordamos del artículo anterior):
 
 
Observe la figura 4.

De todo esto, luego de algún trabajo matemático, surge el algoritmo que se usa en el entrenamiento de la red.

 
ALGORITMO DE RETROPROPAGACION
  1. Inicializar los pesos aleatoriamente y con valores menores que 1.

  2. Escoger un patrón del conjunto de entrenamiento, calcular la salida (para esto se avanza neurona por neurona, capa por capa, hasta llegar a la salida, al igual que en el PS) y el error asociado en cada nodo de la capa de salida.

  3. Adaptar los pesos: empezando con la capa de salida, y “modificando hacia atrás”, de la siguiente manera:



    Para nodos de la capa de salida:



    Para unidades en las capas escondidas:



  4. Volver al paso 2. y repetir el proceso hasta que los pesos converjan ( O sea el error entre las salidas deseadas y las obtenidas sea menor que un valor deseado).

Generalmente estos pasos (de 1 a 4) se realizan un número determinado de veces, llamadas épocas de entrenamiento y luego se observa si la red aprendió.

Este es un modo de entrenamiento, existen otros, pero por ahora con éste es suficiente.

Una vez entrenada la red, se puede usar de igual manera que vimos con el Perceptrón Simple.

No existe un límite para fijar la cantidad de capas de un PMC, pero se ha demostrado que un PMC con una capa oculta y con el número suficiente de nodos, es capaz de solucionar casi cualquier problema. Si se agrega una capa oculta más, un PMC soluciona cualquier tipo de problemas y en forma más eficiente que con una sola.

 
PRACTICA - IMPLEMENTACION DE UN ROBOT MOVIL CON NePic

A grandes rasgos, el problema puede enunciarse de la siguiente manera: un robot móvil se encuentra situado en un determinado ambiente, que contiene una serie de obstáculos y una meta. Se trata de controlar el robot para que navegue por el entorno, evitando los obstáculos y alcanzando la meta. Existe varios enfoques para resolver este problema, y entre ellos se encuentran las técnicas de IA como son la Lógica Fuzzy y las Redes Neuronales. Estas técnicas han permitido aproximarse a la solución de muchos problemas de control debido su capacidad de emular algunas características propias de los humanos. Ahora trataremos de aprovechar la capacidad de generalización de las redes neuronales, para resolver los problemas que plantea la navegación de robots en ambientes desconocidos. Generalización en IA es el nombre que recibe una característica de las redes neuronales artificiales. Es decir, si una red neuronal se entrena con un número suficiente de patrones, y luego frente a un patrón que no pertenece a al grupo con el que se la entrenó (una situación nueva), da una salida correcta (que resuelve la situación), entonces se dice que la red generaliza bien.

Para que un robot pueda navegar en un ambiente desconocido, tiene que ser capaz de efectuar unos movimientos tan intuitivos como los que realizaría una persona que se encuentra en su misma situación.

Los humanos no tenemos un mapa o un sistema de coordenadas en base al cual navegamos, simplemente observamos el entorno y vamos decidiendo en cada instante la acción que hemos de ejecutar para continuar avanzando hacia nuestro objetivo. Lo que se pretende es que el robot actúe de igual forma que una persona, es decir, que capte información sobre su entorno a través de los sensores y en función de ella “decida” qué acción debe llevar a cabo para continuar su camino.

No se puede pretender que el robot aprenda todas las situaciones que posiblemente se vayan a presentar durante la navegación. A nivel de memoria se recargaría el sistema con demasiada información que se puede considerar redundante. Para resolver este problema las personas recurrimos al proceso de generalización, que nos permite solucionar un caso particular, cuando se asemeja a un caso general conocido. Una de las principales características de las redes neuronales es precisamente su capacidad de generalización, por tanto, son una herramienta ideal para proporcionar al robot la capacidad de decidir en cualquier situación, incluso cuando dicha situación no se haya presentado anteriormente.

 
UN ROBOT PARA EXPERIMENTAR

De forma experimental en nuestro proyecto podemos montar un pequeño robot, para esto debemos haber armado inicialmente la placa del circuito experimental que les hablé en el artículo anterior, (que podemos hallar en la página www.rev-ed.co.uk, específicamente en www.rev-ed.co.uk/docs/axe001_pcb.pdf ).

Ya que, como dijimos vamos a usar los Picaxe para experimentar, (ver Saber 205 , 211 o consultar el sitio web www.rev-ed.co.uk para saber más de estos).

Recomiendo usar el PICAXE 18X, para que nos sirva para otros experimentos.

Así, teniendo la placa con el Picaxe 18, ésta va ser el “cerebro” del robot, ahora necesitamos la estructura física, y como para que cualquiera pueda experimentar, vamos a usar, y ¿por que no?, algunos elementos de desecho.

Por ejemplo, ¿quién no tiene CDROMs viejos? Bueno vamos a sacrificar dos de éstos.

Los materiales que vamos a necesitar serán los que podemos observar en la figura 5.

Bueno, vamos armar un robot experimental, nuestro primer experimento será muy sencillo y le permitirá al robot moverse por el espacio. El otro, que es más sofisticado, lo simularemos en parte, ya que requiere realmente de algunos materiales más, pero no es imposible de realizar y proporciona una clara noción de la utilidad de las redes.

En cuanto a los materiales sólo mencioné las características generales, de manera que cada uno pueda hacerlo con lo que tenga en casa. Sólo es conveniente que las ruedas sean pequeñas.

Los chinos dicen: “Una imagen vale más que mil palabras”, de manera que en el ensamblado procuraré valerme más que nada de esquemas.

Así el CD que irá en la parte de abajo deberá quedar como en la figura 6:

Como sensores en este primer experimento usaremos los interruptores de contacto, éstos deben ser de un tipo muy común, lo que tenemos que lograr es que se accionen con facilidad cuando contactan con algún objeto al costado del robot. Para lograr esto, le colocaremos como una especie de “bigotes”, es decir le pegaremos unas barritas de plástico flexible.

La disposición de estas barritas la podemos observar en la figura 7 y su largo podemos elegirlo experimentalmente, pero manteniendo más o menos la relación que vemos en esa figura.

El CD superior deberá quedar como en la figura 8:

Entonces una vez armado, nuestro robot se deberá ver como la figura 9.

Es importante notar que la superficie en la que se moverá nuestro robot deberá ser completamente lisa, de manera que los soportes no se traben, por ejemplo un mesa con cubierta de fórmica.

A continuación veremos cómo realizar las conexiones, para esto nos guiaremos por la figura 10, los números dibujados sobre la placa, nos señalan lo que hay que conectar en esos pines marcados:

1- Cable del interruptor situado del lado izquierdo del robot (ver figura 7).
2- El otro cable del interruptor situado del lado izquierdo del robot (ver figura 7).
3- Cable del interruptor situado del lado derecho del robot (ver figura 7).
4- El otro cable del interruptor situado del lado derecho del robot (ver figura 7).
5- Negativo de la batería.
6- Positivo de la batería (conviene interponer un interruptor para comodidad).

Es importante tener en cuenta que si se trata de motores de corriente continua, como es este caso, depende como los conectemos, van a girar hacia un lado u otro.

Para asegurarnos de hacer bien las conexiones lo mejor es, una vez puestos en su lugar, probar con la fuente directamente como deben ir conectadas las polaridades para que cada motor gire en un sentido que provoque el avance del robot. Una vez logrado esto, marcamos cada cable del motor según qué polaridad reciba de la batería como + o -. Entonces continuamos:

7- El cable marcado como negativo del motor situado del lado izquierdo del robot.
8- El cable marcado como positivo del motor situado del lado izquierdo del robot.
9- El cable marcado como negativo del motor situado del lado derecho del robot.
10- El cable marcado como positivo del motor situado del lado derecho del robot. Observe la figura 10.

 
LA RED QUE USAREMOS
Una red muy apropiada para el control del robot es un perceptrón multicapa, ya que debido a sus características es muy válido para resolver problemas de clasificación. Además presenta una estructura comparativamente sencilla, que permite una relativa sencillez en la implementación en un microcontrolador.

En la figura 11 vemos una de las estructuras que emplearemos en este primer experimento:

Esto es todo por ahora, en la siguiente edición veremos como implementar y entrenar esta red con NePic, y así programar la placa “cerebro” de nuestro robot. Luego plantearemos y simularemos un caso más completo de navegación de robots móviles, con más sensores de proximidad y un sensor de orientación, lo cual permitirá alcanzar un objetivo deseado en el laberinto en el que el robot se mueve. Una vez realizados estos experimentos veremos más claramente la utilidad de las redes neuronales multicapa.

 
Autor: Ing. Sergio R. Richter
E-mail: sergioraulrichter@yahoo.com.ar
FIGURA 1
 
FIGURA 2
 
FIGURA 3
 
FIGURA 4
 
FIGURA 5
 
FIGURA 6
 
FIGURA 7
 
FIGURA 8
 
FIGURA 9
 
FIGURA 10
 
FIGURA 11
 
TABLA 1
 
 
 
 
 
PROMOCIONES
 
 
PROMOCIONES
 
 
PROMOCIONES
 
 
PROMOCIONES
 
 
PROMOCIONES