# Andrej Karpathy

Andrej Karpathy (Bratislava, Checoslovaquia ahora Eslovaquia el 23 de octubre de 1986) es uno de los científicos de datos más influyentes e innovadores. Es especialista en inteligencia artificial, aprendizaje profundo (deep learning) y visión por computadora (computer vision). Desde 2017 es profesor en la Universidad de Stanford.
Andrej Karpathy se unió al grupo de inteligencia artificial OpenAI como científico investigador y miembro fundador en septiembre de 2016. En febrero de 2023 se reincorporó a OpenAI. Entre 2017 y 2022 fue el director de inteligencia artificial y Autopilot Vision en Tesla. El 13 de febrero de 2024 Karpathy abandonó OpenAI para dedicarse a proyectos personales.

## Educación

Andrej Karpathy nació en Bratislava, Checoslovaquia (ahora Eslovaquia) y se mudó con su familia a Toronto cuando tenía 15 años.
Inicialmente estaba interesado en la computación cuántica, pero derivó hacia la inteligencia artificial.
Se licenció en Ciencias de la Computación y Física (Computer Science and Physics) en la Universidad de Toronto en 2009 y completó su maestría en la Universidad de Columbia Británica en 2011, donde trabajó en animación de figuras simuladas físicamente.
Estuvo de becario dos períodos en Google Research trabajando en redes neuronales (Google Brain) para la clasificación de video en 2013, y en 2015 con DeepMind con el equipo de aprendizaje profundo con refuerzo.
Junto a Adam Coates publicó una publicación (paper) NIPS para entrenar un modelo de aprendizaje profundo sin supervisión (unsupervised deep learning model) con millones de imágenes de YouTube y descubrir automáticamente conceptos visuales recurrentes.
Desarrolló la librería ConvNetJS en JavaScript de aprendizaje profundo con redes neuronales para usarla en un navegador (web browser). Permite realizar demos que entrenan redes neuronales convolucionales dentro del navegador.
Se graduó con un doctorado de la Universidad de Stanford en 2015 bajo la supervisión de Fei-fei Li, centrándose su tesis doctoral en la intersección del procesamiento del lenguaje natural y la visión artificial, y en los modelos de aprendizaje profundo adecuados para esta tarea (Connecting Images and Natural Language).
Durante el primer año del programa de rotaciones trabajó con Daphne Koller, Andrew Ng, Sebastian Thrun y Vladlen Koltun.

## Carrera

A finales de 2015 Elon Musk y otros crearon OpenAI, una compañía de investigación de inteligencia artificial (IA) inicialmente sin fines de lucro que tiene como objetivo promover y desarrollar inteligencia artificial amigable de tal manera que beneficie a la humanidad en su conjunto. La organización tiene como objetivo "colaborar libremente" con otras instituciones e investigadores al hacer sus patentes e investigaciones abiertas al público. Los fundadores (notablemente Elon Musk y Sam Altman) estaban motivados en parte por las preocupaciones sobre el riesgo existencial de la inteligencia artificial general. Andrej Karpathy se unió al grupo de inteligencia artificial OpenAI como científico investigador y miembro fundador en septiembre de 2016. En febrero de 2023 se reincorporó a OpenAI y publicó el tuit:
Karpathy publicó media docena de publicaciones (papers) con la directora del laboratorio de visión computerizada de Stanford, Fei-Fei Li, que posteriormente fue jefa del equipo de aprendizaje automatizado (machine learning) de Google Cloud.
También publicó dos publicaciones (papers) con el que fue director de Inteligencia Artificial de Google, Andrew Ng.
Las investigaciones de Karpathy se centran en el reconocimiento de imágenes y en la comprensión.
Diseñó e impartió la primera clase sobre aprendizaje profundo en la Universidad de Stanford (CS 231n: Convolutional Neural Networks for Visual Recognition). La clase se convirtió en una de las más grandes en Stanford con 150 apuntados en 2015, 330 estudiantes en 2016 y 750 estudiantes en 2017.
En junio de 2017 fue contratado como director de inteligencia artificial de Tesla, reportando directamente a Elon Musk.
En Tesla lideró el equipo de visión computerizada de Tesla Autopilot para el etiquetado de imágenes, el entrenamiento de redes neuronales y la integración para que funcionara en el chip de inferencias fabricado a medida por Tesla.
Karpathy contrató hasta mil empleados para etiquetar imágenes. El equipo Autopilot procesaba las imágenes de las ocho cámaras para crear un mundo tridimensional mediante las redes neuronales. Era un problema muy complejo en la ejecución de la ingeniería en el flujo de datos, en el motor de datos (data engine), el entrenamiento de las redes neuronales, la habilidad de evaluar todo el sistema y hacer iteraciones sobre un sistema desplegado a escala. Autopilot mejoró la seguridad y la comodidad de la conducción. El objetivo era alcanzar la conducción autónoma total con Autopilot FSD. Su equipo fue responsable de desactivar el radar y basar el Autopilot puramente en visión. Karpathy argumentó que la aproximación basada en visión era superior porque se puede escalar mucho mejor. Puede funcionar en una amplia variedad de entornos y no solo en los que han sido mapeados en alta definición. Karpathy se preguntaba: Cuando el radar y la visión disienten, ¿a quién hacemos caso? La visión tiene mucha más precisión, de modo que es mejor apostar por la visión que hacer una fusión de sensores. Karpathy explicó que las ocho cámaras de un Tesla proporcionaban más información sobre el entorno del vehículo que cualquier otro tipo de sensor. Y al contrario de lo que la gente piensa, esto se extiende a la profundidad y a la velocidad de los objetos. Los radares proporcionan muy buena información de profundidad y velocidad, pero pueden tener problemas con las alcantarillas y las sombras creadas por los puentes, porque tienen una resolución vertical mediocre, y proporcionar lecturas falsas. Karpathy explicó que entrenando redes neuronales con conjuntos de datos enormes, limpios y diversos podían proporcionar mejor calidad que el radar en esas métricas. La enorme flota de vehículos Tesla proporcionaba esos conjuntos de datos. Cuando el Autopilot está activado también funciona un programa en la sombra (shadow mode) que hace comparaciones entre lo que ve y lo que Autopilot ve.
En marzo de 2022 se tomó un año sabático de Tesla, pero en julio de 2022 Karpathy anunció que dejaba la empresa. En febrero de 2023 se reincorporó a OpenAI. El 13 de febrero de 2024 Karpathy abandonó OpenAI para dedicarse a proyectos personales.

## Divulgación

Karpathy fue nombrado uno de los innovadores menores de 35 años de MIT Technology Review (MIT Technology Review's Innovators Under 35) para el año 2020.
Escribió las aplicaciones arxiv-sanity y arxiv-sanity-lite y creó el sitio web que permite realizar búsquedas por similitud, tiempo y obtener recomendaciones de publicaciones científicas en ArXiv.
Escribió el programa de código abierto ulogme! para medir la productividad de forma privada sin tener que enviar datos a sitios web o a la nube.
Siendo un gran aficionado al cubo de Rubik desarrolló el programa «Rubik's cube color extractor» que permite leer y asignar los colores de los cuadrados de un cubo de Rubik mostrando cada cara del cubo a una cámara. La lectura de las seis caras se efectúa en menos de tres segundos.
Hacia 2009 programó en Python una inteligencia artificial para jugar al Tetris en una rejilla de 10x20, consiguiendo superar siempre 1000 líneas y llegando a un máximo de 5000 líneas.
Publica aportaciones en sus blogs sobre sus investigaciones y trabajos en inteligencia artificial.
Es muy partidario de la publicación del código abierto y de impartir charlas de divulgación.
Publicó una guía de supervivencia para hacer una tesis doctoral.
Hasta 2022 había publicado transcripciones de todos los programas del canal de YouTube sobre inteligencia artificial de Lex Fridman realizadas con OpenAI Whisper.

## Software 2.0

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 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 extremadamente difícil.
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 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, se restringe 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.
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. 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.
Karpathy puso como ejemplos de esa transición:
* 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.
* 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. Las arquitecturas preferidas 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 habían 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 había convertido, con mucho, en el jugador más fuerte del juego.
* Bases de datos. Los sistemas más tradicionales fuera de la inteligencia artificial también veían 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 reduce un orden de magnitud en el uso de la memoria.
Karpathy apuntó los beneficios del Software 2.0:
* Computacionalmente homogéneo. Una red neuronal típica está, en 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 silicio. 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.
* 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. No hay memoria asignada dinámicamente en ningún lugar, por lo que también hay pocas posibilidades de tener que usar la memoria de intercambio (swap) en disco o de tener pérdidas de memoria que haya que buscar en el código.
* Es muy portable. 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 en un programa C++ alguien quisiera hacerlo 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 se puede tomar la red, eliminar la mitad de los canales, reentrenar y listo, funciona exactamente al doble de velocidad y funciona un poco peor. Por el contrario, si consigue más datos/cálculo, puede hacer que su programa funcione mejor de inmediato con solo agregar más canales y volver a entrenar la red neuronal.
* 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.
* Es mejor que un humano. En cualquier campo que tenga algo que ver con imágenes/video y sonido/voz, una red neuronal es una pieza de código mejor que cualquier cosa que un humano pueda crear en la mayoría de métricas.

## Vida personal

En 2022 abandonó Tesla porque las reuniones y las responsabilidades no le dejaban tiempo para la investigación y la docencia. No descartaba volver a trabajar en Tesla. Las clases que imparte le pueden llevar 10 horas de preparación por cada hora de clase. Suele trabajar con su portátil conectado a un «cluster» vía ssh. Andrej trabaja mejor de noche siempre que puede. En 2022 solo hacía dos comidas al día y tenía preferencia hacia lo vegetariano. Entre sus libros favoritos estaban:
    The Vital Question de Nick Lane.
    Life Ascending. The Great Inventions of Evolution de Nick Lane.
    The Selfish Gene (El gen egoísta) de Richard Dawkins.
En 2022 publicó en un tuit que entre las películas que había visto más de cinco veces y que va a seguir viendo cuando pueda están: Interstellar, Gladiator, Contact, Good Will Hunting, The Matrix, Lord of the Rings (El señor de los anillos) 1/2/3, Harry Potter 1, Avatar, The Fith Element (El quinto elemento), Independence Day, Rush Hour, Armageddon, Stargate, Anchorman, Mean Girls y Terminator 2.

## Publicaciones

* World of Bits: An Open-Domain Platform for Web-Based Agents
    ICML 2017
    Tianlin (Tim) Shi, Andrej Karpathy, Linxi (Jim) Fan, Jonathan Hernandez, Percy Liang
* PixelCNN++: A PixelCNN Implementation with Discretized Logistic Mixture Likelihood and Other Modifications
    ICLR 2017
    Tim Salimans, Andrej Karpathy, Xi Chen, Diederik P. Kingma, and Yaroslav Bulatov
* Connecting Images and Natural Language (PhD thesis)
    2016
    Andrej Karpathy
* DenseCap: Fully Convolutional Localization Networks for Dense Captioning
    CVPR 2016 (Oral)
    Justin Johnson, Andrej Karpathy, Li Fei-Fei
* Visualizing and Understanding Recurrent Networks
    ICLR 2016 Workshop
    Andrej Karpathy, Justin Johnson, Li Fei-Fei
* Deep Visual-Semantic Alignments for Generating Image Descriptions
    CVPR 2015 (Oral)
    Andrej Karpathy, Li Fei-Fei
* ImageNet Large Scale Visual Recognition Challenge
    IJCV 2015
    Olga Russakovsky, Jia Deng, Hao Su, Jonathan Krause, Sanjeev Satheesh, Sean Ma, Zhiheng Huang, Andrej Karpathy, Aditya Khosla, Michael Bernstein, Alexander C. Berg, Li Fei-Fei
* Deep Fragment Embeddings for Bidirectional Image-Sentence Mapping
    NIPS 2014
    Andrej Karpathy, Armand Joulin, Li Fei-Fei
* Large-Scale Video Classification with Convolutional Neural Networks
    CVPR 2014 (Oral)
    Andrej Karpathy, George Toderici, Sanketh Shetty, Thomas Leung, Rahul Sukthankar, Li Fei-Fei
* Grounded Compositional Semantics for Finding and Describing Images with Sentences
    TACL 2013
    Richard Socher, Andrej Karpathy, Quoc V. Le, Christopher D. Manning, Andrew Y. Ng
* Object Discovery in 3D scenes via Shape Analysis
    ICRA 2013
    Andrej Karpathy, Stephen Miller, Li Fei-Fei
* Emergence of Object-Selective Features in Unsupervised Feature Learning
    NIPS 2012
    Adam Coates, Andrej Karpathy, Andrew Ng
* Curriculum Learning for Motor Skills
    AI 2012
    Andrej Karpathy, Michiel van de Panne
* Locomotion Skills for Simulated Quadrupeds
    SIGGRAPH 2011
    Stelian Coros, Andrej Karpathy, Benjamin Jones, Lionel Reveret, Michiel van de Panne