martes, 16 de octubre de 2012

Redes neuronales MLP en un PIC? se puede?

Lo se, mucho tiempo ha pasado desde la ultima actualizacion ( casi 2 años ) debido a que me decante por otro tipo de investigación. Sin embargo hace un mes casi, en un comentario que acabo de controlar recién se ha planteado la pregunta: es posible implementar una red MLP en un PIC ( programable interrupt controler, también conocido como microcontrolador ).
Dependiendo del tipo de escenario, es factible su realizacion, pero vamos a analizar dos casos:

Programacion del PIC para entrenar una red: para entrenar una red, además del calculo de la salida ( y las respectivas multiplicaciones ) hay que hacer también el calculo del error, el calculo del error cuadrático medio y la actualizacion de los pesos sinapticos de cada coneccion. Y esto por cada ciclo de entrenamiento hasta que el entrenamiento finaliza. Entonces por poner un ejemplo numérico: 3 perceptrones a la entrada, 5 en la capa oculta y 1 en la salida ( sin bias ). Esto nos da 15 conecciones sinapticas. ahora hipotizamos un ciclo de entrenamiento de 20 etapas.

  1. 15 multiplicaciones para el calculo de la salida
  2. 3 multiplicaciones para aplicar los valores de entrada ( el tiempo de proceso depende de la función de transferencia y de la arquitectura del PIC )
  3. calculo de error cuadrático medio ( elevar al cuadrado el valor de la salida obtenida y la esperada, restar y sacar raíz cuadrada, aproximamos a 6 multiplicaciones, pero depende de la arquitectura de la ALU )
  4. actualizacion de los pesos sinapticos ( según el método, si se usa la ley del gradiente se necesitan cálculos de derivadas, para la ley de Kohonen basta una suma vectorial )
  5. actualizar los pesos sinapticos ( 15 para la capa oculta, 5 para la salida. 20 sumas )
Y esto multiplicarlo por las 20 etapas de entrenamiento. Eso es mucho para un chip que va a 20MHz, aun teniendo en cuenta la modesta dimensión de la red. Y obviamente depende mucho de la habilidad del programador en hacer un código eficiente ( en mi programa yo se que desperdicio muchos ciclos, pero eso es para una demostración, nada profesional )

Programacion del PIC para calcular la red ya entrenada: en este caso, usando la misma red de antes solo necesitamos del calculo de la salida: 15 multiplicaciones... si! nada mas que 15 multiplicaciones. Yo he hecho esta prueba entrenando una red neuronal para dividir el ruido de fondo de la colisión de positrones con electrones ( ahora me dedico a la física ) usando el framework de ROOT y aplicando la red ya entrenada en arduino. Con el entrenamiento en ROOT obtengo 197 pesos sinapticos. Y es que solo basta hacer multiplicaciones de las entradas por los respectivos pesos sinapticos, después sumar los resultados para la salida de cada neurona en la capa oculta ( y así sucecivamente si hay mas capas ocultas ) y lo mismo a la salida, se suma todo y lo que mas se tarda es aplicar la función de transferencia a la salida ( por lo general yo uso la de escalón, mas adapta al envió de información digital y la uso exclusivamente en la salida ).

Entonces en realidad, 20MHz van bien sobrados para hacer una buena cantidad de multiplicaciones, en redes de modesta entidad, siempre que se tenga ya una red entrenada.

EDITO: por cierto, visto que algunos comentan y a mi no me llegan avisos de los comentarios, si teneis alguna pregunta enviarla a jhonellway@gmail.com. Solo tener en cuenta que no soy un experto como lo serìa algun especialista en la materìa o algun PhD en inteligencia artificial.

No hay comentarios:

Publicar un comentario