El mes pasado ocurrió un hito que creo que cambiará la industria del software para siempre. Google liberó el código fuente de TensorFlow, la librería interna que utilizan para casi todos sus productos de inteligencia artificial. No tardé ni un segundo en hacer un pip install tensorflow en mi máquina.
Y tengo un diagnóstico claro: es la herramienta más potente que he tocado en mi vida, pero su curva de aprendizaje es un muro de hormigón armado.
El paradigma del Grafo Computacional Estático
Si vienes de usar librerías amigables como Scikit-Learn, TensorFlow (actualmente en su versión 0.6) te va a parecer código alienígena. No programas un flujo lógico estándar; programas un circuito matemático.
En TensorFlow, primero defines un "Grafo Computacional Estático" y luego lo ejecutas dentro de una "Sesión". Literalmente tienes que crear "marcadores de posición" (placeholders) para los datos que vas a inyectar en el futuro.
He intentado hacer la red neuronal más absurda posible: una simple regresión lineal (matemáticas de instituto) para entender la sintaxis:
import tensorflow as tf
import numpy as np
# 1. DEFINIMOS EL GRAFO (No se calcula nada aún, solo se dibuja el circuito)
# Marcadores para inyectar nuestros datos (X) y resultados esperados (Y)
X = tf.placeholder("float")
Y = tf.placeholder("float")
# Variables que la red va a "aprender" (Pesos y Sesgos)
W = tf.Variable(np.random.randn(), name="peso")
b = tf.Variable(np.random.randn(), name="sesgo")
# La fórmula del modelo: Predicción = X * W + b
prediccion = tf.add(tf.mul(X, W), b)
# Función de coste (Error Cuadrático Medio) a minimizar
coste = tf.reduce_sum(tf.pow(prediccion - Y, 2)) / 2
# Optimizador Gradient Descent
optimizador = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(coste)
# 2. EJECUCIÓN (Lanzamos la chispa en el circuito)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
# Supongamos que inyectamos datos de entrenamiento aquí en un bucle for
# sess.run(optimizador, feed_dict={X: datos_x, Y: datos_y})
print("Modelo entrenado. Los datos por fin fluyen.")
La abstracción es brutal. Estás escribiendo Python, pero en realidad estás construyendo un árbol de operaciones en C++ optimizado que luego se enviará a tu GPU para ejecutar derivadas parciales a la velocidad del rayo.
Reflexión: La democratización de lo incomprensible
Tener la misma herramienta que usa Google en sus centros de datos instalada en mi portátil es un sueño hacker. Pero la fricción técnica es altísima. TensorFlow te obliga a pensar en tensores (matrices multidimensionales), formas geométricas de los datos y gradientes de error.
¿Acabará el Machine Learning siendo una herramienta habitual en el cinturón de cualquier programador web? Con este nivel de complejidad, lo dudo. Es demasiado matemático para un desarrollador de negocio. Mi intuición me dice que en los próximos años veremos surgir "envoltorios" de alto nivel (librerías construidas por encima de TensorFlow) que ocultarán todo este infierno de Sesiones y Grafos, permitiéndonos definir redes neuronales con un par de líneas de código. Hasta entonces, seguiremos sufriendo con el álgebra lineal.