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. |
|
|
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 |
|
-
Inicializar los pesos aleatoriamente
y con valores menores que 1.
-
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.
-
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:
-
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.
|
|
|
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 |
|
|
|
|