Mostrando entradas con la etiqueta reconocimiento patrones. Mostrar todas las entradas
Mostrando entradas con la etiqueta reconocimiento patrones. Mostrar todas las entradas

miércoles, 3 de febrero de 2016

Decodificando la mente

"Tradicionalmente los científicos han examinado las neuronas individuales, nuestro estudio da una visión más global, a nivel de grandes redes de neuronas, de cómo una persona que está despierta y presta atención percibe un objeto visual complejo." (Rajesh P. N. Rao)

A finales del año pasado ocurrió un hito en neurociencia del cual los medios de comunicación no se han hecho el debido eco. En concreto, un equipo multidisciplinario de participantes de muy diversas universidades estadounidenses (además de otros miembros de centros públicos como la NASA), ¡consiguieron literalmente decodificar  parte de la información contenida en los impulsos eléctricos que recibían desde varios electrodos implantados en pacientes voluntarios!

Llegué a este trabajo que os comento gracias a que soy un fiel seguidor del trabajo de Rajesh P. N. Rao, un neurocientífico computacional de renombre que formó parte del equipo de desarrollo de este experimento. El paper original se puede leer de forma gratuita desde este enlace: http://www.ploscompbiol.org/article/fetchObject.action?uri=info:doi/10.1371/journal.pcbi.1004660&representation=PDF y su título es el siguiente: "Spontaneous Decoding of the Timing and Content of Human Object Perception from Cortical Surface Recordings Reveals Complementary Information in the EventRelated Potential and Broadband Spectral Change".

¿En qué consistió el experimento?

El desarrollo técnico es un poco complejo y no voy a entrar en mucho detalle por aquí (aunque tenéis el paper para saber más), por lo que voy a limitarme a divulgar qué es concretamente lo que este equipo de investigación ha hecho de un modo que se pueda entender con claridad:

Comenzaron implantando mediante cirugía varios electrodos dentro de ciertas zonas concretas del cerebro de 7 sujetos voluntarios (los cuales iban a ser operados de todas maneras por otros motivos), de modo que pudieron ir recopilando mediante diversas técnicas los datos eléctricos que esos electrodos recogía.

Una vez implantado los electrodos (de 4 mm de diámetro) en los lóbulos temporales, se comenzó una serie de 3 rondas en las que se le mostraban a estas personas imágenes de cientos de rostros (de caras) y de cientos de casas (imágenes que el paciente no había visto antes). Cada 400 milisegundos la figura que se le mostraba cambiaba por otra imagen aleatoria hasta llegar a las 100 imágenes (por tres series = 300 imágenes).

Durante todo ese tiempo en que se le hacía el pase de imágenes de diferentes objetos al individuo, se iban almacenando digitalmente los valores eléctricos que los diversos electrodos implantados sentían en cada momento del experimento. De este modo consiguieron una base de datos de los valores eléctricos registrados por los 7 participantes durante el pase de las 300 imágenes mostradas. Esa base de datos, por cierto, la han hecho pública y la podéis descargar vosotros mismos desde este enlace: https://purl.stanford.edu/xd109qh3109 (junto con el algoritmo de Matlab desarrollado para la decodificación de las propias señales).

Y ahora viene lo interesante. Una vez con este enorme conjunto de datos, el equipo de investigación se propuso demostrar si esos impulsos eléctricos registrados por los electrodos contenían suficiente información (o incluso alguna información) correlacionada con el estímulo concreto presentado al paciente (y percibido por éste) en cada instante. Es decir; había que estudiar si todos esos datos contenían algún tipo de información oculta detrás de algún patrón de codificación neuronal no conocido a priori.

Estudio de los datos.

Hay que tener en cuenta, que lo que los electrodos recopilan es simplemente un valor escalar que representa el voltaje aproximado que hay en sus proximidades en cada momento, lo cual nos permite en un primer momento simplemente formar gráficas de voltaje por unidad de tiempo de este estilo:


En esta imagen se puede ver, por ejemplo; los valores registrados por cuatro electrodos durante la exposición de 400ms a un imagen conteniendo un objeto determinado (una casa, una cara, etc.). En concreto, la línea rosa representa los valores de voltaje recogidos cuando el objeto del estímulo contuvo la imagen de una casa, mientras que la línea azul representa los valores eléctricos tomados cuando el estímulo fue el de una faz. Estos valores no son siempre los mismos (la gráfica no es siempre igual aunque se presente de nuevo una casa o una cara), por lo que había que descubrir si detrás de todos esos datos había un patrón oculto utilizado por el cerebro a modo de codificación. Y puestos a que fuera ese el caso, se propuso intentar decodificar el mensaje eléctrico para poder prever el objeto de la percepción de un individuo de un modo continuo y sincronizado: es decir; que se pretendía encontrar un algoritmo capaz de decodificar en tiempo real los impulsos que llegaban desde los electrodos del cerebro para poder "adivinar" (sin ninguna otra información), qué tipo o clase de objeto era el que estaba percibiendo el paciente (el cual se encontraba incomunicado del experimentador).

El proceso de decodificación.

Con este fin en  mente, se desarrolló un algoritmo utilizando técnicas de computación mediante aprendizaje automático ("Machine learning"), haciendo uso concretamente de una técnica estadística que se conoce como LDA ("Fisher linear discriminant analysis"). Para lograrlo, dividieron la enrome muestra de datos en 3 partes, y asignaron dos partes al proceso de entrenamiento del modelo ("training"), dejando la parte restante para las pruebas de fidelidad del clasificador ("testing"). Como ya he dicho, este algoritmo escrito en Matlab (junto con los datos recogidos del voltaje de los electrodos), lo han hecho público y lo podéis descargar desde aquí.

Resultados.

Siguiendo este procedimiento, y gracias al algoritmo desarrollado con estas técnicas computacionales de inteligencia artificial, se consiguió detectar ciertos patrones clasificadores detrás de toda esa información eléctrica, lo cual ha permitió el enorme logró que supone el hecho de poder, literalmente, decodificar la suficiente información transportada por estos impulsos neuronales conjuntos como para poder prever (clasificar) en tiempo real lo que los sujetos van percibiendo con una precisión superior al 96% de aciertos.

Es decir; que únicamente a partir del estado eléctrico del cerebro en cierto momento, se pudo detectar (sin ninguna otra información por parte del sujeto) el contenido visual abstracto que el paciente estaba percibiendo en cada momento. Todo esto sugiere que el hecho de que de que un sujeto perciba un tipo de objeto u otro (y lo relacione con un concepto abstracto concreto: "veo una casa, o veo una cara"), se refleja principalmente en un patrón eléctrico determinado el cual codifica dicha información, demostrándose de este modo que cualquier información abstracta del ser humano se puede reducir, en principio, exclusivamente a un estado físico-químico (eléctrico) del cerebro.

Por cierto, que toda esta compleja codificación habría sido evolutiva y gradualmente ajustada por un largo proceso de selección natural actuando sobre la estructura material del cerebro.

Futuros desarrollos.

Esta técnica desarrollada, y que está dando sus primeros pasos, es realmente un trampolín hacía un futuro mapeo cerebral completo, lo cual podrá utilizarse para identificar en tiempo real qué lugares del cerebro son sensibles a los distintos tipos de información. En otras palabras; una mejora de esta técnica podrá llevar, con toda probabilidad, a que podamos finalmente lograr una decodificación completa del cerebro, pudiéndose prever no sólo estímulos visuales abstractos (casas, caras, etc.), sino también cualquier otro producto de un proceso cognitivo. La metodología sería básicamente la misma: tomar datos de la actividad eléctrica neuronal ante una conducta o estímulo de estudio, y proceder a continuación a decodificar esos datos usando técnicas computacionales ante esas señales eléctricas. Posteriormente, simplemente con medir el estado cerebral de un individuo cualquiera se podría prever cualquier proceso cognitivo que haya detrás de dicho estado eléctrico.

Discusión.

A parte de las grandes utilidades prácticas de este estudio (como la de ayudar a "adivinar" qué piensan los pacientes con grave parálisis motora o que han tenido un derrame cerebral y están completamente bloqueados), hay que resaltar un hecho muy importante: este estudio demuestra que la percepción sensorial y la posterior objetivación abstracta (conceptual) del mundo percibido, es un proceso que se produce exclusivamente de un modo material en la red neuronal evolutiva del cerebro (si no fuese este el caso, este experimento no habría podido tener éxito puesto que basa todas sus premisas en el estudio material -eléctrico- del cerebro).

El acto de percibir estímulos, y el acto de transformar esas percepciones en ideas de objetos o conceptos relacionales, se ha demostrado ser un complejo proceso eléctrico disperso entre la red neuronal del cerebro, el cual literalmente codifica un patrón de voltaje distinto para cada concepto, idea, sensación, etc. Tanto es así, que en este estudio se ha conseguido la decodificación de varios de estos patrones "objetivizadores" que permite a un paciente diferenciar en su mente cuando ve, por ejemplo, una casa cualquiera (no una casa concreta, sino cualquier casa, aunque sea la primera vez que la ve), de cuando ve, por ejemplo, una cara cualquiera (aunque sea la de alguien que ve por primera vez). En otras palabras, el acto de ver y reflexionar sobre un objeto concreto, se traduce en distintos patrones eléctricos que van recorriendo las diferentes partes del cerebro transmitiendo la información de un modo codificado. Y es ese patrón constituido por miles de impulsos eléctricos, que hasta no hace mucho parecían caóticos, los que estamos ya empezando a comprender.

Siguiendo este proceso, llegará un momento en que un algoritmo de este tipo será capaz de detectar cualquier clase de percepción y proceso cognitivo únicamente a partir de la información eléctrica que corre entre las sinapsis de nuestra red de neuronas. Es decir; que bastante pronto (relativamente hablando), se conseguirá decodificar (mapear) el patrón del estado eléctrico completo que origina cualquier acto cognitivo en el hombre.

Se puede decir por tanto, a modo de resumen, que el verdadero hito histórico de este trabajo consiste en ser el primero en demostrar con la suficiente fuerza (con aciertos cercanos al 100% y sincronizado en tiempo real) el hecho de que toda la mente humana puede no ser más que la emergencia ocurrida tras el procesado eléctrico conjunto de cientos de millones de neuronas; las cuales utilizan un complejo conjunto de patrones eléctricos (evolutivamente determinados) para comunicar información entre las distintas zonas cerebrales y posteriormente hacia el exterior (mediante la comunicación verbal, por ejemplo).

Si quedaban pocas esperanzas para algún tipo de dualismo en la explicación de nuestra mente, este estudio acaba de dar al traste con ellas: no sólo se ha visto que no es necesario nada a parte del estado material del conjunto del cerebro, sino que incluso ya vamos siendo capaces de decodificar dicho estado material para prever ciertas propiedades emergentes de la mente. En un futuro no demasiado lejano, literalmente podremos usar el estado eléctrico global de un sujeto para adelantar (sin más información) cualquier idea, pensamiento, estimulo sensible, o proceso cognitivo en general que tenga esa persona.

Referencias.

Kai J. Miller, Gerwin Schalk, Dora Hermes, Jeffrey G. Ojemann, Rajesh P. N. Rao: Spontaneous Decoding of the Timing and Content of Human Object Perception from Cortical Surface Recordings Reveals Complementary Information in the Event-Related Potential and Broadband Spectral ChangePLOS Computational Biology (2016). DOI: 10.1371/journal.pcbi.1004660.

viernes, 14 de octubre de 2011

Computación evolutiva: Ejemplo VI

Abstract

Para el ejemplo VI de la serie práctica de algoritmos evolutivos, he implementado un OCR básico, a partir del ejemplo anterior donde realizamos un algoritmo capaz de reconocer los patrones de las vocales mediante aprendizaje evolutivo.

El OCR es bastante básico, pero permite comprobar la potencia de la computación evolutiva en relación al mundo del reconocimiento de patrones.

Ejemplo práctico VI: OCR básico

El programa que os presento a continuación; programado en un applet de Java para que podáis probarlo de primera mano, consigue precisamente eso: aprender a reconocer los patrones de las vocales, en formato Times New Roma, y un tamaño de 8 (8 x 5 = 40 píxeles). Se utiliza una red neuronal cuyos pesos se ajustan mediante una estrategia evolutiva.

El programa actua como un OCR, consiguiendo capturar la información textual dentro de una imagen (en formato GIF), y transcribiendo dicha información en una caja de texto.

Para agilizar la programación necesaria, el OCR sólo reconoce vocales en formato Times New Roman, y un tamaño de letra de 8.

En cualquier momento del entrenamiento, podemos pulsar en el botón Cancelar, y comprobar cómo va mejorando el reconocimiento del patrón.

Una vez entrenada la red neuronal, debemos introducir la ruta url de la imagen a procesar (en formato GIF), y pulsar sobre el botón Pasar OCR.

Las instrucción de uso se pueden esquematizar así:

1) Pulsa sobre el botón Entrenar para que la red neuronal aprenda a reconocer las vocales (espera hasta obtener una media de 120 en la función de evaluación).
2) Abre el Paint de Windows.
3) Crea un nuevo documento, y escribe con la herramienta de texto (con formato Times New Roman, y tamaño 8) todas las vocales que quieras, en cualquier lugar del documento (que pueden no ser consecutivos ni estar alineadas).
4) Guarda la imagen en formato GIF.
5) Sube la imagen a un hosting gratuito de imágenes. Por ejemplo: www.imgur.com.
6) Copia la ruta de la imagen subida (comprueba que la url termina en extensión ".gif").
7) Pega la url en el applet, donde dice URL de la imagen a procesar.
8) Pulsar sobre el botón Pasar OCR.

¡Y listo! Si todo va bien, el applet reconocerá todas las vocales del texto, y las introducirá en orden (y manteniedo los espacios en blanco entre ellas).


Debajo del siguiente applet encontrarás un enlace con el código fuente del ejemplo:

No puede ejecutar applets de Java. Instale la JVM, y vuelva a recargar la página, por favor.

Podéis descargar el código fuente del ejemplo VI desde este enlace.


martes, 11 de octubre de 2011

Computación evolutiva: Ejemplo V

Abstract

El siguiente ejemplo práctico, consiste en una revisión del ejemplo anterior donde realizamos un algoritmo capaz de reconocer las vocales mediante aprendizaje evolutivo.

En esta versión, hemos introducido algo de ruido durante el entrenamiento y prueba del reconocimiento conseguido. El ruido consiste en la introducción o borrado de píxeles en la imagen de la vocal a reconocer.

Ejemplo práctico V: Proyecto evolutivo de reconocimiento de patrones con ruido

El programa que os presento a continuación; programado en un applet de Java para que podáis probarlo de primera mano, consigue precisamente eso: aprender a reconocer los patrones de las vocales, en formato Times New Roma, y un tamaño de 8 (8 x 5 = 40 píxeles). No se usa ninguna técnica estratégica mediante heurística, sólo una red neuronal cuyos pesos se ajustan mediante una estrategia evolutiva.

El programa, al ejecutarse inicialmente el applet, sólo no tiene "conocimiento" alguno, y se limita a dar una respuesta aleatoria, cuando se le presenta los píxles de la imagen de una vocal en Times New Roman.

Para conseguir, de manera on-line; que el programa aprenda a reconocer el patrón de las vocales, debemos pulsar sobre el botón Entrenar. En ese momento, el programa comenzará a seleccionar evolutivamente, los individuos que mejor aproximen sus respuestas cuando se le interroga por las vocales.

En cualquier momento del entrenamiento, podemos pulsar en el botón Cancelar, y comprobar cómo va mejorando el reconocimiento del patrón.

Debajo del siguiente applet con el ejemplo V, explicaré más en profundidad la teoría que sigue el proyecto de aprendizaje automático, y encontrarás un enlace con el código fuente del ejemplo:

No puede ejecutar applets de Java. Instale la JVM, y vuelva a recargar la página, por favor.

Podéis descargar el código fuente del ejemplo V desde este enlace.


Explicación técnica del ejemplo


El proyecto de ejemplo V, tiene las siguientes características técnicas:

Todo el aprendizaje corre a cuenta de una red neuronal; con conexión hacia delante y una capa oculta (hidden layer).

La capa de entrada contiene 40 nodos; uno por cada posible contenido dentro del array que forma el conjunto de píxles de la imagen de la vocal. Hay 5 nodos de salida, los cuales indican la probabilidad de que la vocal pasada sea la que representa sicho nodo de salida.

Inicialmente, los pesos wij de la red neuronal son marcados aleatoriamente, por lo que la respuesta de la red neuronal ante el problema será aleatorio.

Hay pues que entrenar al programa para que aprenda, lo que vamos a conseguir ajustando evolutivamente los pesos de la red neuronal utilizada. Dicho entrenamiento evolutivo se realizará mediante una estrategia evolutiva.

La estrategia evolutiva será representada por un vector de 210 elementos de tipo real. Esos elementos o individuos de selección se van a corresponder con los pesos de los nodos que contiene la red neuronal, de manera que serán esos pesos los que irán evolucionando.

Así pues, la población en evolución, consistirá en n individuos (con n = 15), que tendrán n hijos, con variación exclusiva por mutación -sin recombinación- y cuya función de desempeño (fitness fuction) será calculada mediante competición -selección por torneo-.
Para el proceso de mutación, hay que tener en cuenta que cada individuo; además de un vector de pesos, contiene un vector de variables de ajuste, que también irá evolucionando junto con los pesos.

La mutación es de la forma:



Con alpha igual 0.2f, y donde xi indica el peso en la posición i del vector de pesos, y N(0,1) indica un valor tomado aleatoriamente de una distribución normal de desviación típica igual a 1, y media igual a 0. La otra variable que interviene en el proceso se corresponde con la variable de ajuste del elemento i, que; como se puede ver, muta antes de que lo haga el peso xi.

La evaluación de un individuo se realiza mediante el recuento de los aciertos conseguidos cuando se le pasa las 5 vocales. Se sumará uno cuando se acierta, y se restará uno si falla en el reconocimiento.

Finalmente, el proceso de selección consistirá en tomar los 15 mejores individuos de entre los 30 (15 padres + 15 hijos) individuos de la generación en curso. En caso de empate en la función de desempeño, se favorecerá a los individuos más longevos.

El paso de generaciones tendrá como resultado un ajuste en los pesos de la red neuronal, lo que dará lugar a un entrenamiento de la misma, que será lo que permitirá; a su vez, al programa a reconocer los patrones de las vocales dadas en una imagen GIF.