Chapter Content
Vale, vamos a hablar un poquito sobre... la esencia de los problemas difíciles. O sea, de esos problemas que tela marinera, ¿no? Y para empezar, hay cuatro palabrejas clave para entender todo esto: problema, proceso, respuesta y solución. El problema, pues, es la tarea en la que estamos currando, la movida que queremos solucionar. El proceso, a ver, puede ser la forma en que encontramos la solución (eso sería el proceso externo) o cómo esa solución funciona internamente, cómo hace sus cálculos, ¿sabes? La respuesta es como el estado final, cuando ya vemos que el problema está resuelto. Y la solución es el objeto físico, digamos, que hace ese proceso interno, el que resuelve el problema.
A ver, un ejemplo... Imagínate un puente, ¿vale? El problema es que los coches y la gente crucen un río o lo que sea, de forma segura y eficaz. El proceso externo es... pues, prueba y error, hasta que damos con el diseño final. El proceso interno es cómo funcionan las piezas del puente juntas para que aguante y funcione bien. La respuesta es ver a los coches cruzando el puente, ¿no? Y la solución, ¡voilà!, el puente en sí, esa configuración final de piezas que llamamos puente.
Otro ejemplo, venga. Un modelo de aprendizaje profundo, de estos de inteligencia artificial. El problema podría ser el reconocimiento facial, ¿no? El proceso externo es la fase de entrenamiento, cuando le damos datos y más datos para que aprenda. El proceso interno es lo que hace ese modelo por dentro cuando ya está entrenado, cómo calcula y reconoce las caras. La respuesta es el nombre correcto de la persona que reconoce, y la solución es el modelo ya listo, con sus parámetros ajustados, puesto en marcha.
Uno más, rapidito. Un cubo de Rubik, ¿vale? El problema es alinear todas las caras, cada una con un solo color. El proceso externo es darle vueltas y vueltas, o usar un método sistemático, hasta encontrar una serie de movimientos que resuelvan el cubo. El proceso interno es cuando alguien sigue esos movimientos, ese "algoritmo" que hemos encontrado, para resolver el cubo. La respuesta es el cubo resuelto, y la solución es esa serie de movimientos que descubrimos, a lo mejor escrita en un papel.
Entonces, resumiendo un poco: el problema es la situación que hay que resolver. El proceso externo es cómo encontramos la solución, por ejemplo, probando cosas o pensando mucho. El proceso interno es cómo se pone en práctica la solución que hemos encontrado, paso a paso o de otra forma. La respuesta es el resultado final que confirma que lo hemos solucionado, y la solución es lo que usamos para llevar a cabo ese proceso, puede ser un papel con instrucciones o un programa informático, por ejemplo.
Ahora que tenemos claro el lenguaje, vamos a ver qué hace que un problema sea "difícil" de verdad, ¿no?
A ver, la gente dice que un problema es difícil cuando no es fácil de resolver, obviamente. Si no hay una solución a mano, pues se considera difícil. Pero en informática, "difícil" tiene un significado más específico. Un problema es "computacionalmente difícil" si es muy complicado o casi imposible de resolver de forma eficiente con un ordenador. Necesita muchos recursos, mucho tiempo y/o mucha memoria para calcular.
La dificultad de estos problemas crece muy rápido a medida que el problema se hace más grande. Suele ser algo exponencial, como doblar un papel muchas veces. No añades solo unas pocas capas, sino que crece a lo bestia. Imagínate, si doblaras un papel 42 veces, ¡llegaría de la Tierra a la Luna!
En informática, esto se parece a la explosión de posibles caminos que un algoritmo puede tomar para encontrar la solución. Los problemas difíciles tienen muchos factores a tener en cuenta. Un puente más largo tiene más piezas, más cosas que considerar. El reconocimiento facial es difícil porque hay muchísimos factores que hacen que una cara sea una cara.
El concepto clave aquí es el "espacio de posibilidades". Es decir, todas las posibles combinaciones, configuraciones o estados que podrían existir para ese problema. Si hablamos de un tablero de ajedrez, serían todas las formas de colocar las piezas. Cuanto más grande sea el espacio de posibilidades, más espacio tendrá que explorar el algoritmo que intenta resolverlo. Y esa exploración es lo que hace que el problema sea difícil.
Claro, trabajar con todas las configuraciones posibles es imposible, así que no trabajamos en ese espacio de posibilidades gigante. Tenemos que simplificar, definir un conjunto más pequeño de características importantes para el problema, y trabajar dentro de ese "espacio de características".
Por ejemplo, el problema de mantener las manos calientes en invierno. No vamos a mezclar cosas al azar y envolverlas en las manos. Pensamos en las cosas importantes: grosor, capacidad de aislamiento, absorción, resistencia... Si hiciéramos un gráfico con estas características, tendríamos cuatro ejes. La solución estaría en algún punto dentro de ese espacio. La combinación correcta de materiales para que los guantes funcionen bien tendrá la mezcla justa de grosor, aislamiento, absorción y resistencia. Cada característica es una dimensión del espacio de características, y la combinación de todas crea un espacio de muchas dimensiones donde está la solución. Cuando se dice que un problema es "de alta dimensión", esto es lo que significa: un problema cuyo espacio de características tiene muchas dimensiones, y la solución está en algún lugar dentro de ese espacio.
Lo que hace que un problema sea difícil es encontrar dónde, dentro de ese espacio de características, está la solución. Es un territorio enorme, con caminos complicados y obstáculos. No hay señales que nos digan dónde buscar.
Hay tres cosas principales que hacen que estos espacios de características sean tan difíciles de recorrer y que las soluciones sean tan difíciles de encontrar: la complejidad del espacio en sí, la falta de conexiones claras entre las características y el poco número de combinaciones viables (soluciones que funcionan) en comparación con todas las combinaciones posibles.
La complejidad del espacio de características viene de cómo interactúan y dependen las características entre sí. En el ejemplo de las manos calientes, un material más grueso a lo mejor aísla más, pero reduce la movilidad. Un material muy absorbente puede ser bueno para quitar la humedad, pero también enfriarse si se moja. Esta complejidad no hace que el espacio sea más grande, pero sí que sea más difícil encontrar un camino a la solución. Es fácil equivocarse en un espacio complejo. Imagina que tienes que elegir entre una cosa y otra, y mejorar una cosa empeora otra.
En general, cuantas más características haya, menos probable es que sean independientes. Por eso los espacios de alta dimensión son típicos de los sistemas complejos, y de los problemas difíciles que tienen. La complejidad no es solo tener muchas piezas, sino cómo interactúan esas piezas.
La segunda cosa que hace que un problema sea difícil es la falta de conexiones claras entre las características. En el ejemplo de las manos calientes, vemos cómo el grosor, el aislamiento, la absorción y la resistencia trabajan juntos para solucionar el problema. Podemos deducir cómo movernos por el espacio de características y llegar a una solución. A lo mejor empezamos con piel de animal, que protege del frío, y la unimos con tendones para darle forma. Deducimos que rellenar dos capas de piel con fibra animal aísla mejor que solo la piel.
El problema de las manos calientes es relativamente sencillo, aunque su espacio de características tenga algo de complejidad. Si el número de características es pequeño (pocas dimensiones) y las elecciones entre unas y otras son pocas, podemos encontrar una solución pensando un poco. No será la mejor solución, pero funcionará. La deducción funciona aquí porque las conexiones entre las piezas de la solución son claras.
Pero ahora piensa en un problema más difícil. Imagina que tenemos que mantener las manos calientes mientras hacemos un muñeco de nieve. Ahora hay más condiciones: mantener las manos calientes, secas y con movilidad para manejar la nieve. Estas condiciones no tienen por qué aumentar el número de características a tener en cuenta, pero sí que aumentarán las elecciones difíciles. Y esto dificulta la deducción, porque las conexiones entre las características ya no son tan claras.
Hay una relación entre la complejidad del espacio de características y la falta de conexiones claras. Cuanto más "hablen" las características entre sí, más difícil será encontrar una solución. Si elegimos un material que abriga y tiene buena movilidad, a lo mejor se moja fácilmente. Si encontramos un material resistente al agua, perdemos movilidad. Cuantas más condiciones pongamos, más contradicciones y problemas encontraremos para llegar a una solución.
La tercera cosa que hace que un problema sea difícil tiene que ver con otro espacio: el "espacio de soluciones". Este espacio está dentro del espacio de características (que a su vez está dentro del espacio de posibilidades), y es un conjunto de configuraciones que cumplen con las condiciones del problema. Es decir, el espacio de soluciones es el conjunto de todas las combinaciones que dan una solución viable al problema.
Un espacio de soluciones grande significa que hay muchas soluciones posibles, y uno pequeño significa que hay pocas. Los problemas con espacios de soluciones grandes en comparación con sus espacios de posibilidades serán más fáciles de resolver, porque no hay tanto espacio para moverse antes de encontrar una solución. Los problemas de mantener las manos calientes tienen espacios de soluciones grandes, porque hay muchas combinaciones de materiales que funcionan.
Compara esto con el cubo de Rubik. Un punto dentro de su espacio de características sería una configuración única de las 26 piezas, cada una con unos valores de posición y orientación. La solución sería el conjunto de todos los algoritmos que resuelven el cubo.
El cubo de Rubik tarda en resolverse por la complejidad de su espacio de características. Cuando digo "resolver" no me refiero a seguir un algoritmo que ya existe, sino a descubrir la serie de movimientos por primera vez. El cubo de Rubik tiene una complejidad inherente porque sus características tienen elecciones difíciles. Al colocar una pieza en un sitio, puedes fastidiar otras que ya estaban colocadas.
Aún así, el cubo de Rubik no es un problema extremadamente difícil. Digamos que empieza a mostrar signos de dificultad, pero se puede resolver en un tiempo razonable. El ajedrez tiene un espacio de posibilidades aún más grande y complejo. El ajedrez se acerca más a un problema difícil de verdad. Pero ni el cubo de Rubik ni el ajedrez son problemas difíciles por naturaleza. Los problemas difíciles de verdad son los que encontramos en la naturaleza, no los juegos que inventamos. Los problemas de la naturaleza no encajan en las categorías de complejidad de la informática. Sus espacios de posibilidades son prácticamente infinitos. Pero el cubo de Rubik y el ajedrez son buenos ejemplos para ver la transición de problemas sencillos (como las manos calientes) a problemas que se acercan a la dificultad real.
Resumiendo, hay tres aspectos de los espacios abstractos que usamos para definir los problemas que llevan a la dificultad: la complejidad del espacio en sí (características que dependen unas de otras), la pérdida de conexiones claras entre las características y el tamaño pequeño del espacio de soluciones en comparación con el espacio total. Un problema extremadamente difícil tiene estas tres cosas en un grado muy alto.
Si pensamos en todo el espacio que hay que recorrer en los problemas difíciles, parece imposible encontrar la respuesta. El cubo de Rubik tiene más de 43 trillones de configuraciones posibles. El ajedrez aún más. Y aún así, son solo juegos, con menos dimensiones que las situaciones del mundo real. El número de configuraciones posibles en la naturaleza, sin restricciones impuestas por el hombre, tiene niveles de complejidad inimaginables. Los problemas en este espacio son diferentes a todo lo que encontramos en los juegos.
Y aún así, los humanos encontramos soluciones a los problemas difíciles de la naturaleza todo el tiempo. ¿Cómo podemos controlar esos espacios de posibilidades tan grandes y hacerlos manejables?
Cuanto más difícil es el problema, más suave es la búsqueda.
Hay que tener en cuenta que, debido a la cantidad de combinaciones que tiene el cubo de Rubik, los métodos de búsqueda exhaustiva (probar todas las configuraciones posibles hasta encontrar la correcta) son imposibles, incluso con los ordenadores más rápidos. Tardaríamos miles de millones de años en calcular todas las configuraciones posibles para encontrar una solución.
Por eso, los ordenadores que resuelven cubos de Rubik tienen que usar trucos y reconocimiento de patrones para buscar en el espacio de posibilidades de forma más eficiente. Estos trucos son reglas generales o atajos que permiten a la gente, y a las máquinas, resolver problemas difíciles sin tener que analizar todo explícitamente. Por ejemplo, los grandes maestros de ajedrez usan patrones reconocibles en el tablero para jugar a su máximo nivel. No están contando las piezas, sino reconociendo patrones que les guían hacia buenas jugadas.
El cubo de Rubik no es un problema difícil de verdad, pero nos enseña que, a medida que aumenta la dificultad de un problema, más suave tiene que ser nuestra forma de resolverlo. "Suave" significa usar cosas como trucos y reconocimiento de patrones en lugar de analizar todas las partes del problema. Cuanto más difícil es el problema, más grande y complejo es su espacio de posibilidades, y más espacio hay que buscar. Y cuanto más espacio haya que buscar, menos podemos analizar cómo lo buscamos. En el problema de las manos calientes, buscábamos fácilmente probando y pensando un poco. El problema del muñeco de nieve requería probar más, porque la deducción era menos útil. El cubo de Rubik requeriría aún más prueba y error para encontrar una nueva solución. Incluso si lo hacemos de forma sistemática, necesitamos usar trucos. La búsqueda exhaustiva, probar todas las configuraciones hasta encontrar la solución, no es viable.
Parece lógico que los problemas difíciles de la naturaleza, los que encontramos en la vida real, solo se pueden resolver con los métodos más suaves. Y así es. Los humanos hemos evolucionado para resolver los problemas más difíciles usando trucos y reconocimiento de patrones, no análisis detallado. Las emociones y las intuiciones que usamos son nuestras versiones evolucionadas de los trucos. Por lo tanto, no solo los ordenadores hechos por el hombre calculan, como dice la definición original de problema difícil. La naturaleza calcula. Y la naturaleza nos enseña lo que se necesita para resolver los problemas más difíciles. Tenemos que salir del sistema, alejarnos del análisis deliberado, y explorar espacios de posibilidades enormes usando prueba y error, trucos y reconocimiento de patrones.
Por eso existe el aprendizaje profundo. Los métodos analíticos y la informática basada en reglas no pueden resolver los problemas difíciles de verdad. El aprendizaje profundo no se basa en análisis o reglas, sino que usa versiones informáticas de prueba y error, trucos y reconocimiento de patrones. El aprendizaje profundo se puede aplicar al problema del cubo de Rubik para encontrar nuevas soluciones. Y se ha hecho, con la esperanza de que nos dé ideas, estrategias o innovaciones para resolver problemas en general. El aprendizaje profundo busca en el espacio de posibilidades como lo haría un humano: de forma suave, desde fuera.
Pero aunque la forma de buscar que usa el aprendizaje profundo sea parecida a la que usan los humanos, no podemos decir lo mismo de las soluciones que encuentra. Los humanos y la informática tradicional encuentran una solución que se puede presentar como una serie de instrucciones fáciles de entender para otros (por ejemplo, un algoritmo para resolver el cubo). Pero el aprendizaje profundo produce algo muy diferente. No es una serie de pasos visibles, sino algo que no podemos ver de esa forma. Las soluciones que produce el aprendizaje profundo no se pueden entender y no se pueden interpretar. No sabemos lo que está haciendo el aprendizaje profundo cuando su solución resuelve el cubo. La pregunta obvia es: ¿por qué la misma forma de buscar entre dos sistemas diferentes, humanos e inteligencia artificial, produce soluciones tan diferentes?