• No se han encontrado resultados

BIBLIOTECA EN LENGUAJE DE DESCRIPCIÓN DE HARDWARE (VHDL) PARA LA IMPLEMENTACIÓN DE PERCEPTRÓN MULTICAPA TG 1742

N/A
N/A
Protected

Academic year: 2021

Share "BIBLIOTECA EN LENGUAJE DE DESCRIPCIÓN DE HARDWARE (VHDL) PARA LA IMPLEMENTACIÓN DE PERCEPTRÓN MULTICAPA TG 1742"

Copied!
50
0
0

Texto completo

(1)

BIBLIOTECA EN LENGUAJE DE DESCRIPCIÓN DE HARDWARE (VHDL) PARA LA IMPLEMENTACIÓN DE PERCEPTRÓN MULTICAPA TG 1742

FÁTIMA ANDREA RODRÍGUEZ ALVARADO

PONTIFICIA UNIVERSIDAD JAVERIANA FACULTAD DE INGENIERÍA DEPARTAMENTO DE ELECTRÓNICA

BOGOTÁ D.C.

2018

(2)

BIBLIOTECAEN LENGUAJE DE DESCRIPCIÓN DE HARDWARE (VHDL) PARA LA IMPLEMENTACIÓN DE PERCEPTRÓN MULTICAPA TG 1742

FÁTIMA ANDREA RODRÍGUEZ

TRABAJO DE GRADO PARA OPTAR POR EL TITULO DE INGENIERO ELECTRÓNICO

DIRECTOR DE TRABAJO DE GRADO:

ING. EDUARDO ANDRÉS GERLEIN REYES Ph.D.

PONTIFICIA UNIVERSIDAD JAVERIANA FACULTAD DE INGENIRÍA

DEPARTAMENTO DE ELECTRÓNICA BOGOTA D.C.

2018

(3)

PONTIFICIA UNIVERSIDAD JAVERIANA FACULTAD DE INGENIERÍA

CARRERA DE INGENIERÍA ELECTRÓNICA

RECTOR MAGNÍFICO: P. JORGE HUMBERTO PELÁEZ PIEDRAHITA S.J.

DECANO FACULTAD INGENIERÍA: ING. LOPE HUGO BARRERO SOLANO Ph.D.

DIRECTOR DE CARRERA: ING. ALEJANDRA MARÍA GONZÁLEZ CORREAL Ph.D.

DIRECTOR DE TRABAJO DE GRADO: ING. EDUARDO ANDRÉS GERLEIN REYES Ph.D.

(4)

ARTÍCULO 23 DE LA RESOLUCIÓN No. 13 DE JUNIO DE 1946

"La universidad no se hace responsable de los conceptos emitidos por sus alumnos en sus proyectos de grado. Sólo velará porque no se publique nada contrario al dogma y la moral católica y porque los trabajos no contengan ataques o polémicas puramente personales. Antes bien, que se vea en ellos el anhelo de buscar la verdad y la justicia".

Artículo 23 de la Resolución No. 13, del 6 de julio de 1946, por la cual se reglamenta lo concerniente a Tesis y Exámenes de Grado en la Pontificia Universidad Javeriana

(5)

TABLA DE CONTENIDO.

Capítulo Página

1. Introducción. 6

2. Marco Teórico. 7-13

2.1. Redes Neuronales. 7-10

2.1.1. ¿Qué es una red neuronal? 7

2.1.2. ¿Para qué y por qué se utilizan las redes neurales? 9

2.1.3. Algunos tipos de redes neurales. 9

2.2. Algoritmos de entrenamiento. 10-13

2.2.1. ¿Qué es un algoritmo de entrenamiento? 10

2.2.2. ¿Cómo se implementan los algoritmos de entrenamiento? 11

2.2.3. Algoritmo de Backpropagation. 12

2.2.3.1. Fundamentos matemáticos. 12

3. Desarrollo. 14-37

3.1. Perceptrón. 16-23

3.1.1. MULTIPLIERSP. 17

3.1.2. ADDER. 17

3.1.3. Función de activación Sigmoide. 21

3.2. Perceptrón multicapa. 23-25

3.3. Algoritmo de Backpropagation. 25-37

3.3.1. Derivada de la función de activación Sigmoide. 25

3.3.2. Errores. 27-30

3.3.2.1. Error Capa de salida. 27

3.3.2.2. Error Capa oculta 2. 28

3.3.2.3. Error Capa culta 1. 30

3.3.3. Deltas. 30-35

3.3.3.1. Delta de la Capa de salida. 30

3.3.3.2. Delta de la Capa oculta 2. 33

3.3.3.3. Delta de la Capa oculta 1. 34

3.3.4. Errores Ocultos. 35

3.3.5. Nuevos Pesos. 36

4. Protocolo de pruebas y resultados. 38-42

4.1. Resultados WEKA. 39

4.2. Resultados Implementación VHDL. 39-42

4.2.1. Perceptrón. 39

4.2.2. Perceptrón multicapa. 39

(6)

4.2.3. Algoritmo de Backpropagation. 40-42 4.2.3.1. Evaluar RMSE para las primeras 10 iteraciones. 40 4.2.3.2. Evaluar error absoluto en cálculo de pesos tras 500 iteraciones. 41

5. Conclusiones y recomendaciones. 43

5.1. Conclusiones. 43

5.2. Recomendaciones. 43

6. Bibliografía. 44-46

7. Anexos. 47

(7)

6

1. Introducción.

Los sistemas de cómputo de propósito general en los que se implementan los modelos matemáticos bioinspirados de redes neuronales, son desarrollados a través de algoritmos secuenciales, donde la información es procesada como un listado de instrucciones ejecutadas paso a paso [1]. Sin embargo, dichos modelos, usados para simplificar matemáticamente la representación biológica de las neuronas, buscan precisamente imitar el procesamiento paralelo de la información que sucede al interior del cerebro mamífero [2]. Esto implica que, al implementar los modelos, estas computadoras incrementen su consumo de potencia y al mismo tiempo su rendimiento disminuya [3].

En contraste, implementar una red neuronal artificial (ANN, Artificial Neural Networks, por sus siglas en inglés) sobre tecnologías de hardware reconfigurable puede presentar tiempos de programación menores que realizarlo en una unidad de procesamiento de propósito general [4]. Además, dispositivos de hardware reconfigurable como las Field Programmable Gate Arrays (FPGAs) tienen arquitecturas inherentemente paralelas que cuentan con topologías de interconexión de malla, características que pueden ser aprovechadas en la implementación de redes neuronales que a su vez también se caracterizan por presentar conexiones en grilla y procesamiento paralelo.

Se ha demostrado que al utilizar esta clase de hardware es posible acelerar el tiempo de ejecución de tareas paralelas, esto implica que algunos sistemas basados en redes neurales de impulso alcancen desempeños similares a los biológicos o incluso superiores [5]. Por lo tanto, implementar una biblioteca en VHDL (Del inglés Very High Speed Integrated Circuits Hardware Description Language) permite ofrecer una interfaz definida para la implementación de ANNs en este tipo de hardware, planteando así opciones, con diferentes rendimientos y orientaciones, a los problemas de inteligencia artificial (AI, Artificial Intelligence, por sus siglas en inglés).

Considerando lo anterior, este proyecto pretende implementar una biblioteca en lenguaje de descripción de hardware (VHDL) con funciones para la implementación de Perceptrón Multicapa en hardware reconfigurable. Para esto, se diseña e implementa en VHDL un modelo de neurona artificial, en este caso un perceptrón, con función de activación sigmoidea. Para luego, determinar el número de neuronas a implementar en la red neuronal artificial del modelo diseñado, la manera en que se determina el número de neuronas a implementar, se puede ver en la sección 4 donde se habla del caso de estudio que se utilizó para probar la biblioteca de VHDL y de la herramienta WEKA©.

Posteriormente, se entrena la red neuronal artificial con un algoritmo de clasificación Backpropagation utilizando esta herramienta y se diseña e implementa este algoritmo en VHDL, lo cual puede observarse en la sección 3. Por último, se valida el entrenamiento de la red neuronal, utilizando una base de datos del caso de estudio obtenida de un repositorio para aprendizaje de máquina [44].

En la sección 3, se muestra cómo se diseña el perceptrón, su función de activación, la manera en que se conectan las capas para obtener el perceptrón multicapa y cómo se implementa el algoritmo de Backpropagation. Cabe resaltar que no se encontró información respecto a las implementaciones en hardware de algoritmos de entrenamiento para redes neuronales, y a través de este proyecto se pretende validar la posibilidad de realizarlo, en particular para aplicaciones de aprendizaje online, en los que se entregan datos a la red durante intervalos de tiempo determinados y es necesario realizar un nuevo entrenamiento de la misma antes de que llegue el siguiente conjunto de datos.

(8)

7

2. Marco Teórico.

2.1. Redes Neuronales.

2.1.1. ¿Qué es una red neuronal?

Una red neuronal es un sistema conexionista1, es decir, un modelo que cuenta con una serie de criterios para definir la manera en que sus componentes deben interconectarse. Este modelo en particular consiste en un conjunto de unidades simples interconectadas entre ellas de forma aproximadamente análoga a la que se conectarían dos neuronas en un cerebro biológico, de ahí el nombre ‘neuronal’ que recibe la red[6]. Sin embargo, a pesar de su topología bioinspirada, toda red neural no biológica es, en consecuencia, artificial, una ANN.

En relación a esta topología bioinspirada intrínseca de las ANN resulta categórico entender cómo se realiza la transmisión de información en un cerebro biológico. Como se puede observar en la figura 2.1 existe un proceso de sinapsis entre dos neuronas, una emisora o pre-sináptica y otra receptora o post-sináptica. En [7]

se explica de manera detallas dicho proceso.

Figura 2.1. Proceso biológico de sinapsis entre dos neuronas. [1]

De manera similar a lo explicado en [7], una ANN tiene sistemas simples que hacen el papel de neuronas, razón por la cual son llamados de esta forma. Estos sistemas procesan la información que reciben en sus entradas y generan a partir de éstas una salida que se enviará a otros sistemas. Este tipo de sistema surge debido a que Alan Turing planteó el funcionamiento del cerebro como una forma de ver el mundo de la computación y desde entonces, se han desarrollado teorías y aplicaciones alrededor de sistemas bioinspirados[8]. Éstas abarcan modelamientos simples como los que se muestran en [9], teorías acerca de cómo el aprendizaje ocurre cuando ciertos cambios en una neurona son activados, como las formuladas en [10] y también redes neuronales aplicadas a problemas reales, como los que se plantean en [11].

En un cerebro biológico, cuando una actividad es realizada frecuentemente, las conexiones que existen entre las neuronas encargadas de realizarlo se fortalecen. Es por esto que cuando a un niño se le enseña a sumar, por ejemplo, se le asigna una serie de ejercicios, de forma que repita el proceso tantas veces que éste le resulte tan natural como respirar. Del mismo modo, cuando se deja de realizar una actividad, las habilidad que se tenían para ésta disminuyen, por esta razón los datos que no se utilizan con regularidad, con el tiempo, terminan olvidándose. En una ANN la manera en que se controla la relevancia de una conexión es a través de una variable denominada peso. Cada una de las conexiones de la red tendrá un peso asociado.

1Conexionista:Hace referencia al conexionismo, un conjunto de enfoques que establecen que distintos fenómenos pueden ser interpretados como procesos que emergen de redes formados por unidades sencillas interconectadas, aunque existen muchas formas de conexionismo, las más comunes serían las redes neurales[40] [41].

(9)

8

Al igual que existen los pesos en una ANN, se tienen funciones de activación, las cuales se tienen con el fin de modificar información o imponer un límite que debe sobrepasarse antes de dejar pasar la información a la siguiente neurona. Estas funciones de activación suelen incluirse a la salida de cada neurona.

Así entonces, en las ANN la información que llega a una neurona 𝑎 proveniente de la neurona 𝑏, es multiplicado por el peso asociado a la conexión neuronal entre 𝑎 y 𝑏. De esta manera para cada una de las neuronas vecinas, los resultados de estas multiplicaciones se suman y el valor resultante se evalúa en la función de activación, esto puede verse con mayor claridad en la figura 2.2.

Figura 2.2. Esquema general de una neurona artificial.

Las ANNs, se caracterizan por estar organizadas en capas, existen tres tipos de capas: capa de entrada, capa oculta y capa de salida. La capa de entrada acondiciona el estímulo, para poder ser enviado a través de la red. Las capas ocultas, que pueden variar en cantidad y también en el número de neuronas por capa, tratan los datos que se reciben de la capa de entrada para enviarlos hasta la capa de salida. La capa de salida realiza un último tratamiento de datos que genera la o las salidas que se desean. El número de neuronas en la capa de entrada es igual al número de estímulos y el número de neuronas en la capa de salida es igual al número de salidas deseadas en la red. La ANN que se implementa en la biblioteca de VHDL que se desarrolla en el presente trabajo de grado es conocida como perceptrón multicapa, en donde cada una de las neuronas es un perceptrón.

En la figura 2.3. se muestra un esquema general de la conexión de este tipo de red neural, debe considerarse que, el perceptrón puede tener tantas como se desee, en la sección 4. se muestra el procedimiento seguido para establecer el número de capas ocultas que tendría el perceptrón multicapa, al igual que el número de neuronas en cada una de estas capas.

Figura 2.3. Esquema general de conexión para un perceptrón multicapa.

Como puede verse en la figura 2.3., una característica del perceptrón multicapa es que las neuronas sólo envían información a la capa que les sigue y sólo reciben información de la capa anterior a ellas. Esto definirá la manera en que se conectan los perceptores de la sub-sección 3.1. y es la razón de las conexiones que se tienen en la sub-sección 3.3.

(10)

9

2.1.2. ¿Para qué y por qué se utilizan las redes neurales?

Algunos de los campos comprendidos por la AI incluyen áreas de propósito general como lo son el aprendizaje y la percepción, además de otras áreas específicas como la demostración de teoremas matemáticos, el diagnóstico de enfermedades y la predicción. En cualquier caso, el fundamento bajo el cual se constituye el aporte de la AI a estos campos es la neurona artificial y la red neuronal artificial [12].

Sin embargo, la mayor ventaja, en cuanto a aplicabilidad, de estas redes ocurre cuando se busca sintetizar y automatizar tareas cuyo procesamiento no sea en esencia secuencial. Algunos ejemplos de esto se encuentran en [2,4].Se tiene que, modificando o bien las conexiones entre las neuronas o la relevancia que se le da a las mismas, los sistemas logran aprender y formarse a sí mismos, para no tener que programarse explícitamente[6].

Es aproximado a tener un sistema diseñado a la medida, sin necesidad de diseñar cada función requerida.

Lo anterior dado que como se explica en la sub-sección 2.2 es posible tener una sola red neural y entrenarla para que ésta haga distintas actividades, según sea nuestra intención en un momento determinado. Esto con un sólo algoritmo de entrenamiento y una misma red.

2.1.3. Algunos tipos de redes neurales.

Las redes neurales pueden clasificarse de distintas maneras, por ejemplo, en función de la manera en que están conectadas sus neuronas, en función de la topología con la que diseña cada neurona, o también en función de quién o quiénes plantearon la topología conexionista de la neurona y/o de la misma red.

Los tipos más frecuentemente utilizados que se tienen, en función de la manera en que están conectadas las neuronas, son los siguientes:

 Redes neurales feed-fordward: Como puede observarse en la figura 2.4. en este tipo de red neural, se establecen capas de neuronas y las neuronas presentan conexiones de entrada únicamente con las neuronas de la capa anterior y conexiones de salida únicamente con las neuronas de la capa siguiente. Estas redes presentan una complejidad baja en cuanto a implementación y simulación, su desempeño es bueno para evaluar eventos futuros con base en eventos pasados similares, es decir.

La red podrá por ejemplo, identificar y clasificar patrones, o reconocer imágenes[13]. Dentro de este tipo de red neural se encuentra el perceptrón multicapa.

Figura 2.4. Conexión de una red neuronal feed-forward.

 Redes neurales recurrentes: Están completamente conectadas, presentan caminos que realimentan todos los elementos de la red entre sí mismos, ver figura 2.5.. La complejidad que presentan es alta.

Sin embargo, con el algoritmo de entrenamiento adecuado pueden transmitir la información realizando una predicción. Aplicaciones para este tipo de redes pueden verse en [6][13][14][15][16][17] [18][19][20].

(11)

10

Figura 2.5. Conexión de una red neuronal recurrente.

Las redes neurales que se acaban de mencionar son redes estáticas, una vez se establecen las conexiones éstas no pueden ser modificadas por el algoritmo de entrenamiento, sólo se modifica el peso, o relevancia que dicha conexión tendrá en el procesamiento de la información. Existen redes neurales que pueden cambiar sus conexiones durante el entrenamiento, algunos ejemplos, usados frecuentemente, de estas redes pueden verse en [21][22][23][24] [25][26][27].

2.2. Algoritmos de entrenamiento.

2.2.1. ¿Qué es un algoritmo de entrenamiento?

Para que una red neural aprenda a realizar un proceso debe seguir un procedimiento que implica la modificación, o bien de las conexiones entre neuronas, cuando la red no es estática, o también el peso de las conexiones entre neuronas, sea ésta o no estática. Este procedimiento de modificación hasta alcanzar el aprendizaje es lo que se conoce como algoritmo de entrenamiento [28].

Para que la red aprenda la nueva información, el algoritmo debe ser capaz de determinar la existencia o no de una conexión, establecer cuando la relevancia de una conexión pasa de valer 𝑎 a valer 𝑏. El algoritmo de entrenamiento a utilizar se establece a partir de los criterios bajo los cuales se cambia el valor asignado a las conexiones de la red, estos son: el paradigma de aprendizaje y la regla de aprendizaje [28][29][30][31].

Ambos criterios determinan la manera en que se van a utilizar dos conjuntos de datos, el data-set y el data- test, el primero, hace referencia al conjunto de datos con el cual se entrena la red para establecer los pesos con los que va a trabajar, mientras que el segundo hace referencia al conjunto de datos con el cual se prueba si el aprendizaje, es decir, la asignación de pesos lograda a través del algoritmo, se realizó con cierto grado de acierto y cuál es ese grado. Existe otro conjunto de datos, que es el data-work, es decir, el conjunto de datos con los que se va a trabajar una vez se ha establecido a partir del data-test que la red neural ha alcanzado el grado de acierto apropiado, o que éste es aceptable para la funcionalidad para la cual se entrenó la red [42][43].

El paradigma de aprendizaje, hace referencia a la información a la cual la red neural va a tener acceso durante el proceso de aprendizaje, éste puede ser:

 Aprendizaje online: Implica que la red aprenda durante su funcionamiento. No existe diferencia entre el data-set, data-test y el data-work, el algoritmo de entrenamiento se aplica sobre cada uno de los datos que ingrese. Este paradigma implicará una red más dinámica, la estabilidad de la red es un punto sobre el cual debe prestarse atención. De lo contrario, el flujo continuo de información repetida, por ejemplo, o información contradictoria, podría afectar su desempeño.

 Aprendizaje offline: El funcionamiento de la red requiere dos fases, una de aprendizaje y otra de funcionamiento. Se entrena con el data-set, probando el desempeño a través del data-test, para luego de alcanzando el desempeño deseado pasar a la fase de funcionamiento y procesar el data-work.

(12)

11

Los pesos de las conexiones permanecerán intactos luego de entrar a la fase de operación. La red será estática, así que no se esperan problemas de estabilidad en el sistema durante su funcionamiento.

 Aprendizaje supervisado: Implica que se incluya un agente externo que establece cuál será el resultado esperado a ciertos estímulos de entrada. Una vez estos son procesados se comparan la salida de ésta con dicho resultado. Las modificaciones sobre la red ocurren sólo cuando las respuestas no coinciden. Este paradigma puede ser por corrección de error [32], o por refuerzo [32][33].

 Aprendizaje no supervisado: En este paradigma existe desconocimiento de los valores de salida que la red debe presentar a sus estímulos, la red debe ser capaz de encontrar correlaciones o patrones entre los datos de entrada [32][34]. Esta red es capaz de auto organizarse, y descubre por sí sola datos para el funcionamiento, al no tener que contrastar resultados su aprendizaje toma menor tiempo, además, su arquitectura es simple respecto a la que presenta el aprendizaje supervisado [35][36].

Existen otros tipos de paradigmas que pueden verse en [33] y en [28] a mayor profundidad. Por otra parte, la regla de aprendizaje determina la manera en que las neuronas van a aprender de la información que se les entrega, es decir con qué criterio se modifican los pesos, los cuatro tipos principales son los siguientes:

 Minimización del error: Se pretende que el error en la salida, respecto al valor que se espera de ella sea mínimo. Ejemplos de ésta serían: la regla del perceptrón, el método de descenso por gradiente y el algoritmo de Backpropagation.

 Máquina de Boltzman: Contempla parámetros aleatorios para la asignación de los pesos.

 Aprendizaje de Hebb: Refuerza la conexión entre dos neuronas sólo cuando se presenta la activación de una de ellas.

 Competitivo y Cooperativo: Sólo aprenden las neuronas que se acerquen más a la salida, las otras presentan menor aprendizaje.

2.2.2. ¿Cómo se implementan los algoritmos de entrenamiento?

Los algoritmos de entrenamiento tienen un diagrama de flujo que establece el procedimiento a seguir para la modificación de los pesos. Sin embargo, la manera en que estos se implementen dependerá de si el algoritmo y la red se implementará a través de software o de hardware. Las tareas en software se desarrollan secuencialmente como una lista de tareas, incluso cuando se tienen varios núcleos, mientras que en hardware, las tareas se desarrollan paralelamente.

Para el caso de software existen programas que permiten la creación de redes neurales, donde el usuario puede ingresar el número de entradas, salidas, capas y neuronas por capa deseada en su red y también elegir tanto la regla a seguir como la taza de aprendizaje. Algunos ejemplos son [37] o WEKA, que permite descargar una plataforma que permite utilizar las ANN para tareas de clasificación [38]. También puede programarse la neurona, la red y el algoritmo desde cero en el lenguaje de programación que se desee utilizando un compilador de agrado.

En el caso de hardware, se tienen otras opciones. Si se quiere una red estática, es posible desarrollar la red y entrenarla en software, diseñar un esquemático para hardware que la replique y posteriormente implementarlo.

Otra opción es, diseñar para hardware una neurona, a través de bloques de procesamiento y control, luego de la misma forma conectar la red. Una vez la red esté implementada sobre un dispositivo de hardware reconfigurable, se conecta con un computador sobre el que se implementa el algoritmo y se entrena la red.

Una vez el entrenamiento termine, se tiene una red con pesos definidos y podrá procederse a sintetizar los bloques para obtener el circuito de la red.

(13)

12

Por último, si se desea que la red no sea estática y pueda reentrenarse para múltiples actividades, existe la alternativa de no obtener el esquemático para implementación sino dejar que la red permanezca en el dispositivo de hardware reconfigurable. Si se implementan en el dispositivo algoritmo y también red, es posible que se desarrolle un entrenamiento desde el dispositivo sin necesidad de un ordenador, esto puede permitir menores tiempos de aprendizaje.

2.2.3. Algoritmo de Backpropagation.

El algoritmo de Backpropagation es un algoritmo de aprendizaje supervisado por corrección de error con aprendizaje offline, también es conocido como de propagación hacia atrás del error o de retropropagación.

La señal de error entonces se propagará de la salida a la entrada, mientras los pesos de las conexiones se optimizan con un proceso basado en la minimización de la función de coste2.

El algoritmo tiene dos etapas, la primera en la que se propagan de la entrada a la salida los estímulos con el fin de obtener una salida, luego ésta es comparada con la salida esperada. En la segunda etapa se propaga el error de la salida a la entrada a través de las capas ocultas de la red hasta llevarlo a la capa de entrada. Cada vez que el error pasa por una capa los pesos se reacondicionan, hasta que toda la red presente nuevos pesos.

2.2.3.1. Fundamentos matemáticos.

Los fundamentos matemáticos detrás del algoritmo de Backpropagation son, en esencia tres: La derivación, la derivación parcial y la regla de la cadena. El propósito entonces en el Backpropagation es encontrar las derivadas parciales de la función de error respecto a cada peso de la red. De manera que al final obtengamos el gradiente de cada uno de los pesos de la red con respecto a la salida.

𝑒𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎𝑆𝑎𝑙𝑖𝑑𝑎= 𝑆𝑎𝑙𝑖𝑑𝑎 − 𝑆𝑎𝑙𝑖𝑑𝑎_𝑑𝑒𝑠𝑒𝑎𝑑𝑎 Ecuación 2.1.

Δ𝐶𝑎𝑝𝑎𝑆𝑎𝑙𝑖𝑑𝑎= 𝑒𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎𝑆𝑎𝑙𝑖𝑑𝑎 𝛿

𝛿𝑃𝑒𝑠𝑜𝑠𝑆𝑎𝑙𝑖𝑑𝑎𝐹𝐴(𝑆𝑎𝑙𝑖𝑑𝑎) Ecuación 2.2.

𝑒𝑟𝑜𝑟𝐶𝑎𝑝𝑎𝑖= Δ𝐶𝑎𝑝𝑎𝑖+1∙ 𝑃𝑒𝑠𝑜𝑠𝑖 Ecuación 2.3.

Δ𝐶𝑎𝑝𝑎𝑖= 𝑒𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎𝑖 𝛿

𝛿𝑃𝑒𝑠𝑜𝑠𝐶𝑎𝑝𝑎𝑖𝐹𝐴(𝑆𝑎𝑙𝑖𝑑𝑎𝑖) Ecuación 2.4.

𝑃𝑒𝑠𝑜𝑠𝑖= 𝑃𝑒𝑠𝑜𝑠𝑖+ (𝑆𝑎𝑙𝑖𝑑𝑎𝑖∙ Δ𝐶𝑎𝑝𝑎𝑖+1) Ecuación 2.5.

Las ecuaciones 2.1 a 2.5. permiten ejecutar el diagrama de flujo de la figura 2.6. Es importante considerar que antes de que la red sea entrenada por primera vez, las conexiones no tienen pesos, por lo que es necesario generar de forma aleatoria valores para los pesos antes de ejecutar por primera vez el algoritmo. El algoritmo se realizará tantas veces como datos haya en el data-set. Como se está calculando el gradiente decreciente, cada vez que se ejecute el algoritmo se minimiza el error a la salida.

Para explicar mejor el algoritmo, se realiza un ejemplo en la herramienta MATLAB © el cual se encuentra en el anexo 7.1., éste incluye también 4 tablas que muestran los valores iniciales de los pesos de las capas ocultas y de la capa de salida, las salidas de éstas, los valores de los errores y deltas de las mismas y por último los valores finales que éstos presentan tras la ejecución del algoritmo y una tabla comparativa entre los errores absolutos que se tienen entre los valores deseados y los obtenidos al evaluar las entradas en el perceptrón multicapa con los pesos iniciales y con los pesos finales.

2 Función de coste: Se denomina así al valor absoluto del error.

(14)

13

Figura 2.6. Diagrama de flujo algoritmo de Backpropagation[39].

(15)

14

3. Desarrollo.

Se determina que, dado que se implementará un perceptrón multicapa en el presente el trabajo de grado, es imperativo determinar el número de capas ocultas que se tendría para éste. Como se menciona en la sección 2, existen herramientas de software que permiten diseñar una ANN, en este caso, se utiliza la herramienta WEKA.

El workbench de WEKA es una colección de algoritmos de aprendizaje de máquina y de herramientas de procesamiento de datos. Está diseñado para que pueda probarse rápidamente los algoritmos, de manera flexible sobre cualquier conjunto de datos. Permite realizar la preparación de los datos de entrada, la evaluación estadística de los esquemas de aprendizaje y la visualización de los datos de entrada, y el resultado del aprendizaje. Además, no sólo incluye una interfaz gráfica para acceder a todas estas herramientas, sino que los códigos fuente están disponibles en línea en [38], por lo que es posible modificarlos si se desea o simplemente analizarlos para entender el procedimiento que siguen para lograr los resultados.

En la sección 4 se muestra describe la prueba realizada para determinar la topología del perceptrón multicapa e información respecto a los resultados de la implementación en software de ésta. Como se menciona en dicha sección el mejor resultado de clasificación se obtuvo con una configuración de dos capas ocultas, la primera con 7 neuronas y la segunda con 8, la cual obtuvo un porcentaje de acierto del 99,6485%, esto quiere decir que la ANN sería capaz de, entre un total de 1000 pacientes, clasificar correctamente a 9966 pacientes.

Luego, habiendo definido a partir de estas pruebas la topología a seguir en el perceptrón multicapa, se procede a realizar el diseño e implementación de los distintos códigos VHDL que permitirán generar un perceptrón multicapa de estas características. Para ello, se utiliza la herramienta Quartus Prime Version 18.0 Lite Edition©, que realiza la síntesis de los códigos que se implementan en el dispositivo de hardware reconfigurable. De igual manera para simular los bloques se utiliza la herramienta ModelSim – Intel FPGA STARTER 10.5b©.

Como se ha mencionado en la sección 2, se realizan múltiples operaciones matemáticas con los valores que se tienen en las entradas, por lo que resulta importante determinar el tipo de dato con el cual se alimentará el modelo. Como se realizan implementaciones en VHDL se trabajará con número binarios, los cuales pueden tener representación de punto fijo o de punto flotante cuando se desea trabajar con números no enteros. Para garantizar que sea posible introducir valores de estímulo en un amplio rango de valores, se elige una representación de punto flotante de precisión sencilla, en lugar que una representación de punto fijo la cual restringiría el rango de valores a representar. En la representación de punto flotante en formato IEEE 754 ha utilizar, cada número será representado, siguiendo la figura 3.1., así, el MSB será el signo los siguientes 8 bits corresponderán al exponente y los 23 bits restantes a la mantisa, siendo esta exclusivamente decimal, donde el valor del número representado puede calcularse siguiendo la ecuación 3.1. Este formato permite representar números desde −11,754943𝑒 − 39 hasta 3,402823466𝑒38 aproximadamente.

Figura 3.1. Representación punto flotante de precisión simple.

𝑁𝑢𝑚𝑒𝑟𝑜 = (−1)𝑠𝑖𝑔𝑛𝑜(1 + 𝑚𝑎𝑛𝑡𝑖𝑠𝑎)2𝑒𝑥𝑝𝑜𝑛𝑒𝑛𝑡𝑒−127 Ecuación 3.1.

(16)

15

Es importante notar que, cuando se tienen números en este tipo de formato no es posible operar de la misma forma en que se operan los números de punto fijo o los enteros. Por lo que para realizar las operaciones se utilizan módulos aritméticos prediseñados, disponibles en Quartus II, también llamadas intelectual property core (IP core), los cuales se encuentran disponibles en el catálogo de la herramienta. Los IP cores utilizados para esta aplicación son: IP ALTFP_MULT, de multiplicación de punto flotante, IP ALTFP_ADD, de adición de punto flotante, ALTFP_EXP, para cálculo de la función exponencial elevada a un número en punto flotante y ALTFP_INV, para cálculo del inverso multiplicativo de punto flotante. Todos estos bloques son instanciados en un circuito evolvente que, mediante un contador parametrizable, evalúa la latencia propia de cada uno, y emite una señal data_ready junto con el dato final registrado como puede observarse en la figura 3.2. Las banderas de salida DATA_READY, TROUBLE, informan cuándo se ha terminado de realizar el proceso del que se encarga el bloque que implementa la IP y si ha habido un error en la realización del mismo, es decir, un overflow, una división por cero o un NAN, esto aplica para todas las señales denominadas de esta manera en todos los bloques del diseño implementado.

Figura 3.2. Diagrama de bloques para uso de IP cores de Altera.

El bloque IPSP_CONTROL de la figura 3.2., se encarga de monitorear, reiniciar y activar los bloques IP, CONTADOR_LATENCIA y REGISTRO. Para ello, sigue la máquina de estados que puede verse en la figura 3.3. y que es descrita a continuación en la tabla 3.1.

Figura 3.3. Máquina de estados bloque IPSP.

Estado Acciones

S0 Reinicia los bloques: IP, CONTADOR_LATENCIA y REGISTRO.

No habilita ninguno de los bloques

La salida DATA_READY, está en bajo, es decir, 0 lógico.

S1 No reinicia los bloques IP, CONTADOR_LATENCIA y REGISTRO.

Habilita sólo los bloques IP y CONTADOR_LATENCIA.

La salida DATA_READY está en bajo, es decir, 0 lógico

S2 No reinicia los bloques IP, CONTADOR_LATENCIA y REGISTRO.

Habilita sólo el bloque registro.

La salida DATA_READY está en bajo, es decir, 0 lógico

S3 No reinicia los bloques IP, CONTADOR_LATENCIA y REGISTRO.

No habilita ninguno de los bloques.

La salida DATA_READY está en alto, es decir, 1 lógico.

Tabla 3.1. Descripción de acciones para cada estado del bloque IPSP_CONTROL.

(17)

16

A continuación, se presentan los diagramas de bloques y de estados con los cuales se implementan los distintos bloques de la biblioteca, y simulaciones comportamentales de los mismos.

3.1. Perceptrón.

Como se menciona previamente, la biblioteca de VHDL que se diseña está pensada para la implementación de redes neurales de tipo perceptrón multicapa, por lo que se debe comenzar realizando un perceptrón. La figura 2.2. muestra el esquema general del cual se deriva el diseño del perceptrón implementado. Como se observa en ésta el perceptrón tiene símiles morfológicos con las neuronas vistas en la figura 2.1.

En el esquema de la figura 2.2, las entradas 𝑥1 a 𝑥𝑛 se multiplican por los pesos 𝑤1𝑗 a 𝑤𝑛𝑗 de la conexión, para luego sumarse y por último pasar por la función de activación 𝑓(𝑧)𝑗, que en el caso del perceptrón implementado será una función sigmoide cuya forma está dada por la ecuación 3.3. donde z es el resultado de la sumatoria de la ecuación 3.2.

∑ 𝑤𝑖𝑗∗ 𝑥𝑖

𝑛 𝑖=1

Ecuación 3.2.

𝑓(𝑧)𝑗= 1

1 + 𝑒−𝑧 Ecuación 3.3.

Con lo anterior en mente, se plantea la caja negra que se observa en la figura 3.4., para ésta las señales de entrada INPUTS y WEIGHTS son arreglos de tamaño 𝑁 de señales de tipo std_logic_vector de 32, la señal de salida OUTPUT, corresponde al mismo tipo, pero no es un arreglo. Las señales RST_N, EN, Clk, DATA_READY y TROUBLE son todas de tipo std_logic, RST_N y EN son señales de control, que permiten reiniciar y activar el bloque, la primera es activa en bajo mientras que la segunda es activa en alto.

Las señales de salida DATA_READY y TROUBLE son banderas, activas en alto.

Figura 3.4. Caja negra del bloque Perceptrón

En la figura 3.5. se muestra un diagrama en bloques para el bloque perceptrón, basado en las ecuaciones 3.2. y 3.3.. Como puede notarse se diseñaron 3 bloques principales: MULTIPLIERSP, que multiplica dos señales de tipo std_logic_vector de 32 bits que representen números en formato punto flotante de precisión sencilla; ADDER que es un bloque parametrizable, en el cual es posible sumar 𝑁 entradas todas de tipo std_logic_vector de 32 bits que representen números en formato punto flotante de precisión sencilla y por último el bloque SIGMOIDE, que implementa la función 𝑓(𝑧) de la ecuación 3.3. a partir de una entrada de tipo std_logic_vector de 32 bits que represente un número en formato punto flotante de precisión sencilla.

Figura 3.5. Diagrama en bloques del bloque PERCEPTRÓN.

El bloque MULTIPLIERSP utiliza la IP ALTFP_MULT, el bloque addSP, contenido en el bloque ADDER, utiliza la IP ALTFP_ADD, de adición de punto flotante, y por último, el bloque SIGMOIDE utiliza tres IPs

(18)

17

como se observa en la figura 3.14, para los bloques internos de EXPONENTIAL, addSP e INVER, correspondientes a las IPs ALTFP_EXP, ALTFP_ADD y ALTFP_INV, respectivamente, que ejecutan la función exponencial elevada a un número, la adicción y el cálculo del inverso multiplicativo de un número para punto flotante.

3.1.1. MULTIPLIERSP.

Este bloque presenta la estructura que se muestra en la figura 3.2. el cual instancia IP ALTFP_MULT. El módulo tiene una latencia3 de 5 ciclos de reloj. Se realiza una prueba para verificar el funcionamiento del bloque y validar el tiempo que tarda en entregar una respuesta. Para esta prueba se configura un reloj con duty cycle del 50% y frecuencia de 50 MHz, se ingresan dos números para operar, que son, DATAA,−4,95216𝑒35, y DATAB,2,85425𝑒 − 29, que deben dar como resultado al multiplicarse,

−1,41347027𝑒7. Como se ve en la figura 3.6., el bloque presenta una latencia de 8 ciclos de reloj y el resultado es el esperado.

Figura 3.6. Resultado de Simulación del bloque MULTIPLIERSP.

3.1.2. ADDER

Durante el desarrollo del proyecto, se evidenció que este bloque tiene algunos requerimientos especiales, como lo es el número indeterminado de entradas a operar. Esto dado que la suma que se realiza utilizando la IP ALTFP_ADD, sólo permite sumar 2 números a la vez. Mientras que el ADDER recibe para la suma tantas entradas como neuronas pertenezcan a la capa inmediatamente anterior. Lo anterior quiere decir que si una capa 2 tiene 45 entradas y una neurona de la capa 3 va a operar, requiere sumar 45 los resultados de 45 multiplicaciones. La biblioteca de VHDL que se implementa en el trabajo de grado pretende que la neurona sea completamente parametrizable. Por lo que la arquitectura del sumador debe ser capaz de adaptarse a esto y sumar 45 entradas de la misma manera en que sumaría 2, 100 o cualquier otro valor.

Para empezar, se realiza el bloque addSP que toma el IP core ALTFP_ADD y la implementa con la arquitectura que se muestra en la figura 3.4, configurando la latencia del IP core ALTFP_ADD en 7 ciclos de reloj, que es la latencia mínima requerida para un bloque de suma en punto flotante de precisión sencilla.

Se realiza una prueba sobre esta implementación, con las mismas condiciones para el reloj que se tenían en la prueba realizada para el bloque MULTIPLIERSP, y que son las que se utilizarán para la realización de todas las pruebas comportamentales de los bloques. En esta prueba, se ingresan dos números, X, 39837, y Y, 40122, para operarse, cuya suma resultante, S, debe ser 79969, también se realizan en la prueba el ingreso posterior de otros dos valores para X y Y, 0.453200 y -0.0245200, respectivamente, para observar el comportamiento para números enteros y para decimales, en este segundo caso, se espera que S sea 0,42868.

La figura 3.7. muestra el resultado de la simulación de este bloque, puede observarse que en ambos casos le toma entre 10 ciclos de reloj informar que el resultado está listo y éste es el esperado.

3 Latencia corresponde a la cantidad de ciclos de reloj que le toma a un bloque determinado el entregar el resultado de la operación de la cual se encarga, contados a partir del momento en que se envía la señal de activación de dicho bloque.

(19)

18

Figura 3.7. Simulación del bloque addSP.

Se realizó una búsqueda de distintas topologías para lograr realizar la suma de las múltiples entradas que podían tenerse. La primera de estas topologías, que puede verse en la figura 3.8., implica sumar las dos primeras entradas entre sí para luego sumar el resultado con la entrada siguiente y así sucesivamente hasta sumar las 𝑁 entradas, esta topología presenta dos inconvenientes, el primero es que se requieren tantos bloque addSP como entradas se tengan en el bloque ADDER, por lo que se incrementa el consumo de recursos, el segundo inconveniente es que, como se debe terminar una suma antes de realizar la siguiente y son en total 𝑁 − 1 sumas, el tiempo que le tomaría al ADDER, con esta topología, tratar los datos sería en el mejor de los casos 10(𝑁 − 1), ciclos de reloj, siendo 10 la latencia del bloque addSP.

Figura 3.8. Diagrama en bloques de primera topología de ADDER.

Otra topología que se estudió es la del árbol sumador, que puede verse en la figura 3.9., en la cual se suman las entradas de dos en dos en un primer nivel de sumas. Si hay un número impar de entradas la última entrada se suma con cero. Luego las salidas se agrupan nuevamente en pares en un segundo nivel y se van sumando niveles sucesivos por parejas hasta obtener una única salida.

Figura 3.9. Diagrama en bloques de segunda topología de ADDER.

En esta topología, el número de niveles de suma viene dado por la ecuación 3.4, donde N es el número de entradas y el número de bloque addSP por nivel viene dado por la ecuación 3.5, la ecuación 3.6 muestra cómo se puede calcular el número de bloques addSP que requeriría esta topología, por lo que la latencia de esta topología vendría dada por la ecuación 3.7., donde 10 sería la latencia del bloque addSP.

#𝑁𝑖𝑣𝑒𝑙𝑒𝑠(𝑁) = 𝑐𝑒𝑖𝑙𝑖𝑛𝑔(log2(𝑁)) Ecuación 3.4.

#𝑎𝑑𝑑𝑆𝑃(𝑁, 𝑁𝑖𝑣𝑒𝑙) = 𝑁

2𝑁𝑖𝑣𝑒𝑙 Ecuación 3.5.

(20)

19

#𝑎𝑑𝑑𝑆𝑃𝑇𝑜𝑡𝑎𝑙= 𝑁 2𝑖

𝑐𝑒𝑖𝑙𝑖𝑛𝑔(log2(𝑁))

𝑖=1

Ecuación 3.6.

𝐿𝑎𝑡𝑒𝑛𝑐𝑖𝑎 = 10 𝑁

2𝑖

𝑐𝑒𝑖𝑙𝑖𝑛𝑔(log2(𝑁))

𝑖=1

Ecuación 3.7.

El resultado de la ecuación 3.6 es siempre mayor a N-1, por lo que requiere la implementación de más unidades addSP que ésta, y su latencia también es mayor. Sin embargo, la principal desventaja de esta estructura es que la codificación que requiere para poder implementarse, no es sintetizable en VHDL cuando se requiere el bloque sea parametrizable.

Figura 3.10. Diagrama en bloques topología ADDER.

La última topología que se estudió es la que se puede observar en la figura 3.10. esta topología es la que se decidió implementar, dado que, aunque presenta una latencia mayor que las dos mencionadas anteriormente, requiere de menos recursos, y debe considerarse que cada neurona debe contar con un bloque ADDER y una red neural puede tener fácilmente más de 50 o incluso 500 neuronas, por esto, se consideró preferible implementar esta arquitectura. Para este fin se diseñan los bloques MUX y CONT_N parametrizables. La señal que va del bloque CONT_N a bloque MUX es de tipo integer, mientras que la señal que va del bloque CONT_N es de tipo std_logic, las señales que van del bloque MUX al bloque addSP, de este último a REGISTRO y desde REGISTRO de regreso al bloque addSP, son todas de tipo std_logic_vector de 32 bits, por la representación punto flotante de precisión simple, mientras que las señales RST_N, EN y las que van desde el bloque ADDER_CONTROL hasta los bloque CONT_N, addSP y REGISTRO son también del mismo tipo pero de 2 bits. El bloque MUX actuará de forma combinacional, se realizó una prueba sobre el miso, los resultados de simulación de la misma pueden verse en la figura 3.11., y como puede notarse en ésta, la salida X_out toma el valor que la entrada X_in tenga en la posición que la variable SEL de entrada indique, tal y como se desea.

Figura 3.11. Simulación bloque MUX.

La figura 3.12. muestra la máquina de estados del bloque ADDER_CONTROL, que reinicia, activa y monitorea los bloques addSP y CONT_N, en la tabla 3.2. pueden verse los estados de esta máquina de estados y las acciones que se realizan durante cada uno de estos.

(21)

20

Figura 3.12. Máquina de estados bloque ADDER_CONTROL.

Estado Acciones

S0 Reinicia los bloques addSP , CONT_N y REGISTRO.

No habilita ninguno de los bloques.

La salida DATA_READY está en bajo.

La salida TROUBLE está en bajo.

S1 No reinicia ninguno de los bloques.

Habilita sólo al bloque addSP.

La salida DATA_READY está en bajo.

La salida TROUBLE está en bajo.

S2 No reinicia ninguno de los bloques.

No habilita ninguno de los bloques.

La salida DATA_READY está en alto.

La salida TROUBLE está en alto.

S3 No reinicia ninguno de los bloques.

Habilita sólo el bloque registro.

La salida DATA_READY está en bajo.

La salida TROUBLE está en bajo.

S4 No reinicia ninguno de los bloques.

Habilita sólo el bloque CONT_N.

La salida DATA_READY está en bajo.

La salida TROUBLE está en bajo.

S5 Reinicia sólo el bloque addSP.

No habilita ninguno de los bloques.

La salida DATA_READY está en bajo.

La salida TROUBLE está en bajo.

S6 No reinicia ninguno de los bloques.

No habilita ninguno de los bloques.

La salida DATA_READY está en alto.

La salida TROUBLE está en bajo.

Tabla 3.2. Descripción de acciones para cada estado del bloque ADDER_CONTROL

Se realiza una prueba sobre el bloque ADDER, para verificar el funcionamiento de la implementación. Para ello se ingresa un vector X_in, [1,2,3,4], de tamaño 4, para que se sumen todas las entradas, lo que debe dar como resultado, Y, 10. Los resultados de simulación de la prueba pueden verse en la figura 3.13, en ésta se evidencia que la latencia del bloque ADDER con la topología que tiene es de (10 + 4)𝑁 + 1, donde 10 es la latencia del bloque addSP. También puede notarse que el bloque entrega el resultado, Y, esperado.

(22)

21

Figura 3.13 Simulación del Bloque ADDER.

3.1.3. Función de activación Sigmoide.

La función de activación que se implementó en los Perceptrones de la biblioteca de VHDL que se desarrolla en el trabajo de grado, es la función sigmoide, descrita por la función que puede verse en la ecuación 3.3.

Se diseña el diagrama en bloques que se observa en la figura 3.14 el cual permite calcular la función sigmoide de una variable X, que será la señal DATAIN que puede verse en la figura 3.14.

Figura 3.14. Diagrama en bloques del bloque SIGMOIDE.

En la representación de punto flotante de precisión simple, el MSB representa el signo del número, por lo que para el bloque INV_SIG sólo es necesario negar este bit. Los bloques EXPONENTIALSP e INVERSORSP, como se menciona previamente, internamente presentan una conexión como la que se muestra en la figura 3.2., donde el bloque IP corresponde a los bloques ALTFP_EXP, ALTFP_INV, respectivamente, las latencias de estos bloques IP son 17 y 20 ciclos de reloj. Se realiza una prueba sobre el bloque EXPONENTIALSP, ingresando como entrada, DATA, 3, que debería producir como resultado, RESULT,.20,0845369. La figura 3.15. muestra el resultado la prueba, como puede observarse en ésta, la latencia del bloque EXPONENTIALSP es de 20 ciclos de reloj, y el valor de la salida, RESULT, es el deseado.

Figura 3.15. Simulación del bloque EXPONENTIALSP.

Del mismo modo, se plantea una prueba para el bloque INVERSORSP, para ésta se ingresa como entrada, DATA, 1,50757e-36, al cual se desea hallarle el inverso multiplicativo, se espera el resultado, RESULT, sea 6,63319e35. La figura 3.16 muestra el resultado de la simulación de dicha prueba, como puede observarse, la latencia del bloque INVERSORSP, es de 23 ciclos de reloj, y el resultado es el esperado.

(23)

22

Figura 3.16. Simulación del bloque INVERSORSP.

El bloque SIGMOIDE_CONTROL, se encarga de reiniciar, activar y monitorear los bloques EXPONENTIALSP, addSP e INVERSORSP, para ello se diseña la máquina de estados que puede verse en la figura 3.17. La tabla 3.3. muestra las acciones que se realizan en cada uno de los estados que se muestran en esta máquina.

Figura 3.17. Máquina de estados bloque SIGMOIDE_CONTROL.

Estado Acciones

S0 Reinicia los bloques EXPONENTIALSP, addSP, REGISTRO INVERSORSP.

No habilita ningún bloque

La salida DATA_READY está en bajo.

La salida TROUBLE está en bajo.

S1 No reinicia ningún bloque

Habilita sólo el bloque EXPONENTIASP.

La salida DATA_READY está en bajo.

La salida TROUBLE está en bajo S2 No reinicia ningún bloque

No habilita ningún bloque.

La salida DATA_READY está en alto.

La salida TROUBLE está en alto.

S3 No reinicia ningún bloque

Habilita sólo el bloque addSP.

La salida DATA_READY está en bajo.

La salida TROUBLE está en bajo.

S4 No reinicia ningún bloque

Habilita sólo el bloque INVERSORSP.

La salida DATA_READY está en bajo.

La salida TROUBLE está en bajo.

S5 No reinicia ningún bloque

Habilita sólo el bloque REGISTRO.

La salida DATA_READY está en bajo.

La salida TROUBLE está en bajo S6 No reinicia ningún bloque

No habilita ningún bloque.

La salida DATA_READY está en alto.

La salida TROUBLE está en bajo.

(24)

23

Tabla 3.3. Descripción de acciones para cada estado del bloque SIGMOIDE

Se procede a realizar también una prueba sobre el bloque SIGMOIDE, para ésta se ingresa una entrada, DATAIN, de 3, el bloque SIGMOIDE corresponde a la ecuación 3.3., siguiendo ésta, el valor esperado en la salida, DATAOUT, es de 0,9525741. La figura 3.18. muestra el resultado de simulación de esta prueba, como puede observarse, la latencia del bloque SIGMOIDE es de 58 ciclos de reloj, y el resultado, DATAOUT, es el deseado, y tiene una precisión de 5 decimales.

Figura 3.18. Simulación del bloque SIGMOIDE.

Habiendo verificado el comportamiento de los bloques MULTIPLIERSP, ADDER, SIGMOIDE diseñados, se procede a verificar el comportamiento que presenta el bloque perceptrón implementado con ellos a partir del diagrama en bloques de la figura 3.5. Para ello se realiza una prueba con un vector de entradas, INPUTS:

[17.99,10.38,122.8,1001,0.1184,0.2776,0.3001,0.1471,0.2419,0.07871,1.095,0.9053,8.589,153.4,0.00639 9,0.04904,0.05373,0.01587,0.03003,0.006193,25.38,17.33,184.6,2019,0.1622,0.6656,0.7119,0.2654,0.460 1,0.1189], y un vector de pesos, WEIGHTS, [0.469886,1.77942,0.57482,-0.277533,-0.735489,-

0.993228,2.89076,0.988562,0.319585,-1.99231,2.76022,-3.21745,1.63422,0.345234,0.569863,- 0.0120532,0.0893613,1.09491,-0.711428,-2.9253,3.32509,2.78602,2.6088,1.62521,0.930144,-

1.53275,3.1814,2.31628,0.373056,-3.26055], para determinar el resultado, OUTPUT, que debía entregar el perceptrón ante estos estímulos, se utilizó la herramienta MATLAB©, en la que se implementó el script que puede observarse en el anexo 7.2. , según esto, dicho resultado debe ser 1.

La figura 3.19, muestra el resultado de la prueba, como puede observarse, la latencia del bloque PERCEPTRÓN es de 491 ciclos de reloj, y el resultado concuerda con lo que se espera a partir del script de MATLAB©.

Figura 3.19 Simulación bloque PERCEPTRÓN

3.2. Perceptrón multicapa.

Como se menciona al comienzo de este capítulo, se realizaron una serie de pruebas utilizando la herramienta WEKA, con las que se pretendía determinar el número apropiado de capas en el perceptrón multicapa y de Perceptrones en cada capa, los resultados de las mismas aparecen en la tabla 4.2., se determina que el perceptrón multicapa a implementarse en la biblioteca de VHDL que se desarrolla en el trabajo de grado tiene dos capas ocultas, la primera de 7 Perceptrones y la segunda de 8 Perceptrones.

Por lo que se implementa un bloque parametrizable denominado LAYER, en el cual es posible definir el número de entradas, 𝑁, que tendrá cada perceptrón capa y el número de Perceptrones, 𝑀, que se desean tener en la capa, este bloque requiere que se ingresen los pesos de las conexiones de cada perceptrón y como salida se entrega un arreglo de 𝑀 vectores de tipo std_logic_vector de 32.

(25)

24

Figura 3.20. Diagrama en bloques de la arquitectura del bloque LAYER.

La figura 3.20 muestra cómo se diseñó el bloque LAYER, a partir del cual se procede a diseñar el perceptrón multicapa. Como se establece que existen dos capas ocultas de tamaño predeterminado, y las entradas al perceptrón multicapa corresponden a la capa de entrada; el número de neuronas en el perceptrón multicapa estará dado por la ecuación 3.8. donde 𝑆 es el número de salidas que se desea tenga la red.

#𝑁𝑒𝑢𝑟𝑜𝑛𝑎𝑠𝑝𝑒𝑟𝑐𝑒𝑝𝑡𝑟ó𝑛 𝑚𝑢𝑙𝑡𝑖𝑐𝑎𝑝𝑎 = 15 + 𝑆 Ecuación 3.8.

Considerando esto, el Perceptrón multicapa que se implementa tiene una arquitectura como la que se muestra en la figura 3.21, donde los bloques LAYEH1 y LAYER H2, corresponden a las capas ocultas de 7 y 8 Perceptrones cada una, respectivamente. Mientras que el bloque LAYERO corresponde a la capa de salida, y tendrá tantos Perceptrones como salidas se dese para la red. El bloque LAYERH1, tendrá como entradas un arreglo de 𝑁 vectores de 32 bits, cada uo de ellos representa una de las entradas de la red neuronal. También tendrá como dato de salida4

Figura 3.21. Arquitectura del bloque MLP.

Es importante mencionar que, el perceptrón multicapa que se diseña para la implementación en la biblioteca VHDL que se desarrolla en el trabajo de grado, sólo permite, dada la arquitectura que se ve en la figura 3.20, un vector de 𝑁 entradas y un vector de 𝑀 salidas. Pues la manera en que se parametriza no admite ingresar matrices en la entrada o la salida

En la sub-sección 4.2.2. se pueden ver los resultados de simulaciones del comportamiento del perceptrón multicapa implementado a partir de la figura 3.21, utilizando información correspondiente al data-set del caso de estudio a tratarse.

4 Un dato de salida corresponde al resultado que un bloque entrega al terminar de realizar el cálculo u operación para el cual es implementado, a diferencia de las señales de bandera que simplemente informan que un dato está disponible, ha ocurrido un inconveniente en el procesamiento del dato o también que se ha cumplido una condición.

(26)

25

3.3. Algoritmo de Backpropagation.

Considerando el algoritmo que se observa en la figura 2.6, y el número de capas del perceptrón multicapa, se establece que es necesario para poder obtener los pesos nuevos calcular 3 errores y 3 Δs, estos pueden obtenerse a través de las ecuaciones 3.9. a 3.14., donde Y corresponde a la salida de la red, 𝐾𝑖 corresponde a la salida de la capa 𝑖, y 𝑓′(𝑥) a la derivada de la función sigmoide.

𝐸𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎3= 𝑌 − 𝐾3 Ecuación 3.9.

Δ𝐶𝑎𝑝𝑎3= 𝐸𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎3∙ 𝑓′(𝐾3) Ecuación 3.10.

𝐸𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎2= Δ𝐶𝑎𝑝𝑎3∙ 𝑃𝑒𝑠𝑜2 Ecuación 3.11.

Δ𝐶𝑎𝑝𝑎2= 𝐸𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎2∙ 𝑓′(𝐾3) Ecuación 3.12.

𝐸𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎_1= Δ𝐶𝑎𝑝𝑎2∙ 𝑃𝑒𝑠𝑜1 Ecuación 3.13.

Δ𝐶𝑎𝑝𝑎3= 𝐸𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎3∙ 𝑓′(𝐾3) Ecuación 3.14.

Los nuevos pesos de cada capa se calculas con las ecuaciones 3.15 a 3.17, donde 𝐻𝐸𝐶𝑎𝑝𝑎𝑖 corresponde al error oculto de la capa 𝑖, los cual pueden ser calculados con las ecuaciones 3.18 a 3.20,

𝑃2𝑁𝑢𝑒𝑣𝑜= 𝑃2+ 𝐻𝐸𝐶𝑎𝑝𝑎2 Ecuación 3.15.

𝑃1𝑁𝑢𝑒𝑣𝑜= 𝑃1+ 𝐻𝐸𝐶𝑎𝑝𝑎1 Ecuación 3.16.

𝑃0𝑁𝑢𝑒𝑣𝑜= 𝑃0+ 𝐻𝐸𝐶𝑎𝑝𝑎0[𝑁 − 1: 0, 6: 0] Ecuación 3.17.

𝐻𝐸𝐶𝑎𝑝𝑎2= 𝐾2 ∙ Δ𝐶𝑎𝑝𝑎3 Ecuación 3.18.

𝐻𝐸𝐶𝑎𝑝𝑎1= 𝐾1 ∙ Δ𝐶𝑎𝑝𝑎2 Ecuación 3.19.

𝐻𝐸𝐶𝑎𝑝𝑎0= 𝐾0 ∗ Δ𝐶𝑎𝑝𝑎1 Ecuación 3.20.

El procedimiento a seguir en cada una de las iteraciones de Backpropagation, será entonces el que se enuncia a continuación

1. Calcular 𝐸𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎3utilizando la ecuación 3.9.

2. Calcular Δ𝐶𝑎𝑝𝑎3utilizando la ecuación 3.10.

3. Calcular 𝐻𝐸𝐶𝑎𝑝𝑎2 utilizando la ecuación 3.18.

4. Calcular 𝑃2𝑁𝑢𝑒𝑣𝑜utilizando la ecuación 3.15.

5. Calcular 𝐸𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎2utilizando la ecuación 3.11.

6. Calcular Δ𝐶𝑎𝑝𝑎2utilizando la ecuación 3.12.

7. Calcular 𝐻𝐸𝐶𝑎𝑝𝑎1 utilizando la ecuación 3.19.

8. Calcular 𝑃1𝑁𝑢𝑒𝑣𝑜utilizando la ecuación 3.16.

9. Calcular 𝐸𝑟𝑟𝑜𝑟𝐶𝑎𝑝𝑎1utilizando la ecuación 3.13.

10. Calcular Δ𝐶𝑎𝑝𝑎1utilizando la ecuación 3.14.

11. Calcular 𝐻𝐸𝐶𝑎𝑝𝑎0 utilizando la ecuación 3.20.

12. Calcular 𝑃0𝑁𝑢𝑒𝑣𝑜utilizando la ecuación 3.17.

Para ello se requiere entonces implementar las ecuaciones 3.9 a 3.20, las sub-secciones 3.3.1 a 3.3.5. se encuentra una descripción de cómo se implementaron éstas.

3.3.1. Derivada de la función de activación sigmoide

Si se deriva la ecuación 3.3, para determinar la función a utilizarse para el algoritmo de Backpropagation se tiene la ecuación 3.21. que se ve a continuación, para la cual se diseña el diagrama en bloques de la figura 3.22.

(27)

26

𝑓(𝑧) = 𝑒−𝑥

(1 + 𝑒−𝑥)2 Ecuación 3.21.

Figura 3.22. Diagrama en bloques para el bloque DSIGMOIDE

El bloque DSIGMOIDE_CONTROL, que se utiliza para este bloque, se encarga de reiniciar, activar y monitorear a los bloques EXPONENTIALSP, MULTIPLIERSP1y2, addSP e INVERSORP, para este fin, se diseña la máquina de estados que puede verse en la figura 3.23. La tabla 3.4. muestra las acciones que se realizan en cada uno de los estados de ésta.

Figura 3.23. Máquina de estados del bloque para el bloque DSIGMOIDE.

Estados Acciones

S0

Reinicia los bloques EXPONENTIALSP, addSP, MULTIPLIERSP1y2, INVERSORSP.

No habilita ningún bloque.

La salida DATA_READY, está en bajo.

La salida TROUBLE, está en bajo.

S1

No reinicia ningún bloque.

Habilita sólo el bloque EXPONENTIALSP.

La salida DATA_READY, está en bajo.

La salida TROUBLE, está en bajo.

S2

No reinicia ningún bloque

No habilita ningún bloque.

La salida DATA_READY, está en alto.

La salida TROUBLE, está en alto.

S3

No reinicia ningún bloque.

Habilita el bloque addSP.

La salida DATA_READY, está en bajo.

La salida TROUBLE, está en bajo.

S4

No reinicia ningún bloque.

Habilita el bloque MULTIPLIERSP1.

La salida DATA_READY, está en bajo.

La salida TROUBLE, está en bajo.

(28)

27

S5

No reinicia ningún bloque.

Habilita el bloque INVERSORSP.

La salida DATA_READY, está en bajo.

La salida TROUBLE, está en bajo.

S6

No reinicia ningún bloque.

Habilita el bloque MULTIPLIERSP2.

La salida DATA_READY, está en bajo.

La salida TROUBLE, está en bajo.

S7

No reinicia ningún bloque.

No habilita ningún bloque.

La salida DATA_READY, está en alto.

La salida TROUBLE, está en bajo.

Tabla 3.4. Descripción de acciones para cada estado del bloque DSIGMOIDE.

Se realiza una prueba sobre el bloque DSIGMOIDE, para comprobar su comportamiento, para ésta se ingresa una entrada, DATAIN, de 5, considerando la ecuación 3.9, el resultado, DATAOUT, que se espera obtener es 0,006648056. La figura 3.24 muestra el resultado de la simulación de esta prueba, como puede observarse, el bloque DSIGMOIDE tiene una latencia de 70 ciclos de reloj y el resultado es el esperado, aunque ha redondeado la cifra para el 7 decimal.

Figura 3.24. Simulación del bloque DSIGMOIDE

3.3.2. Errores

Se diseña un bloque para cada uno de los errores a calcular, estos permiten realizar el cálculo de las ecuaciones 3.9, 3.11 y 3.13

3.3.2.1. Error Capa de salida

Para el cálculo del error de la capa de salida basta con realizar el cálculo de la diferencia entre el valor deseado de la salida y el valor de salida que entrega la red. El diagrama en bloques de la figura 3.23, muestra la conexión que se diseña para garantizar que el bloque ERROROUT, que cumple dicha función sea parametrizable para cualquier arreglo de 𝑁 salidas.

Figura 3.25. Diagrama en bloques del bloque EK3.

Se realiza una prueba para verificar el comportamiento del bloque, en ésta se ingresa un vector de entradas, YW, [2,1] que representa la salida deseada, y otro, YNN, [2.976,1.02], se espera que al operar se obtenga una salida, ERROR, de [-0.976,-0.02]. La figura 3.26. muestra la simulación resultante de esta prueba, como puede observarse, el bloque EK3, que calcula el error de la capa 3, tiene una latencia de 10 ciclos de reloj, correspondiente a la latencia del bloque addSP, y la salida, ERROR, corresponde con el valor deseado.

Referencias

Documento similar

Cedulario se inicia a mediados del siglo XVIL, por sus propias cédulas puede advertirse que no estaba totalmente conquistada la Nueva Gali- cia, ya que a fines del siglo xvn y en

Where possible, the EU IG and more specifically the data fields and associated business rules present in Chapter 2 –Data elements for the electronic submission of information

The 'On-boarding of users to Substance, Product, Organisation and Referentials (SPOR) data services' document must be considered the reference guidance, as this document includes the

In medicinal products containing more than one manufactured item (e.g., contraceptive having different strengths and fixed dose combination as part of the same medicinal

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

This section provides guidance with examples on encoding medicinal product packaging information, together with the relationship between Pack Size, Package Item (container)

Package Item (Container) Type : Vial (100000073563) Quantity Operator: equal to (100000000049) Package Item (Container) Quantity : 1 Material : Glass type I (200000003204)