Traducción: https://karpathy.medium.com/software-2-0-a64152b37c35

A veces veo que la gente se refiere a las redes neuronales como simplemente “otra herramienta en su caja de herramientas de aprendizaje automático”. Tienen algunos pros y contras, funcionan aquí o allá y, a veces, puedes usarlos para ganar competencias de Kaggle. Desafortunadamente, esta interpretación pierde por completo el bosque por los árboles. Las redes neuronales no son solo otro clasificador, representan el comienzo de un cambio fundamental en la forma en que desarrollamos software. Son Software 2.0.

El “stack clásico” de Software 1.0 es lo que todos estamos familiarizados con — está escrito en lenguajes como Python, C ++, etc. Se compone de instrucciones explícitas a la computadora escrito por un programador. Al escribir cada línea de código, el programador identifica un punto específico en el espacio del 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 (lo intenté).

En cambio, 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 un juego de Go”), escribir un esqueleto aproximado del código (es decir, una arquitectura de red neuronal) que identifica un subconjunto del espacio del 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, restringimos la búsqueda a un subconjunto continuo del espacio del programa donde el proceso de búsqueda se puede hacer (algo sorprendentemente) eficiente con retropropagación y descenso de gradiente estocástico.

Para hacer explícita la analogía, 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 El 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,

Resulta que 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 que detallaré a continuación, estamos siendo testigos de una transición masiva en la industria donde una gran cantidad de código 1.0 se está transfiriendo 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 nos damos por vencidos en tratar de abordar un problema complejo escribiendo código explícito y, en su lugar, hacemos la transición del código a stack 2.0.

El reconocimiento visual solía consistir en funciones diseñadas con un poco de aprendizaje automático al final (por ejemplo, una SVM). Desde entonces, descubrimos características visuales mucho más poderosas al obtener grandes conjuntos de datos (por ejemplo, ImageNet) y buscar en el espacio de las arquitecturas de redes neuronales convolucionales. Más recientemente, ni siquiera confiamos en nosotros mismos para codificar manualmente las arquitecturas y también hemos comenzado a buscarlas .

El reconocimiento de voz solía involucrar una gran cantidad de preprocesamiento, modelos de mezcla gaussiana y modelos de markov ocultos, pero hoy en día consiste casi en su totalidad en redes neuronales. Una cita humorística muy relacionada y citada a menudo atribuida a Fred Jelinek de 1985 dice: “Cada vez que despido a un lingüista, el rendimiento de nuestro sistema de reconocimiento de voz aumenta”.

Históricamente, la síntesis de voz se ha abordado con varios mecanismos de unión, pero hoy en día los modelos más avanzados son ConvNets grandes (por ejemplo, WaveNet ) que producen salidas de señal de audio sin procesar.

La traducción automática se ha utilizado habitualmente con técnicas estadísticas basadas en frases, pero las redes neuronales se están convirtiendo rápidamente en dominantes. Mis arquitecturas favoritas están formadas en entornos multilingües , donde un solo modelo se traduce de cualquier idioma de origen a cualquier idioma de destino, y en entornos poco supervisados ​​(o totalmente no supervisados ).

Juegos. Durante mucho tiempo se han desarrollado programas de juego Go codificados explícitamente a mano, pero AlphaGo Zero (una ConvNet que observa el estado bruto del tablero y realiza un movimiento) se ha convertido ahora, con mucho, en el jugador más fuerte del juego. Espero que veamos resultados muy similares en otras áreas, por ejemplo, DOTA 2 o StarCraft .

Bases de datos . Los 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 los componentes centrales de un sistema de administración de datos con una red neuronal, superando a los B-Trees optimizados para caché en hasta un 70% en velocidad mientras guarda un orden de magnitud en la memoria.

Notarás que muchos de mis enlaces anteriores implican trabajo realizado en Google. Esto se debe a que Google está actualmente a la vanguardia de la reescritura de grandes partes de sí mismo en el código de Software 2.0. “ Un modelo para gobernarlos a todos ” proporciona un esbozo inicial de cómo podría verse esto, donde la fuerza estadística de los dominios individuales se fusiona en una comprensión coherente del mundo.

Los beneficios del software 2.0

¿Por qué deberíamos preferir portar programas complejos al Software 2.0? Claramente, una respuesta fácil es que funcionan mejor en la práctica. Sin embargo, hay muchas otras razones convenientes para preferir este stack. Echemos un vistazo a algunos de los beneficios del Software 2.0 (piense: una ConvNet) en comparación con el Software 1.0 (piense: una base de código C ++ a nivel de producción). El software 2.0 es:

Computacionalmente homogéneo . Una red neuronal típica está, de primer orden, formada por un sándwich de solo dos operaciones: multiplicación de matrices y umbral en cero (ReLU). Compare eso con el conjunto de instrucciones del software clásico, que es significativamente más heterogéneo y complejo. Debido a que solo tiene que proporcionar la implementación del Software 1.0 para una pequeña cantidad de primitivas computacionales centrales (por ejemplo, multiplicación de matrices), es mucho más fácil hacer varias garantías de corrección / rendimiento.

Fácil de hornear en silicona . 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 mucho más cerca del silicio, por ejemplo, con ASIC personalizados , chips neuromórficos , etc. El mundo cambiará cuando la inteligencia de baja potencia se vuelva omnipresente a nuestro alrededor. Por ejemplo, los chips pequeños y económicos podrían venir con un ConvNet previamente entrenado, un reconocedor de voz y una red de síntesis de voz WaveNet, todo integrado en un pequeño protocerebro que puede adjuntar a cosas.

Tiempo de ejecución constante . Cada iteración de un pase hacia adelante de una red neuronal típica requiere exactamente la misma cantidad de FLOPS. No hay variabilidad basada en las diferentes rutas de ejecución que su código podría tomar a través de una base de código C ++ en expansión. Por supuesto, podría tener gráficos de cálculo dinámicos, pero el flujo de ejecución normalmente sigue estando significativamente limitado. De esta manera, también tenemos casi la garantía de que nunca nos encontraremos en bucles infinitos no deseados.

Uso constante de la memoria . En relación con lo anterior, no hay memoria asignada dinámicamente en ningún lugar, por lo que también hay pocas posibilidades de cambiar al disco o pérdidas de memoria que debe buscar en su código.

Es muy portátil . Una secuencia de multiplicaciones de matriz es significativamente más fácil de ejecutar en configuraciones computacionales arbitrarias en comparación con los binarios o scripts clásicos.

Es muy ágil . Si tuviera un código C ++ y alguien quisiera que lo hiciera dos veces más rápido (a costa del rendimiento si fuera necesario), no sería nada trivial ajustar el sistema para la nueva especificación. Sin embargo, en Software 2.0 podemos tomar nuestra red, eliminar la mitad de los canales, reentrenar y listo, funciona exactamente al doble de velocidad y funciona un poco peor. Es magia. Por el contrario, si obtiene más datos / cálculo, puede hacer que su programa funcione mejor de inmediato con solo agregar más canales y volver a capacitarse.

Los módulos pueden fusionarse en un todo óptimo . Nuestro software a menudo se descompone en módulos que se comunican a través de funciones públicas, API o puntos finales. Sin embargo, si dos módulos de Software 2.0 que se entrenaron originalmente por separado interactúan, podemos propagarlos fácilmente a través del conjunto. Piense en lo asombroso que podría ser si su navegador web pudiera rediseñar automáticamente las instrucciones del sistema de bajo nivel 10 pilas hacia abajo para lograr una mayor eficiencia en la carga de páginas web. O si la biblioteca de visión por computadora (por ejemplo, OpenCV) que importó podría ajustarse automáticamente a sus datos específicos. Con 2.0, este es el comportamiento predeterminado.

Es mejor que tu . Finalmente, y lo más importante, una red neuronal es una mejor pieza de código que cualquier cosa que usted o yo podamos encontrar en una gran fracción de verticales valiosas, que actualmente al menos involucran cualquier cosa que ver con imágenes / video y sonido / voz. .

Las limitaciones del software 2.0

El stack 2.0 también tiene algunas de sus propias desventajas. Al final de la optimización, nos quedamos con grandes redes que funcionan bien, pero es muy difícil saber cómo. En muchas áreas de aplicaciones, nos quedaremos con la opción de utilizar un modelo con una precisión del 90% que comprendamos o un modelo con una precisión del 99% que no conozcamos.

Stack 2.0 puede fallar de maneras poco intuitivas y vergonzosas , o peor, pueden “fallar silenciosamente”, por ejemplo, adoptando silenciosamente sesgos en sus datos de entrenamiento, que son muy difíciles de analizar y examinar adecuadamente cuando sus tamaños son fácilmente de millones en mayoria de los casos.

Finalmente, todavía estamos descubriendo algunas de las propiedades peculiares de este stack. Por ejemplo, la existencia de ejemplos y ataques contradictorios destaca la naturaleza poco intuitiva de este stack.

Programación en stack 2.0

El software 1.0 es el código que escribimos. El software 2.0 es un código escrito por la optimización basado en un criterio de evaluación (como “clasificar correctamente estos datos de entrenamiento”). Es probable que cualquier entorno en el que el programa no sea obvio pero se pueda evaluar repetidamente el rendimiento del mismo (por ejemplo, ¿clasificó algunas imágenes correctamente? ¿Ganó juegos de Go?) Estará sujeto a esta transición, porque la optimización puede encontrar un código mucho mejor que el que puede escribir un humano.

La lente a través de la cual vemos las tendencias es importante. Si reconoce al Software 2.0 como un paradigma de programación nuevo y emergente en lugar de simplemente tratar las redes neuronales como un clasificador bastante bueno en la clase de técnicas de aprendizaje automático, las extrapolaciones se vuelven más obvias y está claro que hay mucho más trabajo por hacer.

En particular, hemos creado una gran cantidad de herramientas que ayudan a los humanos a escribir código 1.0, como IDE potentes con características como resaltado de sintaxis, depuradores, perfiladores, ir a def, integración de git, etc. En stack 2.0, el La programación se realiza acumulando, masajeando y limpiando conjuntos de datos. Por ejemplo, cuando la red falla en algunos casos difíciles o raros, no arreglamos esas predicciones escribiendo código, sino incluyendo más ejemplos etiquetados de esos casos. ¿Quién va a desarrollar los primeros IDE de Software 2.0, que ayudan con todos los flujos de trabajo a la hora de acumular, visualizar, limpiar, etiquetar y obtener conjuntos de datos? Quizás el IDE genera imágenes que la red sospecha que están mal etiquetadas en función de la pérdida por ejemplo, o ayuda a etiquetar mediante la siembra de etiquetas con predicciones.

De manera similar, Github es un hogar muy exitoso para el código de Software 1.0. ¿Hay espacio para un Software 2.0 Github? En este caso, los repositorios son conjuntos de datos y las confirmaciones se componen de adiciones y ediciones de las etiquetas.

Los administradores de paquetes tradicionales y la infraestructura de servicio relacionada como pip, conda, docker, etc. nos ayudan a implementar y componer binarios más fácilmente. ¿Cómo implementamos, compartimos, importamos y trabajamos de manera efectiva con binarios de Software 2.0? ¿Cuál es el equivalente de conda para redes neuronales?

A corto plazo, el software 2.0 prevalecerá cada vez más en cualquier dominio donde la evaluación repetida sea posible y barata, y donde el algoritmo en sí sea difícil de diseñar explícitamente. Hay muchas oportunidades interesantes para considerar todo el ecosistema de desarrollo de software y cómo se puede adaptar a este nuevo paradigma de programación. Y a la larga, el futuro de este paradigma es brillante porque cada vez es más claro que cuando desarrollemos AGI, sin duda estará escrito en Software 2.0.

Referencia

Traducción: https://karpathy.medium.com/software-2-0-a64152b37c35

bootcampai.org