Showing posts with label memoria. Show all posts
Showing posts with label memoria. Show all posts

Sunday, February 19, 2012

El cerebro, las computadoras y su organización


La semana pasada fui a ver una película de las denominadas "de permanencia voluntaria", casi. Se trata de "Votos de amor", y la anécdota trata de un matrimonio joven que sufre un accidente y la mujer sale disparada contra el parabrisas. Finalmente ambos se recuperan pero ella ha perdido la memoria. No recuerda a su marido ni su vida con él. Pareciera que sus recuerdos hubiesen terminado antes de decidir irse a vivir sola. La trama es la lucha de su esposo por reconquistarla. En el filme se aclara que la película está basada en hechos reales y al final de la misma dicen que la mujer en cuestión (la de la historia, pues), jamás recuperó la memoria aunque tuvo dos hijos con precisamente su marido.

Fuera de si la historia es real o no, llama la atención este asunto de la memoria. ¿Cómo estará organizada dentro del cerebro? ¿En dónde residen los recuerdos? ¿Qué dispara que un recuerdo aparezca y qué lo inhibe? Sin duda estamos ante una "caja negra", que es el cerebro, el cual nos da información a cuentagotas. Lo interesante es que el hombre estudia al hombre en su ser más íntimo, en donde residen sus pensamientos. Eso de entrada debe ser fascinante.

Pero el punto que me puso a dudar es si es posible que alguien olvide los recuerdos de una etapa de su vida. ¿No habría algunos hechos que pudiesen desencadenar que dichos recuerdos regresaran? ¿O es que la mujer de la película se golpeó en una parte de su cerebro que simplemente destruyó esa zona del mismo, dejando impecables sus recuerdos de estudiante universitaria? En la película el marido le pone una serie de estímulos: fotos de ellos, videos, lugares a los que fueron, etc., pero nada parece hacerle recordar a la protagonista.

Y quizás eso pueda pasar, porque la mente es un misterio, pero hay una serie de datos que son los que me hacen dudar. Por ejemplo, se sabe que en experimentos con ratas,a  las cuales se les han enseñado ciertos trucos, cuando éstas se les quita una parte del cerebro, pueden sin embargo, seguir haciendo los trucos que aprendieron. Esto pareciese mostrar que la memoria no se encuentra en un área específica del cerebro, sino que de alguna manera parece estar repartida por toda la masa encefálica o al menos, en algunas partes de la misma. Por ejemplo, en experimentos con un tomógrafo y la GM Zsuzsa Polgar, se halló que el cerebro de la gran maestra era estimulado en la parte del habla cuando veía imágenes de partidas de ajedrez, diagramas de posiciones, etc. Como si el cerebro hubiese decidido que el ajedrez podía asociarse al lenguaje (y tal vez lo es. Larsen decía: "el ajedrez es un lenguaje marcado por la agresión"). No sé si estos estudios mostrasen qué otras áreas del cerebro de la ajedrecista están involucrados en la actividad del juego ciencia.

Pero esto me lleva a un asunto que es más simple pero no menos ingenioso. La mayoría de la gente habla de que en sus computadoras tiene dos gigabytes de memoria, por ejemplo, o cuatro, o más incluso. Todos imaginamos la memoria de una computadora como una serie de espacios asignados a un identificador, como si fuese un arreglo de 2 gigalugares en donde se pueden poner números.


Lo curioso es que no es estrictamente cierto. De hecho, en los cursos de electrónica muchas veces se habla de chips que tienen 8K x 1 bit, es decir, tienen 8 mil lugares de un solo bit. Así, si queremos formar bytes, y tener una memoria de 8K bytes, lo que necesitamos es comprar 8 chips de 8K x 1 y ponerlos en paralelo. Es decir, cada byte esta repartido en 8 chips diferentes. En ese sentido da la impresión que sigue un poco la manera en como el cerebro parece organizar la memoria, la cual no parece tener un "lugar de residencia", pues. Lo mismo hacemos cuando usamos una computadora moderna. Desde luego que la abstracción que todos entendemos es que hay una serie de casilleros para poner números, que son la memoria, y que pueden accederse apuntando a la dirección numérica en la que se encuentran. Sin embargo, el hardware se encarga, por así decirlo, de "juntar" los 8 bits para formar el byte que requerimos. De alguna manera estamos en un mundo invisible.

Wednesday, June 15, 2011

De la eficiencia en cómputo

A mí me gusta Prolog, el lenguaje de programación, que a decir de la propaganda que Borland hacía de su compiladort (turbo Prolog), era "el lenguaje natural de la inteligencia artificial". Bonita frase publicitaria, nada más.

Y lo que me gusta de Prolog es su paradigma, que es totalmente diferente al que tienen los lenguajes de programación de cuarta generación como Pascal y C. En prolog actuamos en otra forma: definimos el problema y el lenguaje se encarga de darnos la solución. Suena a magia, pero no lo es.

Prolog es un lenguaje de programación declarativo y por ende, lo que tenemos que hacer es precisamente declarar las condiciones iniciales y de frontera. Por ejemplo, puedo decir:


ama(juan, ana).

Lo cual quiere decir, por ejemplo, que "juan ama a ana". Ojo, aquí es importante el orden de los términos. En prolog no es esto equivalente a lo que sigue:


ama(ana, juan).

Lo cual querría decir que "ana ama a juan", lo cual evidentemente no es equivalente.

Pero lo interesante aquí es el que declaramos, casi en el idioma que hablamos normalmente, un hecho que dentro de Prolog tiene sentido. No hablamos pues de hacer cálculos sofisticados por ejemplo, sino de declarar estas relaciones, que en los lenguajes de cuarta generación se dificulta hacerlo.

Pero pensando en esto y en los problemas que Prolog puede resolver, vía el mecanismo de la recursividad, hallé que en realidad habría que preguntarse si Prolog es un lenguaje víable para aplicaciones reales y no para meramente problemas académicos como los que ya he tratado aquí (crear crucigramas, pasear por un laberinto, resovlver sudokus, etc.). Y la realidad es que pienso que Prolog bien puede ser una herramienta víable, pero solamente para unos pocos casos en donde las simbologías son muy importantes.

Por ejemplo, pienso en un diccionario que tengo que consultar. Si mi diccionario cuenta con digamos medio  millón de palabras, y necesito saber si una palabra determinada existe en mi archivo (y considerando que las palabras están debidamente ordenadas), requiero de hacer unas 19 búsquedas, pues 2^N = 500,000 es aproximadamente 19.

Escribir un programa en Prolog que haga una búsqueda binaria no es difícil. La idea es colocarse en la palabra 250,000 inicialmente y e si la palabra que busco es la que está en esa posición. Si no es, entonces debo ver si "me pasé", es decir, la palabra está antes de la que hallé o "me quedé corto", es decir, la palabra está después de la que leí. Así, divido esa región del archivo 0 a 249,000; o 250,001 a 500,000 entre dos y vuelvo a hacer la búsqueda. En Prolog, naturalmente esto se hace de forma recursiva, lo cual implica guardar el estado del sistema, vía el stack, que es una estructura de datos LIFO (Last In, First Out), cada vez que se hace la llamada recursiva. Obviamente necesito una condición terminal o de salida para no ciclar al programa y que éste termine por quedarse sin memoria.

Si intento hacer, en cambio, una búsqueda binaria en un lenguaje de cuarta generación, hallaré que no necesito usar ninguna función recursiva y con un ciclo WHILE puedo resolver mis dificultades. Aquí no hay que llevar cuenta del stack y resulta muy eficiente en términos de memoria.

Aún así, 19, 20 búsquedas usando un stack en un algoritmo recursivo no sólo no es terriblemente ineficiente, sino que es además muy elegante. Niklaus Wirth decía: "Iteratum humanum est, recursivitum divinum est" (la iteración es humana, la recursion es divina)

Pero pensando en esto, me pregunté si quisiese hacer una búsqueda linea, es decir, buscar de la primera a la última palabra en mi diccionario. Si hago esto, en el mejor de los casos haré una búsqueda: la palabra que busco está en la primera posición. En el peor de los casos la palabra que busco estará en la última línea de mi archivo, por lo cual haré medio millón de consultas.

Si quiero hacer esto en Prolog, y además lo quiero hacer recursivo, debo prepararme para guardar en el stack medio millón de estados. Por lo menos eso en un principio. Mi esquema en Prolog sería algo así:


Si la variable I es mayor que medio millón termina.

Define la variable I como 1
busca en la iésima palabra si es la que busco
si no lo es, crea una nueva variable I1 que sea igual a I+1
ve al principio del procedimiento y vuelve a buscar con estos valores
Si es el valor, imprime el resultado y asigna a la variable el valor de medio millón + 1 y ve al procedimiento recursivo



Obviamente estoy asumiendo que quienes me leen ya han tenido contacto con Prolog, pero aquí el asunto que quiero ilustrar es la dificultad que voy a enfrentar, que es la de guardar el estado del sistema en el stack a cada llamada recursiva. Dudo que el programa soporte medio millón de llamadas guardadas en el stack. ¿Qué hacer entonces? La solución es usar la instrucción corte (cut), la cual se identifica con un signo de admiración "!" y entonces le decimos al sistema en prolog que no guarde todos estos estados temporales de la recursión, porque en el fondo no me interesa saber qué pasa cuando regreso de la recursión en sí.

Si se me ocurre hacer esto en algún lenguaje de cuarta generación como Pascal, lo que haría es:

repite
  asigna a I el valor de 1
  asigna termina = falso
  lee el registro cuyo valor es I
  Si es la palabra que busco, entonces
      asigna a la varianble termina = verdadero
      escribe resultado
  Si la palabra no es la que busco, incremento la variable I
hasta que termina = verdadero




Aquí no llevo control del stack y no tengo que preocuparme por nada de eso. Por ende, parece ser más fácil usar para este asunto en particular, un lenguaje de cuarta generación.

Pero un momento, hasta los lenguajes declarativos, que usan simbologías, no se salvan de tener que hacer procedimientos repetitivos como en los lenguajes tradicionales. Aquí la cuestión es que el programador necesita definir las cosas de manera que el sistema sea eficiente y no se quede sin memoria.

En suma, pienso que Prolog es un lenguaje comercialmente víable, pero en este caso, el programador requiere de ser más cuidadoso, mucho más, de los recursos de memoria con los que cuenta. No tener esto presente puede hacer de prolog un lenguaje por demás ineficiente y poco usable.

Friday, April 29, 2011

Un Funes el memorioso de la vida real


Hace apenas un par de días, la página alemana de ajedrez, chessbase, mostró el artículo de un profesor de Ucrania que sostenía tener una memoria fenomenal. Entre sus dichos es que guarda en su memoria unos 22000 libros de texto y que recuerda hasta 30 millones de cifras del número Pi. Además, se decía en dicho artículo que el profesor en cuestión le habría ganado un match (a dos partidas) a Rybka, uno de los programas de ajedrez más fuertes del planeta.



El asunto me recuerda al cuento de Borges, el de Funes el memorioso. De acuerdo a la Wikipedia:

Funes el memorioso es un cuento del escritor argentino Jorge Luis Borges. Apareció en Ficciones, una colección de cuentos y relatos publicada en 1944.

Según Borges, se trata de «una larga metáfora del insomnio». El protagonista sufre de hipermnesia un síntoma del síndrome del sabio y, si consideramos el sueño (en su primera fase) como un depurador de recuerdos (sólo quedan en nuestra mente lo importante o lo más impresionante que nos haya sucedido), al no dormir no eliminamos recuerdos, es decir, no tenemos la capacidad de olvidar muchas cosas con las que no podríamos vivir.

Muchos críticos han visto en este relato una referencia a los postulados del filósofo inglés John Locke, y de manera menos directa, a la obra de Friedrich Nietzsche. Para otros, en esta narración hay un «velado reconocimiento y homenaje a su mentor» y amigo, el escritor mexicano Alfonso Reyes Ochoa.1

El cuento narra el encuentro de un estudiante porteño con Ireneo Funes, un joven de Fray Bentos, Uruguay, con rarezas como la de no darse con nadie y la de saber siempre la hora, como un reloj.

Luego, postrado como consecuencia de un accidente que tuvo a los 19 años, primero perdió el conocimiento y luego, al recobrarlo, puede recordar toda memoria con preciso detalle, a pesar de su antiguedad. Si antes podía saber la hora sin ver el reloj, ahora Funes había afinado sus asombrosas capacidades: lo recuerda todo, y cada percepción que tiene es, para él, una característica única e inolvidable:
No sólo le costaba comprender que el símbolo genérico 'perro' abarcara tantos individuos dispares de diversos tamaños y diversa forma; le molestaba que el perro de las tres y catorce (visto de perfil) tuviera el mismo nombre que el perro de las tres y cuarto (visto de frente).

Funes decía:
Más recuerdos tengo yo que los que habrá tenido todos los hombres desde que el mundo es mundo.
Mi memoria es como vaciadero de basuras.

Funes había creado un sistema complicadísimo y absurdo de numeración en el que a cada número le atribuía una cosa, pero que luego había rechazado por su característica de ser una labor interminable. El autor sostiene que, a fin de cuentas, Funes carecía de la capacidad del pensamiento:
Pensar es olvidar diferencias, es generalizar, abstraer. En el abarrotado mundo de Funes no había sino detalles, casi inmediatos.

Ireneo Funes murió en 1889, de una congestión pulmonar.


¿Será cierto que este personaje de Ucrania tiene una memoria casi como la que se describía en el cuento de Borges? Este tipo de situaciones siempre se ponen en duda pero pareciera que algo hay de real en ello, pues un charlatán en este sentido reprobaría la primera prueba que se le pusiese (con cierto grado de dificultad). El profesor ucraniano dice que tiene un método para que cualquiera pueda desarrollar la memoria de esa manera ¿será cierto? 

Según entendí, la gente de Chessbase invitó al académico a un pequeño match contra Rybka, en las oficinas de la empresa alemana, pero parece ser que el nuevo Funes rechazó la invitación. 

No sé si todo esto sea un truco. Lo que sí sé es que da qué pensar.