Inteligencia Artificial: Memorias Asociativas Bidireccionales

Cable

x-ezine

Table of Contents
1. Prefacio
2. Introducción
3. Haciendo IA con números
4. Capturando el conocimiento de los expertos
5. Modelando los conocimientos
6. Representando el conocimiento
7. Utilizando la matriz de conocimientos
8. Quitándonos de encima a los expertos: sistemas que aprenden por sí mismos
9. Memorias Asociativas Bidireccionales
10. Otra aplicación de las MAB: reconocimiento de caracteres
11. Conclusión

1. Prefacio

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found in GNU Free Documentation License.


2. Introducción

En las primeras décadas de la historia de la informática, los investigadores de Inteligencia Artificial (IA) solían reducir el problema de la inteligencia a una mera "manipulación de símbolos": se podría automatizar cualquier pensamiento o idea representándolos como valores "Verdadero o Falso" u otra categoría discreta similar, y aplicando un motor de inferencia sobre dichos valores.

Durante aquel período se lograron avances importantes, como los Sistemas Expertos y los programas que jugaban al ajedrez; incluso se hicieron programas que demostraban teoremas matemáticos; pero no tardó en hacerse patente que la manipulación de símbolos tan sólo representaba un subconjunto del pensamiento humano.

A medida que los investigadores comprendían que no todos los problemas de IA se podían reducir a lógica simbólica, se comenzaron a buscar alternativas; las redes neuronales y la lógica difusa, entre otras, produjeron mayor éxito en mecanizar la visión, el reconocimiento de voz, control de brazos robóticos, y muchas otras tareas.

Las Memorias Asociativas Bidireccionales (MAB) són una de estas "nuevas" técnicas; están directamente vinculadas tanto con las redes neuronales como con la lógica difusa; contienen elementos de ámbas; y són bastante simples de implementar; las matemáticas involucradas son tan simples como sumar y multiplicar.


3. Haciendo IA con números

En el mundo de la lógica, todo cuadra con exactitud dentro de una categoría bien definida; o el ornitorrinco es un mamífero o no lo es, o Pedro es alto o no lo es, todo es verdadero o falso. La lógica es incapaz de manejar situaciones en las que existe duda o incertidumbre, probabilidades o posibilidades; ello abarca casi la totalidad de los actos cotidianos; por lo que no es de extrañarse el escaso éxito de los sistemas de inteligencia artificial basados en manipulación de símbolos.

Una forma de hacer frente a la incertidumbre es representarla mediante números; en lugar de tener sólo dos valores posibles (verdadero o falso), permitir la presencia de un gran número de valores distintos; por ejemplo, ésto es lo que obtendremos si intentamos usar la lógica verdadero-falso (0-1) para clasificar un grupo de animales en la categoría "mamífero":

  Animal       ¿Es Mamífero?
  ======       =============
  Pulpo              0
  Ratón              1
  Águila             0
  Caballo            1
  Ornitorrinco       1

Este modelo sería básicamente correcto, si no fuese porque el Ornitorrinco es una criatura que no se deja clasificar tan fácilmente: tiene características de mamífero y de ave; pero esa información se pierde al introducirse en un modelo lógico.

Pero, si nos permitimos el uso de otros números enteros (no sólo el 0 y el 1), podemos modelar las cosas de esta forma:

  Animal       ¿Es Mamífero?
  ======       =============
  Pulpo            -10
  Ratón             10
  Águila            -5
  Caballo           10
  Ornitorrinco       2

En éste modelo, los no-mamíferos tienen números negativos, mientras que los mamíferos tienen números positivos. Además, las cantidades representan qué tanto pertenecen (o no pertenecen) a la categoría. Tanto el pulpo como el águila no són mamíferos, pero el pulpo está mucho más lejos de serlo que el águila; por ello, el pulpo tiene un número más bajo (-10) que el águila (-5); de la misma forma, el ornitorrinco, aunque está clasificado como mamífero, solo tiene un 2 en la escala, mientras que el ratón y el caballo tienen un 10; ello indica que el ornitorrinco tiene menos de mamífero que los otros dos.

Puede que te estés preguntando "¿pero de dónde sacaríamos esos números? que yo sepa, no existe ningún método para medir numéricamente que tanto tienen de 'mamífero' los animales"; en efecto, la mayoría de las cosas que tratamos en la vida diaria no sólo contienen incertidumbre, sino que además no es posible medirlas numéricamente.

Si has jugado juegos de rol, sabrás que existe una respuesta sencilla: si no podemos medir esos valores, ¡podemos inventarlos! En los juegos de rol tenemos atributos como "sabiduría", "cordura" o "suerte" representados como números, pese a que no hay forma de medir esas cosas. Aquí, los números no representan cantidades físicas, solo los usamos para crear un modelo matemático de los eventos que ocurren en el "mundo virtual" del juego.

Podemos hacer lo mismo con un software de inteligencia artificial. Podemos proporcionarle números al programa que, aunque arbitrarios, reflejen la forma como funcionan las cosas (no importa cuantos "puntos de mamífero" le demos al ornitorrinco, siempre que sean menos que los de un caballo y más que los de un águila, el modelo se corresponderá con el sentido común).

Otra alternativa es utilizar algoritmos que le permitan al programa mismo generar esos números, observando el mundo que le rodea (o los datos que le proporcionemos sobre el mundo) y asignándole a los números los valores más apropiados, mediante un proceso de aprendizaje.

Las redes neuronales són uno de los métodos por los cuales la máquina genera por sí misma los números que representan el mundo (és decir, aprende); los algoritmos genéticos són otro método. En este artículo examinaremos las MAB, que constituyen un método cercano a las redes neuronales, así como a la lógica difusa.


4. Capturando el conocimiento de los expertos

Supongamos que queremos crear un sistema experto que modele la interacción entre la industria y el ambiente; hablamos con un grupo de expertos, con la idea de representar sus conocimientos en la máquina, pero nos dan respuestas mutuamente contradictorias.

Por ejemplo, uno de ellos opina que los Clorofluorocarbonos (CFC's) causan la pérdida de ozono, pero otro opina que no; uno dice que el efecto de invernadero es causado por el hombre, otro dicen que no; la lista de opiniones divididas es interminable.

Hay que recordar que en ningún área del conocimiento humano existe un consenso total en todo; siempre existen áreas de controversia, donde cada experto tiene su propia opinión, o áreas donde la mayoría de los expertos están de acuerdo, pero existen "herejes" que no aceptan la opinión generalizada (¡pero que podrían tener razón!)

El cómo representar conocimientos que difieren o incluso se contradicen entre sí es uno de los problemas clásicos de los sistemas expertos.

Podríamos simplemente ignorar las contradicciones, y colocar sólamente aquellos hechos en los que estén de acuerdo la mayoría de los expertos; pero al hacerlo estaríamos perdiendo información: si algunos hechos són controversiales es porque són inciertos, y sería bueno que el sistema manejase dicha incertidumbre.


5. Modelando los conocimientos

El primer paso es modelar los conocimientos en un formato adecuado para almacenar en un computador; probemos a utilizar grafos:


         #---------(-)--------->[Ozono]
         |                         |
         |                        (-)
	 |                         |
         |                         V
    [Polución]-----(+)--->[Efecto Invernadero]         [Deforestación]
                                   |                          |
                                  (+)                         |
				   |                          |
				   V                          |
                             [Temperatura]<--------(-)--------#

Éste grafo indica la opinión de un experto acerca de la relación entre Polución, niveles de ozono, deforestación, temperatura global y efecto invernadero. Las flechas con el símbolo (+) indican una relación de incremento (por ejemplo, que la polución incrementa el efecto de invernadero) y las que tienen el símbolo (-) indican una relación decremental (como el que la polución disminuye los niveles de ozono).

Pero, ahora supongamos que consultamos a otro experto, que opina casi igual que el primero, pero que no cree que la polución afecte al efecto invernadero; el grafo correspondiente sería el siguiente:


         #---------(-)--------->[Ozono]
         |                         |
         |                        (-)
	 |                         |
         |                         V
    [Polución]           [Efecto Invernadero]         [Deforestación]
                                   |                          |
                                  (+)                         |
				   |                          |
				   V                          |
                             [Temperatura]<--------(-)--------#

Y, para acabar de complicar la cosa, supongamos que un tercer experto opina que la deforestación no afecta la temperatura del planeta, y que la polución *incrementa* los niveles de ozono:


         #---------(+)--------->[Ozono]
         |                         |
         |                        (-)
	 |                         |
         |                         V
    [Polución]-----(+)--->[Efecto Invernadero]         [Deforestación]
                                   |
                                  (+)
				   |
				   V
                             [Temperatura]

Tenemos tres opiniones similares, pero con diferencias, e incluso mutuas contradicciones. El problema es ahora combinarlas en un solo modelo.


6. Representando el conocimiento

La forma más sencilla de representar un grafo es utilizando una matriz:

  Ozono Polución Ef. Inv. Deforest. Temp.
  ----- -------- -------- --------- -----
      0       -1        0         0     0  Ozono
      0        0        0         0     0  Polución
     -1       +1        0         0     0  Efecto Invernadero
      0        0        0         0     0  Deforestación
      0        0       +1        -1     0  Temperatura

Esta matriz representa las opiniones del primer experto; como la polución *incrementa* el efecto invernadero, colocamos un +1 en la intersección de "Polución" con "Efecto Invernadero"; como la deforestación *disminuye* la temperatura del planeta, colocamos un -1 en la intersección entre ámbos. Los ceros indican elementos que (según este experto) no tienen relación entre sí.

De la misma forma, creamos las matrices que modelan las opiniones de los tres expertos:

          Experto #1           Experto #2            Experto #3
          ----------           ----------            ----------
         0 -1  0  0  0        0 -1  0  0  0         0 +1  0  0  0
         0  0  0  0  0        0  0  0  0  0         0  0  0  0  0
        -1 +1  0  0  0       -1  0  0  0  0        -1 +1  0  0  0
         0  0  0  0  0        0  0  0  0  0         0  0  0  0  0
         0  0 +1 -1  0        0  0 +1 -1  0         0  0 +1  0  0

Una vez llegado a este punto, nos encontramos con una forma fácil de combinar el conocimiento de los tres, resolviendo las contradicciones en el proceso: simplemente *sumamos* las tres matrices:

                          Matriz combinada
                          ----------------
                            0 -1  0  0  0
			    0  0  0  0  0
			   -3 +2  0  0  0
			    0  0  0  0  0
			    0  0 +3 -2  0

La matriz resultante refleja las diferencias de opinión entre los expertos; como los tres están de acuerdo en que el efecto de invernadero incrementa la temperatura, la celda que los conecta tiene un +3; como uno de los expertos no cree que la deforestación disminuya la temperatura, la conexión es de sólamente -2 (si los tres estuviesen de acuerdo, sería un -3).


7. Utilizando la matriz de conocimientos

Ahora, supongamos que deseamos utilizar el modelo para determinar, digamos, qué ocurre si se incrementan los niveles de polución; para ello, creamos un vector:


   0  Ozono
  +1  Polución
   0  Efecto Invernadero
   0  Deforestación
   0  Temperatura

Así obtenemos el vector [0,+1,0,0,0], que representa la idea de que "la polución ha aumentado"; si queremos representar una *disminución* en los niveles de polución, sólo tenemos que colocar un -1.

Nota: *Con el método que vamos a tratar, los valores posibles para el vector serán únicamente -1, 0 o +1; el vector no debe tener otros valores*

A continuación, multipliquemos la matriz por el vector:

 /  0 -1  0  0  0 \     /  0 \     / -1 \
 |  0  0  0  0  0 |     | +1 |     |  0 |
 | -3 +2  0  0  0 |  *  |  0 |  =  | +2 |
 |  0  0  0  0  0 |     |  0 |     |  0 |
 \  0  0 +3 -2  0 /     \  0 /     \  0 /

Tenemos el vector resultante [0, -1, +2, 0, 0]; a continuación, sustituimos cada valor mayor que +1 por +1, y cada valor *menor* que -1 por -1; en otras palabras, lo convertimos en un vector cuyos únicos valores sean -1, 0 o +1.

Así obtenemos:

 / -1 \     / -1 \
 |  0 |     |  0 |
 | +2 | --> | +1 |
 |  0 |     |  0 |
 \  0 /     \  0 /

El vector [-1, 0, +1, 0, 0] nos dice que han *disminuído* los niveles de ozono (por el -1 en la primera casilla), mientras que se ha incrementado el efecto invernadero (por el +1 en la tercera casilla).

Hemos determinado que un incremento en la polución causa una disminución del ozono y un incremento de efecto invernadero; podemos ir más allá; podemos repetir la operación, utilizando el resultado previo como entrada, para saber que efectos tendrán, a su vez, esos cambios en el ozono y el efecto de invernadero:

 /  0 -1  0  0  0 \     / -1 \     /  0 \     /  0 \
 |  0  0  0  0  0 |     |  0 |     |  0 |     |  0 |
 | -3 +2  0  0  0 |  *  | +1 |  =  | +3 | --> | +1 |
 |  0  0  0  0  0 |     |  0 |     |  0 |     |  0 |
 \  0  0 +3 -2  0 /     \  0 /     \ +3 /     \ +1 /

Y así tenemos que, disminuir el ozono e incrementar el efecto invernadero, provocan como consecuencia que aumente el efecto invernadero (otra vez) y que aumente la temperatura global.

Este proceso se puede iterar indefinidamente, realimentando el resultado de cada operación como entrada de la operación misma, y detenernos cuando lleguemos a un resultado que no varíe; la siguiente iteración nos daría [0, 0, 0, 0, +1], que es *otro* aumento de la temperatura global; la siguiente nos dará el vector [0,0,0,0,0] debido a que el modelo no indica ninguna consecuencia del aumento de la temperatura; seguir iterando sólo nos dará ese mismo vector cada vez.

De esa forma, el modelo nos ha dicho que, si aumenta la polución, disminuirá el ozono y aumentará el efecto de invernadero, lo cual a su vez aumentará la temperatura global; todo ello combinando el conocimiento de los tres expertos en una sola base de conocimientos.


8. Quitándonos de encima a los expertos: sistemas que aprenden por sí mismos

Hemos visto cómo, con una técnica sencilla, podemos capturar el conocimiento de varios expertos, con un sistema que puede asimilar conocimientos distintos e incluso contradictorios sin mayor problema.

Pero, ¿realmente tenemos que estar consultando a un montón de expertos? ¿No podríamos adquirir el conocimiento nosotros mismos? Después de todo, los expertos deben haber adquirido el conocimiento de alguna forma.

Algunos expertos humanos aprendieron de otros expertos; pero el conocimiento proviene en primer lugar de la observación del mundo; así que, si no deseas consultar a expertos, o no hay un experto disponible, has de construir la matriz de conocimientos a partir de datos básicos, obtenidos directamente de la observación.

Supongamos que, tras observar el clima durante un tiempo, detectamos un incremento en la polución, un decremento del ozono, y un incremento en el efecto invernadero; podemos modelarlo como un vector de la siguiente forma:

  -1  Ozono
  +1  Polución
  +1  Efecto Invernadero
   0  Deforestación
   0  Temperatura

A partir de este vector [-1, +1, +1, 0, 0] podemos crear una matriz que represente las posibles relaciones entre las variables; para ello, hacemos que la celda <i,j> de la matriz contenga el resultado de multiplicar el i-ésimo y j-ésimo elementos del vector:

      -1  +1  +1  0  0
      ------------------
      +1  -1  -1  0  0 | -1
      -1  +1  +1  0  0 | +1
      -1  +1  +1  0  0 | +1
       0   0   0  0  0 |  0
       0   0   0  0  0 |  0

El significado de esto es: como han aumentado la polución y el efecto invernadero (ámbos tienen +1 en el vector), suponemos que uno de los dos afecta al otro, por lo que la celda de la matriz que las conecta tendrá el valor +1 * +1 = +1; por otro lado, como la polución ha aumentado y el ozono ha disminuído, suponemos que la polución disminuye el ozono (+1 * -1 = -1).

Nótese que estas correlaciones no són todas correctas; por ejemplo, el modelo indica un -1 conectando ozono y polución, lo que podría hacernos pensar que un incremento en el ozono disminuye la polución!

Lo que ocurre es que no se pueden sacar conclusiones definitivas con apenas una observación; tenemos que combinar distintas observaciones hechas a lo largo del tiempo; supongamos que, en otra ocasión, observamos un incremento del ozono, y una disminución en el efecto invernadero; ello nos da el vector [+1, 0, -1, 0, 0], con el cual construimos la matriz:

      +1   0  -1  0  0
      ------------------
      +1   0  -1  0  0 | +1
       0   0   0  0  0 |  0
      -1   0  +1  0  0 | -1
       0   0   0  0  0 |  0
       0   0   0  0  0 |  0

Ahora tenemos dos matrices, que contienen el conocimiento extraído de dos observaciones distintas; para combinar dicho conocimiento, sumamos las dos matrices, con lo que obtenemos:

      +2  -1  -2  0  0
      -1  +1  +1  0  0
      -2  +1  +2  0  0
       0   0   0  0  0
       0   0   0  0  0

Nótese que ahora, las correlaciones "correctas" (que el ozono disminuye el efecto invernadero, por ejemplo) tienen un valor alto (+2 o -2), mientras que las "incorrectas" (como que el ozono afecta la polución) han permanecido con valores pequeños (+1 o -1); las correlaciones correctas tienden a repetirse en cada observación, reforzándose en el modelo, mientras que las incorrectas tienden a quedarse pequeñas o incluso a disminuir (pues en una observación saldrán como +1 y como -1 en otras, cancelándose mutuamente).

Así, cuantas más observaciones hagas, más exacto será el modelo; solo genera una matriz por cada observación que hagas, y súmala a la que ya tienes.

Nota: si haces muchas observaciones, acabarás teniendo números bastante grandes en el modelo; para mantenerlos pequeños (evitando así posibles errores de desbordamiento), puedes dividirlos de vez en cuando por un número constante; cada 100 observaciones que introduzcas, divide todos los números en la matriz por 10; así ningún número de la matriz superará el +10 o el -10, y las correlaciones incorrectas, como tendrán valores muy pequeños, acabarán valiendo cero por redondeo.


9. Memorias Asociativas Bidireccionales

A las matrices que hemos estudiado también se les llama "Memorias Asociativas Bidireccionales", debido a que se pueden utilizar para almacenar datos; ¡Son una especie de memoria informática!

Supongamos que deseamos almacenar una serie de pares (clave, valor), es decir, un diccionario: sabiendo la clave, queremos acceder al valor correspondiente; y que tanto la clave como el valor són números binarios; tomemos estos tres ejemplos:

   (0001, 1011)
   (1111, 0110)
   (1000, 1111)

És decir, que sabiendo el número 0001 podamos derivar 1011, a partir de 1111 obtengamos 0110, y de 1000 obtener 1111; el primer paso es convertir los ceros en -1s:

   (-1 -1 -1  1,   1 -1  1  1)
   ( 1  1  1  1,  -1  1  1 -1)
   ( 1 -1 -1 -1,   1  1  1  1)

A continuación, procedemos a crear tres matrices, una por cada pareja de datos, asignando a la celda [i,j] el resultado de multiplicar el i-ésimo "bit" de la clave por el j-ésimo bit del valor (exactamente igual que hicimos para generar matrices de conocimiento a partir de observaciones):

Primera pareja de datos (-1 -1 -1 1, 1 -1 1 1):

     -1 -1 -1  1
     --------------
     -1 -1 -1  1  |  1
      1  1  1 -1  | -1
     -1 -1 -1  1  |  1
     -1 -1 -1  1  |  1

Segunda pareja de datos ( 1 1 1 1, -1 1 1 -1):

      1  1  1  1
     --------------
     -1 -1 -1 -1  | -1
      1  1  1  1  |  1
      1  1  1  1  |  1
     -1 -1 -1 -1  | -1

Tercera pareja de datos ( 1 -1 -1 -1, 1 1 1 1):

      1 -1 -1 -1
     --------------
      1 -1 -1 -1  |  1
      1 -1 -1 -1  |  1
      1 -1 -1 -1  |  1
      1 -1 -1 -1  |  1

Cada una de estas tres matrices almacena la relación entre una clave y su valor; para almacenar las tres en una sola, sumamos las tres matrices (nuevamente imitando lo que hicimos en el ejemplo del modelo del clima); el resultado es la siguiente matriz:

    -1 -3 -3 -1
     3  1  1 -1
     1 -1 -1  1
    -1 -3 -3 -1

Ahora intentamos recuperar la información: dada la clave 0001 (-1 -1 -1 1), vamos a recuperar el valor que tiene asociado; multiplicamos la matriz por el vector (-1 -1 -1 1) y reducimos los números resultantes a 1 o -1 (si un número es mayor o igual que cero, lo convertimos en 1, de lo contrario en -1):

 / -1 -3 -3 -1 \     / -1 \     /  6 \     /  1 \
 |  3  1  1 -1 |     | -1 |     | -6 |     | -1 |
 |  1 -1 -1  1 |  *  | -1 |  =  |  2 | --> |  1 |
 \ -1 -3 -3 -1 /     \  1 /     \  6 /     \  1 /

¡Hemos recuperado el valor (1, -1, 1, 1), el valor correspondiente a la clave! Probemos con las otras dos:

 / -1 -3 -3 -1 \     /  1 \     / -8 \     / -1 \
 |  3  1  1 -1 |     |  1 |     |  4 |     |  1 |
 |  1 -1 -1  1 |  *  |  1 |  =  |  0 | --> |  1 |
 \ -1 -3 -3 -1 /     \  1 /     \ -8 /     \ -1 /

 / -1 -3 -3 -1 \     /  1 \     /  6 \     /  1 \
 |  3  1  1 -1 |     | -1 |     |  2 |     |  1 |
 |  1 -1 -1  1 |  *  | -1 |  =  |  2 | --> |  1 |
 \ -1 -3 -3 -1 /     \ -1 /     \  6 /     \  1 /

Con lo que hemos recuperado todos los datos que introdujimos; te estarás preguntando, "¿Y en qué se diferencia esto de una memoria tradicional?"; para saberlo, vamos a intentar introducir una clave corrompida; supongamos que, debido a un error, la clave (1000) se convierte en (1100); veamos qué sucede al intentar acceder el valor asociado:

 / -1 -3 -3 -1 \     /  1 \     /  0 \     /  1 \
 |  3  1  1 -1 |     |  1 |     |  4 |     |  1 |
 |  1 -1 -1  1 |  *  | -1 |  =  |  0 | --> |  1 |
 \ -1 -3 -3 -1 /     \ -1 /     \  0 /     \  1 /

¡Resulta que (1111) es el valor *correcto* asociado a la clave (1000)! Tenemos aquí una memoria que és inmune, hasta cierto punto, a errores y distorsiones en los datos.

A estas memorias se le llaman "asociativas" porque, al contrario que las memorias usuales, que accesan datos a partir de direcciones, éstas accesan datos a partir de datos (las "claves"); són de interés para la investigación de inteligencia artificial debido a su gran parecido con la memoria humana: "recuerdan" cosas asociando un dato con otro (un nombre con una cara, una canción con un cantante, etc), són resistentes a errores, funcionan bien incluso con datos distorsionados, y, desafortunadamente, pueden olvidarse de las cosas (los nuevos datos que introduzcas se "sobreescribirán" encima de los datos previos, haciendo que su recuerdo se debilite).

La razón por la que se les llama "bidireccionales" es porque su capacidad de asociación también va en dirección opuesta: supongamos que tenemos el valor (1011) y queremos averiguar su *clave* (lo contrario de antes); para ello aplicamos el mismo proceso con la *traspuesta* de la matriz:

 / -1  3  1 -1 \     /  1 \     / -4 \     / -1 \
 | -3  1 -1 -3 |     | -1 |     | -8 |     | -1 |
 | -3  1 -1 -3 |  *  |  1 |  =  | -8 | --> | -1 |
 \ -1 -1  1 -1 /     \  1 /     \  0 /     \  1 /

Lo que nos da precisamente la clave del par (0001, 1011); así que tenemos una "memoria asociativa bidireccional".

Éstas memorias se caracterizan por permitir asociar libremente unos datos con otros, y recordar las asociaciones correctamente aún si hay ruido o distorsión en los mismos; no pueden memorizar volúmenes muy grandes de datos, a no ser que éstos datos tengan alguna clase de secuencia lógica; todo ello de forma muy parecida a la memoria humana.


10. Otra aplicación de las MAB: reconocimiento de caracteres

Podemos entrenar la MAB para que reconozca caracteres leídos por un escáner; tomemos como ejemplo la siguiente imágen binaria de la letra 'A':

    1111          00111100
   1    1         01000010
   1    1         01000010
   111111   -->   01111110
   1    1         01000010
   1    1         01000010
   1    1         01000010      
                  00000000

(Aunque no se note, la matriz del lado derecho es la misma imagen de la 'A' pero con ceros llenando las áreas en blanco; sí, así es como las máquinas ven las imágenes)

esa matriz de ceros y unos tiene 8 caracteres de ancho y 8 de alto, lo cual da un total de 64 bits; tomemos esos 64 ceros y unos y representémoslos como un vector:

  0011110001000010010000100111111001000010010000100100001000000000

Los primeros 8 bits corresponden a la primera fila de la imágen, los siguientes 8 a la segunda fila, y así sucesivamente. Ahora los convertimos a la representación de -1 y +1:

( -1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 )

Ahora podemos generar una matriz que asocie ese vector consigo mismo (és decir que esa ristra de 64 1s y -1s será tanto el campo clave como el valor); así crearíamos una MAB capaz de reconocer la letra 'A'.

Como los vectores tienen 64 bits, las matrices tendrían 64*64 = ¡4096 celdas! Como eso ya es muy grande, no vamos a realizar el proceso aquí; si el lector siente curiosidad, puede implementar el proceso en su lenguaje de programación favorito.

Baste decir que, si le introducimos a la matriz cualquiera de las siguientes imágenes (la 'A' con errores de escaneo):

    1111      1111      1111
   1    1    1    1    1    1
   1         1    1    1    1
   111111    11 111    111111
   1    1    1 1  1    1    1
   1    1    1    1    1    1
   1    1    1    1    1     1

La MAB nos dará como respuesta la letra 'A' ¡correcta y sin distorsión!

    1111
   1    1
   1    1
   111111
   1    1
   1    1
   1    1      

Mira por donde, mientras intentábamos descubrir un mejor tipo de sistema experto, acabamos obteniendo una nueva clase de memoria y un reconocedor de imágenes; puedes intentar descubrir tú mismo otros usos para las MABs.

Observa, además, que en ningún punto del artículo hemos utilizado números de punto flotante; ¡sólo enteros! lo cual es estupendo, porque el computador maneja los enteros con más velocidad, elegancia y precisión; podrás generar y procesar matrices mucho más grandes usando sólo enteros, tanto por cuestiones de memoria como de velocidad de cálculo (en cualquier caso, ¿para qué íbamos a utilizar flotantes, decimales y todo eso si aquí los números no representan cantidades físicas, sino *conexiones*?)


11. Conclusión

Las MAB fueron propuestas por primera vez en 1988; desde entonces, han atraído la atención de muchos investigadores por su similitud con las capacidades de percepción sensorial y memorización de los cerebros reales. Debido a su similitud con las redes neuronales, se utilizan en ciencia neurológica cognitiva así como en el diseño de arquitecturas de redes neuronales artificiales. Nada mal para un simple proceso de suma y multiplicación de números enteros.