Prefacio
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
El aprendizaje profundo en el mundo actual
¡Hola y bienvenido! Este libro te introducirá en el aprendizaje profundo a través de PyTorch, una biblioteca de código abierto publicada por Facebook en 2017. A menos que hayas tenido la cabeza clavada en el suelo imitando muy bien a un avestruz en los últimos años, no habrás podido evitar darte cuenta de que las redes neuronales están por todas partes estos días. Han pasado de ser una rama muy interesante de la informática sobre la que la gente aprende y luego no hace nada, a estar presentes en nuestros teléfonos todos los días para mejorar nuestras fotos o escuchar nuestras órdenes de voz. Nuestro software de correo electrónico lee nuestro correo y produce respuestas sensibles al contexto, nuestros altavoces escuchan por nosotros, los coches conducen solos, y el ordenador ha superado por fin a los humanos en Go. También estamos viendo que la tecnología se utiliza con fines más nefastos en países autoritarios, donde centinelas respaldados por redes neuronales pueden detectar rostros entre la multitud y decidir si deben ser detenidos.
Y, sin embargo, a pesar de la sensación de que todo esto ha sucedido tan rápido, los conceptos de redes neuronales y aprendizaje profundo se remontan a mucho tiempo atrás. La prueba de que una red de este tipo podría funcionar como una forma de sustituir cualquier función matemática de forma aproximada, que sustenta la idea de que las redes neuronales pueden entrenarse para muchas tareas diferentes, se remonta a 1989,1 y las redes neuronales convolucionales de se utilizaban para reconocer dígitos en cheques a finales de los 90. Ha habido una base sólida construyéndose todo este tiempo, así que ¿por qué parece que se ha producido una explosión en los últimos 10 años?
Hay muchas razones, pero la principal tiene que ser el aumento del rendimiento delas unidades de procesamiento gráfico (GPU)de y su creciente asequibilidad. Diseñadas originalmente para juegos, las GPU necesitan realizar incontables millones de operaciones matriciales por segundo para renderizar todos los polígonos del juego de conducción o disparos al que estás jugando en tu consola o PC, operaciones para las que una CPU estándar simplemente no está optimizada. Un artículo de 2009, "Large-Scale Deep Unsupervised Learning Using Graphics Processors" (Aprendizaje profundo no supervisado a gran escala mediante procesadores gráficos), de Rajat Raina y otros, señalaba que el entrenamiento de redes neuronales también se basaba en realizar muchas operaciones matriciales, por lo que estas tarjetas gráficas complementarias podían utilizarse para acelerar el entrenamiento, así como para hacer factibles por primera vez arquitecturas de redes neuronales más grandes y profundas. Otras técnicas importantes, como Dropout (que veremos en el Capítulo 3), también se introdujeron en la última década como formas no sólo de acelerar el entrenamiento, sino de hacerlo más generalizado (para que la red no aprenda sólo a reconocer los datos de entrenamiento, un problema llamado sobreadaptación que veremos en el próximo capítulo). En los últimos dos años, las empresas han llevado este enfoque basado en la GPU al siguiente nivel, con Google creando lo que describe como unidades de procesamiento tensorial (TPU), que son dispositivos creados a medida para realizar el aprendizaje profundo lo más rápido posible, y que incluso están disponibles para el público en general como parte de su ecosistema Google Cloud.
Otra forma de trazar el progreso del aprendizaje profundo en la última década es a través del concurso ImageNet. Una base de datos masiva de más de 14 millones de imágenes, etiquetadas manualmente en 20.000 categorías, ImageNet es un tesoro de datos etiquetados para fines de aprendizaje automático. Desde 2010, el reto anual ImageNet Large Scale Visual Recognition Challenge ha intentado poner a prueba a todos los aspirantes con un subconjunto de 1.000 categorías de la base de datos, y hasta 2012, las tasas de error al afrontar el reto se situaban en torno al 25%. Ese año, sin embargo, una red neuronal convolucional profunda ganó el concurso con un error del 16%, superando ampliamente a todos los demás participantes. En los años siguientes, esa tasa de error se fue reduciendo cada vez más, hasta el punto de que en 2015, la arquitectura ResNet obtuvo un resultado del 3,6%, que superaba el rendimiento humano medio en ImageNet (5%). Nos habían superado.
Pero, ¿qué es exactamente el aprendizaje profundo y necesito un doctorado para entenderlo?
La definición de aprendizaje profundo suele ser más confusa que esclarecedora. Una forma de definirlo es decir que el aprendizaje profundo es una técnica de aprendizaje automático que utiliza múltiples y numerosas capas de transformaciones no lineales para extraer progresivamente características de la entrada bruta. Lo cual es cierto, pero en realidad no ayuda, ¿verdad? Yo prefiero describirlo como una técnica para resolver problemas proporcionando las entradas y las salidas deseadas y dejando que el ordenador encuentre la solución, normalmente utilizando una red neuronal.
Una cosa sobre el aprendizaje profundo que asusta a mucha gente son las matemáticas. Si echas un vistazo a casi cualquier artículo sobre el tema, te encontrarás con cantidades casi impenetrables de notación con letras griegas por todas partes, y lo más probable es que salgas corriendo gritando hacia las colinas. La cuestión es la siguiente: en su mayor parte, no necesitas ser un genio de las matemáticas para utilizar técnicas de aprendizaje profundo. De hecho, para la mayoría de los usos básicos cotidianos de la tecnología, no necesitas saber mucho en absoluto, y para entender realmente lo que está pasando (como verás en el Capítulo 2), sólo tienes que estirarte un poco para comprender conceptos que probablemente aprendiste en el instituto. Así que no te asustes demasiado por las matemáticas. Al final del Capítulo 3, serás capaz de montar un clasificador de imágenes que rivalice con lo que podrían ofrecer las mejores mentes de 2015 con sólo unas pocas líneas de código.
PyTorch
Como mencioné al principio, PyTorch es una oferta de código abierto de Facebook que facilita la escritura de código de aprendizaje profundo en Python. Tiene dos linajes. En primer lugar, y quizás no sea del todo sorprendente dado su nombre, deriva muchas características y conceptos de Torch, que era una biblioteca de redes neuronales basada en Lua de que se remonta a 2002. Su otro progenitor principal es Chainer, creado en Japón en 2015. Chainer fue una de las primeras bibliotecas de redes neuronales en ofrecer un enfoque ansioso de diferenciación en lugar de definir gráficos estáticos, lo que permite una mayor flexibilidad en la forma de crear, entrenar y operar las redes. La combinación del legado de Torch con las ideas de Chainer ha hecho popular a PyTorch en los últimos dos años.2
La biblioteca también incluye módulos que ayudan a manipular texto, imágenes y audio (torchtext
, torchvision
y torchaudio
), junto con variantes incorporadas de arquitecturas populares como ResNet (con pesos que pueden descargarse para proporcionar ayuda con técnicas como el aprendizaje por transferencia, que verás en el Capítulo 4).
Aparte de Facebook, PyTorch ha tenido una rápida aceptación en la industria, con empresas como Twitter, Salesforce, Uber y NVIDIA que lo utilizan de diversas formas para su trabajo de aprendizaje profundo. Ah, pero intuyo una pregunta ....
¿Qué pasa con TensorFlow?
Sí, abordemos el elefante bastante grande, con la marca de Google , que hay en la esquina. ¿Qué ofrece PyTorch que no ofrezca TensorFlow? ¿Por qué deberías aprender PyTorch en su lugar?
La respuesta es que TensorFlow tradicional funciona de un modo distinto a PyTorch que tiene importantes implicaciones para el código y la depuración. En TensorFlow, utilizas la biblioteca para construir una representación gráfica de la arquitectura de la red neuronal y luego ejecutas operaciones en ese gráfico, lo que ocurre dentro de la biblioteca TensorFlow. Este método de programación declarativa se contradice en cierto modo con el paradigma más imperativo de Python, lo que significa que los programas TensorFlow de Python pueden tener un aspecto y un tacto un tanto extraños y difíciles de entender. El otro problema es que la declaración estática del grafo puede hacer que alterar dinámicamente la arquitectura durante el entrenamiento y el tiempo de inferencia sea mucho más complicado y esté más lleno de repeticiones que con el enfoque de PyTorch.
Por estas razones, PyTorch se ha hecho popular en las comunidades orientadas a la investigación. El número de trabajos presentados a la Conferencia Internacional sobre Representaciones de Aprendizaje que mencionan PyTorch se ha disparado un 200% en el último año, y el número de trabajos que mencionan TensorFlow ha aumentado casi en la misma proporción. Definitivamente, PyTorch ha llegado para quedarse.
Sin embargo, las cosas están cambiando en las versiones más recientes de TensorFlow. Recientemente se ha añadido a la biblioteca una nueva función llamada ejecución ansiosa (eager execution) que le permite funcionar de forma similar a PyTorch y que será el paradigma promovido en TensorFlow 2.0. Pero como es nuevo los recursos fuera de Google que te ayuden a aprender este nuevo método de trabajo con TensorFlow son escasos, además necesitarías años de trabajo por ahí para entender el otro paradigma y poder sacar el máximo partido a la biblioteca.
Pero nada de esto debe hacerte pensar mal de TensorFlow; sigue siendo una biblioteca probada en la industria con el apoyo de una de las mayores empresas del planeta. PyTorch (respaldada, por supuesto, por otra de las mayores empresas del planeta) es, diría yo, un enfoque más racionalizado y centrado del aprendizaje profundo y la programación diferencial. Al no tener que seguir dando soporte a APIs más antiguas y rudimentarias, es más fácil enseñar y llegar a ser productivo en PyTorch que en TensorFlow.
¿Dónde encaja Keras en todo esto? ¡Cuántas buenas preguntas! Keras es una biblioteca de aprendizaje profundo de alto nivel que originalmente era compatible con Theano y TensorFlow, y ahora también es compatible con algunos otros marcos como Apache MXNet. Proporciona ciertas características, como bucles de entrenamiento, validación y prueba, que los marcos de nivel inferior dejan como ejercicio para el desarrollador, así como métodos sencillos para construir arquitecturas de redes neuronales. Ha contribuido enormemente a la adopción de TensorFlow, y ahora forma parte del propio TensorFlow (como tf.keras
), además de seguir siendo un proyecto independiente. PyTorch, en comparación, es una especie de término medio entre el bajo nivel de TensorFlow en bruto y Keras; tendremos que escribir nuestras propias rutinas de entrenamiento e inferencia, pero crear redes neuronales es casi igual de sencillo (y yo diría que el enfoque de PyTorch para crear y reutilizar arquitecturas es mucho más lógico para un desarrollador de Python que parte de la magia de Keras).
Como verás en este libro, aunque PyTorch es habitual en puestos más orientados a la investigación, con la llegada de PyTorch 1.0, se adapta perfectamente a los casos de uso en producción.
Convenciones utilizadas en este libro
En este libro se utilizan las siguientes convenciones tipográficas:
- Cursiva
-
Indica nuevos términos, URL, direcciones de correo electrónico, nombres de archivo y extensiones de archivo.
Constant width
-
Se utiliza en los listados de programas, así como dentro de los párrafos para referirse a elementos del programa como nombres de variables o funciones, bases de datos, tipos de datos, variables de entorno, sentencias y palabras clave.
Constant width bold
-
Muestra comandos u otros textos que deben ser tecleados literalmente por el usuario.
Constant width italic
-
Muestra el texto que debe sustituirse por valores proporcionados por el usuario o por valores determinados por el contexto.
Consejo
Este elemento significa un consejo o sugerencia.
Nota
Este elemento significa una nota general.
Advertencia
Este elemento indica una advertencia o precaución.
Utilizar ejemplos de código
Puedes descargarte material complementario (incluidos ejemplos de código y ejercicios) en https://oreil.ly/pytorch-github.
Este libro está aquí para ayudarte a hacer tu trabajo. En general, si se ofrece código de ejemplo con este libro, puedes utilizarlo en tus programas y documentación. No es necesario que te pongas en contacto con nosotros para pedirnos permiso, a menos que estés reproduciendo una parte importante del código. Por ejemplo, escribir un programa que utilice varios trozos de código de este libro no requiere permiso. Vender o distribuir un CD-ROM de ejemplos de los libros de O'Reilly sí requiere permiso. Responder a una pregunta citando este libro y el código de ejemplo no requiere permiso. Incorporar una cantidad significativa de código de ejemplo de este libro en la documentación de tu producto sí requiere permiso.
Agradecemos, pero no exigimos, la atribución. Una atribución suele incluir el título, el autor, la editorial y el ISBN. Por ejemplo "Programando PyTorch para el Aprendizaje Profundo por Ian Pointer (O'Reilly). Copyright 2019 Ian Pointer, 978-1-492-04535-9".
Si crees que el uso que haces de los ejemplos de código no se ajusta al uso legítimo o al permiso concedido anteriormente, no dudes en ponerte en contacto con nosotros en permissions@oreilly.com.
Aprendizaje en línea O'Reilly
Nota
Durante casi 40 años, O'Reilly Media ha proporcionado formación, conocimientos y perspectivas sobre tecnología y negocios para ayudar a las empresas a alcanzar el éxito.
Nuestra red única de expertos e innovadores comparten sus conocimientos y experiencia a través de libros, artículos, conferencias y nuestra plataforma de aprendizaje online. La plataforma de aprendizaje en línea de O'Reilly te ofrece acceso bajo demanda a cursos de formación en directo, rutas de aprendizaje en profundidad, entornos de codificación interactivos y una amplia colección de textos y vídeos de O'Reilly y de más de 200 editoriales. Para más información, visita http://oreilly.com.
Cómo contactar con nosotros
Dirige tus comentarios y preguntas sobre este libro a la editorial:
- O'Reilly Media, Inc.
- 1005 Gravenstein Highway Norte
- Sebastopol, CA 95472
- 800-998-9938 (en Estados Unidos o Canadá)
- 707-829-0515 (internacional o local)
- 707-829-0104 (fax)
Tenemos una página web para este libro, donde se enumeran erratas, ejemplos y cualquier información adicional. Puedes acceder a esta página en https://oreil.ly/prgrming-pytorch-for-dl.
Envía un correo electrónico a bookquestions@oreilly.com para comentar o hacer preguntas técnicas sobre este libro.
Para más información sobre nuestros libros, cursos, conferencias y noticias, consulta nuestro sitio web en http://www.oreilly.com.
Encuéntranos en Facebook: http://facebook.com/oreilly
Síguenos en Twitter: http://twitter.com/oreillymedia
Míranos en YouTube: http://www.youtube.com/oreillymedia
Agradecimientos
Muchas gracias a mi editora, Melissa Potter, a mi familia y a Tammy Edlund por toda su ayuda para hacer posible este libro. Gracias también a los revisores técnicos que aportaron valiosos comentarios a lo largo del proceso de redacción, entre ellos Phil Rhodes, David Mertz, Charles Givre, Dominic Monn, Ankur Patel y Sarah Nagy.1 Véase "Aproximación mediante superposiciones de funciones sigmoidales", de George Cybenko (1989).
2 Ten en cuenta que PyTorch toma prestadas ideas de Chainer, pero no el código real.
Get Programación de PyTorch para Aprendizaje Profundo now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.