sábado, junio 28, 2008

Cerebro de liebre, mente de tortuga y redes neuronales


Desde hace unos días estoy leyendo "Cerebro de liebre, mente de tortuga". En pocas (y no expertas) palabras, el libro habla de conocimiento explícito (o deliberado) y conocimiento implícito.
Por ejemplo, cuando estamos diseñando un artefacto de software y damos argumentos "sólidos" por cada decisión que tomamos, citando teorías, patrones y estándares, estamos aplicando conocimiento explícito. En contraste, imaginemos a un piloto de Nascar (en una de esas clásicas películas de Hollywood) que esquiva un accidente en el humo, varios autos vuelan sobre su cabeza, hace rebajes, toca apenas el freno, acelera, y sigue sano y salvo en carrera, todo en cuestión de segundos. Terminada la carrera el piloto no puede explicar que hizo, como lo hizo, ni por que lo hizo. No hay teoría que hubiese podido aplicar de manera consciente en esas fracciones de segundo que tuvo; simplemente se dejo llevar por su experiencia/inconsciente/instinto, es decir, su conocimiento implícito.
Vivimos en una sociedad que aparenta valorar mas el conocimiento explícito que el implícito. Nuestra capacidad depende de cuan bien podamos explicar nuestros resultados. Algunas excepciones parecen ser el arte, muchos deportes y las relaciones humanas. Son asuntos tan complejos, con tantas variables y tan ilógicos, que intentar resolverlos solo en base a conocimiento explícito no nos lleva a ningún lado. Y, si hablamos de resultados, no podemos negar que el piloto que sale ileso del accidente ha tenido un resultado excepcional - aún cuando no pueda explicarlo.
Hace un tiempo, Oscar García, un colega de la UNLu, intento desasnarme respecto al desarrollo de redes neuronales entrenadas. Entendí que una red neuronal tiene neuronas organizadas en capas, donde cada neurona esta conectada a todas las neuronas de la capa siguiente. Cada neurona recibe una entrada y calcula una salida que pasa a todas las de la capa siguiente. Si se trata de la última capa de la red, lo que obtenemos es el resultado final. Por ejemplo, podríamos alimentar a una red con todos los pixels de una imagen y obtener a la salida todos los pixels de una imagen que es la versión en escala de grises de la original. Desde mi perspectiva de diseñador orientado a objetos, me atrajo lo simple del modelo (capas, neuronas, conexiones) y supuse que sería muy interesante pensar en el diseño de redes neuronales, patrones de redes, etc. Entonces, Oscar siguió explicándome; lo interesante todavía no había llegado.
La función de una red no depende solamente de la cantidad y forma en que se conectan las neuronas. Tampoco depende solamente de la función de transferencia de la neurona (qué cuentas hace la neurona con su entrada para calcular su salida). En realidad, depende mayormente los pesos por los que se multiplica la salida de una neurona antes de dársela a la siguiente como entrada (imagine que cada conexión tiene un peso por el que multiplica la señal antes de entregarla al destinatario). Eso quiere decir que redes de estructura idéntica (mismas capas, misma cantidad de neuronas, misma función de transferencia) podrían dar resultados diferentes para una misma entrada. La misma red podría calcular la versión escala de grises de una imagen y la imagen negativa. La única diferencia entre las dos redes serían los pesos de las conexiones. Eso me decepcionó un poco porque yo estaba pensando en diseñar con lindos diagramas de UML y aplicar algunos de los patrones del gof (y hasta se me cruzó la idea de escribir un pattern languaje) y Oscar me transformó el problema en uno de matemáticas (no es que no me guste, pero soy un poco haragán). Aparentemente hay muy poca teoría respecto a qué combinaciones de valores consiguen cuál efecto (y solo para redes pequeñas); entonces ¿cómo se diseña una red compleja? Una alternativa es diseñar la estructura (capas, neuronas, conexiones, función de propagación) y luego enseñarle a la red para que ella calcule sus propios pesos.
Hay varias estrategias para enseñarle a una red, pero basicamente consisten en darle muchas entradas y mostrarle para cada entrada cual es la salida que esperamos. Cada vez que la red se equivoca, corrige los pesos que cree que tuvieron la culpa del error. La idea es enseñarle con tantos ejemplos nuevos como podamos hasta que la red ya no se equivoque.
Si uno mira una red que cumple bien la función para la cual fue entrenada, difícilmente pueda explicar que es lo que la hace funcionar bien (mirando los pesos). Simplemente es una buena red porque consigue buenos resultados. Como el piloto de Nascar.
Para cerrar, algunas conclusiones y sugerencias:
1) Se nota que no se nada de redes neuronales.
2) No solo en el arte, los deportes y las relaciones humanas es valioso el conocimiento implícito.
3) No para todo lo que funciona bien existe una explicación racional/explicita. No siempre lo racional nos lleva a la solución.
3) Si un día estás en la librería y repentinamente te llama la atención un libro de un tema que aparentemente no tiene nada que ver con lo que hacés, comprálo. Ni te tomes el trabajo de explicarte por que vale la pena invertir el tiempo y el dinero en ese tema, comprálo y leelo (al menos hasta que algo adentro te diga que ya no te interesa). Seguramente es tu conocimiento implícito que te está dando una señal.
5) Cerebro de Liebre, Mente de Tortuga es un libro recomendable.

1 comentario:

Sxadvi dijo...

Bueno, entré a buscar la url de Pizzared.

Creo que voy a probar el segundo punto 3 y tomar en consideración el 5.

Saludos