Download Implementación de una red neuronal para la identificación de
Document related concepts
Transcript
MEMORIAS DEL SEGUNDO CONCURSO DE INVESTIGACIÓN, DESARROLLO E INNOVACIÓN TECNOLÓGICA IDIT 2013 Implementación de una red neuronal para la identificación de patrones en un FPGA Spartan 6 Ayala Hernández Arturo Alejandro, Durán Álvarez Agustín, Waltier Barraza Christian Axel Resumen- El diseño de aplicaciones embebidas en tiempo real que incorporan redes neuronales, requieren de una mayor precisión y menor tamaño. Por lo que su diseño, utilizando FPGAs (Field Programmable Gate Array) proporciona mayor flexibilidad al permitir superar limitaciones de tiempo de operación y costo. Adicionalmente, la programación de redes neuronales en hardware reconfigurable de propósito específico, puede establecer las condiciones para explorar nuevos algoritmos a problemas de escala mayor que no son factibles con procesadores convencionales. El objetivo de este artículo es presentar la implementación de una red neuronal tipo ADALINE de 3 neuronas, para el reconocimiento de patrones en imágenes de 5x5 bits. La arquitectura de la red neuronal, soporta operaciones de punto flotante de 32-bits, acordes al estándar IEEE-754. un FPGA Spartan 6, de la empresa ATLYS. En la segunda sección se detalla la arquitectura de la red neuronal y la construcción del vector de características utilizado para clasificar los patrones. En la tercera sección, se describe la representación de números en punto flotante y la cuarta sección detalla los algoritmos implementados para realizar operaciones con punto flotante de 32-bits, acordes al estándar IEEE-754. La quinta sección muestra la implementación en FPGA de la red neuronal y la clasificación de patrones. La sexta sección concluye con los resultados obtenidos y trabajo futuro. II. ELABORACIÓN DE LA RED NEURONAL Los tres diferentes patrones a evaluar son los siguientes: I. INTRODUCCIÓN Las Redes Neuronales son consideradas por su naturaleza, como unidades de cómputo en paralelo, que reconocen múltiples patrones en forma continua y en un ambiente altamente ruidoso. El número de elementos constituyentes y sus complejas interconexiones existentes en un modelo fisiológico, hacen que no sean directamente tratables en un dispositivo digital. Diversos trabajos han mostrado que la programación digital del hardware es una oportunidad real, derivando en implementaciones flexibles de redes neuronales. Sin embargo diversos problemas se presentan al implementarse en dispositivos de hardware programables, en especial, cuando se requiere manipular números reales eficientemente [1]. La aritmética de punto flotante, es una de las mejores alternativas para representar números reales en dispositivos programables [2]. Sin embargo, su implementación no es sencilla dado su algoritmo, ya que al interpretar un conjunto infinito y continuo (números reales) con un conjunto finito (números binarios) en un dispositivo programable, se deben comprometer diversos aspectos en la transformación y representación, como la velocidad, precisión, implementación y costo en memoria. En el presente trabajo se muestra la implementación de una red neuronal para la identificación de 3 patrones distintos en Ayala Hernández Arturo Alejandro, Durán Álvarez Agustín y Waltier Barraza Christian Axel, pertenecen a la Maestría en Ciencias: Área Cibetrónica de la Facultad de Ingeniería y realizaron el proyecto dentro del curso: ARQUITECTURA DE SISTEMAS EMBEBIDOS. El proyecto fue asesorado por EL Mtro. Octavio Rodríguez Torres. (email: octavio.rodriguez@ulsa.mx) O O 1 O O O O O O O O O 1 O O O O 1 O O O 1 1 1 O O O 1 O O 1 1 1 O O O 1 O O 1 1 1 1 1 O O O 1 O O O 1 1 1 O O O 1 O O O O 1 O O O O O O O O O 1 O O Figura 1. Patrones a evaluar: Cruz, Cuadrado y Línea. Las celdas de n filas por m columnas albergan 25 combinaciones distintas para el patrón cruz, 9 para el cuadrado y 5 para la línea. Cada bit en blanco se le asignó el valor cero, y a cada bit en negro se le asignó el valor uno, tal y como se muestra en la Figura 1. Para la identificación de patrones se eligió el siguiente vector de rasgos característicos con 12 elementos: Vr = [ Σn1, Σn2, Σn3, Σn4, ΣnS, Σm1, Σm2, Σm3, Σm4, ΣmS, Σ(m,n), Π(Σni)·Π(Σmi) ] Donde: Σni Σ(m,n) es la sumatoria de elementos de la fila i es la sumatoria de todos los elementos del arreglo. Π(Σni)·Π(Σmi) es el producto de la productoria de la suma de todos los elementos del arreglo. Esta selección de rasgos característicos, reúne la información suficiente del arreglo sin constituir un vector de gran tamaño, como el que sería un vector de los 25 elementos, considerando cada celda. La red Adaline, fue desarrollada siguiendo una topología de 3 neuronas, entrenadas utilizando la regla de aprendizaje delta fuera del dispositivo, con 39 vectores de características distintos y un factor de aprendizaje, α=O.1. Posterior al entrenamiento, la red neuronal fue capaz de detectar el 100% 39 Ayala-Hernandez et al: Implementación de una red neuronal de una selección aleatoria de los patrones posibles, sin ruido presente. Con el fin de facilitar las operaciones a realizar en la red neuronal, se normalización los vectores de características, para reducir el rango de valores reales que constituyen la matriz de pesos. 5. La representación final del número en punto flotante, queda definida por la posición del signo, exponente y mantisa, acorde al estándar IEEE-754. PF(x) = 01000001100010001001111101010110 IV. III. REPRESENTACIÓN DE NÚMEROS EN PUNTO FLOTANTE La aritmética de punto flotante, es el estándar más utilizado para aproximar las operaciones con números reales [3]. Su ventaja sobre otras formas de representación, como punto fijo o enteros, radica en que es posible operar aritméticamente con mayores rangos de precisión. El estándar IEEE-754, presenta dos formas de representar números con punto flotante, formato de intercambio binario y formato de intercambio decimal. La figura 2 muestra la representación en formato binario, consiste en 1-bit de signo (S), 8-bits de exponente y 23-bits de mantisa o fracción (M). Si el exponente es mayor a 0 y menor a 255 y existe un 1 en el MSB de la mantisa, se dice que el número está normalizado y está representado por la ecuación (1). OPERACIONES ARITMÉTICAS EN PUNTO FLOTANTE A continuación se detallan los algoritmos para la adición, substracción y multiplicación en punto flotante implementados en el FPGA [4], [5]. ADICIÓN / SUBSTRACCIÓN EN PUNTO FLOTANTE Dados dos número x y y tal que: 1x1 = 2Ex * Mx y 1y1 = 2Ey * My . La suma o resta de dos números positivos en punto flotante está dada por: 1 x 1 ± 1 y 1= 2Ex * Mx ± 2Ey * My (2) La secuencia de operaciones que se utilizan para implementar la ecuación (2) está definida de la siguiente forma: 1. Los dos exponentes son Ex y Ey son comparados e intercambiados para asegurar que Ex � Ey . Figura 2. Representación binaria de un número en punto flotante. Z = (-1)S * 2(E - Bias) * (1.M) (1) Donde: M = m22 2-1 + m21 2-2 + m20 2-3 +........+m12-22+ m02-23; Bias = 127 CONVERSIÓN DE NÚMERO DECIMAL A PUNTO FLOTANTE La conversión de un número decimal a punto flotante será explicada utilizando el siguiente ejemplo: Sea x=17.0778 el número decimal que se requiere convertir a punto flotante. 1. Se convierte la parte entera y decimal del número a su representación en binario: 10001 . 0001001111101010110 2. Posteriormente se recorre el punto decimal hacia la izquierda, hasta que el bit más significativo sea igual a uno: 1 . 00010001001111101010110 El bit anterior al punto decimal representa el bit oculto (bit 24) y los bits posteriores al punto decimal representan la mantisa 3. El número de veces que se recorrió el punto decimal hacia la izquierda representa el exponente al cual debe de sumársele el número 127. E = 4 + 127 = 10000011 4. El bit más significativo representa el signo del número decimal. S=0 40 2. Calcular 2- (Ex - Ey) * My por medio de desplazamiento de My(Ex - Ey) posiciones. 3. Sea S = Sx xor Sy. El resultado del significando es calculado como M = Mx + (-1)S * 2-(Ex - Ey) * My en donde una operación de suma o resta es realizada dependiendo de los signos Sx y Sy. 4. La suma calculada, no necesariamente está normalizada y es posible que se presenten dos casos: a) Se produce un desbordamiento en la suma de punto fijo. En este caso, M debe ser desplazada una posición hacia la derecha y E incrementado. b) Se produce una cancelación en el significando. En general, si L es el número de ceros colocados en el extremo izquierdo de M. M es desplazada hacia la izquierda L posiciones y E es recalculado como E - L. MULTIPLICACIÓN EN PUNTO FLOTANTE Dados dos número x y y tal que: 1x1 = 2Ex * Mx y 1y1 = 2Ey * My . El producto de dos números positivos en punto flotante está dada por: 1 x 1 * 1 y 1= Mx My * 2(Ex + Ey) (3) Considerando que los dos operandos de la multiplicación son normales, el producto exacto de Mx*My satisface 1 ” Mx*My MEMORIAS DEL SEGUNDO CONCURSO DE INVESTIGACIÓN, DESARROLLO E INNOVACIÓN TECNOLÓGICA IDIT 2013 ” 22. Esto muestra que el significando del producto tiene uno o dos ceros a la izquierda del punto. Por esto, para obtener un significando normalizado, este debe ser desplazado a la derecha una posición, similar al caso de la adición. V. IMPLEMENTACIÓN EN FPGA La implementación de la Red Neuronal de tipo ADALINE se realizó utilizando un módulo principal que es sincronizado mediante una máquina de estados Moore, que controla las operaciones que se realizan para determinar la clase del patrón de entrada. La definición del módulo en VHDL y estados de la máquina son los siguientes: VHDL 1. Módulo Adaline entity Adaline is port ( input: in std_logic_vector(4 downto 0); btn : in std_logic; reset: in std_logic; clk : in std_logic; leds : out std_logic_vector(7 downto 0):="00000000" ); end Adaline; STATE_INIT: Representa el estado inicial donde todos las variables del proceso de la máquina de estaos son inicializadas, así como las señales del módulo principal STATE_PROMPT: El estado permite obtener los patrones conforme a un arreglo de vectores lógicos de 5 bits que son introducidos por el usuario, al presionar el botón de entrada. Para detectar en un sólo ciclo de reloj la activación del botón, se implementó un circuito lógico con flip-flops que permite eliminar los rebotes, como se presenta a continuación: VHDL 2. Componente para evitar rebotes en el botón de entrada signal clk_div: std_logic_vector(26 downto 0):=(others=>'0'); signal btnPressed: std_logic:='0'; component DLatch port( clk, D: in std_logic; Q: out std_logic ); end component; button: component DLatch port map(clk=>clk_div(18), D=>btn, Q=>btnPressed); El diagrama de las señales que detecta la activación del reloj es la siguiente: Figura 3. Circuito para eliminar rebotes y detectar la activación del botón en un solo ciclo de reloj. STATE_VECTORIZE: El estado obtiene el vector de características x, que corresponde a la sumatoria vertical y horizontal de números enteros descritos en la sección II. STATE_IEEE754: Convierte el vector de entrada en un vector de números en punto flotante, mediante la función en VHDL: VHDL 3. Función para convertir de número entero a flotante function to_float(number: std_logic_vector) return std_logic_vector; STATE_CLASSIFY1: Realiza la multiplicación de la matriz de pesos W3,12 con el vector de entrada x en punto flotante, utilizando las siguientes funciones en VHDL: VHDL 4. Funciones que implementan la suma y multiplicación en punto flotante function ieee754Sum( INPUT_A: std_logic_vector(31 downto 0); INPUT_B: std_logic_vector(31 downto 0) ) return std_logic_vector; function ieee754Mul( multiplicando: std_logic_vector; multiplicador: std_logic_vector ) return std_logic_vector; STATE_CLASSIFY2: Realiza la clasificación del vector de entrada para cada neurona, conforme la siguiente ecuación y = WT * x + Bias (4) STATE_DISPLAY: Despliega la clasificación del patrón de entrada en el puerto de salida, representado por Leds. VALIDACIÓN Se ha seguido una metodología top-down tradicional [6] [7], para el desarrollo y prueba de la red neuronal en FPGA. En primera instancia se realizó una validación lógica de cada una de las secciones descritas y con el fin de corregir errores en las operaciones en punto flotante relacionadas a la función de transferencia y activación para cada neurona de la red, se implementó el siguiente registro que permite visualizar la evolución de los resultados en cada estado de la máquina. 41 Ayala-Hernandez et al: Implementación de una red neuronal VHDL 5. Registros de evolución type InputArray is array(4 downto O) of std_logic_vector(4 downto O); type Vector is array(11 downto O) of integer; type IEEEArray is array(11 downto O) of std_logic_vector(31 downto O); type Class is array(2 downto O) of std_logic_vector(31 downto O); type ProductW is array (O to 2, O to 11) of std_logic_vector (31 downto O); type patternRecord is record input: InputArray; vector: Vector; ieee754: IEEEArray; prodW: ProductW; sumaW: Class; class: Class; end record; La figura.4, 5 y 6 muestran los resultados de la clasificación para cada patrón en punto flotante, con los registros de evolución para cada estado de la máquina. En cada imagen, el registro led[7:O] muestra la clasificación para cada patrón, acorde a la etapa de entrenamiento. Figura 6. Registros de evolución del patrón Línea. VI. CONCLUSIONES La implementación en hardware de una red neuronal ADALINE, para la clasificación de patrones, permitió desarrollar una librería en VHDL de operaciones en punto flotante, conforme al estándar IEEE-754, que no sólo nos servirá de base para la implementación en hardware de otras áreas de investigación académica que se realizan en la Maestría en Cibertrónica, si no conforma una herramienta importante en el desarrollo de sistemas embebidos implementados en FPGAs. De esta forma, se cuenta con una herramienta poderosa que permite explorar nuevos algoritmos de redes neuronales, por ejemplo el diseño de aplicaciones en tiempo real que incorpore redes de tercera generación, que por su naturaleza están fuertemente acopladas al tiempo. Las líneas de investigación a desarrollarse como producto de este trabajo, radica en la implementación de un circuito aritmético en paralelo mediante la utilización de pipelines [8], [9], [1O], por consiguiente, aprovechar el paralelismo existente en los FPGAs. Figura 4. Registros de evolución del patrón Cruz. Agradecemos al Mtro. Octavio Rodríguez Torres, por la cátedra impartida durante el curso de "Arquitectura de Sistemas Embebidos". VII. REFERENCIAS [1] Ali malik, Dongdong chenand Soek bum ko,"Design tradeoff analysis of floating point adders in FPGAs," Can. J. elect. Comput. Eng.,2OO8 IEEE. [2] B. Fagin and C. Renard, "Field Programmable Gate Arrays and Floating Point Arithmetic," IEEE Transactions on VLSI, vol. 2, no. 3, pp. 365-367, 1994. [3] IEEE standard for floating-point arithmetic(IEEE STD 754-2OO8), revision of IEEE std 754-1985. Agosto 2OO8. Figura 5. Registros de evolución del patrón Cuadrado. 42 [4] Metin Mete, Mustafa Gok, "A multiprecision floating point adder" 2011 IEEE. MEMORIAS DEL SEGUNDO CONCURSO DE INVESTIGACIÓN, DESARROLLO E INNOVACIÓN TECNOLÓGICA IDIT 2013 [5] Loucas Louca, Todd A cook and William H. Johnson, "Implementation of IEEE single precision floating point addition and multiplication on FPGAs," 1996 IEEE. [6] Karan Gumber,Sharmelee Thangjam "Performance Analysis of Floating Point Adder using VHDL on Reconfigurable Hardware" in International Journal of Computer Applications (0975 - 8887) Volume 46- No.9, Mayo 2012 [7] N. Shirazi, A. Walters, and P. Athanas, "Quantitative Analysis of Floating Point Arithmetic on FPGA Based Custom Computing Machines," Proceedings of the IEEE Symposium on FPGAs. [8] Ali malik, Soek bum ko , "Effective implementation of floating point adder using pipelined LOP in FPGAss," 2010 IEEE. [9] Florent de Dinechin, "Pipelined FPGA adders" 2010 IEEE. [10] A. Jaenicke and W. Luk, "Parameterized Floating-Point Arithmetic on FPGAs", Proc. Of IEEE ICASSP, 2001, vol. 2, pp.897-900. 43 Ayala-Hernandez et al: Implementación de una red neuronal 44