martes, 13 de mayo de 2014

Marvin Minsky y la computación neuronal.

Sara Pedrosa Sánchez. 

 

Marvin Minsky (Nueva York, 9 de agosto de 1927) es un informático, científico y escritor considerado uno de los padres de las ciencias de la computación. Cofundador en 2003 del CSAIL (laboratorio de inteligencia artificial del MIT (instituto tecnológico de Massachusetts)), recibió el premio Turing en 1969 y el premio Japón en 1990, así como el premio BBVA Fronteras del Conocimiento en Tecnologías de la Información y la Comunicación.

Marvin Minsky y su brazo tentáculo, el cual creó en 1968 en el CSAIL.

 
Fue uno de los fundadores en la década de los 50 del campo de la inteligencia artificial, con el objetivo de transformar los ordenadores de entonces, máquinas de calcular, en máquinas inteligentes, capaces de imitar la mente humana.

Basándose en la idea de que el cerebro es una máquina que se puede replicar, abordó el problema de dotar a estos aparatos de sentido común, dotándolos del conocimiento que el hombre adquiere mediante la experiencia. Además, es autor de contribuciones esenciales en matemáticas, ciencia cognitiva, robótica y filosofía.
Escribió junto a Seymour Papert el libro Perceptrones, el trabajo fundacional en el análisis de redes neuronales artificiales.



La computación neuronal.


 Es lógico pensar que si las máquinas fuesen capaces de simular el sistema de cómputo con el que nos ha dotado la naturaleza, basado en una enorme red de neuronas, estarían en condiciones de pensar tal y como lo hacemos las personas.
El funcionamiento de una neurona se podría comparar con el de un diodo con entradas ponderadas: si el potencial de las entradas (dentritas) alcanza un cierto valor se producirá una salida (axónes), de lo contrario no. La diferencia es que no todos los valores de las entradas van a tener la misma importancia de cara a decidir si se produce o no la salida.
Para que se produzca el aprendizaje, solo es necesaria una neurona. El aprendizaje consiste en modificar el valor de los pesos (importancia de cada entrada) aplicando un algoritmo a nuestro valor de salida. El psicólogo Donald O. Hebb enunció una regla según la cual “las conexiones que unen diferentes neuronas que se encuentran activas en un instante dado se fortalecen”. Se refiere a que si la neurona está transmitiendo, las entradas que están activas tendrán más importancia de la que ya tenían. Esto es, a grandes rasgos, la esencia de la computación neuronal, especialmente la no supervisada, la cual nos encontramos en la naturaleza.


Redes neuronales artificiales.

Denominadas habitualmente RNA (ANN en inglés). Son un paradigma de aprendizaje y procesamiento automático inspirado en la forma en que funciona el sistema nervioso de los animales.
Se trata de un sistema de interconexión de neuronas en una red que colabora para producir un estímulo de salida. En inteligencia artificial es frecuente referirse a ellas como redes de neuronas o redes neuronales.
Las redes neuronales consisten en una simulación de las propiedades observadas en los sistemas neuronales biológicos a través de modelos matemáticos recreados mediante mecanismos artificiales (como un circuito integrado, un ordenador o un conjunto de válvulas). Pueden ser desarrolladas tanto en software como en hardware y con ellas se pueden construir sistemas capaces de aprender, de adaptarse a condiciones variantes, o inclusive si se dispone de una colección suficientemente grande de datos, predecir el estado futuro de algunos modelos. El objetivo es conseguir que las máquinas den respuestas similares a las que es capaz de dar el cerebro que se caracterizan por su generalización y su robustez.



Se componen de unidades llamadas neuronas. Cada neurona recibe una serie de entradas a través de interconexiones y emite una salida. Esta salida viene dada por tres funciones:


  • Una función propagación (también conocida como función de excitación), que por lo general consiste en el sumatorio de cada entrada multiplicada por el paso de su interconexión (valor neto). Si el peso es positivo, la conexión se denomina excitatoria. Si es negativo, se denomina inhibitoria.
  • Una función de activación, que modifica a la anterior. Puede no existir, siendo en este caso la salida la misma función de propagación.
  • Una función de transferencia, que se aplica al valor devuelto por la función de activación. Se utiliza para acotar la salida de la neurona y generalmente viene dada por la interpretación que queramos darle a dichas salidas. Algunas de las más utilizadas son la función sigmoidea (para obtener valores en el intervalo [0,1] y la tangente hiperbólica (para obtener valores en el intervalo [-1, 1]).



En la práctica las redes neuronales artificiales no han creado en las máquinas comportamientos similares a los de las personas. Sin embargo, lo cierto es que los problemas que tradicionalmente son más complejos para las máquinas (visión artificial, reconocimiento del habla, etc.), se resuelven mejor utilizando redes neuronales que mediante otras perspectivas simbólicas.
La computación neuronal tiene como tarea genérica la clasificación y reconocimiento de patrones (búsqueda, clasificación, reconstrucción…). Por ejemplo, pensemos que queremos averiguar en qué imágenes está Wally y en qué imágenes no. Nuestras entradas serían las intensidades RGB de cada pixel de cada una de las imágenes, y tendría una única salida que nos diría si está o no.
Las redes neuronales tienen un modelo inherentemente distribuido, puesto que un procesador puede simular una neurona. Así mismo, son autoprogramables. La programación pasa por elegir un número de neuronas, las conexiones entre las mismas, un número de salidas, un número de entradas y una configuración inicial de pesos. Después bastaría con alimentarla correctamente y, si el aprendizaje es supervisado, darle la adecuada realimentación humana.




  • Aplicaciones
Son una tecnología computacional que puede utilizarse en un gran número y variedad de aplicaciones.  Son adecuadas para enfrentar problemas que hasta ahora eran resueltos solo por el cerebro humano y resultaban difíciles o imposibles para las máquinas lógicas secuenciales. Un procesamiento paralelo realizado por un gran número de elementos altamente interconectados, es la clave de su fucionamiento.
Cuando se implementan mediante hardware (redes neuronales en chips VLSI), presentan una alta tolerancia a fallos del sistema y proporcionan un grado de paralelismo en el proceso de datos muy grande.
Hay muchos tipos de redes neuronales pudiéndose clasificar en distintas disciplinas: biología, empresa, medio ambiente, finanzas, manufacturación, medicina, militar…
Las características de las RNA las hacen bastante apropiadas para aplicaciones en las que no se dispone a priori de un modelo identificable que pueda ser programado, pero se dispone de un conjunto básico de ejemplos de entrada (previamente clasificados o no). Asimismo, son altamente robustas tanto al ruido como a la disfunción de elementos concretos y son fácilmente paralelizables.


  • Caracteristicas.
Aprendizaje adaptativo. 
Una de las características más atractivas de las redes neuronales es que son sistemas dinámicos autoadaptativos. Son adaptables debido a la capacidad e autoajuste de los elementos procesales (neuronas) que componen el sistema, esto es, aprenden a llevar a cabo ciertas tareas mediante un entrenamiento con ejemplos ilustrativos.
Autoorganización.
Cuando las redes neuronales se usan para reconocer ciertas clases de patrones, autoorganizan la información usada. Emplean esta capacidad para autoorganizar la información que reciben durante el aprendizaje y/o la operación.
Tolerancia a fallos.
Las redes neuronales fueron los primeros métodos computacionales con la capacidad inherente de tolerancia a fallos. Las redes pueden aprender a reconocer patrones con ruido, distorsionados o incompletos (esta es una tolerancia a fallos respecto a los datos) y seguir realizando su función, aún con cierta degradación, aunque se destruya parte de la red.
Fácil inserción dentro de la tecnología existente.
Una red individual puede ser entrenada para desarrollar una única y bien definida tarea. Tareas complejas, que hagan múltiples selecciones de patrones, requerirán sistemas de redes interconectadas.



  • Evolución.
Los intentos por imitar el funcionamiento del cerebro han seguido la evolución del estado de la tecnología. Por ejemplo, al finalizar el siglo XIX se le comparó con la operación de la bomba hidráulica; durante la década de 1920 a 1930 se intentó utilizar la teoría de la conmutación telefónica como punto de partida de un sistema de conocimiento similar al cerebro.
Entre 1940 y 1950 los científicos comenzaron a pensar seriamente en las redes neuronales utilizando como concepto la noción de que las neuronas del cerebro funcionan como interruptores digitales (on-off) de manera también similar al recién desarrollado computador digital. Así nace la idea de “revolución cibernética” que maneja la analogía entre el cerebro y el computador digital.


1943: teoría de las redes neuronales artificiales.
Walter Pitts junto a Bertran Russell y Warren McCulloch intentaron explicar en funcionamiento del cerebro humano, por medio de una red de células conectadas entre sí, para experimentare ejecutando operaciones lógicas. Partiendo del menor suceso psíquico (estimado por ellos): el impulso todo/nada, generado por una célula nerviosa.
El bucle “sentidos-cerebro-músculos”, mediante la retroalimentación, producirían una reacción positiva si los músculos reducen la diferencia entre una condición percibida por los sentidos y un estado físico impuesto por el cerebro.
También definieron la memoria como un conjunto de ondas que reverberan en un circuito cerrado de neuronas.

1949: conductividad de la sinápsis en las redes neuronales.
Seis años después de que McCulloch y Pitts mostraran sus redes neuronales, el fisiólogo Donald O. Henn (de la McGill University) expuso que éstas (las redes neuronales) podían aprender. Su propuesta tenía que ver con la conductividad de la sinápsis, es decir, con las conexiones entre neuronas.
Hebb expuso que la repetida activación de una neurona por otra a través de una sinápsis determinada, aumenta su conductividad y la hace más propensa a ser activada sucesivamente, induciendo a la formación de un circuito de neuronas estrechamente conectadas entre sí.


1951: primera red neuronal.
El sobresaliente estudiante de Harvard, Marvin Minsky, conoció al científico Burrhus Frederic Skinner, con el que trabajó algún tiempo ayudándole en el diseño y creación de máquinas para sus experimentos. Minsky se inspiró en Skinner para gestar su primera idea “oficial” sobre inteligencia artificial, su Red Neuronal. Por aquel entonces entabló amistad con otro brillante estudiante, Dean Edmonds, el cual estaba interesado en el estudio de una nueva ciencia llamada Electrónica.

Durante el verano de 1951, Minsky y Edmonds montaron la primera máquina de redes neuronales, compuesta básicamente por 300 tubos de vacío y un piloto automático de un bombardero B-24. Llamaron a su creación SNARC; se trataba de nada menos que de una red de 40 neuronas artificiales que imitaban el cerebro de una rata. Cada neurona hacía el papel de una posición del laberinto y cuando se activaba daba a entender que la “rata” sabía en qué punto del laberinto estaba.



Una de las “neuronas” de la computadora SNARC. Imagen de Gregory Loan.




 Las neuronas que estaban conectadas alrededor de la activada, hacían la función de alternativas que seguir por el cerebro, la activación de la siguiente neurona, es decir, la elección entre “derecha” e “izquierda” en este caso estaría dada por la fuerza de sus conexiones con la neurona activada.



Por ejemplo, la “rata” completaba bien el recorrido eligiendo a partir de la quinta neurona la opción “izquierda” (que correspondería a la sexta). Es entonces cuando las conexiones entre la quinta y la sexta se hacen más fuertes (dicha conexión era realizada por el piloto automático), haciendo desde este momento más propensa esta decisión en un futuro.

Pero las técnicas Skinnerianas (que eran las que se habían puesto en funcionamiento en esta red de neuronas) no podrían llevar muy lejos a este nuevo engendro. La razón pasa porque esto, en sí, no es inteligencia, pues la red neuronal nunca llegaría a trazar un plan.

Después de su red neuronal, Minsky escribió su tesis doctoral acerca de esta, en ella describía “cerebros mucho mayores”, exponiendo que si se realizada este proyecto a gran escala, con miles o millones de neuronas con más y con diferentes censores y tipos de retroalimentación, la máquina podría ser capaz de razonar, mas él sabía que la realización de esta red neuronal era imposible y decidió buscar otra forma de crear inteligencia.


 

Redes neuronales e Inteligencia Artificial.


La inteligencia artificial es un intento por descubrir aspectos de la inteligencia humana que pueden ser simulados mediante máquinas. Las redes neuronales no son más que otra forma de emular ciertas características propias de los humanos, como la capacidad de memorizar y de asociar hechos.


Entre la inteligencia artificial y las redes neuronales hay diferentes tecnologías o áreas de conocimiento. Las redes de autoproceso son aquellas formadas por nodos en los que hay elementos procesadores de información de cuyas interacciones locales depende el comportamiento del conjunto del sistema.
El procesamiento simbólico representa un alto nivel de proceso cognitivo: corresponde al pensamiento consciente, donde se representa, manipula y examina el conocimiento. Por el contrario, en el procesamiento numérico, las redes reciben directamente la señal de entrada desde el exterior y operan sobre ella. Esta rama se dedica a los sistemas constituidos por nodos hardware interconectados entre sí formando una red.
Si la conexión entre los nodos se realiza agrupándolos en subredes, se denominan sistemas asociativos o redes de redes, mientras que si la conexión se realiza de forma global bajo unas reglas de composición, estamos ante sistemas distribuidos. Además de las ya nombradas redes neuronales, dentro de los sistemas distribuidos encontramos las redes subsimbólicas, que se orientan a simular los elementos de más bajo nivel que componen o intervienen en los procesos inteligentes.


 


Implicaciones filosóficas de la creación de redes neuronales.


La mayoría de la gente piensa que las computadoras nunca serán capaces de pensar.  Sin duda, la mayoría de la gente también está de acuerdo en que las computadoras pueden hacer muchas cosas para las cuales una persona debería pensar. Entonces, ¿cómo podría una máquina hacer como que piensa sin hacerlo realmente? Dejando a un lado la cuestión de qué es pensar exactamente, lo que la mayoría de nosotros responderíamos a esa cuestión es que en esos casos, lo que está haciendo el computador es una mera imitación superficial de la inteligencia humana. Ha sido diseñado para obedecer determinados comandos simples y se le han proporcionado programas compuestos por esos comandos. Debido a esto, el computador debe obedecer esas órdenes o comandos, pero sin tener idea de lo que está sucediendo.

En efecto, cuando las computadoras aparecieron por primera vez, la mayoría de sus diseñadores las destinaron únicamente para realizar grandes computaciones sin ir más allá. De ahí el nombre de las computadoras. Incluso entonces, algunos pioneros –en especial Alan Turing- concibieron lo que conocemos ahora como Inteligencia Artificial o IA. Vieron que los computadores podrían posiblemente ir más allá de la aritmética e imitar quizás los procesos que se llevan a cabo dentro del cerebro humano.

Hoy en día, con los robots en la industria y el cine, la mayoría de las personas piensas que la IA ha ido mucho más lejos de lo que ha ido en realidad. Sin embargo, todavía expertos en computación afirman que las máquinas nunca llegarán a pensar. Si es así, ¿cómo podrían ser tan inteligentes, y a la vez tan estúpidas?


  • ¿Pueden las máquinas ser creativas?

Naturalmente, las personas admiramos a nuestros Einsteins y Beethovens e imaginamos si los computadores podrían llegar a crear teorías o sinfonías tan maravillosas como las suyas. La mayoría de la gente piensa que la creatividad requiere de un “don” especial o mágico que simplemente no puede ser explicado. De ser así, ningún computador podría crearlo, teniendo en cuenta que para la mayoría de la gente cualquier cosa que una máquina pueda hacer, podrá ser explicada.

Para ver qué es lo incorrecto de esta teoría, debemos evitar una equivocación bastante extendida. No solo debemos observar los trabajos que nuestra cultura acepta como muy buenos; antes debemos obtener buenas impresiones acerca de cómo personas ordinarias hacen cosas ordinarias. No podemos esperar que, de repente, averigüemos cómo los grandes compositores escriben las grandes sinfonías. No hay una gran diferencia entre el pensamiento ordinario y el altamente creativo. No hay que culpar a nadie por no ser capaz de hacer todo lo que la gente creativa puede. Tampoco por no ser capaces de explicarlo. Hay que objetar la idea de que, solo porque no seamos capaces de explicarlo en este instante, nadie va a ser capaz de encontrar una explicación nunca a cómo funciona la creatividad. 


Escena de la película Yo, Robot de Alex Proyas, basada 
en la serie de relatos de Isaac Asimov.
Nuestra admiración por los grandes genios como Beethoven o Einstein no debería intimidarnos. En su lugar, debería molestarnos nuestra ignorancia en cuanto a cómo captamos las ideas (y no solo las creativas). Estamos tan acostumbrados a las maravillas de lo inusual que olvidamos lo poco que sabemos sobre las maravillas del pensamiento ordinario. Quizás nuestras supersticiones sobre la creatividad sirven a otro fin, como el proporcionarnos héroes con cualidades tan especiales que, de alguna forma, hagan más excusables nuestras deficiencias.
 













 
  • ¿Son los humanos conscientes de sí mismos?

La mayoría de las personas asumen conscientes de su existencia, o conscientes de sí mismos; en todo caso podrían simplemente simularlo. Por supuesto esto da por hecho que nosotros, como humanos, somos conscientes de nuestra existencia, pero ¿lo somos realmente?
Si por conciencia nos referimos a saber lo que hay en nuestras mentes entonces, como cualquier psicólogo clínico sabe, las personas solo somos ligeramente conscientes de nosotros mismos y la mayoría de lo que pensamos sobre nosotros son conjeturas. Tendemos a establecer redes de teorías sobre lo que hay en nuestra mente y confundimos estas visiones aparentes con lo que realmente está ocurriendo. Para ser francos, la mayoría de cosas que nuestro conocimiento nos revela son “invenciones”. Ahora bien, no es que no seamos conscientes de lo que vemos u oímos, o incluso de algunas partes del pensamiento. Solo que no somos conscientes de las muchas cosas que ocurren en nuestra mente.

Cuando las personas hablamos u observamos, la parte física es bastante clara, todos somos capaces de comprender el funcionamiento de estos procesos. Pero sigue habiendo un problema complicado. ¿Qué entidad o mecanismo sigue a partir de ahí? Estamos acostumbrados a decir simplemente que es el “yo”. ¿Cuál es el problema con esa idea? Nuestro concepto estándar del yo es que en las profundidades de cada mente un yo central, especial, que hace el verdadero trabajo mental por nosotros; un pequeño individuo en las profundidades de nuestra mente que escucha, ve y entiende lo que está ocurriendo en cada momento. Marvin Minsky llamó a esto la teoría del “Agente Solitario”. No es difícil ver por qué todas las culturas se apegan a esta idea. No importa lo ridículo que pueda parecer científicamente, esta idea subyace a todos los principios de la ley, el trabajo y la moral. Sin esto, todos nuestros cánones de responsabilidad se desbaratarían, para bien o para mal. Sin este mito, ¿de qué serviría el resolver problemas? ¿Cómo podríamos tener sociedades como las conocidas hasta ahora?


El problema es que no podemos construir buenas teorías sobre la mente de esta manera. El cualquier campo, como científicos que somos estamos siempre forzados a reconocer que lo que vemos de forma individual, como las piedras, las nubes o incluso las mentes, deben ser descritas a veces como parte de un todo formado por otro conjunto de cosas. Tenemos que entender que el yo, por sí mismo, no es una sola cosa.


  • Computadores conscientes de sí mismos.

 La gente suele pensar que no es posible programar un computador para que sea consciente de sí mismo, pero ¿y si dijéramos que las máquinas son capaces, en principio, de tener una mayor y mejor consciencia de la que tienen las personas?


Esto podría hacerse dotando a las máquinas de modos de examinar sus propios mecanismos mientras trabajan. En principio, al menos, esto parece posible; de hecho ya tenemos algunos programas simples de IA que pueden entender un poco el funcionamiento de programas más sencillos. El problema es que todavía sabemos muy poco como para hacer programas con suficiente sentido común como para entender cómo funcionan los programas de solución de errores en IA actuales. Pero una vez que aprendamos a construir máquinas lo suficientemente inteligentes como para entender estas cosas, no tiene por qué haber ningún problema en darles la autocomprensión que necesitarían para entenderse, modificarse y mejorarse a sí mismas. 


Aun tiene que pasar mucho tiempo hasta que aprendamos lo suficiente sobre el razonamiento desde el sentido común para hacer máquinas tan inteligentes como lo son las personas. Hoy en día sabemos bastante sobre la creación de sistemas expertos útiles y especializados, pero aún no sabemos cómo hacerlos capaces de mejorarse a sí mismos de forma interesante. Aún así, cuando respondamos a esas preguntas, tendremos que afrontar una incluso más extraña. Cuando aprendamos el cómo, ¿deberíamos construir máquinas que pudiesen ser de alguna forma “mejores” que nosotros mismos? Tenemos suerte de poder dejar esa elección a futuras generaciones.

Así como la evolución cambió la visión que el ser humano tenía de la vida, la Inteligencia Artificial cambiará la visión de nuestras mentes sobre la Mente en sí. Conforme encontremos formas de hacer que las máquinas se comporten de forma más sensible, iremos aprendiendo más sobre nuestros procesos mentales. Encontraremos nuevas formas de pensar en el pensamiento y en los  sentimientos. Nuestra visión de ellos pasará de misterios opacos a redes de representación y uso de ideas complejas, pero comprensibles. Entonces esas ideas, sucesivamente, llevarán a nuevas máquinas, y éstas nos llevaran a nuevas ideas. Nadie puede saber a dónde nos conducirá todo esto, pero una cosa es segura: hoy en día, no tiene sentido la necesidad de buscar diferencias básicas entre la mente de los humanos y las posibles mentes de las máquinas.
 


Enlaces de Interés. 

 Traducción de la entrevista que Jeremy Bernstein hizo con Marvin Minsky a propósito de la creación de la SNARC - The New Yorker, Dic 14, 1981. Pag 69.
https://www.dropbox.com/s/47u1n8kc6zcr1nv/entrevista%20Jeremy%20Bernstein%20con%20Marvin%20Minsky%20.pd


Página personal de Marvin Minksy.


Software de simulación de redes neuronales.
SNNS (Stuttgart Neural Network Simulator).
Es un simulador de software de redes neuronales para estaciones de trabajo Unix, desarrollado por el Instituto de Sistemas Paralelos y Distribuidos de Alto Rendimiento (IPVR) de la Universidad de Stuttgart.
El objetivo del proyecto SNNS es crear un entorno de simulación eficiente y flexible para la investigación y aplicación de las redes neuronales.

 

FANN Fast Artificial Neural Network Library (librería rápida de redes neuronales/neurales artificiales).
Es una librería de redes neuronales gratuita y de código abierto, la cual implementa redes neurales artificiales de múltiples capas en C con soporte para redes tanto completamente como escasamente conectadas. Es compatible con una ejecución multiplataforma tanto en punto fijo como flotante.
Incluye un marco de trabajo para manejar los datos con facilidad. Es fácil de usar, versátil, bien documentado y rápido. Pone a disposición del usuario más de 20 lenguajes de programación.



 

Bibliografía.

Wikipedia: la enciclopedia libre,  Marvin Minsky, http://es.wikipedia.org/wiki/Marvin_Minsky (04-2014)

CyberneticZoo, 1951 – SNARC Maze Solver – Minsky / Edmonds (American), http://cyberneticzoo.com/mazesolvers/1951-maze-solver-minsky-edmonds-american/ (04-2014)

Michael B. Farrell. The Boston Globe, MIT artificial intelligence, robotics pioneer feted, http://www.bostonglobe.com/business/2014/01/15/mit-professor-marvin-minsky-wins-award/aSiCSHIjlGycOGYmeLSZ5L/story.html (04-2014)


Stefanie Chiou, Craig Music, Kara Sprague, Rebekah Wahba. Bret Victor, beast of burden, A Marriage of Convenience: The founding of the MIT artificial Intelligence laboratory, http://worrydream.com/refs/FoundingOfTheAILab.pdf (04-2014)

Patrick Henry Winston. A. M. Turing Award, Marvin Minsky, http://amturing.acm.org/award_winners/minsky_7440781.cfm (04-2014)

David Arroyo Menéndez. David Arroyo Menéndez, Aplicaciones Prácticas de la Inteligencia Artificial, http://www.davidam.com/docu/aplic-ia/neuronal.html (04-2014) 

Sociedad Andaluza de Educación Matemática Thales, Introducción a la computación neuronal, http://thales.cica.es/rd/Recursos/rd98/TecInfo/07/capitulo1.html (04-2014)

Edgard Iván Benítez Guerrero. Universidad Veracruzana, IA: Conocimiento y razonamiento. 4. Otras representaciones de conocimiento, http://www.uv.mx/personal/edbenitez/files/2010/11/CursoIA10-III-4.pdf (05-2014)

Hilera J. R., Martínez V. J. (1995). Redes Neuronales Artificiales: Fundamentos, modelos y aplicaciones. Ra-ma.

S. Russel (1996). Inteligencia Artificial: un enfoque moderno. Prentice Hall.

Manuel de la Herrán Gascón (2005). Arena Sensible, REDcientífica.

Damián Jorge Matich. Facultad Regional Rosario: universidad tecnológica nacional, Redes neuronales: Conceptos básicos y aplicaciones, http://www.frro.utn.edu.ar/repositorio/catedras/quimica/5_anio/orientadora1/monograias/matich-redesneuronales.pdf (04-2014)

Henry Mancheno. Slideshare, Redes Neuronales, http://www.slideshare.net/HB09/redes-neuronales-1514651 (04-2014)

Marvin L. Minsky (1982).  Why people think computers can’t,  AI Magazine, 3(4).

Marvin L. Minsky (1991). Conscious Machines, Machinery of Consciousness.

Marvin L. Minsky (1994). Will Robots Inherit the Earth?, Scientific American.





lunes, 12 de mayo de 2014

Origen de los lenguajes de programación

El origen de los lenguajes de programación se remonta a mediados del siglo XIX, fruto de la idea del británico Charles Babagge, quien es considerado como “El Padre de la Computación”. Babagge fue un profesor matemático de la universidad de Cambridge e inventor que al principio del siglo XIX predijo muchas de las teorías en las que se basan los actuales ordenadores.
Su primer intento de construir un “computador” fue la máquina diferencial. La presentó en la Royal Astronomical Society en 1822 y su función era tabular polinomios usando un método numérico llamado el método de las diferencias. No llegó a ser terminada puesto que los engranajes internos disponibles no eran suficientemente buenos y porque Babbage cambiaba constantemente el diseño de la máquina.
Después del intento de la máquina diferencial, intentó entre 1833 y 1842 la construcción de una máquina que fuera programable para hacer cualquier tipo de cálculo, la que llamó la máquina analítica. Estaba basada en el telar de Joseph Marie Jacquard, quien en 1801 creó un telar que utilizaba en tarjetas perforadas para representar los movimientos de un brazo de la máquina de tejer, con el objetivo de generar patrones decorativos automáticamente.
Esta máquina tenía dispositivos de entrada basadas en las tarjetas perforadas del telar de Jacquard, un procesador aritmético, una unidad de control que determinaba qué tarea se debía realizar, un mecanismo de salida y una memoria para almacenar números hasta ser procesados. Esta máquina no fue construida hasta mediados del siglo XX debido a los pocos medios de la época y a la poca financiación. En 1842, Ada Lovelace escribió varios programas para esta máquina, por lo que es considerada la primera programadora de la historia.

Máquina analítica de Babbage, construida por su hijo

En 1936 Alan Turing diseñó la máquina de Turing, la que estableció las bases para almacenar programas como datos en la arquitectura de von Neuman. Hubo que esperar hasta la década de 1940 para que se crearan las primeras computadoras modernas, con alimentación eléctrica, las que se programaban con lenguaje ensamblador muy afinado.
A mediados de la década de 1950, John W. Backus quiso desarrollar una alternativa más práctica que la utilización de tediosos lenguajes de ensamblador, por lo que propuso a sus superiores en IBM la creación de un lenguaje de mayor nivel para programar el computador IBM 704. En 1956 apareció el primer manual del que sería el primer lenguaje de programación de alto nivel, FORTRAN.
Este lenguaje cambió la forma de concebir la programación, pues ya no era el programador quien escribía el lenguaje máquina, si no que éste era traducido mediante un compilador. Muchos clientes fueron en un principio reacios a este cambio, pues pensaban que el compilador generaría más código ensamblador que escribir directamente en ensamblador. Sin embargo, esto redujo en un factor 20 el número de sentencias de programación necesarias para operar una máquina.
Este lenguaje fue ampliamente adoptado por los científicos para escribir programas con gran cantidad de números, lo que incentivó a escritores de compiladores a diseñar compiladores que generaran un código más rápido y eficiente. Poco a poco se fueron introduciendo mejoras y nuevas funcionalidades, como tipos de datos y aritmética de números complejos, lo que amplió cada vez más la gama de aplicaciones para las que el lenguaje se adaptaba.
Un ejemplo de programa FORTRAN es el siguiente:

REGRESION LINEAL.FORTRANS
APLICACION
     DIMENSION TIEMPO(1000),PROD(1000)
        OPEN(1,FILE='HISTORIA.txt')
        I=0
 10     READ(1,*,END=80)T,P
        I=I+1
        TIEMPO(I)=T
        PROD(I)=P
        GO TO 10
 80     NDATOS=I
        CALL AJULIN(TIEMPO,PROD,NDATOS,A,B)
        WRITE(*,90)A,B
 90     FORMAT('LA ECUACION ES:Y=',F10.2,'+',F10.2,'X')
 20     FORMAT(20F10.0)
        END

        SUBROUTINE AJULIN(X,Y,N,A,B)
         DIMENSION X(1),Y(1)
          SUMX=0.
          SUMY=0.
          SUMX2=0.
          SUMY2=0
          SUMXY=0
        DO 20 I=1,N
         SUMX=SUMX+X(I)
         SUMY=SUMY+Y(I)
         SUMX2=SUMX2+(X(I)*X(I))
         SUMY2=SUMY2+Y(I)**2
         SUMXY=SUMXY+(X(I)*Y(I))
 20    CONTINUE
        PROD=SUMX*SUMY
        B=(SUMXY-PROD/N)/(SUMX2-SUMX**2/N)
        A=(SUMY/N-B*SUMX/N)
       RETURN
       END

En esta década también se empezó a diseñar otro lenguaje de alto nivel llamado Lisp. Su creador fue John McCarthy allá por el 1958. Su nombre viene de LISt Processing (procesamiento de listas), pues este lenguaje emplea las listas como su estructura de datos más importante, de hecho su código fuente está compuesto de listas. Fue creado originalmente como una notación matemática práctica para los programas de computadora, aunque poco a poco ha ido incorporando mayores funcionalidades, llegando a ser el lenguaje preferido para la investigación en Inteligencia Artificial. Fue pionero, además, en muchas ideas en ciencias de la computación, como estructuras de datos de árbol, el manejo de almacenamiento automático, los tipos dinámicos y el compilador auto contenido.
El lenguaje se caracteriza, además de por las listas, por su sintaxis completamente entre paréntesis. Además introdujo la estructura IF THEN ELSE de una forma más general (la estructura cond).
Dos ejemplos de programas Lisp son:

*******************************************************************
Definición de la función:
  (defun vacia (l)
    (cond ((null l) 1)    ; si la lista esta vacia devuelve 1
          (t 0)))         ; en otro caso (lista llena) devuelve 0
 
Llamada a la función:
  (vacia '(1 3 4))        ; La lista no esta vacia, devolvería 0
  (vacia '())             ; La lista esta vacia, devolvería 1
*******************************************************************
;        ---FACTORIAL----
(defun factorial (n)
   (if (= 0 n)
     1                            ; caso base
     (* n (factorial (- n 1)))))  ; caso recursivo

(factorial 4)              ;esto nos devolvería 24=4*3*2*1
*******************************************************************

En mayo de 1959 se creó en Estados Unidos una comisión llamada CODASYL (Conference On Data Systems Languages), quienes, junto con el Departamento de Defensa de Estados Unidos crearon COBOL (COmmon Business-Oriented Language). Éste era un lenguaje orientado completamente a negocios y fue llamado COBOL-60 en su primera versión por su año de lanzamiento.
COBOL fue ganando usuarios según fueron pasando los años. Hubo varias revisiones en distintos años (1961, 1963 y 1965), dando lugar a varias versiones del lenguaje. Todas las anteriores dieron paso a la primera versión Standard la cual nació en 1968, a su vez ésta fue revisada en 1974 y fue denominada COBOL ANSI o COBOL-74. La última versión revisada es la de 1985 llamada COBOL-85.
Características de este lenguaje son:
  •  Dotado con grandes capacidades de autodocumentación.
  •  Buena gestión de archivos y de tipos de datos para la época a través la de sentencia PICTURE.
  • Más tarde, en 2002, se le añadió orientación a objetos.

Un ejemplo de programa COBOL es:

IDENTIFICATION DIVISION.
PROGRAM-ID. HOLAMUNDO.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION. 
PROCEDURE DIVISION.
        DISPLAY 'Hola mundo'.
        STOP RUN.


Alrededor de las décadas de los 60 y 70, IBM creó un nuevo lenguaje de programación de nivel alto llamado PL/I (Programming Language 1). Nació como parte del desarrollo de la arquitectura system 360, fabricada por IBM en aquel tiempo.
Su desarrollo fue llevado a cabo en los laboratorios hursley, ubicados en el reino unido y propiedad de IBM, y su diseño iba orientado a satisfacer las necesidades existentes en las aplicaciones científicas y comerciales. Esta necesidad, era producida debido a que los lenguajes de programación antecesores a este, como por ejemplo Cobol y Fortran, podían resolver problemas de carácter científico o comercial, pero era necesario realizar aplicaciones que pudieran resolver tanto los problemas de carácter científico, como los referentes al negocio, y dado esto se procedió a realizar este lenguaje.
Este lenguaje tenía muchas de las características que más adelante adoptaron lenguajes como C y C++. Entre ellas estaba el multiprocesamiento, la recursión, estructuras de control modernas, asignación dinámica de espacio para estructuras de datos, procedimientos, etc. No fue muy utilizado fuera de IBM, puesto que registraron el nombre del lenguaje para mantener el control sobre su desarrollo. Fue probablemente el primer lenguaje comercial cuyo compilador estaba escrito en el lenguaje que compilaba.
Un ejemplo de programa PL/1 es:

Test: procedure options(main);
   declare My_String char(20) varying initialize('Hola, mundo!');
   put skip list(My_String);
 end Test;

Miguel Martínez del Horno

Bibliografía



domingo, 11 de mayo de 2014

La computación neuronal.

Muchas tareas relacionadas con la inteligencia y el reconocimiento de patrones son extremadamente dificiles de automatizar, pero parecen ser fácilmente llevadas a cabo por los animales. Por ejemplo, los animales pueden reconocer objetos o entender la mayor parte de la información visual en su entorno. Por tanto, parece lógico pensar que un sistema que intente llevar a cabo tareas similares se beneficiará enormemente de entender cómo los animales realizan estas tareas y de simular los procesos que se llevan a cabo para realizarlas.

Con este objetivo en mente surge el modelo de la Computación Neuronal, también conocido como el modelo de las Redes Neuronales Artificiales. Este modelo esta inspirado en el sistema nervioso, en especial, en las redes de neuronas que forman este sistema. Una Red Neuronal Artificial esta formada por elementos con comportamiento que pretende imitar al de una neurona biológica, siendo capaces de aprender de la experiencia, generalizar, permitiendo un buen comportamiento ante pequeñas variaciones y abstraer, obteniendo la esencia ante un conjunto de entradas. Antes de comenzar a explicar cómo funciona una red neuronal artificial, vamos a explicar brevemente como funcionan las neuronas naturales.

Esquema de una neurona. Traducido de la creación de BruceBlaus (Licencia CC-BY).
Disponible en: http://goo.gl/oL7W32 

La neurona es la unidad fundamental del sistema nervioso y, en particular del cerebro. Se puede ver como una simple unidad de procesamiento. Una neurona típica esta compuesta de un cuerpo celular, o soma, un axón de forma tubular y multitud de dendritas, como se muestra en la figura. El axón es esencialmente un tubo largo que se ramifica en botones sinápticos que casi tocan a las dendritas de otras neuronas. Este pequeño hueco que queda entre la dendrita y el axón se llama sinapsis y es a través del cual se transmite la información. Esta información se transmite mediante estímulos. Cuando a una neurona le llegan estímulos de otras neuronas esta combina los estímulos y si el estímulo resultante es suficientemente fuerte, la neurona produce un estímulo de salida que envía por su axón.

 Nuestro cerebro esta compuesto por unas 10 billones de estas neuronas conectadas cada una de estas con, entre 100 y 100000. Es decir, 10 billones de pequeñas unidades procesadoras, muy simples y muy interconectadas. Esta interconexión, esta red, permite realizar las tareas tan complejas que caracterizan a los animales y sobre todo, a los seres humanos. Y es en esta red de pequeñas unidades de procesamiento en la que se inspira el modelo de las Redes Neuronales Artificiales.

Esquema de un perceptrón. Creación de Mayranna (CC-BY-SA).
Disponible en: http://goo.gl/Ocyqy6 
Los primeros investigadores en desarrollar el primer modelo matemático de neurona fueron Warren McCulloch y Walter Pitts, en el año 1943, y del cual se han obtenido un gran número de modelos derivados entre los que podemos destacar el Perceptrón, introducido por Frank Rosenblatt en 1958, padre de la red neuronal del mismo nombre. En palabras de Rosenblatt, el perceptrón es una máquina que aprende, usando ejemplos, a clasificar unas entradas en diferentes clases usando una función lineal de la entrada. Concretamente, el perceptrón recibe una serie de entradas, lo que se conoce como vector de entrada. Cada entrada tiene asignado un peso (vector de pesos), el cual nos permite simular la fuerza de las conexiones en el aprendizaje sináptico. Las entradas, modificadas por los pesos, se suman (combinación) y se produce una salida. Esta salida se realiza mediante una función de transferencia, que en el caso del perceptrón es un simple umbral, haciendo analogía al comportamiento natural de la neurona. Si la entrada es suficientemente fuerte, se activa la salida.

De esta forma, una Red Neuronal Artificial, consiste en un conjunto interconectado de estas unidades de procesamiento, en cuya conexión radica la utilidad de la red. Normalmente estas redes se organizan en capas, distinguiéndose:
  • La capa de entrada: por donde se presentan los datos a la red.
  • La capa de salida: que ofrece la respuesta de la red a una entrada determinada.
  • Las capas ocultas: que son las capas intermedias de la red.
Esquema genérico de una red neuronal. Traducido de la creación de Kjell Magne Fauske (Licencia CC-BY).
Disponible en: http://goo.gl/deLGNC
 
Además de la topología de la red, un factor determinante en la salida de esta son los pesos de las neuronas artificiales, que fueron comentados anteriormente. La mayoría de los métodos para el aprendizaje de estos pesos están relacionados con el análisis de la correlación y la técnica de descenso de gradiente. Así Hebb, en 1949 propone un método para modificar los pesos cuando dos nodos conectados están simultáneamente activados y Frank Rosenblatt, en 1958, propone un modelo de aprendizaje de estos pesos basado en el método de descenso de gradiente.
Normalmente, la red aprende estos pesos a base de ejemplos de entrenamiento, modificándolos de forma que se aproximen a la función de salida deseada. Para llevar a cabo este entrenamiento hay, básicamente, dos mecanismos:
  • Supervisado: En el que proveemos a la red con las entradas y salidas deseadas y se modifican los pesos paulatinamente para aproximarse a la función deseada.
  • No supervisado: Al que solo proveemos con las entradas y la red se ajusta de forma que entradas similares produzcan salidas similares.
Esquema de una red Perceptrón simple.
Traducido de la creación de Al456.
(Licencia CC-BY-SA)
Disponible en: http://goo.gl/yC45ka
Veamos un ejemplo del primer tipo de aprendizaje con la Red Perceptrón, introducida por Frank Rosenblatt. Esta red fue la primera red neuronal con capacidad de aprender. Esta formada únicamente por neuronas de entrada y por neuronas de salida. Las neuronas de entrada normalmente tienen dos estados, ON y OFF, mientras que las neuronas de salida usan como función de transferencia un umbral (son Perceptrones). Estas redes, por su simplicidad solo pueden resolver problemas lineales o que se pueden aproximar mediante una línea recta. Para el aprendizaje de los pesos se utiliza, como adelantamos anteriormente, aprendizaje supervisado, ajustando los pesos mediante un algoritmo de descenso de gradiente. Muy generalmente, este algoritmo intenta hacer mínima una función del error cometido al clasificar ejemplos de prueba. Este método consiste en ir dando pasos que cada vez nos acerquen más al mínimo de la función a minimizar (en el caso de que la función tenga un solo mínimo, llegaríamos al óptimo global). Una ilustración de este mecanismo se puede ver en la siguiente figura.

Ilustración del método de descenso de gradiente (Dominio Público).
Disponible en: goo.gl/VID2PD
La red Perceptrón fue estudiada en profundidad por Marvin Lee Minsky, autor del libro Perceptrons, e investigador reconocido en diversos campos de las ciencias cognitivas, y al el que se le atribuyen invenciones como la primera Head-mounted Display o SNARC (Stochastic Neural Analog Reinforcement Calculator) una red neuronal implementada en hardware. El libro Perceptrons, llevo a mucha controversia en el campo de la inteligencia artificial, contribuyendo, según varios autores, al Invierno de la Ingeligencia Artificial. En este libro se realizaban una serie de predicciones pesimistas, basándose en el hecho de que la red Perceptrón básica no podía implementar la función lógica XOR. Esto es así debido a que la red Perceptrón básica solo puede trabajar con problemas para los que las salidas puedan separarse mediante una línea recta. Se puede ver un ejemplo en la siguiente figura.

Gráfica de solución de un problema de separación lineal. Obra derivada de otra de Dominio Público.
Disponible en: goo.gl/gp7kFH

Pero las salidas de la función XOR no pueden separarse por una linea recta, como se puede ver en la siguiente figura.

Ejemplo de intento de separación de la función XOR. Creación propia. 

Sin embargo, el rumbo que torno la inteligencia artificial debido a estos pronósticos resulto erróneo cuando nuevos descubrimientos demostraron que el libro se equivocaba en algunas de estas predicciones.
En la actualidad existen muchos otros ejemplos de redes neuronales que mejoran la red Perceptrón. En especial, habría que hablar de las redes neuronales en las que el aprendizaje se realiza mediante la técnica de backpropagation introducida en 1974 por Paul Werbos, David E. Rumelhart, Geoffrey E. Hinton y Ronald J. Williams, que llevo a un renacimiento en la investigación en redes neuronales. Esta investigación decayó durante principios del siglo XXI pero se ha vuelto a poner de moda en la actualidad, gracias a la gran capacidad de cómputo actual y al uso de las GPUs para aumentar el rendimiento. Dicho esto, gracias a la investigación en redes neuronales, estas se han convertido en métodos muy poderosos, incluso llegando a convertirse su uso en un estándar de facto en aplicaciones relacionadas con el procesamiento del lenguaje natural, compresión de imágenes, reconocimiento de caracteres, reconocimiento de patrones en imágenes, problemas combinatorios, modelos económicos, y un largo etc. Pero no solo las redes neuronales son importantes en el campo de la informática. Estas se han usado también en campos como la neurología y la psicología para simular partes del cerebro e investigar sobre los mecanismos internos de este.

Enrique González Rodrigo

Bibliografía:

Kishan Mehrotra, Chilukuri K. Mohan, Sanjay Ranka. Elements of artificial Neural Networks. ISBN: 0-262-13328-8

V.Cheung, K. Cannons. An introduction to Neural Networks.University of Manitoba.
Disponible en: http://www2.econ.iastate.edu/tesfatsi/NeuralNetworks.CheungCannonNotes.pdf

E. Roberts. Neural Networks. Disponible en:
http://cs.stanford.edu/people/eroberts/courses/soco/rojects/neural-networks/index.html

X. Basogain Olabe. Redes Neuronales Artificiales y sus aplicaciones. Escuela Superior de Ingeniería de Bilbao. Disponible en:
http://cvb.ehu.es/open_course_ware/castellano/tecnicas/ redes_neuro/contenidos/pdf/libro-del-curso.pdf

G. Orr. Neural Networks. Willamette University. Disponible en: http://www.willamette.edu/~gorr/classes/cs449/intro.html

Colaboradores de Wikipedia. Marvin Minsky. Wikipedia. Disponible

Wikipedia Contributors. Perceptrons (book). Disponible en: