El Software 2.0 es un término acuñado por Andrej Karpathy en 2017[1] en contraposición al desarrollo de software tradicional que sería el Software 1.0. El «stack» clásico del Software 1.0 está escrito en lenguajes como Python o C++. Se compone de instrucciones explícitas a 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 programa con algún comportamiento deseable. Por el contrario, el Software 2.0 está escrito en un lenguaje mucho más abstracto y hostil a los humanos, como los pesos de una red neuronal. Ningún ser humano está involucrado en la escritura de este código porque hay muchos pesos (las redes típicas pueden tener millones), y codificar directamente en pesos es algo difícil.[2] En cambio, en el Software 2.0 el 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 un juego de Go»), escribir un esqueleto aproximado del código (es decir, una arquitectura de red neuronal) que identifica un subconjunto del espacio de programa para buscar y utilizar los recursos computacionales a nuestra disposición para buscar en este espacio un programa que funcione. En el caso de las redes neuronales, se restringe la búsqueda a un subconjunto continuo del espacio de programa donde el proceso de búsqueda se puede hacer eficiente con retropropagación y descenso de gradiente estocástico.[2]
En Software 1.0, el código fuente diseñado por humanos (por ejemplo, algunos archivos «.cpp») se compila en un binario que hace un trabajo útil. En 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 la red neuronal que proporciona el esqueleto aproximado del código, pero con muchos detalles (los pesos) para 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 de hoy, las arquitecturas de redes neuronales y los sistemas de entrenamiento están cada vez más estandarizados en un producto, por lo que la mayor parte del «desarrollo de software» activo toma la forma de curar, crecer, masajear y limpiar conjuntos de datos etiquetados.[2]
Software 1.0: Los ingenieros formalmente especifican sus problemas, diseñan algoritmos cuidadosamente, componen sistemas y subsistemas o dividen sistemas complejos en componentes más pequeños.
Software 2.0: Los ingenieros recopilan datos de entrenamiento con los que alimentan un algoritmo ML (Machine Learning: Aprendizaje automático) que sintetizará una aproximación de la función definida por ese conjunto de datos de entrenamiento. En lugar de que el interés esté en el código de programación, en el Software 2.0 todo se centra en los datos y la compilación de código fuente queda reemplazada por los modelos de entrenamiento con datos.
Además de las funciones que sintetizan los algoritmos ML, el Software 2.0 incluye con frecuencia muchas otras funciones que los programadores implementan usando el paradigma Software 1.0.[1]
Desde la década de 2010, los avances tanto en los algoritmos de aprendizaje automático como en el hardware de la computadora han llevado a métodos más eficientes para entrenar redes neuronales profundas que contienen muchas capas de unidades ocultas no lineales y una capa de salida muy grande. Para 2019, las unidades de procesamiento gráfico (GPU), a menudo con mejoras específicas de IA, habían desplazado a las CPU como el método dominante para entrenar la IA en la nube comercial a gran escala.[3]
En 2018 OpenAI estimó el cálculo computacional utilizado en los proyectos de aprendizaje profundo desde AlexNet (2012) a AlphaZero (2017), y encontró un aumento de 300 000 veces en la cantidad de cálculo requerido. La línea de tendencia exponencial indicaba que cada 3.4 meses se duplicaba la potencia de cálculo usada para los mayores proyectos de inteligencia artificial.[4]
De forma similar a cómo la disponibilidad de un rico ecosistema de librerías reutilizables contribuyó a grandes ganancias de productividad en el Software 1.0, la disponibilidad de librerías como TensorFlow, Scikit-Learn y Keras es un componente clave para el crecimiento del Software 2.0.
Empresas como Google, Facebook, Microsoft y Amazon invierten activamente en librerías ML de código abierto.
La disponibilidad de los últimos algoritmos ML (state-of-the-art) en librerías hace que sea relativamente fácil usar ML en aplicaciones de software partiendo de cero o transformar aplicaciones de Software 1.0 en aplicaciones de Software 2.0.[1]
Python es la «lengua franca» para ML. Python es un lenguaje de programación de propósito general, de alto nivel e interpretado. Reúne la potencia de un lenguaje de propósito general con la facilidad de uso de los lenguajes de scripting en dominios específicos.
ML (Machine Learning: Aprendizaje automatizado) abarca varios tipos de algoritmos de aprendizaje como:
Para proporcionar un acceso rápido a estos algoritmos la comunidad de código abierto desarrolló muchas librerías Python ML como:
Estas librerías proporcionan algoritmos que permiten que los desarrolladores apliquen fácilmente soluciones basadas en ML a objetivos de negocio. Además de las librerías ML, los desarrolladores frecuentemente usan librerías que proporcionan:
El Software 2.0 hereda los desafíos de las librerías ML:
Un estudio de 2021 afirmó que entre 2013 y 2018 los nuevos proyectos de Software 2.0 en GitHub crecieron del 1.75% al 49.63% del total. ML (Aprendizaje automático) era entonces el campo de mayor crecimiento en las ciencias de la información.[1]
El aumento del Software 2.0 tiene implicaciones para investigadores, fabricantes de herramientas de software, vendedores de librerías ML, vendedores de hardware y desarrolladores de ML.[1]
‘ If you recognize Software 2.0 as a new and emerging programming paradigm instead of simply treating neural networks as a pretty good classifier in the class of machine learning techniques, the extrapolations become more obvious, and it’s clear that there is much more work to do.‘‘Si reconoces que el Software 2.0 como un nuevo paradigma emergente en programación en lugar de tratar a las redes neuronales como un buen clasificador en las técnicas de aprendizaje automático, las extrapolaciones se hacen obvias, y está claro que hay mucho trabajo por hacer.’Andrej Karpathy
[6]
‘In the short term, Software 2.0 will become increasingly prevalent in any domain where repeated evaluation is possible and cheap, and where the algorithm itself is difficult to design explicitly. There are many exciting opportunities to consider the entire software development ecosystem and how it can be adapted to this new programming paradigm. And in the long run, the future of this paradigm is bright because it is increasingly clear that when we develop AGI, it will certainly be written in Software 2.0‘‘En el corto plazo el Software 2.0 será prevalente en cualquier dominio donde la evaluación repetida sea posible y barata, y donde el algoritmo mismo sea difícil de diseñar explícitamente. Hay muchas oportunidades apasionantes para considerar el ecosistema del desarrollo de software y cómo puede ser adaptado a este nuevo paradigma de programación. Y en el largo plazo, el futuro de este paradigma es brillante porque cada vez está más claro que cuando desarrollemos AGI (Artificial General Intelligence: Inteligencia Artificial General) seguramente estará escrita en Sofware 2.0.’Andrej Karpathy
[6]
El 11 de noviembre de 2017 Andrej Karpathy publicó un artículo seminal titulado «Software 2.0» en el que afirmaba que las redes neuronales no eran otro clasificador, sino que representaban el principio de un cambio fundamental en la forma en que se desarrollaba software. El stack clásico del Software 1.0 está escrito en lenguajes como Python, C++. Se compone de instrucciones explícitas a 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 programa con algún comportamiento deseable. Por el contrario, el Software 2.0 está escrito en un lenguaje mucho más abstracto y hostil a los humanos, como los pesos de una red neuronal. Ningún ser humano está involucrado en la escritura de este código porque hay muchos pesos (las redes típicas pueden tener millones), y codificar directamente en pesos es algo difícil.[2]
En cambio, en el Software 2.0 el 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 un juego de Go»), escribir un esqueleto aproximado del código (es decir, una arquitectura de red neuronal) que identifica un subconjunto del espacio de programa para buscar y utilizar los recursos computacionales a nuestra disposición para buscar en este espacio un programa que funcione. En el caso de las redes neuronales, se restringe la búsqueda a un subconjunto continuo del espacio de programa donde el proceso de búsqueda se puede hacer (algo sorprendentemente) eficiente con retropropagación y descenso de gradiente estocástico.[2][7]
En Software 1.0, el código fuente diseñado por humanos (por ejemplo, algunos archivos «.cpp») se compila en un binario que hace un trabajo útil. En 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 la red neuronal que proporciona el esqueleto aproximado del código, pero con muchos detalles (los pesos) para 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 de hoy, las arquitecturas de redes neuronales y los sistemas de entrenamiento están cada vez más estandarizados en un producto, por lo que la mayor parte del «desarrollo de software» activo toma la forma de curar, crecer, masajear 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) editan y amplían los conjuntos de datos, mientras que unos pocos programadores 1.0 mantienen e iteran la infraestructura del código circundante, analíticas, visualizaciones e interfaces de etiquetado.[2] Una gran parte de los problemas del mundo real tienen la propiedad de que es significativamente más fácil recolectar los datos (o más generalmente, 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, hay una transición masiva en la industria donde una gran cantidad de código 1.0 se está transfiriendo a código 2.0.
‘Software (1.0) is eating the world, and now AI (Software 2.0) is eating software.‘‘El software (1.0) se está comiendo el mundo y ahora la IA (Software 2.0) se está comiendo el software.’Andrej Karpathy
[6]
Karpathy puso como ejemplos de esa transición:
Karpathy apuntó los beneficios del Software 2.0:
‘Gradient descent can write code better than you. I'm sorry.‘‘El descenso de gradiente estocástico puede escribir mejor código que tú. Lo siento.’Andrej Karpathy
[6]
El Software 2.0 ha reinventado dominios como: