Software 2.0 — Andrej Karpathy (2017)
La traducción
A veces veo que las personas se refieren a las redes neuronales artificiales simplemente como "otra herramienta más en tu caja de herramientas de aprendizaje automático". Tienen algunos pros y contras, funcionan en ciertos casos, y a veces puedes usarlas para ganar competencias Kaggle. Desafortunadamente, esta interpretación no ve el bosque por los árboles. Las redes neuronales no son solo otro clasificador, representan el comienzo de un cambio fundamental en cómo desarrollamos software. Son el Software 2.0.
La "pila clásica" del Software 1.0 es con lo que todos estamos familiarizados: está escrito en lenguajes como Python, C++, etc. Consiste en instrucciones explícitas para la computadora escritas por un programador. Al escribir cada línea de código, el programador identifica un punto específico en el espacio de programas con algún comportamiento deseable.
En contraste, el Software 2.0 está escrito en un lenguaje mucho más abstracto y menos accesible para los humanos, como los pesos de una red neuronal artificial. No se requiere la intervención humana para escribir este código porque hay muchos pesos (las redes típicas pueden tener millones), y codificar directamente en pesos es bastante difícil (lo intenté).
En su lugar, nuestro enfoque es especificar algún objetivo sobre el comportamiento de un programa deseable (por ejemplo, "satisfacer un conjunto de datos de pares de entrada y salida de ejemplos", o "ganar una partida de Go"), escribir un esqueleto aproximado del código (es decir, una arquitectura de red neuronal) que identifique un subconjunto del espacio de programas para buscar, y usar los recursos computacionales a nuestra disposición para buscar en este espacio un programa que funcione. En el caso de las redes neuronales, restringimos la búsqueda a un subconjunto continuo del espacio de programas donde el proceso de búsqueda puede hacerse (algo sorprendentemente) eficiente con propagación hacia atrás y descenso de gradiente estocástico.
Para hacer la analogía explícita, en el Software 1.0, el código fuente diseñado por humanos (por ejemplo, algunos archivos .cpp) se compila en un binario que realiza un trabajo útil. En el Software 2.0, la mayoría de las veces el código fuente comprende 1) el conjunto de datos que define el comportamiento deseable y 2) la arquitectura de red neuronal que proporciona el esqueleto aproximado del código, pero con muchos detalles (los pesos) por completar. El proceso de entrenamiento de la red neuronal compila el conjunto de datos en el binario: la red neuronal final. En la mayoría de las aplicaciones prácticas actuales, las arquitecturas de redes neuronales y los sistemas de entrenamiento se estandarizan cada vez más como un bien estándar, por lo que la mayor parte del "desarrollo de software" activo toma la forma de curar, expandir, ajustar y limpiar conjuntos de datos etiquetados. Esto está alterando fundamentalmente el paradigma de programación mediante el cual iteramos en nuestro software, ya que los equipos se dividen en dos: los programadores 2.0 (etiquetadores de datos) editan y expanden los conjuntos de datos, mientras que algunos programadores 1.0 mantienen e iteran sobre la infraestructura de código de entrenamiento circundante, las analíticas, las visualizaciones y las interfaces de etiquetado.
Resulta que una gran parte de los problemas del mundo real tienen la propiedad de que es significativamente más fácil recopilar los datos (o, en términos más generales, identificar un comportamiento deseable) que escribir explícitamente el programa. Debido a esto y a muchos otros beneficios de los programas de Software 2.0 que analizaré más adelante, estamos presenciando una transición masiva en la industria, donde gran parte del código 1.0 se está migrando a código 2.0. El Software (1.0) se está comiendo el mundo, y ahora la IA (Software 2.0) se está comiendo el software.
Transición en curso
Examinemos brevemente algunos ejemplos concretos de esta transición en curso. En cada una de estas áreas hemos visto mejoras en los últimos años cuando abandonamos el intento de abordar un problema complejo escribiendo código explícito y, en cambio, migramos el código a la pila 2.0.
El reconocimiento visual solía consistir en características diseñadas manualmente con un poco de aprendizaje automático al final (por ejemplo, un SVM). Desde entonces, hemos descubierto características visuales mucho más potentes al obtener grandes conjuntos de datos (por ejemplo, ImageNet) y buscar en el espacio de arquitecturas de Redes Neuronales Convolucionales. Más recientemente, ni siquiera confiamos en codificar manualmente las arquitecturas y hemos comenzado a buscarlas también.
El reconocimiento de voz solía implicar mucho preprocesamiento, modelos de mezcla gaussiana y modelos ocultos de Markov, pero hoy consiste casi en su totalidad en redes neuronales. Una cita humorística muy relacionada, a menudo atribuida a Fred Jelinek en 1985, dice: "Cada vez que despido a un lingüista, el rendimiento de nuestro sistema de reconocimiento de voz mejora".
La síntesis de voz históricamente se abordó con varios mecanismos de unión, pero hoy los modelos más avanzados son grandes ConvNets (por ejemplo, WaveNet) que producen salidas de señal de audio en bruto.
La traducción automática generalmente se ha abordado con técnicas estadísticas basadas en frases, pero las redes neuronales están dominando rápidamente. Mis arquitecturas favoritas se entrenan en entornos multilingües, donde un solo modelo traduce de cualquier idioma fuente a cualquier idioma objetivo, y en entornos débilmente supervisados (o completamente no supervisados).
Juegos. Los programas de Go codificados explícitamente se han desarrollado durante mucho tiempo, pero AlphaGo Zero (una ConvNet que observa el estado crudo del tablero y realiza un movimiento) se ha convertido, con mucho, en el jugador más fuerte del juego. Espero que veamos resultados muy similares en otras áreas, como DOTA 2 o StarCraft.
Bases de datos. Sistemas más tradicionales fuera de la Inteligencia Artificial también están viendo indicios tempranos de una transición. Por ejemplo, "The Case for Learned Index Structures" reemplaza componentes centrales de un sistema de gestión de datos con una red neuronal, superando a los B-Trees optimizados para caché hasta en un 70% en velocidad mientras ahorra un orden de magnitud en memoria.
Notarán que muchos de mis enlaces anteriores involucran trabajos realizados en Google. Esto se debe a que Google se encuentra actualmente a la vanguardia de reescribir grandes porciones de sí mismo en código de Software 2.0. "Un modelo para gobernarlos a todos" proporciona un bosquejo inicial de cómo podría lucir esto, donde la fuerza estadística de los dominios individuales se amalgama en una comprensión coherente del mundo.
Los beneficios del Software 2.0
¿Por qué deberíamos preferir migrar programas complejos al Software 2.0? Claramente, una respuesta sencilla es que funcionan mejor en la práctica. Sin embargo, hay muchas otras razones prácticas para preferir esta pila. Veamos algunos beneficios del Software 2.0 (piensen: una ConvNet) comparado con el Software 1.0 (piensen: una base de código C++ de nivel productivo). El Software 2.0 es:
Computacionalmente homogéneo. Una red neuronal típica está compuesta, en primera instancia, por solo dos operaciones: multiplicación de matrices y umbralización en cero (ReLU). Comparen eso con el conjunto de instrucciones del software clásico, que es significativamente más heterogéneo y complejo. Como solo deben implementar en Software 1.0 un pequeño número de primitivas computacionales básicas (ej. multiplicación de matrices), es mucho más fácil garantizar corrección/rendimiento.
Sencillo de implementar en silicio. Como corolario, dado que el conjunto de instrucciones de una red neuronal es relativamente pequeño, es significativamente más fácil implementar estas redes más cerca del silicio, ej. con ASICs personalizados, chips neuromórficos, etc. El mundo cambiará cuando la inteligencia de bajo consumo se vuelva omnipresente. Ej., chips pequeños y económicos podrían incluir una ConvNet preentrenada, un reconocedor de voz y una red de síntesis de voz WaveNet, todo integrado en un "protocerebro" que puedan conectar a dispositivos.
Tiempo de ejecución constante. Cada iteración de un paso forward típico en una red neuronal consume exactamente la misma cantidad de FLOPS. No hay variabilidad basada en diferentes rutas de ejecución que su código podría tomar en una base de código C++ extensa. Claro, podrían tener grafos de computación dinámicos, pero el flujo de ejecución normalmente sigue estando significativamente restringido. De esta forma, también tenemos casi garantizado no encontrarnos con bucles infinitos no intencionales.
Uso de memoria constante. Relacionado con lo anterior, no hay memoria asignada dinámicamente en ningún lugar, por lo que también hay poca posibilidad de intercambio a disco o fugas de memoria que deban rastrear en su código.
Altamente portable. Una secuencia de multiplicaciones de matrices es significativamente más fácil de ejecutar en configuraciones computacionales arbitrarias en comparación con binarios clásicos o scripts.
Muy ágil. Si tuvieras un código en C++ y alguien te pidiera que lo hicieras el doble de rápido (a costa del rendimiento si fuera necesario), sería extremadamente complejo ajustar el sistema para cumplir con el nuevo requisito. Sin embargo, en el Software 2.0 podemos tomar nuestra red, eliminar la mitad de los canales, reentrenar, y listo: funciona exactamente al doble de velocidad con un rendimiento ligeramente inferior. Es mágico. A la inversa, si obtienes más datos o capacidad de cómputo, puedes mejorar inmediatamente tu programa simplemente añadiendo más canales y reentrenando.
Los módulos pueden fusionarse en un todo óptimo. Nuestro software suele descomponerse en módulos que se comunican mediante funciones públicas, APIs o puntos finales. Sin embargo, si dos módulos de Software 2.0 entrenados por separado interactúan, podemos propagar hacia atrás fácilmente a través de todo el sistema. Imagina lo increíble que sería si tu navegador web pudiera rediseñar automáticamente las instrucciones de bajo nivel 10 niveles más abajo para lograr una mayor eficiencia en la carga de páginas. Con el 2.0, este es el comportamiento predeterminado.
Es mejor que tú. Finalmente, y lo más importante, una red neuronal artificial es un código mejor que cualquier cosa que tú o yo podamos diseñar en una gran fracción de verticales valiosas, que actualmente incluyen al menos todo lo relacionado con imágenes/video y sonido/voz.
Las limitaciones del Software 2.0
La pila 2.0 también tiene sus propias desventajas. Al final de la optimización, nos quedamos con redes grandes que funcionan bien, pero es muy difícil entender cómo. En muchas áreas de aplicación, tendremos que elegir entre usar un modelo 90% preciso que comprendemos o un modelo 99% preciso que no entendemos.
La pila 2.0 puede fallar de formas poco intuitivas y embarazosas, o peor aún, puede "fallar silenciosamente", por ejemplo, adoptando sesgos en sus datos de entrenamiento que son muy difíciles de analizar y examinar adecuadamente cuando sus tamaños suelen ser de millones en la mayoría de los casos.
Finalmente, todavía estamos descubriendo algunas de las propiedades peculiares de esta pila. Por ejemplo, la existencia de ejemplos y ataques adversarios resalta la naturaleza poco intuitiva de este enfoque.
Programación en la pila 2.0
El Software 1.0 es código que escribimos. El Software 2.0 es código escrito por la optimización basado en un criterio de evaluación (como "clasifica correctamente estos datos de entrenamiento"). Es probable que cualquier escenario donde el programa no sea obvio pero se pueda evaluar repetidamente su rendimiento (por ejemplo, ¿clasificaste correctamente algunas imágenes? ¿ganas partidas de Go?) esté sujeto a esta transición, porque la optimización puede encontrar un código mucho mejor que el que un humano puede diseñar.
Si reconocemos el Software 2.0 como un nuevo paradigma de programación emergente, en lugar de tratar simplemente a las redes neuronales artificiales como un clasificador bastante bueno dentro de las técnicas de aprendizaje automático, las extrapolaciones se vuelven más evidentes y queda claro que queda mucho trabajo por hacer.
En particular, hemos desarrollado una gran cantidad de herramientas que ayudan a los humanos a escribir código 1.0, como IDEs potentes con funciones como resaltado de sintaxis, depuradores, generadores de perfiles, navegación a definiciones, integración con git, etc. En la pila del Software 2.0, la programación se realiza acumulando, procesando y limpiando conjuntos de datos. Por ejemplo, cuando la red falla en algunos casos difíciles o raros, no corregimos esas predicciones escribiendo código, sino incluyendo más ejemplos etiquetados de esos casos. ¿Quién desarrollará los primeros IDEs para Software 2.0, que ayuden con todos los flujos de trabajo relacionados con la acumulación, visualización, limpieza, etiquetado y obtención de conjuntos de datos? Tal vez el IDE resalte imágenes que la red sospecha que están mal etiquetadas basándose en la pérdida por ejemplo, o ayude en el etiquetado sugiriendo etiquetas con predicciones, o proponga ejemplos útiles para etiquetar basándose en la incertidumbre de las predicciones de la red.
Del mismo modo, Github es una plataforma muy exitosa para el código de Software 1.0. ¿Hay espacio para una plataforma como Github para el Software 2.0? En este caso, los repositorios serían conjuntos de datos y las confirmaciones estarían compuestas por adiciones y ediciones de las etiquetas.
Los gestores de paquetes tradicionales y la infraestructura relacionada como pip, conda, docker, etc. nos ayudan a desplegar y componer binarios más fácilmente. ¿Cómo desplegamos, compartimos, importamos y trabajamos eficazmente con los binarios del Software 2.0? ¿Cuál es el equivalente de conda para las redes neuronales artificiales?
A corto plazo, el Software 2.0 se volverá cada vez más prevalente en cualquier dominio donde la evaluación repetida sea posible y económica, y donde el algoritmo en sí sea difícil de diseñar explícitamente. Existen muchas oportunidades emocionantes para considerar todo el ecosistema de desarrollo de software y cómo puede adaptarse a este nuevo paradigma de programación. Y a largo plazo, el futuro de este paradigma es brillante porque cada vez está más claro que cuando desarrollamos Inteligencia Artificial General, ciertamente estará escrita en Software 2.0.
Paper original: https://karpathy.medium.com/software-2-0-a64152b37c35
Newsletter
Si llegaste hasta acá, sabés que esto vale la pena.
Un email por paper. Sin resúmenes semanales ni contenido de relleno.
También en Magacín
The AI Layoff Trap — Falk & Tsoukalas (2026)
Un modelo matemático que demuestra que empresas racionales se automatizan más allá del punto óptimo colectivo. Una trampa de coordinación, no de irracionalidad.
Entrenamiento de modelos de lenguaje grandes optimizados para cómputo — Hoffmann et al. (2022)
El paper de Chinchilla que demostró que la mayoría de los LLMs estaban sub-entrenados. No solo necesitás más parámetros: necesitás más datos.
Hacking de recompensa en RLHF — Gao et al. (2023)
Cuando los modelos aprenden a maximizar la recompensa sin resolver el problema real. Un análisis formal del fenómeno de reward hacking en RLHF.