Algoritmo de cálculo de autovalores y autovectores en
Xilinx System Generator.
Bravo I., Padilla D., Mazo M., Hernández A., Gardel A., Mateos R., Lázaro J.L. Departamento de Electrónica. Escuela Politécnica Superior, Univ. de Alcalá. Madrid, Spain,
[email protected]://www.depeca.uah.es
Abstract. El presente trabajo muestra el diseño de un algoritmo de cálculo de autovalores y autovectores orientado hacia hardware reconfigurable. En el diseño del algoritmo, se debe abordar tanto su verificación funcional como un estudio práctico de la precisión óptima para su implementación en el interior de una FPGA. Para la evaluación de la calidad del algoritmo, se evalúan tres aspectos: velocidad, mínimo error y consumo del menor número de recursos hardware. La herramienta ideal para realizar el diseño hardware objeto, es la librería de Matlab denominada Xilinx System Generator
1 Introducción
El cálculo de autovalores y autovectores está vinculado a una gran cantidad de algoritmos pertenecientes a múltiples disciplinas. En este caso, el presente algoritmo ha sido desarrollado orientado hacia el algoritmo PCA (Principal Component Analysis). Exactamente el cálculo de autovalores y más concretamente el de autovectores, es la parte principal de dicho algoritmo, ya que realizando el cálculo de los citados sobre la matriz de covarianza de varias imágenes, se consigue realizar una transformación espacial que facilita la extracción de características de varias imágenes.
Para comprender el algoritmo que se va a mostrar a continuación y sin necesidad de entrar en qué hace el algoritmo PCA, simplemente se ha de tener de referencia con respecto al algoritmo PCA, que la matriz sobre la que se va a realizar el proceso de obtención de los autovalores y autovectores, es una matriz real y simétrica. Esta condición de partida, que puede parecer poco probable en la realidad, es muy habitual en muchas matrices.
Otra premisa sobre la que se va a basar este algoritmo, es el tamaño de las matrices sobre las que se va a trabajar. Dicho tamaño será relativamente bajo, ya que las matrices con las que se trabajará en PCA son pequeñas, estableciendo siempre la matriz de trabajo de tipo cuadrada (mismo número de filas que de columnas) y teniendo un orden máximo de 10 filas por 10 columnas. El trabajar con matrices mayores, no tiene mucho sentido en esta aplicación concreta, pero en el caso de necesitarlo la extensión hacia un tamaño mayor es muy cómoda.
Desde el punto de vista de la información que aportan los autovectores y autovalores, cabe decir que ambos aportan determinadas propiedades invariantes ante transformaciones lineales que preservan la información existente en la matriz. Los valores propios (autovalores) son las medidas básicas de tamaño de una matriz que no se ven alteradas si se hace un cambio de coordenadas. Se puede demostrar, que las medidas globales de tamaño
de una matriz, como la traza o el determinante, son sólo función de los valores propios y en consecuencia también serán invariantes ante transformaciones. Por su parte, los vectores propios (autovectores) representan las direcciones características de la matriz y no son variantes.
2 Cálculo de autovalores y autovectores.
Para el cálculo de los autovectores ( vr ) hace falta saber los autovalores. Si éstos son conocidos entonces en una matriz cuadrada A se cumple:
i i i v v A⋅r =λ ⋅r
Ecuación 1. Obtención de los autovalores.
donde λi es un escalar que se denomina autovalor o valor propio de la matriz A.
Si lo que se desea calcular son los autovalores, éstos se obtienen a partir de la ecuación característica (ver Ecuación 2). Ésta es una ecuación polinómica en λi de orden n y sus n raíces se denominan valores propios de una matriz.
(
)
0 0 = ⋅ − = ⋅ ⋅ − I A v I A λ λ rEcuación 2. Ecuación característica de una matriz.
Por lo tanto se comenzará con el cálculo de autovalores, ya que para la obtención de los autovectores es necesario conocer previamente los autovalores. Parece inmediato que para la obtención de los autovalores, sin tener en cuenta dónde se van a calcular éstos, bastaría con la resolución de la Ecuación 2. Si el medio dónde se obtendrá la solución de esta ecuación, es un sistema tipo PC, microprocesador, DSP, etc. es inmediato la codificación del algoritmo secuencial de resolución la citada ecuación. Sin embargo si se desea implementar dicha ecuación en hardware puede suponerse que ello no es inmediato, ya que resolver una sencilla ecuación de primer grado como es la Ecuación 2, conlleva el desarrollo de un hardware muy complejo donde seguramente si se cambia el tamaño de A, el desarrollo anterior no valdrá. Por ello se descartará esta alternativa para poder solventar el cálculo de autovalores en hardware.
La mayoría de las alternativas para la obtención de valores propios, una vez descartada la ecuación característica, tienden hacia soluciones recurrentes, donde a partir de la matriz original (A) se le aplican una serie de transformaciones recurrentes, normalmente de tipo rotacional, hasta conseguir diagonalizar la matriz A. Una vez diagonalizada, en la diagonal se obtendrán los valores propios.
Uno de los métodos más extendidos es el de Jacobi [1]. Así siendo A una matriz de nxn elementos, y siendo esta matriz sobre la que se desea calcular sus autovalores, el método de Jacobi se basa en la ejecución de k iteraciones, en donde el valor de la matriz A en la iteración k+1, depende del valor anterior así como de los valores anteriores de la matriz Q y su transpuesta según muestra la Ecuación 3. El valor de la matriz Q en cada iteración depende de los elementos de A en esa iteración.
⋅ = + K K T K k Q A Q A 1
Ecuación 3. Diagonalización de una matriz de nxn elementos.
donde Q es la matriz de rotación. El ángulo de rotación para la matriz Q se elegirá de tal forma que se eliminen los elementos de AK no pertenecientes a la diagonal, es decir se elegirá de tal manera que se al multiplicar A por esta matriz, se anulen los elementos no pertenecientes a la diagonal.
A la hora de implementar este algoritmo en hardware, los trabajos desarrollados por [2] y [3] plantean el uso de una arquitectura sitólica donde en base a una serie de elementos de procesado (procesadores) se consigue diagonlizar una matriz de entrada. Para ello se debe implementar una arquitectura cuadrada de n/2 x n/2 procesadores, siendo n el tamaño de la matriz, donde cada procesador manejará únicamente matrices de 2x2. Concretamente cada procesador deberá realizar una serie de multiplicaciones sobre su matriz de entrada de 2x2 (ver Ecuación 4). Una vez realizada esas multiplicaciones se propagan los datos entre los procesadores vecinos durante un número de iteraciones proporcional al tamaño de la matriz, hasta conseguir diagonalizar la matriz original.
= ⋅ ⋅ i h g f cos(j) sin(j) -sin(j) cos(j) d c b a cos(i) sin(i) sin(i) - cos(i)
Ecuación 4. Operación a ejecutar por cada procesador.
En la Figura 1 se observa la arquitectura propuesta por [2] para conseguir diagonalizar una matriz de entrada de 8x8 elementos. En dicha figura no todos los procesadores son iguales sino que se hace una distinción entre procesadores pertenecientes a la diagonal y procesadores fuera de la diagonal. Ambos deben de ejecutar en su interior la Ecuación 4, pero además los procesadores asociados a la diagonal se encargarán de calcular los ángulos i,j de la citada ecuación. Dichos ángulos vienen descritos en [2] y son ángulos obtenidos a partir de los elementos de la matriz 2x2 que tiene cada procesador de la diagonal. Como los elementos van variando en sucesivas iteraciones, se obtendrá ángulos distintos en cada iteración.
Para el cálculo de los autovectores, a partir de los diferentes ángulos que se han ido calculando para los autovalores, mediante un conjunto de otros procesadores se consiguen los autovectores asociados a los diferentes autovalores.
El sistema que computa los autovectores puede ser ejecutado simultáneamente a la diagonalización (cálculo de autovalores) de la matriz original. Cada procesador necesita cuatro datos adicionales
dv cv bv av
los cuales también habrá que ir rotando. Por ello, en la arquitectura propuesta, se añadirá un módulo en cada procesador encargado de realizar la gestión de los autovectores.
La diferencia con los valores propios es que aquí solamente se necesita una rotación y el ángulo de rotación es el creado por los procesadores de autovalores. El ángulo a rotar es el del procesador de diagonal asociado de la columna únicamente.
⋅ = ) cos( ) sin( -) sin( ) cos( ' ' ' ' j j j j dv cv bv av dv cv bv av
Ecuación 5. Cálculo de autovectores.
La matriz inicial para los autovectores, es la matriz identidad. Se deberá crear una matriz identidad del mismo tamaño que la inicial. Cada procesador, la parte correspondiente a los autovectores deberá también realizar una reordenación de elementos y realizar una transmisión entre los procesadores vecinos.
P
11P
12P
13P
21P
22P
23P
14P
24P
31P
32P
33P
34P
31P
32P
33P
34Figura 1. Arquitectura de trasiego de información en diagonal para una matriz inicial de 8x8.
3 Arquitectura propuesta.
Cavallaro [4] propone como alternativa hardware para poder realizar el cálculo de autovalores y autovectores de [2] y [3] el empleo de algoritmos CORDIC [5] como base para poder realizar las multiplicaciones trigonométricas expuestas en la Ecuación 4 y Ecuación 5. De esta manera la multiplicación hardware que es una de las operaciones más complejas queda solventada.
Figura 2. Arquitectura procesador diagonal
Así en la Figura 1 se diferencian los módulos pertenecientes a la diagonal y los no pertenecientes. En la Figura 2 y la Figura 3 se observan los diagramas hardware a implementar.
Figura 3. Arquitectura Módulo CORDIC modo rotación.
El principal problema a la hora de implementar en hardware el algoritmo propuesto es la precisión a utilizar. Por ello se ha pensado en el empleo de Xilinx System Generador (XSG) como herramienta de validación y modelado de la precisión en coma fija a utilizar. Los resultados de las simulaciones en coma fija, serán a su vez comparados con el resultado de realizar las operaciones en precisión double en coma flotante, mediante la facilidad Override with Doubles que se controlará desde el System Generator block.
Cada sistema y subsistema del algoritmo diseñado en XSG se simulará con 3 precisiones en coma fija diferentes además de la simulación adicional con la opción Override with Doubles activa: • 20/11 Î NBits=20 y BPoint=11 • 15/6 Î NBits=15 y BPoint=6 • 50/32 Î NBits=50 y BPoint=32 θSUM
Σ
÷ 2Σ
÷ 2 2θr 2θl θr θl a b d c CORDIC (Modo Rotación) a’=λ1 c’ CORDIC (Modo Vector) a b d c Σ b+c Σ d-a CORDIC (Modo Vector) a b d c Σ c-b Σ d+a θDIF d’ =λ2 b’ a b d c CORDIC (Modo Rotación) CORDIC (Modo Rotación) x1 y1 x2 y2 CORDIC (Modo Rotación) CORDIC (Modo Rotación) θLEFT θLEFT θRIGHT θRIGHT x3 y3 y4 x4 λ1 λ24 Cálculo de autovectores y autovalores.
Una vez explicada la estructura del diseño, en la Figura 4 se observa la estructura diseñada en XSG para la obtención de los autovalores y autovectores de una matriz de 6x6. En dicha figura, en su estructura interior el núcleo fundamental son módulos CORDIC (tanto en modo rotación como en modo vectorización) [6] que se han diseñado con XSG sin hacer uso del módulo IP CORDIC que ofrece Xilinx ISE, ya que no ofrece muchas prestaciones a la hora de manejar dicho módulo. La Figura 5 muestra un módulo de rotación en base a CORDIC.
En base a estas estructuras se han realizado múltiples ensayos con diferentes matrices de entrada, tanto desde el punto de vista de valores como de tamaño, así como con diferentes precisiones. En la Tabla 1 se puede ver un resumen de ellas. A la vista de los resultados obtenidos se puede deducir, que a la hora de implementar en un sistema real el algoritmo propuesto, la alternativa de usar dato de tamaño 32 bits en precisión puede proporcionar resultados muy buenos.
Esta herramienta ha permitido la implementación hardware del diseño con una aritmética en coma fija 32/15, obteniendo un índice de error bastante pequeño.
5 Conclusiones
Analizando los resultados de la tabla y el consumo de recursos de la FPGA, se sacan las siguientes conclusiones:
• El sistema se ajusta a lo esperado que se consiguen los resultados esperados: los autovalores son prácticamente iguales en la función svd de Matlab y con una precisión 20/11 con OwD en XSG, el error es pequeño.
• De las 3 simulaciones de los modelos XSG con precisión en coma fija, el que mejor resultados tiene es el de precisión 50/32, y posteriormente el 20/11. Los autovalores obtenidos con precisión 15/6 tienen bastante error. Por otro lado, se descarta el uso de 50/32 porque el consumo hardware es muy alto.
• Independientemente de la precisión, el número de ciclos mínimo del sistema es de 13x11 ciclos de reloj.
• La precisión seleccionada como óptima en un futuro es 20/11, dado que es la que mejor equilibrio presenta entre consumo hardware y error en los resultados. Como en todas las arquitecturas de Brent anteriores, se observa tras lanzar una batería de simulaciones y analizar los resultados, que los coeficientes de fuera de la diagonal se quedan siempre cerca del valor nulo, pero no llegan a anularse totalmente: los CORDIC pierden calidad con valores bajos (menor de la unidad).
Figura 4. Arquitectura hardware de Brent para el cálculo autovalores matriz 2x2: Sistema2x2_AuVals_1.mdl. Segundo nivel jerárquico
Tabla 1. Evaluación de resultados obtenidos para una matriz de 6x6. Fichero fuente iter Nº n Evaluació
Svds Ideal
Jacobi_hw6x6.m 32 Ideal
(precisión 15/6) 8 Malo
(precisión 20/11) 8 Bueno
(precisión 50/32) 8 Bueno Muy
Figura 5. CORDIC rotacional 8 iteraciones. Segundo nivel jerárquico.
6 Agradecimientos.
Este trabajo ha sido posible gracias a la Cátedra de control electrónico en transportes patrocinado por LOGYTEL y RENFE y al proyecto “Sistema de localización y posicionamiento absoluto de robots. Desarrollo de un espacio inteligente” del Ministerio de Ciencia y Tecnología (ref:DPI2003-05067).
7 Referencias.
[1] J.H. Wilkinson. “The algebraic eigenvalue problem”. Oxford Science Publications. 1999. ISBN: 0198534183.
[2] Richard P. Brent and Franklin Luk. “The solution of singular-value and symmetric eigenvalue problems on multiprocessor arrays”. SIAM Journal. Vol 6, no.1, January 1985. Pp 69-84.
[3] Richard P. Brent, Franklin Luk and Charles Van Loan “Computation of the singular value decomposition using mesh-connected processors”. Journal of VLSI and Computer Systems, volume 1, number 3. pp 242-270.
[4] Joseph R. Cavallaro and Franklin Luk. “CORDIC Arithmetic for an SVD processor”. Journal of Parallel and Distributed Computing 5, 271-290. 1988.
[5] Joseph R. Cavallaro and Franklin Luk. “Architectures for a CORDIC SVD processor”. Proceedings SPIE Real time Signal Processing IX, vol. 698, pp 45-53 271-290. 1986.
[6] Ray Andraka. A survey of CORDIC algorithms for FPGA based computers.. Proceedings of FPGA 1998.