redes neuronales - Tienda de ultramarinos
logo Tienda de Ultramarinos
Etiquetas: redes neuronales

Mi Proyecto Fin de Carrera: Asistente para Redes MLP


ACTUALIZACIÓN POSTERIOR: Cuelgo la presentación que hice para la defensa del PFC. Igual queda más claro en qué consiste.


Bueno, como cada vez queda menos tiempo (el 12 de noviembre es la última fecha para entregar) y no sé si me dará tiempo de escribir el post sobre el Perceptrón Multicapa, me lo salto y voy a intentar explicar en qué consiste mi Proyecto Fin de Carrera; así los que me preguntan qué estoy haciendo, tienen aquí una clara (espero) explicación.

Esta semana he empezado con la documentación, y esto que pego más adelante es un primer intento de lo que será la Descripción (y Justificación) del Proyecto en la Memoria. No creo que cambie mucho la cosa.

Un posible nombre descriptivo del PFC en sí, podría ser:

Asistente para modelado de redes neuronales MLP mediante computación distribuída.

Las actividades esenciales en las que va a consistir el programa son:

  • Interfaz gráfica para facilitar el desarrollo de las redes MLP;
  • Generación automática de modelos distintos en base a los parámetros;
  • Computación distribuida de los diferentes modelos;
  • Selección automática de la red más eficiente;
  • Muestra por pantalla de los parámetros significativos de la mejor red.

Las redes neuronales (como expliqué en un anterior post) se definen por una amplia cantidad de caracteres que implican un enorme y complejo número de cálculos con ellos, lo cual significa que es muy difícil predecir exactamente el comportamiento que tomará la red con diferentes parámetros. Además, puesto que la elección de algunos es dejada al azar —como los pesos entre cada neurona— también es necesario entrenar varias veces un mismo modelo de red (con todos los parámetros igual salvo aquellos que se dejan al azar) para tratar de obtener mejores resultados.

Otro factor importante es que el cálculo del entrenamiento no se realiza inmediatamente sino que conlleva un tiempo de procesamiento nada despreciable, la elaboración de una buena red neuronal con una salida eficiente requiere unas elevadas dosis de ensayo/error; resultando una tarea harto tediosa, y que consume mucho tiempo.

Además la herramienta utilizada para el entrenamiento y ejecución de las redes —entorno/lenguaje estadístico R— funciona como lenguaje de scripting, y dado el creciente pánico y temor de la mayoría de usuarios ante la introducción de comandos en consola, y lo pesado de definir múltiples redes distintas mediante este sistema, se creará una interfaz gráfica que lo facilite.

Por todo ello, surge la necesidad de automatizar esta tarea, permitiendo la preselección de varios modelos —mediante una GUI/IGU (Graphical User Interface/Interfaz Gráfica de Usuario)— que se entrenen secuencialmente sin la constante intervención del usuario. Se permitirá la preselección de los diversos parámetros para formar las distintas redes que se desee testear, dejando que las máquinas lo calculen por sí mismas.

Dado que el total de redes puede ser bastante alto, lo que implicaría un altísimo tiempo de procesamiento, es necesario buscar una solución basada en la computación distribuida, en la que todos los modelos escogidos por el usuario se evaluen en varios servidores de cálculo repartidos en distintos ordenadores.

La solución presentada en este proyecto, va un paso más, y no sólo entrena todas las redes, sino que automatiza la selección de la red que obtiene un rendimiento más cercano al óptimo. El lenguaje R sólo realiza el entrenamiento y ejecución de las redes, devolviendo únicamente la información relevante de las mismas, sin aplicar ningún criterio de calidad. Puesto que se pretenden entrenar un elevado número de ellas, sería incómodo para el usuario compararlas una a una, de modo que se automatiza también este proceso: tanto en los servidores de cálculo para devolver su mejor red entre las diversas entrenadas, como en la máquina que solicita todos los modelos y que recibe los mejores entre ellos.

El criterio de calidad está basado en la curva ROCReceiver Operating Characteristic curve— y es el valor del área bajo la curva —Area Under Curve (AUC)—. Este criterio será explicado detalladamente más adelante.

Redes Neuronales Artificiales

Tras el anterior post explicando más o menos en qué consiste realmente la Inteligencia Artificial y algunos de los principales algoritmos mediante los que se intenta lograr en la computación, hoy vamos a centrarnos en un tipo especial de elos: las redes neuronales.

Red Neuronal

En ellas, la unidad básica se denomina neurona y recibe unas entradas (valores numéricos) a las que realiza una operación (generalmente suma) y al resultado le aplica una función. Esta función devuelve otro resultado que envía a más neuronas, hasta llegar a la salida final. La idea general está inspirada en el sistema nervioso animal,  siendo una pobre imitación del mismo, pero muy útil aún así.

Cada entrada dirigida a una neurona viene acompañada de un peso, el cual multiplica el valor de la entrada. La entrada total de la neurona será la suma (u otra operación) de todas ellas al que, en ocasiones, se le suma una constante umbral. En toda red hay dos capas conectadas con el exterior, la capa de entradas que recibe los datos, y la capa de salidas, que devuelve la respuesta de la red. Entre ambas pueden situarste una o más capas denominadas ocultas. La capa de entradas tiene la función de distribuir los datos entre la red, por lo que no se cuentan como una capa más.

Con esta idea básica se han establecido muy diveros tipos de redes neuronales clasificados según su número de capas (monocapa, multicapa) , topología (unidireccionales, realimentadas), aprendizaje (supervisado, no supervisado, mixto), datos de entrada/salida (contínuos, discretos), tipo de respuesta(autoasociativa, heteroasociativa).  Con lo que tenemos Perceptron (problemas binarios, de clasificación), MLP (problemas no linearmente separables), Adaline (Perceptron con entradas reales y no binarias), Máquina de Bolzman (problemas de combinatoria), Memorias Asociativas (recuperación de información mediante alguna de sus partes, por asociación), Red de Hopfield(tipo de asociativa, basada en perceptron), Mapas autoorganizados/Redes de Kohonen y muchos otros tipos diferentes.

Las redes neuronales tienen dos fases principales de operación: aprendizaje o entrenamiento, recuerdo o ejecución. Durante el entrenamiento se aplican “ejemplos”, generalmente un conjunto de datos conocidos que definen una solución conocida, que mediante una regla de aprendizaje modifican los diferentes pesos de cada neurona en función de cómo difiera la respuesta de la red de la solución esperada. Los valores de estos pesos representan el grado de conocimiento. El entrenamiento concluye cuando el margen de error entre la salida de la red y la salida real es aceptable. Después, en la fase de ejecución, se aplican nuevos datos con solución desconocida y se espera que la red esté preparada para dar una solución verdadera en base a lo aprendido durante el entrenamiento. Generalmente en esta fase cesa el aprendizaje, por lo que no se modifican los pesos.

Estos “ejemplos” de los que hablaba no son nada especial. Pueden ser fotografías de pacientes con cáncer de pulmon y sanos (que estén catalogadas) y la red “descubrirá” patrones en ellas. Luego, se pasa una nueva foto y debería discernir si hay cáncer o no. Unos datos de entrada más comunes podrían ser edad, sexo, peso, altura, color de piel, color de ojos, color de pelo, grupo sanguíneo, y la salida la raza a la que pertenece el sujeto. O figuras geométricas, bien sea mediante imágenes o las coordenadas de sus puntos y líneas en el plano. Las posibilidades son infinitas.

Inteligencia Artificial

La Inteligencia Artificial es la rama de la informática que trata fabricar progamas que se puedan catalogar de alguna forma como racionales, es decir, analicen una información dada y sean capaces de comportarse de distinta forma para lograr un objetivo más cercano al óptimo para los datos que disponen.

Por ejemplo, para hallar la salida a un laberinto se podría hacer un programa que recorriese todas las direcciones posibles sin ninguna distinción, volviendo atrás cuando se bloquease y probando los distintos caminos. Esto en informática se denomina backtracking o técnica de ensayo-error y es justo lo contrario a la inteligencia artificial. Un programa “inteligente” tendría ciertas preferencias, como los caminos hacia la derecha si sabe que la salida está en ese sentido. En este caso, seguramente, resultaría completamente inútil, pero está analizando su entorno y respondiendo de forma aparentemente mejor.

Para lograr una salida óptima hay muy diversos métodos que dividen a la Inteliencia Artificial en varias ramas completamente distintas entre sí. Se puede, por ejemplo, crear una extensa base de datos (conocimientos) con las mejores soluciones conocidas para diferentes situaciones. Son los llamados sistemas expertos y pretenden simular a una persona con gran experiencia en cierta labor, siendo esa base de conocimientos con los que cuenta la máquina los que habría adquirido esa persona durante toda su carrera. Sería, por ejemplo, resoler un cubo de Rubik sabiendo que primero se debe completar una cara, luego una fila de las caras contiguas, dejar ciertas piezas en una posición determinada y luego efectuar 17 movimientos iguales (nota a frikis del cubo: creo que la forma de resolverlo era algo similar, no pretendo ser exacto, sólo dar un ejemplo).

Otra opción es estudiar las implicaciones de nuestras diversas acciones y seleccionar las que nos reporten mayores beneficios en base a unas reglas. Es lo que se suele utilizar en ajedrez y juegos del estilo. La máquina analiza cada uno de sus movimientos y cada uno de los movimientos del contrario, y lo que ella respondería… así hasta unas cuantas jugadas más adelante. Obviamente esto implica una explosión de combinaciones imposible de computar, por lo que se descartan muchas según diversos criterios heurísticos.

Como curiosidad, el primer programa para jugar al ajedrez lo escribió Alan Turing en 1952. Por entonces las computadoras no tenían suficiente capacidad para procesarlo, así que tenía que hacerlo él mismo a mano, ¡tardando hora y media para cada movimiento! En la única partida registrada el programa perdió contra un amigo de Turing.

Otros intentos de crear Inteligencia Artificial mucho más interesantes y recientes son las redes neuronales y los algoritmos genéticos, ambos inspirados en la naturaleza. Pese a que las primeras fueron enunciadas hace más de medio siglo no se han estudiado y aplicado realmente hasta hace relativamente poco, y los algoritmos genéticos datan de la década de los setenta. Estos últimos creo que están orientados a problemas de optimización, basándose en las ideas de la evolución darwinista. Se crean un montón de soluciones aleatorias y las que que parecen mejores se combinan entre sí durante varios ciclos, añadiendo mutaciones azarosas para mantener la variedad. Supuestamente al final sólo quedan las soluciones más cercanas a la óptima. Como casi siempre en estos casos, la entrada inglesa Genetic algorithms es mucho más completa y hasta lo que he leído me ha quedado más claro que en la española

Las redes neuronales intentan imitar el sistema nervioso animal. Se basan en unas “neuronas” que reciben unos valores de entrada a los que aplican una función específica y su salida la envían a otras neuronas que siguen el mismo proceso hasta alcanzar la salida. Obviamente ésta salida será un número más, y dependiendo del mismo se tomarán unas decisiones u otras. Hay diversos tipos de redes con distintas filosofias y formas de interconectarse, pero por lo general están pensadas para problemas de reconocimiento de patrones. Lo realmente interesante de las redes es que son “entrenadas” y una vez lo han hecho es cuando está preparado el modelo para ser implementado y utilizado. Al igual que antes la versión inglesa es mucho más completa.

Además de toda la parte técnica y teórica que os he contado están las discusiones de carácter filosófico ¿Qué es inteligencia? ¿Se puede llamar realmente inteligencia a los procesos que hace una máquina? ¿Puede considerarse inteligencia aunque no entienda realmente lo que hace? Hay un gran debate sobre esto y sus definiciones. Una de las posibles respuestas la dio, de nuevo, Alan Turing, en los años cincuenta con su famosa Prueba de Turing.

Se fundamenta en la hipótesis positivista de que, si una máquina se comporta en todos los aspectos como inteligente, entonces debe ser inteligente. El Test de Turing consiste en un hombre y una máquina en una habitación comunicándose con otro fuera de ella. El que está fuera ha de adivinar cuál de sus dos interlocutores es el ordenador mediante preguntas y respuestas en las que obviamente no sirve de nada preguntar si lo son o no, puesto que tienen permitido mentir. Por supuesto ninguna máquina lo ha pasado todavia como tal, pero como afirman en Turing Test lo realmente interesante es que el usuario no se comporte como juez tratando de pillar a la máquina haciendo preguntas tendenciosas dispuesto a descubrirla, si no que no sepa que puede estar hablando con un computador y se comporte normalmente como en un chat con otro humano cualquiera.

Para unos esta prueba sería suficiente para demostrar una IA, sin embargo otros creen que no. Para rebatirlo John Searle inventó el experimento mental de la Sala China, y el famoso Roger Penrose lo popularizó. Afirma que si él, que no sabe chino, entra en un cuarto con manuales y reglas que le indican cómo responder a las diferentes frases y un chino desde fuera introduce un texto, él sería capaz, utilizando esos manuales, de emitir una respuesta coherente. Entonces el chino afirmaría que quién le ha respondido entiende chino, sin embargo John no ha entendido nada de lo que ha leído ni contestado. Esto conlleva todo tipo de discusiones e interpretaciones.

No dudo que con la Inteligencia Artificial podamos acabar llegando muy lejos, y consiguiendo sistemas muy preparados para casi cualquier problema al que se vaya a enfrentar y preparados para aprender de sus errores y que quizá podamos llegar a conseguir entes que podamos calificar de inteligentes, pero lo que veo prácticamente imposible es que logremos dotarles de una consciencia, por lo que no creo que debamos temer nunca por una Skynet o unos Nexus 6 renegados, ni sentir lástima por el niño de Inteligencia Artificial o El Hombre Bicentenario.