¿Pueden las máquinas ser inteligentes?

Empecemos hablando de problemas de reconocimiento de objetos para luego pasar a ver luego el tema de la inteligencia.  Voy a hablar del funcionamiento del reconocimiento de objetos, y tú decidirás si las máquinas pueden ser inteligentes.

Una foto es en realidad una hoja con una cuadrícula, conda cada cuadro tiene un color.  Cada uno de estos cuadros se llama pixel.  El color de cada pixel está representado con entre 1 y 3 valores numéricos en la computadora, dependiendo del sistema de numeración de colores que se use.

El reconocimiento de objetos requiere de masticar números para determinar un valor final. Para ello se usa dos técnicas:
Convoluciones de kernel (kernel convolution) y aprendizaje profundo (deep learning).  El deep learning usa redes neuronales.

REDES NEURONALES

Las redes neuronales son esencialmente funciones que suelen arrojar resultados no lineales.  Reciben información de un lado (uno o varios datos) y lanzan información procesada del otro lado (una o varias salidas).

No voy a entrar muy a fondo a hablar de funciones no lineales, así que voy a usar ejemplos lineales de la vida cotidiana.  Un ejemplo de una función que usas en tu vida cotidiana es la del total de recibos que debes pagar.  Por ejemplo:

Total recibos a pagar = alquiler + recibo de electricidad + recibo del agua + recibo del cable + recibo del internet

Para calcular el recibo de electricidad usas otra función:

Recibo de electricidad = potencia contratada x tarifa o coste de aplicar kilovatios (€/kW/día) x dias del periodo de fecturación

La tarifa o coste de aplicar kilovatios depende del consumo, que determina si usas tarifa normal, nocturna, o según hora de la semana (precio punta, precio llano o valle)

A ello le agregas otra función de impuestos e IVA.

Entonces, si tenías la información de las horas a las cuales usaste la electricidad, empiezas a pasar los datos por medio de varias capas de funciones apiladas en secuencia, hasta obtener el monto del recibo de electricidad.  De igual manera, si otros recibos no tienen un monto fijo, puedes establecer las capas (etapas) de cálculo para esos recibos.

Al final una red neuronal es una secuencia de funciones, organizada en capas e interconectadas de distintas maneras, que procesan información.  Son una especie de "fábrica de datos" con procesos en secuencia y operarios que toman un dato y le aplican una función para obtener algo distinto.  El resultado de un recibo no va a ser algo demasiado complicado, pero con funciones apiladas en capas puedes lograr cosas complicadísimas.

Un ejemplo de una función es el algoritmo de PageRank que es el que usa Google para medir la relevancia de un sitio web en función de la búsqueda que acabas de hacer.

Aprendizaje

Las redes neuronales también se usan para bienes raíces, para calcular precios justos.  Al igual que con los recibos, puedes tomar variables como edad del inmueble, cantidad de habitaciones, cantidad de baños, y otras características para determinar el precio.  Diseñas una función que consideras genial:

Precio = (coeficiente 1 x Edad) + (Coeficiente 2 x Habitaciones) + (Coeficiente 3 x Baños)

Resulta que ves que te faltan los coeficientes.  No puedes calcular nada.  Necesitas recoger datos de edificios reales, para hacer una estimación estadística de cada coeficiente, y probablemente tendrías que ver si hay estratos o datos agrupados o tendencias centrales.  

Este análisis estadístico es lo que podríamos denominar "aprendizaje".  Cada nuevo conjunto de datos de un nuevo edificio obliga a revisar los coeficientes.  Y así la máquina aprende.  Convierte datos en coeficientes, con un proceso de aprendizaje que le permite reconocer patrones de datos.

Desaprender lo aprendido

A veces diseñaste tu red neuronal para que aprendiera a ver relaciones lineales o cuadráticas o exponenciales entre datos, pero tu diseño se puede caer si hay estratos o grupos.  Si tu neurona catalogaba´datos en dos regiones, usando valores "altos" y "bajos", y resulta que al analizar datos lo mejor no era que hubiese datos altos o bajos, sino un balance equilibrado, entonces en lugar de 2 regiones de datos tienes tres "alto, bajo y en equilibrio".  Estos cambios en el diseño de la red neuronal obliga a desaprender todo lo que la máquina había aprendido.

Por ejemplo, investigas datos de una nueva medicina, y mides el estado de salud de pacientes contra la dosis recibida, y puedes determinar si el paciente puede estar bien o no, en virtud de la dosis, donde por debajo de la dosis, la medicina no surte efecto.  Pero de pronto un paciente se toma un exceso de medicina, creyendo que más medicina significa más salud, y se enferma.  Y eso arroja un estado de enfermedad que el análisis no había contemplado, que no está por debajo de la dosis mínima sino por encima.  Esto convierte dos estratos en tres, en la gráfica de estado de salud del paciente contra la dosis.

Si el proceso de aprendizaje de la neurona no es capaz de asimilar datos que se salen de la norma, el resultado puede ser aberrante.  De este modo, si el proceso de aprendizaje automatizado de la neurona no sabe cuando reconocer que debe desaprender y reprocesar los datos usando criterios distintos, los resultados pueden volverse adefesios.

El desaprendizaje es parte de un buen diseño neuronal.

Capas de neuronas

La razón para aplicar capas de neuronas es porque empiezas a tener situaciones y casos especiales que a veces crean bifurcaciones en el análisis.  Si pensabas que un edificio viejo debía ser barato, de pronto te encuentras que el edificio fue declarado patrimonio histórico y su valor se dispara, lo que obliga a un análisis separado para estos edificios, y la manera de calcular precios de edificios históricos es muy distinto de la manera de calcular para un edificio de apartamentos.

En lugar de tratar de unir todos los procesos en un sólo programa, lo mejor es agregar neuronas y reconectarlas de manera distinta, porque así necesitas menos cambios en todo el proceso.

La ventaja de hacer capas de neuronas es que puedes terminar con un proceso muy complicado, que se programa en pequeñas neuronas muy simples.  Y el resultado de amontonar capas de neuronas es que obtienes resultados, que son muy dificiles de anticipar a punta de intuición.

CONVOLUCIONES DE KERNEL

Cuando tienes una imagen compuesta de pixeles, puedes aplicar filtros fotográficos al efectuar operaciones sobre los valores numéricos de cada uno de los pixeles.  Las convoluciones de kernel son un algoritmo que toma un pixel de la imagen original, los piexeles que están alrededor de ese pixel en la imagen original también, y se aplica una operación matermática usando ciertos coeficientes, de modo que los pixeles de los alrededores ejercen distinto peso en el resultado final.  El color del pixel en la imagen final será el resultado de este proceso.  

Por ejemplo, si tomas un pixel y promedias su valor con los pixeles que están alrededor, entonces conviertes la imagen en algo borroso.

Hay filtros de muchos tipos que se pueden lograr con esta técnica.  Para hacer imágenes borrosas, para mejorar la definición de bordes, para convertir imágenes a blanco y negro, etc.  Normalmente la gente se preguntaría ¿para qué sirve esto, aparte de consideraciones estéticas?  Se usa para simplificar imégenes, convertir una imagen compleja en algo más simple que un programa podría analizar.

Filtro para convertir de color a blanco y negro

Filtro para mejorar los bordes de una imagen

 

RECONOCIMIENTO DE OBJETOS

Cuando tienes muchas variables y deseas obtener un resultado como un total de recibos, la cosa es relativamente fácil.  Pero si tienes montones de pixeles, cada uno con un color, crear un algoritmo para procesar puede volverse inmanejable por la cantidad de datos a procesar.  Tendrías que anticipar todas las formas y combinaciones posibles de valores de colores.

Por ejemplo, si vas a ver fotos de edificios para tratar de adivinar su precio a punta de encontrar cantidad de ventanas y puertas.  Tendrías primero que hacer reconocimiento de imágenes e identificar si tienes ventanas y puertas, pero hay muchos tipos de ventanas y puertas y no vas a hacer un algoritmo para reconocerlos todos.

Lo que tendrías que hacer es tomar la foto, convertirla a blanco y negro, afilar bordes para reconocer el delineado de ventanas y puertas, convertir puertas y ventanas en manchas, y una vez que identificaste puertas y ventanas, pasar a analizar contra los datos de edificios que ya conocías, para extrapolar sus característcas y así calcular el precio.

Es decir, al inicio lo que hiciste fue simplificar una foto muy complicada, para reducirla a manchas que indican regiones donde están los objetos.  Una vez hecho esto identificas su forma, y cuentas a ver si tienes ventanas o puertas.  Esto es más sencillo que analizar montones de pixeles de todos colores.  Para la simplificación de la imagen, las convoluciones de kernel son muy útiles.

Pero aunque la imagen está simplificada, para reducir el procesamiento, aún así necesita paar por un proceso de reconocimiento para ver si es o no es una ventana, es o no una puerta, donde una red neuronal determina la naturaleza de la mancha.  Todavía hay debate acerca de las limitaciones que la convolución de kernel presenta para procesos de simplificación.

Y una vez que obtuviste los parámtros inferidos o extrapolados de la foto a partir de la cantidad de ventanas, usas redes neuronales para encontrar el precio del inmueble.

El reconocimiento de objetos usa una combinación de redes neuronales y convolución kernel para tener un proceso de "deep learning".

SISTEMAS REALMENTE INTELIGENTES

El problema de diseñar inteligencia artificial con redes neuronales, es que los algoritmos de las redes sirven para resolver unos problemas  específicos y otros no.  No son redes neuronales genéricas para cualquier tipo de problema.  ¿O sí?

Google ya tiene su Deepmind, que aprende a jugar videojuegos de consolas viejas, que por rebote le gana a los jugadores de Go (toma el tablero como una colección de pixeles),  y sabe identificar fotos de animales.  Se alega que es la primera vez que tenemos una inteligencia genérica. Yo no estoy muy seguro de que así sea, pero como un primer intento parece un enorme avance.

We propose the neural programmer-interpreter (NPI): a recurrent and compositional neural network that learns to represent and execute programs. NPI has three learnable components: a task-agnostic recurrent core, a persistent key-value program memory, and domain-specific encoders that enable a single NPI to operate in multiple perceptually diverse environments with distinct affordances. By learning to compose lower-level programs to express higher-level programs, NPI reduces sample complexity and increases generalization ability compared to sequence-to-sequence LSTMs. The program memory allows efficient learning of additional tasks by building on existing programs. NPI can also harness the environment (e.g. a scratch pad with read-write pointers) to cache intermediate results of computation, lessening the long-term memory burden on recurrent hidden units. In this work we train the NPI with fully-supervised execution traces; each program has example sequences of calls to the immediate subprograms conditioned on the input. Rather than training on a huge number of relatively weak labels, NPI learns from a small number of rich examples. We demonstrate the capability of our model to learn several types of compositional programs: addition, sorting, and canonicalizing 3D models. Furthermore, a single NPI learns to execute these programs and all 21 associated subprograms.  - Neural Programmer-Interpreters

Me resulta evidente que aprendió a reconocer imagenes a partir de simplificación, y que aprendió a identificar objetos y a reaccionar frente a estímulos visuales.  Sin embargo, con la limitada información disponible, aún no parece que haya todavía una capacidad de resolver problemas genéricos, que es algo distinto de aprender a reaccionar frente a estímulos visuales, una tarea ya de por sí increíble que se logre.

Ni siquiera entendemos bien lo que es la inteligencia.  para unos significa una cosa, para otros significa otra.  ¿Como podemos saber entonces si una máquina es inteligente o no?  ¿Nos daremos cuenta algún día?

Lo que si podemos decir es que ahora Deepmind podría aprender a leer imágenes médicas y aprender a diagnosticar, pues parece que va a trabajar con la NHS de los EUA.  Luego de conversar con el experto en inteligencia artificial Ramón López de Mantaras del Consejo Superior de Investigaciones Científicas (CSIC) sobre el tema de los sistemas expertos y diagnóstico médico (ver post Diagnosticar la realidad),ahora entendemos que un pequeño paso para Google, significa un gran salto para la humanidad.  Y al ver el trabajo de CSIC en materia de inteligencia artificial en el área de la salud, entendemos que los españoles tienen tambien muchas razones para sentirse orgullosos.

¡Sé el primero en comentar!