👋 Hola, soy Omar y bienvenido a una edición gratuita del 🎉 newsletter de IA y la vida. Cada semana abordamos humildemente las preguntas de los lectores sobre temas específicos de la IA, el trabajo con humanos y cualquier otra cosa que te estrese. Sígueme en Twitter 🙌.
Si te gusta te agradecería que lo compartas! Esa es nuestra gasolina 🦾.
Este newsletter es traído a ti por Roam Research...
Roam te permite fácilmente asociar ideas gracias a su asociación bidireccional, algo que no he encontrado en otra aplicación de notas. Llevo usándolo algunos días y tengo que admitir que me quedaré con mi suscripción.
Entendiendo PyTorch: Las bases de las bases para hacer inteligencia artificial
Cuando comenzaba mi viaje por PyTorch buscaba algún post, tutorial, markdown, lo que fuera que me ayudara a entender cómo podía manejarme por el framework. Muchos paquetes, muchas funciones y poco material para entender cómo navegarlas. El objetivo de este texto es precisamente ese, ayudar en la comprensión de PyTorch: para que podamos hacer deep learning antes debemos conocer nuestras herramientas.
En un segundo texto, ya involucrando código, mostraré los primeros pasos para hacer deep learning: la manipulación de tensores.
Antes de iniciar el viaje por la programación del deep learning se debe, como con cualquier otro arte/oficio, entender que se cometerán errores. Muchos y muchos errores. Cada día que programo recurro a la documentación de PyTorch, no hay día que no ocurra.
Como dice Brené Brown en su increíble libro Dare to Lead: no es prepararse por SI se falla (equivoca, en nuestro caso) sino prepararse para CUANDO se falle. La cita es aproximada.
Así es, nos vamos a equivocar y no pasa nada. Para eso tenemos una riquísima guía: la documentación de PyTorch. Esta será nuestro texto sagrado, nuestro instrumento para el éxito. Pero antes de entrar en la documentación, entendamos un poco más qué es PyTorch.
Pytorch se denomina a sí mismo en GitHub como un paquete de Python que provee dos cualidades: (1) Cálculos con tensores con aceleración de una Graphic Processing Unit (GPU). (2) La construcción de redes neuronales construidas sobre un sistema de autogradiente. Además, PyTorch vive sobre un API backend basado en C++ lo cual le permite contar con mayor velocidad de ejecución.
Para que (1) se pueda llevar a cabo en GPUs, PyTorch nos permite utilizar CUDA. Por el momento, basta con saber que CUDA, plataforma de computación paralela, nos sirve para correr nuestros modelos en GPUs. Esto nos permite que nuestra computación científica se ejecute con mayor velocidad a si operáramos en un Central Processing Unit (CPU).
El punto (2) nos indica que PyTorch puede realizar, si lo activamos, un seguimiento a los tensores después de pasar por múltiples operaciones que involucran la creación de una red neuronal, de forma que nos pueda retornar la derivada de la última operación con respecto al tensor en cuestión. No te preocupes si algunos conceptos no son claros, en textos siguientes entraremos con mayor profundidad en lo que esto significa.
Cami Williams, lead Developer Advocate for ML/AI en Facebook, explica a la perfección la composición de PyTorch. Dentro del "front-end", en Python, existen tres secciones:
"Torch: paquete que contiene estructuras de datos para tensores multidimensionales y operaciones matemáticas.
Torch.nn: Creación y entrenamiento de redes neuronales. Los datos ingresados en estos módulos se pasan en forma de tensores. Por ejemplo: al entrenar una "red neuronal convolucional" para imágenes puede usar el módulo "nn.conv2D".
Torch.optim: algoritmos de optimización utilizados para entrenar las redes neuronales. Por ejemplo: algoritmos como SGD, para principiantes, o más avanzados, como Adam, utilizados para el entrenamiento" - Cami Williams.
El "back-end", en C++, tiene cinco secciones: Autograd, ATen, TorchScript, C++ Frontend y C++ Extensions. Sin embargo, para fines de este texto introductorio no entraremos en detalle.
Todas estas secciones pueden ser consultadas en la documentación oficial.
Dentro de la documentación, en la barra vertical de la izquierda encontramos la sección Python API
donde aparecerá todo lo necesario para construir una red neuronal desde el front-end de PyTorch. Ahí están los "componentes" (como los nombra PyTorch en su GitHub) o "paquetes" (como los nombra en su documentación) torch; torch.nn; torch.nn.functional; torch.Tensor; etc.
Hagamos una revisión de cada uno de los componentes del front-end, más torch.nn.functional.
El paquete
torch
Para comprender la documentación de PyTorch, ingresemos primero al paquete/componente Torch.
Para fines introductorios de este texto, enfoquémonos en lo que se encuentra dentro de los subtítulos "Tensors" y "Math operations".
En "Tensors" encontramos operaciones para crear tensores (dentro del subsubtítulo (¿así se dice?) "Creation Ops"), por ejemplo la función tradicional torch.tensor
:
También encontramos funciones para manipular los tensores (dentro del subsubtítulo "Indexing, Slicing, Joining, Mutating Ops"), por ejemplo tensor.cat
:
En la subsección "Math Operations" encontramos precisamente eso, operaciones matemáticas que podemos ejercer sobre nuestros tensores.
Valores absolutos:
Sumas:
Funciones techo:
y todo lo que puedas necesitar para operar a "low-level" con tus tensores. Para fines introductorios, no es necesario revisar el código fuente de las operaciones en el paquete torch
.
En mi texto "Manipulación de tensores en PyTorch. ¡El primer paso para el deep learning!" puedes revisar más sobre los tensores.
El paquete
torch.nn.functional
Este paquete contiene funciones ya construidas por los contribuidores a PyTorch. Las funciones se construyen precisamente con las operaciones en el paquete torch
. Así, vamos construyendo sobre lo que vamos aprendiendo; veremos que torch.nn
construye sobre las funciones definidas en torch.nn.functional
.
Dada la frecuencia con la que se utiliza este paquete, en la documentación y código de PyTorch encontraremos muy comúnmente la abreviación F
en vez de torch.nn.functional
. Por ejemplo, torch.nn.functional.conv_transpose2d
significa lo mismo que F.conv_transpose2d
.
En la barra vertical de la derecha encontramos subsecciones con los diferentes tipos de función. Pueden ser, por ejemplo, operaciones de convolución (en la subsección "Convolution functions") como:
la operación linear (en la subsección "Linear functions"):
o hasta funciones de pérdida (en la subsección "Loss functions") como la de mean square error:
Si en algún punto te pierdes, como nos pasa a todos, la documentación cuenta con excelentes ejemplos de uso para la mayoría de las operaciones. Por ejemplo, la función torch.nn.functional.conv2d
:
O por ejemplo para la función torch.nn.functional.avg_pool1d
:
En fin, en este paquete encontraremos funciones ya implementadas. Con ellas podremos crear estructuras más grandes como pueden ser las capas de una red neuronal.
La siguiente semana seguiremos viendo paquetes como el torch.nn
y torch.nn.optim.
Buena Suerte! Para cualquier comentario, sígueme en Twitter.
Un agradecimiento especial a Mar y Yadnielis por su ayuda en la edición.