IMPLEMENTACION DE UN SISTEMA INMUNE ARTIFICIAL SOBRE UN FPGA J. Sepúlveda+, C. Camargo* + Estudiante Ingeniería Electrónica * Profesor Departamento de Ingeniería Eléctrica & Electrónica Universidad Nacional de Colombia, Bogotá {marthase, ccamargo}@gmun.unal.edu.co ABSTRACT The artificial immune system (AIS) is an adaptative system, inspired in the immune system theory and the observation of its principles and models. In this article the implementation of these principles in the solution of a pattern’s recognition problem is shown. RESUMEN El Sistema Inmune Artificial o SIA es un sistema adaptativo, inspirado en la teoría del Sistema Inmune y en la observación de sus principios y modelos. En este artículo se muestra la implementación de éstos principios en la solución de un problema de reconocimiento de patrones empleando un FPGA. IMPLEMENTACION DE UN SISTEMA INMUNE ARTIFICIAL SOBRE UN FPGA J. Sepúlveda+, C. Camargo* + Estudiante Ingeniería Electrónica * Profesor Departamento de Ingeniería Eléctrica & Electrónica Universidad Nacional de Colombia, Bogotá {marthase, ccamargo}@gmun.unal.edu.co RESUMEN El Sistema Inmune Artificial o SIA es un sistema adaptativo, inspirado en la teoría del Sistema Inmune y en la observación de sus principios y modelos. En este artículo se muestra la implementación de éstos principios en la solución de un problema de reconocimiento de patrones. 1. INTRODUCCIÓN Los animales superiores son atacados por microorganismos y partículas extrañas, denominados antígenos. Para protegerse de estos individuos, el organismo posee sistemas defensivos conformados por una serie de mecanismos que no solo reconocen y diferencian su entorno sino que pueden almacenar información. Este conjunto de mecanismos encargados de tal función se denomina Sistema Inmune. Los SIAs constituyen una metáfora del Sistema inmune. Resulta de interés su estudio debido a que desde el punto de vista biológico y computacional, la presencia de un dispositivo adaptativo con memoria es de gran importancia. El Sistema Inmune es capaz de extraer información y disponer de ella para futuras infecciones por el mismo agente. El artículo se divide en cuatro secciones. La primera sección describe los principios del Sistema Inmune. En la segunda sección se muestra al Sistema Inmune como un paradigma computacional. En la tercera sección se examinan las características de la implementación de un SIA, en la cuarta y quinta sección se describe el problema resuelto y la solución empleando un SIA implemenentado en un FPGA. Por último se generan las conclusiones. 2. SISTEMA INMUNE El sistema inmune es una red de células y órganos que tratan de proteger al medio interno de un individuo de agresiones externas, principalmente infecciosas y de agresiones internas principalmente de células transformadas en malignas [1]. El sistema inmune está sometido a una regulación muy estricta, cuando se produce una falla en este control se torna insuficiente y se producen múltiples enfermedades. La eficacia dinámica con que funciona el sistema inmune es lo que le permite el éxito de su accionar y lo que le permite su especificidad para diferenciar entre lo ajeno y lo propio del organismo. El Sistema Inmune consta dos "líneas de defensa" principales que interactúan estrechamente en toda respuesta inmune: Inmunidad innata (fagocitos) y la Inmunidad adquirida (Anticuerpos) moléculas que funcionan como "adaptadores flexibles" que suministran una respuesta específica frente a cada agente infeccioso. Posee memoria inmunológica específica, que tiende a evitar que el agente infeccioso provoque enfermedad en una segunda infección. 2.1. Composición El sistema inmune está compuesto por órganos, células y moléculas afines. Los órganos se dividen en centrales (órganos de la etapa embrionaria, timo y médula ósea) y periféricos (ganglios, bazo y tejido linfoide)[2]. Las células del sistema inmune están representadas fundamentalmente por los linfocitos B, T, las células fagocíticas (“devoradoras” de otras células) de diferentes extirpes, las células presentadoras de antígeno, las células Natural killer (leucocitos granulares), y el resto de los leucocitos basófilos, eosinófilos y neutrófilos[2]. Linfocitos B: Maduran en la médula ósea y reconocen el antígeno a través de receptores de membrana. Cada linfocito B que se diferencia en la médula ósea está programado genéticamente para sintetizar un solo tipo de anticuerpo, a la espera de contactar con el Antígeno específico. Cuando una de ellas reconoce un antígeno experimenta un proceso de activación con expansión clonal (se copia rápidamente). Unas copias se encargan de secretar anticuerpos y otras constituyen una memoria, debido a su prolongado tiempo de vida [3]. Linfocito T: Madura en el timo, en donde adquiere un receptor único y específico en su membrana que se encarga de reconocer fragmentos del antígeno degradados y procesados. Una célula T no es específica de un antígeno X, sino de un antígeno X unido a una célula presentadora. Células presentadoras de antígeno: Son auxiliares del sistema inmunológico, no participan en el reconocimiento del antígeno pero sin ellas los linfocitos T y B no pueden ejercer su función. Estas células fagocitan (digieren) el antígeno, lo degradan y luego lo presentan en la membrana citoplasmática para que pueda ser reconocido por los linfocitos T [2]. Anticuerpos: Los linfocitos B secretan anticuerpos que se unen con el antígeno con el fin de neutralizarlo. 2.2 Funcionamiento Los anticuerpos son producidos por los linfocitos B. En ausencia de estímulo antigénico, los linfocitos B maduros vírgenes mueren por apoptosis (suicidio celular)[3]. Sin embargo si sus receptores perciben un antígeno complementario y específico, se pone en marcha la selección y proliferación clonal (activación y copia de un linfocito B), que termina (al cabo de 4-5 días). La unión entre el antígeno (Ag) y el anticuerpo (Ac) específico provoca: • La lisis (ingestión) del microorganismo invasor. • Recubrimiento de los fagocitos con complejos Ag-Ac, lo cual facilita la fagocitosis (digestión). • Neutralización de ciertas toxinas y virus por la simple unión Ag-Ac. Son los Antígenos los que seleccionan el Anticuerpo específico que les hará frente. Sin embargo, cada tipo de Anticuerpo está preformado antes de entrar en contacto por vez primera con el Antígeno [2]. 3. SIA COMO PARADIGMA COMPUTACIONAL Desde el punto de vista biológico y computacional, la presencia de un dispositivo adaptativo con memoria es de gran importancia. El Sistema Inmune es capaz de extraer información y disponer de ella para futuras infecciones por el mismo agente. Cuando se diseñan algoritmos inspirados en algún sistema biológico se debe crear una representación para los diferentes componentes del sistema, un conjunto de mecanismos que evalúen el desempeño de los diferentes organismos y procesos de adaptación que gobiernen y mantengan la dinámica del sistema. En el caso de los SIAs (Sistemas Inmunes Artificiales), se debe decidir que características de los Sistemas Inmunes biológicos se desean explotar, de tal forma que se desarrollan las analogías (Timo, clonación selectiva, red inmune). Una vez codificado el problema en forma de individuos se crea una población inicial de anticuerpos. Para evaluar las interacciones del grupo de individuos, se deben diseñar una serie de criterios basados en el espacio en el cual se desarrolla la población. Estas interacciones se pueden medir en términos de distancia entre un individuo ( Función XOR) y su objetivo . A los individuos que presentan una mayor afinidad, se les suele clonar. Es decir, los más aptos pueden seguir a la siguiente población. Una vez se ha encontrado un individuo exitoso, se guarda como una memoria temporal, si después de algún tiempo no ha sido utilizado, desaparece [1]. También se pueden mutar los individuos, hasta que la condición deseada se cumpla. Es deseable aplicar la propiedad en la cual el sistema es capaz de reconocerse a sí mismo, para evitar su autodestrucción. El Sistema Inmune emplea un procesamiento de información de alto nivel [1]. Desde el punto de vista computacional, existen varias características interesantes como el reconocimiento de patrones, la unicidad (cada individuo posee un SI único), su diversidad, su autonomía (no existe un control central), la detección de anomalías, cambio dinámico (adaptación), tolerancia al ruido (no necesita un reconocimiento completo para actuar), resistencia, robustez e integración con otros sistemas. Con las características presentadas anteriormente, es obvio esperar que las herramientas computacionales basadas en los Sistemas Inmunes tengan un alto desempeño, además se pueden emplear en diversas áreas, como reconocimiento de patrones, detección de errores, análisis de datos, aprendizaje de máquinas, optimización y en sistemas de navegación de robots. 4. IMPLEMENTACION DE UN SIA Debido a las características descritas anteriormente, resulta muy atractiva la idea de implementar este modelo electrónicamente, ya que el Sistema inmune artificial puede ser aplicado para solucionar muchos problemas. Para diseñar el SIA electrónico es necesario representar el valor de las variables de entrada (Antígenos presentados al sistema inmune) en forma digital, asignándoles un valor binario (cadena de longitud L). Este debe incluir por lo menos un ‘0’ lógico para indicar que se trata de un antígeno, pues cuando se presenta el anticuerpo que va atacar esa condición, se evalúa su desempeño, por medio de la afinidad entre ambos patrones (es decir si son complementarios). Una cadena de unos expresa el reconocimiento perfecto de un antígeno por parte de un anticuerpo, por tal motivo carece de sentido expresar un antígeno como una cadena de unos. Para implementar el SIA, se pueden emplear dos clases de algoritmos: El de Selección Negativa y el de Selección clonal. En el primero se crean linfocitos (cadenas binarias) con el fin de que no reconozcan los patrones (tal como se realiza en el Timo), mientras que la Selección clonal se encarga de evolucionar un repertorio de anticuerpos capaces de reconocer el patrón del antígeno. Se pueden emplear los linfocitos B, los cuales serían cadenas de bits, que son estimulados proporcionalmente a su afinidad con el antígeno, la cual puede ser calculada empleando la operación lógica OR exclusiva (la cual da como resultado un nivel lógico alto cuando una entrada es el complemento de la otra), ya que esta calcula la distancia a un punto si se trabaja en un espacio Hamming[1]. Este proceso se muestra en la figura 1. El antígeno (cadena de bits de entrada) selecciona al patrón correcto (el cual corresponde a su complemento). Se dice que un anticuerpo identificó al antígeno cuando el resultado de la comparación empleando la función XOR es una cadena de unos. La forma de estimulación a los linfocitos B es mediante su clonación (note que no se emplea crossover). Estos clones sufren mutaciones (con lo cual se puede expresar el proceso de adaptación del sistema inmune) las cuales pasarán a hacer parte del repertorio actual. Este proceso recibe el nombre de: Maduración de la afinidad de la respuesta inmune. Una vez se ha encontrado un individuo que es satisfactorio (empleando la comparación XOR el resultado es una cadena de unos), la cadena que produjo este resultado (linfocito B) es almacenado durante cierto periodo, en el cual debe ser empleado para no desaparecer. 5. RECONOCIMIENTO DE PATRONES Para aplicar los principios del Sistema Inmune, se propone realizar un dispositivo capaz de identificar los números del 0 al 9. Figura 1. Sistema inmune artificial digital Al interior del sistema inmune artificial, se cuenta con un repertorio limitado de anticuerpos (descritos como una cadena binaria de longitud L) los cuales van a ser encargados de reconocer los patrones de entrada presentados (ver figura 1). Los números serán introducidos por el usuario por medio de un programa en el cual se presenta una matriz de siete filas y cinco columnas (ver figura 2). Cada posición de ésta matriz representa un bit con el cual se va a codificar el patrón, si la posición se encuentra activa (ha sido seleccionado por el usuario), esta posición representa un uno lógico. De ésta forma se pede codificar el patrón en una cadena de 35 bits. En la matriz se dibujarán diferentes patrones corruptos y el sistema Inmune artificial será capaz de procesar e identificar el número que se escribió. inicio Cargue Patrón Entrada (Ag) Compare con Patrones Calcule Afinidad Guarde Patrón exitoso Figura 2. Número introducido al SIA y patrón reconocido por el SIA. SI Comparación Perfecta ? NO Transmita Patrón exitoso Organizar por Afinidad fin En la figura 2 se muestra un número introducido por el usuario y el número identificado por el SIA. Clonar los mejores Mutar clones 6. IMPLEMENTACIÓN DE CHIP ADN CON FPGAS Figura 4. Diagrama de Flujo de la implementación del Sistema Inmune Artificial (SIA) con el FPGA. Figura 3 Esquema General de la implementación del Sistema Inmune Artificial. En la figura 3 se muestra la arquitectura de la implementación. La cual está conformada por un computador que se encarga de generar la cadena de 35 bits (corresponde a la codificación de la matriz de entrada) y transmitirlos de forma serial a la tarjeta del FPGA. La FPGA contiene el Sistema Inmune Artificial que se encargará de: • Procesar los datos enviados • Transmitir serialmente el patrón identificado hacia el computador. En la figura 4 y 5 muestran el diagrama de flujo y el diagrama de bloques empleado para la implementación del sistema inmune artificial. En general el sistema Figura 5. Diagrama de bloques general empleado para implementar el algoritmo de la figura 4 consta de cuatro partes. La primera realiza la comparación entre el patrón de entrada (antígeno) y los patrones de referencia del sistema (anticuerpos). Si la comparación es perfecta, el resultado es transmitido. De otra forma se emplea el resultado del bloque como medida de afinidad de los patrones internos. Esta medida es clasificada por medio del bloque que organiza estos valores en forma descendente. El último bloque se encarga de generar nuevos patrones de referencia mediante la clonación y mutación de los mejores patrones para que estos sean evaluados de nuevo. En la figura 6 se muestra el diagrama de bloques de la implementación final del sistema de reconocimiento de patrones. Los datos que son enviados por el computador (que corresponden a la codificación del número dibujado por el usuario) son recibidos por la UART (Universal Asynchronous Receiver & Transmitter). Cada vez que recibe una trama, se activa la bandera DATA_READY la cual hace que el control active la lectura del dato (READ_DATA en alto) y carga en el registro la información de la trama hasta completar 35 bits correspondientes a la codificación de la matriz del número dibujado. ambos patrones son iguales, el proceso se detiene y se transmite el patrón de referencia correcto. De otra forma el valor arrojado por este bloque pasa al módulo SORT, el cual organiza los patrones según su afinidad. Si no existe un patrón idéntico se seleccionan los tres patrones con mayor número de coincidencias y se realiza un proceso de MUTACIÓN sobre ellos. Una vez obtenidos los nuevos patrones auxiliares, estos se cargan en los registros de entrada y se repite el proceso hasta que se encuentra un patrón que sea muy similar a la matriz de entrada, en cuyo caso se transmitirá el patrón de referencia del cual provenía el nuevo patrón mutado (subpatrón), el cual además es almacenado para posteriores comparaciones. Cuando se obtiene el resultado, el control se encarga de manipular la UART para que transmita el resultado hacia el ordenador. 6.1 Bloque UART Este bloque se encarga de recibir de forma serial los datos que corresponden a la matriz dibujada por el usuario y que provienen del computador, así como de transmitir el patrón encontrado por e Sistema Inmune Artificial. Los datos transmitidos y recibidos están empaquetados en tramas constituidas por un bit de Start (cero lógico ), los siete bits que constituyen los datos recibidos o transmitidos y el bit de stop. La velocidad de transmisión empleada fue de 34.800 baudios [4]. Figura 6. Diagrama de bloques del Sistema inmune artificial. Una vez recibido el carácter definido por el usuario, se compara (operación XOR lógica) con los patrones establecidos de los diez dígitos, (0 al 9) almacenados en sendos registros internos, la salida de dicha comparación es un vector de 35 bits en la que un ‘1’ en una determinada posición, indica que el patrón almacenado y el definido por el usuario son iguales en esa posición. En este momento es necesario determinar cuál de los patrones almacenados se acerca más al patrón definido por el usuario. Esto se logra con el módulo CONT_UNOS, el cual contabiliza el número de unos del vactor resultante de la comparación. Si se encuentra que Este módulo se encarga de recibir cada una de las cinco columnas que conforman la matriz de entrada y transmitir el patrón resultado del procesamiento de la información del SIA. 6.2 COMPARA Este módulo se encarga de almacenar un patrón de referencia (patrón del 0 al 9) y de realizar la comparación entre éste y el valor de la matriz de entrada mediante la operación lógica OR exclusiva (la cual da como resultado un nivel lógico alto cuando las entradas son complementarias). Este módulo se activa (START en alto) cuando existe algún dato cargado en el registro ALMACENA, que corresponde a la información suministrada por el usuario. 6.3 Bloque CONT_UNOS Este bloque se encarga de contar el número de unos presentes en una cadena de bits (resultado de la comparación llevada a cabo en el bloque COMPARA). Estos unos indican los lugares en los cuales difieren la matriz de entrada y un patrón de referencia. Por tal motivo se dice que este módulo cuantifica la afinidad de un patrón con respecto a la entrada. El diagrama de flujo de la implementación del bloque CONT_UNOS es: Figura 8. Diagrama de bloques del CONT_ONES 6.4 Bloque SORT INICIO ONES + 1 LSB='1'? ONES + 1 A= A / 2 A= 0? Figura 9 Bloque Sort FIN Figura 7. Diagrama de Flujo de la implementación del CONT_ONES. Una vez cargado el dato, este bloque se encarga de realizar corrimientos sucesivos de un bit hacia la derecha. En cada oportunidad se evalúa el valor del bit menos significativo de la cadena. Si éste es uno, se incrementa en uno un contador. Cuando la cadena a la que se le realizan los corrimientos se hace igual a cero, el proceso termina y se activa la señal DONE. La salida NUM_ONES (6 bits) indica cuantos unos tenía el DATA_IN de 35 bits. Este bloque se encarga de organizar el valor de las afinidades (cadena de seis bits) de los diferentes patrones de referencia. Según la señal de entrada DIR, la organización se puede realizar de forma ascendente (DIR tiene un nivel lógico bajo) o descendente (DIR tiene un nivel lógico alto). Cuando existe un dato a la entrada de este bloque, se debe inicializar el módulo colocando INIT en alto para que el conteo tenga lugar. El diagrama de bloques que implementa el algoritmo mostrado en figura 7 se muestra en la figura 8. Figura 10. Proceso de clasificación par e impar 6.5 Bloque MUTA Para realizar este bloque se empleo el proceso de clasificación par e impar (ver figura 10). Estos se encargan de comparar entre dos datos adyacentes. Con la señal DIR en alto, si el primer dato es menor que el segundo, el orden de los datos se invierte, de otra forma los datos permanecen iguales. La diferencia entre los algoritmos de clasificación par e impar es el comienzo de la comparación. Este bloque selecciona los patrones que obtuvieron las tres afinidades más altas. El diagrama de flujo correspondiente se muestra en la figura 12. INICIO n = 1, i = 4 Una vez cargadas los datos al módulo Sort, se inicializa el módulo por medio de RST, se coloca la señal DIR en alto y se activa la señal READY. CARGUE DATO (n) COPIE (i - n) VECES Después de suficientes iteraciones (dependiendo de la secuencia de entrada) todos los números son organizados. n= n +1 RND (BIT) BIT (muta)= Bit Anterior ? SI NO TRANSMITA n=3? NO SI FIN Figura 11. Diagrama de Bloques del módulo SORT El diagrama de bloques que implementa el algoritmo de ordenamiento se muestra en la figura 11. La entrada del bloque SORT se carga en el multiplexor junto con las salidas organizadas de la iteración anterior. Este se encarga de seleccionar entre la señal de entrada y la realimentada mediante las señales READY y VER. Cuando se multiplexa por primera vez, se selecciona los datos de entrada, pero cuando ya se ha realizado alguna iteración, los datos seleccionados son aquellos que ya han sufrido un proceso de organización. En los bloques de EVEN y ODD se realiza una clasificación par seguida de una impar, luego de las cuales se prueba (en el bloque DONE) la serie de datos obtenida para determinar si los datos se encuentran correctamente organizados. Cuando esto sucede, la señal VER se activa, lo cual hace que el demultiplexor coloque los datos organizados a la salida del módulo. Figura 12. Diagrama de Flujo de la implementación del bloque MUTA. Al patrón de mayor afinidad lo clona tres veces y realiza un cambio aleatorio (mutación en la cadena patrón) en tan sólo uno de los 35 bits que conforman al patrón. Al segundo mejor, lo copia dos veces y realiza dos mutaciones y al tercero lo copia solo una vez y lo muta en tres oportunidades. El diagrama de bloques de la implementación se muestra en la figura 13. El bloque SELECTOR escoge los tres mejores patrones mediante las señales provenientes del clasificador (Bloque SORT). El bloque RANDOM genera números pseudoaleatorios mediante una combinación lógica de una señal de entrada. Cada bloque se inicializa de forma diferente. El número generado se encuentra entre 0 y 34, que corresponde al bit que cambiará de valor. 6.6 Control General Este bloque se encarga de implementar el algoritmo general presentado en la figura 4, controla los procesos de transmisión y recepción desde y hacia el SIA de datos, clasificación y mutación. La Figura 15 muestra el diagrama de la máquina de estados diseñada para implementar el control. !DATA_READY RESET RESET LD_ACUM= 0 START= 0 MODO= 0 MUTA_ON= 0 RST_SORT= 0 TX TX= 1 DATA_READY MODO_MUTA LOAD MODO= 1 LD_ACUM= 1 READ_DATA=1 CARGA COMPARA LD_PATRON= 1 START_COMP= 1 SORT RST= 0 READY= 1 Figura 13. Diagrama de Bloques del módulo MUTA CONTEO SORTINI El REGISTRO MUTADOR, se encarga de realizar la mutación en la posición que indica el generador de números pseudoaleatorio para generar los nuevos patrones. El CONTROL se encarga de generar los pulsos de reloj necesarios para activar los generadores pseudoaleatorios, de tal forma que se produzcan el número de mutaciones apropiadas. La Figura 14 muestra el diagrama de la máquina de estados diseñada para implementar el control. !MUTA RESET RESET LD= 0 CLK1= 0 CLK2= 0 GEN_CLK1 CLK1= 1 CLK2= 1 CLK3= 1 GEN_CLK3 CLK3= 1 DOWN1 DOWN2 GEN_CLK2 Figura 15. Máquina de estado empleada para el bloque CONTROL. Una vez se activa el reset global del sistema, el control inicializa los demás bloques asignando a las señales de la UART (RST, READ_DATA y START) un nivel lógico bajo. El control se encarga de inicializar los demás bloques. Note que si no se realizara la interfaz entre el computador y la FPGA, éste control no sería necesario, cumpliendo así con los principios del Sistema inmune (carencia de control central). 7. CONCLUSIONES LD= 1 EN= 1 CLK3= 0 CLK2= 0 CLK3= 0 !PERFECT MUTA LOAD SAL PERFECT INIT= 1 RST_SORT= 1 DIR= 1 CLK1= 0 CLK2= 0 CLK3= 0 CLK2= 1 CLK3= 1 Figura 14. Máquina de estado empleada para controlar el bloque MUTA. El Sistema Inmune Artificial es un dispositivo adaptativo con memoria, inspirado en la teoría del Sistema Inmune y en la observación de sus principios y modelos. Como puede aprender y posee memoria nos brinda una descripción detallada del medio en el cual se desenvolvía, capacidad que carecen otros sistemas computacionales. Este artículo muestra las ventajas la gran versatilidad de este tipo de sistemas, lo cual los convierte en una herramienta computacional poderosa. Se empleo un FPGA debido a su procesamiento paralelo y enorme versatilidad, logrando la solución en unos pocos ciclos de reloj. Se mostró además las ventajas del empleo de los SIAs en la resolución de problemas, con el fin de estimular su estudio y su aplicación en diversos problemas que puedan aprovechar las características que posee el Sistema Inmune. El sistema presentado es muy flexible permitiendo no sólo la solución del problema descrito en éste artículo, sino de otros problemas en ingeniería como detección de fallas. Nuestra implementación se basó en la idea de desarrollar un dispositivo con procesamiento en paralelo sacrificando espacio (número de compuertas) en el dispositivo empleado. Se recomienda utilizar una arquitectura software-hardware en la cual se dividan las tareas. Las tareas que requieran procesamiento rápido serán implementadas en hardware mientras las restantes se implementarán en software. 8. REFERENCIAS [1] L. Castro, J. Timmis, Articial inmune systems: A new computational intelligence approach, Springer, Inglaterra, 2002. [2] H. Velez, J. Borrero, J restrepo, A. Restrepo, Fundamentos de medicina. Hematología, Coorporación para investigaciones biológicas, Medellín, 1981. [3] E. Iañez, “Curso de inmunología general”. Online : fai.unne.edu.ar/inmunologiaacademic [4] J. Sepúlveda, C. Camargo, A. Delgado. “Implementación de Chip ADN en un FPGA”