Download Implementación de una red neuronal para la identificación de

Document related concepts

IEEE coma flotante wikipedia , lookup

Precisión simple en coma flotante wikipedia , lookup

VHDL wikipedia , lookup

Coma flotante wikipedia , lookup

Número subnormal wikipedia , lookup

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: [email protected])
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