viernes, 14 de diciembre de 2012

Máquinas que aprenden

Como dirían los entrevistados de Punset: "No es tan sencillo"

Esta semana vamos a darle un rápido repaso a cómo las máquinas, ordenadores, son capaces de aprender. Había pensado ponerle de título a la entrada "Ordenadores que aprenden", pero, seamos sinceros, la palabra ordenador suena fatal, mientras que máquina aporta al título un aspecto duro y, sobre todo, sexy.

Para entender como un ordenador aprende algo, es necesario saber su funcionamiento básico. Una computadora ejecuta programas, que son secuencias de instrucciones previamente programadas. Estas instrucciones no son muy distintas a las de una calculadora programable. Básicamente, a una velocidad increíble,  el ordenador está leyendo números de memoria, operando con ellos y almacenándolos de nuevo para un uso posterior. La pregunta que planteo es ¿qué grado de aprendizaje puede asumir un ordenador, si su comportamiento viene definido por una secuencia de instrucciones de este estilo? 

Bien, para un programa dado, sus instrucciones no se ejecutan siempre de la misma manera porque existe un elemento variable: los parámetros. Día a día, a veces sin darnos cuenta, comunicamos parámetros al ordenador. La dirección de una web, a la hora de introducirla en la barra del navegador, es un parámetro, y en función de su valor, la respuesta del programa será distinta. Nada más lejos de la realidad, este texto que escribo es un parámetro que estoy variando, luego el sistema de gestión de contenidos del blog, dependiendo de su contenido, lo transformará a un formato presentable (y si, esta vez con los párrafos justificados). La gracia de estos parámetros es que un cambio en sus valores pueden producir una respuesta diferente, sin necesidad de cambiar el programa subyacente.

Vale, ha quedado claro que los ordenadores pueden actuar de una manera u otra según los parámetros que se le introducen, pero no he dicho qué puede aprender un ordenador. Está claro que introducir la URL en el navegador no se presta a mucho aprendizaje (¿seguro?) y el texto que escribo es un simple bulto que se arrastra a lo largo de Internet (repito, ¿seguro?). Dar una definición de aprendizaje es compleja, incluso para seres humanos, y su generalización al ámbito computacional también lo es.

A grosso modo, se denomina aprendizaje automático (machine learning) al campo de la computación que se encarga de dar a los ordenadores la capacidad de aprender sin ser explícitamente programados para ello. Veamos algunos ejemplos de lo que puede aprender a hacer un ordenador:
  • Reconocer texto en general, ya sea manuscrito o tipografiado.
  • Reconocer caras.
  • Diagnóstico de enfermedades.
  • Selección de perfiles de personal.
  • Determinar si una transacción bancaria es fraudulenta.
  • Corregir el texto que escribimos en la pantalla táctil de un móvil (dios, esta si que me gusta)
  • ...
A las tareas anteriores podemos añadir conducir, andar o incluso componer música (si, si Conde Chócula me lo permite, algún día haré una entrada sobre música generativa). En general un ordenador es capaz de aprender cualquier tarea cuyo conocimiento pueda verse de manera formal. Ahora bien, no podemos programar, es decir cambiar explícitamente las instrucciones que sigue el programa, pero sí podemos modificar los parámetros de un programa ya escrito. Pero claro, entonces necesitaría un programa para cada tarea de la lista anterior, es decir no puede usarse la misma técnica para reconocer texto que para reconocer caras o corregir texto mal escrito.

MENTIRA

Imaginaos la situación. Una letra, al igual que un texto escaneado, es una imagen. Una imagen es algo que está escrito en el idioma del ordenador. Por simplicidad, centrémonos en el reconocimiento de caracteres manuscritos. Si cada carácter esta contenido en una imagen en blanco y negro, existen ciertos píxeles que están en blanco y otros que estan en negro, lo cual puede verse como una matriz cuyas celdas pueden tomar valores de 0 para el negro o 1 para el blanco (o al revés, como más os plazca).

Una vez formalizada la entrada, vosotros, lectores míos, ¿que más hace falta para que el ordenador sea capaz de, a partir de la imagen, averiguar el carácter que representa?. Pensad como aprenderíais vosotros  las letras del abecedario (¡dejadlo en los comentarios!), yo os voy a contar cómo lo haría el ordenador.

En primer lugar  se construye un conjunto de entrenamiento, que se caracteriza porque para cada imagen se dispone del resultado, es decir del carácter que representa la letra contenida en la imagen. Una vez establecido, se procede a mostrar una y otra vez estos ejemplos al ordenador, el cual produce un resultado. La dinámica es la siguiente: si el programa se equivoca, modifica sus parámetros para evitar volver a cometer el error en un futuro.

Después de varias pasadas, cuyo número, entre otros factores, depende del número de ejemplos, el programa ha aprendido con más o menos "nota" los ejemplos. Si os dais cuenta, este procedimiento se asemeja bastante a los malvados ejercicios que mandan antes de hacer un examen. Genial, sois un ordenador y os sabéis de puta madre los ejercicios que habéis memorizado una y otra vez, pero ha llegado la hora del examen. El examen se realiza con otros ejercicios diferentes, el conjunto de test. Estos ejemplos no han sido vistos nunca por parte del programa y sirven únicamente para ver cuantos aciertos se tienen con datos desconocidos, lo cual da una medida de lo bien que nuestro programa ha aprendido lo que queríamos enseñarle.

Bueno señores, el problema del reconocimiento de caracteres es un problema de aprendizaje supervisado, porque se indica al método cuales han sido sus errores diciéndole la respuesta cada vez que intenta adivinar el resultado. Además se trata de un problema de clasificación, porque se trata de averiguar a que clase pertenecen las distintas imágenes, que en este caso son las letras del abecedario. La clave es que existen técnicas (de aprendizaje automático) que resuelven problemas de este tipo, las cuales de manera transparente al usuario (no hay que cambiar el comportamiento del método), dada una base de ejemplos y una representación adecuada de la entrada (en el caso anterior una matriz) y una salida (la clase, cualquiera de las letras del abecedario) son capaces de ajustar los parámetros para que en el futuro clasifique datos que no ha visto nunca. 

En cuanto a las técnicas empleadas para este tipo de problema, podemos hablar de redes neuronales. En este caso los parámetros a ajustar son los potenciales de activación entre las neuronas, recordando un poco el funcionamiento de éstas en el sistema nervioso.

Otra técnica interesante son los árboles de clasificación, los cuales crean una estructura en forma de árbol en la cual a cada paso se realiza una pregunta sobre los datos. Aunque no son recomendables para el problema del reconocimiento de caracteres, un árbol de decisión podría ser perfectamente útil para diagnóstico de enfermedades, en cuyo caso las preguntas recordarían a las que realiza un médico: ¿es su temperatura superior a 37ºC?, ¿cuál es el recuento de leucocitos en sangre?, etc.

Finalmente, una de las técnicas empleadas para clasificación son las máquinas de vectores de soporte (support vector machines). Aquí os dejo un vídeo en el que se intenta clasificar dos tipos de puntos, los rojos y los azules. El problema es que no podemos, en dos dimensiones, separar las clases mediante una linea recta, lo cual interesa bastante, porque es bastante fácil trabajar con ellas (o con planos, o cualquier generalización en un espacio de dimensión superior). El truco que emplea esta técnica puede verse en el vídeo (si no os apetece saltadlo, simplemente quería mencionar esta técnica porque me parece una verdadera fumada, cualquier duda que tengáis preguntadla en los comentarios)


El truco parte de la idea de que si puedo tener más dimensiones (en el vídeo se pasa de dos, plano, a tres, espacio) también tengo más probabilidades de encontrar una superficie recta que separe a mis puntitos.

Hasta ahora hemos dado por supuesto que a la hora de enseñar al ordenador, se conoce la clase a la que pertenece el ejemplo. Esto se puede ver en el caso anterior en que para cada imagen también se sabía la letra que era realmente. Ahora bien, existen casos en los que lo que se persigue no es determinar a qué clase pertenece el ejemplo, sino agrupar los ejemplos según sus características. La situación en este nuevo problema sería encontrar en el caso de una empresa de telefonía móvil, perfiles de usuario. Suponemos que tenemos cierta información sobre cada cliente (su edad, tiempo en la compañía, consumo, etc) y queremos encontrar grupos para hacer publicidad más específica (sí señores, Google también hace algo similar con los anuncios). Si la clasificación puede llegar a ser compleja, el agrupamiento o aprendizaje no supervisado lo es más. Para dar una pequeña introducción planteo una serie de problemas que adolecen estas técnicas:

  1. ¿Cuantos grupos hay? Precisamente muchas técnicas requieren el número de grupos que hay que encontrar. En algunos casos puede ser conocido y en otros no, como es el caso de los perfiles de clientela.
  2. ¿Cómo se mide el parecido entre los elementos a agrupar? Este problema se puede paliar cuando hay poca información, pero conforme la información aumenta (el número de dimensiones del espacio en el que se encuentran los elementos a agrupar aumenta) las técnicas de medida de similitud degradan por el fenómeno conocido como la maldición de la dimensionalidad (curse of dimensionality).
  3. ¿Son necesarios todos los elementos? ¿Qué hacemos con los que sobran? Seguro que recordáis en estadística que a veces al pintar una gráfica había un punto loco que se alejaba del resto de la población. En ese caso el profesor(a) lo que solía deciros es que lo borrarais. Para problemas pequeños esta misma técnica puede aplicarse, pero de nuevo ¿cómo es posible medir que hay un elemento muy diferente al resto, cuando no eres capaz (para problemas grandes) de saber con fiabiliadad si son parecidos?
  4. ¿Cómo se sabe que los grupos son correctos? Antes, en aprendizaje supervisado podíamos dejar algunos ejemplos para probar cómo se comportaba el programa con datos no vistos anteriormente. Para aprendizaje no supervisado la comprobación no puede tener en cuenta esa información.

Para ser sincero, hay mucho más que decir sobre este tema. Por ejemplo, no hemos hablado de cómo  predecir en el futuro el valor que tomará una determinada magnitud, mediante el estudio previo de lo sucedido en el pasado.

En general, existen multitud de técnicas de aprendizaje que evitan reprogramar la solución y son capaces de aprender a partir de los datos disponibles. Con esta entrada lo que espero haber conseguido es eliminar un poco el velo que cubre el aprendizaje computacional, sin haber caído en fórmulas ni tecnicismos.

Me gustaría que, a partir de ahora, sepáis que la manera que tiene un ordenador de aprender a partir de los datos, se fundamenta en la variación de sus parámetros. Los parámetros óptimos pueden encontrarse tras un entrenamiento o a partir de lo parecidos que son los ejemplos entre sí. De cualquier manera, si os pica la curiosidad, no dudeís en comentarlo abajo.

Pepe "Puertas de Acero" Pérez


7 comentarios:

  1. Me ha gustado muchi tu post. Soy ingeniera informática y creo que has dado una explicación muy clara del funcionamiento de las computadoras, que a veces, es dificil de explicar. Felicidades!

    ResponderEliminar
  2. Perdón si suena un tanto duro, pero no he podido resistirme de hacer una serie de observaciones: te has dejado (1) métodos del aprendizaje automático, como el aprendizaje por refuerzo y el aprendizaje semisupervisado; (2) la que probablemente es la familia de técnicas más importantes dentro del ML: los GBML; (3) multitud de técnicas no supervisadas, como las reglas de asociación o las de reducción de dimensionalidad, entre muchas otras; y (4) cómo los distintos algoritmos representan este conocimiento y lo explotan en la fase de test.
    Tampoco comentas nada sobre la optimización, que es un tema muy importante dentro del ML.

    Disculpa el tono; el comentario tiene el ánimo de mejorar un texto atractivo para transformarlo en científicamente completo :)

    Un saludo.

    ResponderEliminar
    Respuestas
    1. El tono me parece correcto, tranquilo, las críticas son bien recibidas :)

      Mi intención con el post era dar una introducción al aprendizaje automático, centrada en el aprendizaje supervisado y no supervisado, que, a mi parecer, son la referencia de la que partir a la hora de aprender el resto de paradigmas de aprendizaje (refuerzo, semisupervisado, o incluso si nos ponemos, el paradigma de aprendizaje estructurado de Winston)

      Estoy totalmente de acuerdo cuando comentas que debería haber hablado más de técnicas de aprendizaje no supervisado. En particular, las reglas de asociación podrían haber formado parte de un ejemplo muy intuitivo y vistoso.
      Sin embargo, creo que esta entrada no supone el momento adecuado para mostrar técnicas de reducción de dimensionalidad, pese a que en algunos dominios son imprescindibles, creo que para un post introductorio tan corto, se quedan bastante grandes.

      Por supuesto que sería interesante hablar de todo lo que comentas (¡y también de muchas cosas más!), pero no era el objetivo del post. Quien sabe, a lo mejor escribo sobre la "maldición de la dimensionalidad" y como "atacarla" en entradas posteriores.

      Un saludo y muchas gracias por el comentario. Intentaré que las próximas entradas sean completas ;)

      Eliminar
    2. El texto, como dije, me pareció muy bueno; por eso los comentarios: para hacerlo simplemente perfecto. Insisto: disculpa el tono, releyéndolo me parece un tanto duro y más sabiendo que se trata de divulgación. Ya sabes, en ocasiones uno olvida el entorno en el que se encuentra ;)

      Eliminar
  3. Muy interesante y bien redactado, se hace fácil de leer.

    Sólo quería notar una pequeña cosa totalmente fuera de la línea del artículo. La expresión "Grosso modo" es latina y como tal declina de manera que ya incluye la preposición "a". Si la incluyes diciendo "A grosso modo" es una redundancia que, si bien no deja de ser una anécdota lingüistica, sigue siendo un error. Todos los días se aprende algo nuevo :)

    Enhorabuena por el artículo.

    ResponderEliminar
    Respuestas
    1. No lo sabía. Muchas gracias por tu corrección, efectivamente, todos los días se aprende algo nuevo ;)

      Un saludo

      Eliminar

Comparte este post

Related Posts Plugin for WordPress, Blogger...