Before you go, check out these stories!

0
Hackernoon logoEntendiendo PyTorch: las bases de las bases para hacer inteligencia artificial by@espejelomar

Entendiendo PyTorch: las bases de las bases para hacer inteligencia artificial

Author profile picture

@espejelomarOmar U. Espejel

Llevemos la IA a Am茅rica Latina!! TSC.ai y Escuela Latinoamericana de IA (ELIA)

<meta name="monetization" content="$ilp.uphold.com/EXa8i9DQ32qy">

*Nota: Contactar a Omar Espejel (omar@tsc.ai) para cualquier observaci贸n. Cualquier error es culpa del autor.

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, muestro los primeros pasos para hacer deep learning: Manipulaci贸n de tensores en PyTorch. 隆El primer paso para el deep learning!

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 铆ncreible 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 r铆quisima 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 operaramos en un Central Processing Unit (CPU).

El punto (2) nos indica, brevemente, 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 鈥嬧媏n 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
en la que encontraremos 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

torch.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 comunmente 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.

El paquete
torch.nn

Para los que conocen Keras, este paquete har谩 mucho sentido pues podemos considerarlo como "high-level" en cuanto a la programaci贸n necesitada. Podremos acceder a diferentes tipos de capas, crear las nuestras y acomodarlas para formar nuestras redes.

En la barra vertical de la derecha encontramos todo tipo de capas para nuestras redes neuronales "Convolution layers", "Pooling layers", "Transformer layers", "Linear layers", etc. Aqu铆 ya no hablamos de simples funciones, hablamos de capas enteras codificadas como clases de Python.

La mayor铆a de estas clases vienen con la f贸rmula de la que se derivan, amplios ejemplos y una opci贸n para ver el c贸digo fuente directamente en la documentaci贸n.

Por ejemplo, la muy utilizada capa Conv2d (se encuentra en el subt铆tulo "Convolution layers"):

En la parte derecha de la definici贸n de la clase Conv2D est谩 la opci贸n

[SOURCE]
con la que podemos acceder al c贸digo fuente. Al ingresar a este notaremos que que se utilizan funciones del paquete
torch.nn.functional
para definirlas. Por ejemplo, claro que vemos
F.conv2d
en en el c贸digo fuente de la clase
torch.nn.Conv2d
:

Todo va cuadrando.

En algunas capas, por ejemplo en torch.nn.Transformer (se encuentra en el subt铆tulo "Transformer layers"), encontramos hasta papers relevantes:

En un escrito posterior incluir茅 informaci贸n sobre c贸mo podemos hacer uso de toda est谩 informaci贸n para crear nuestras primeras redes neuronales.

Tambi茅n podemos acceder a funciones de p茅rdida en formato de clase y listas para agregar en nuestra red neuronal.

Nuevamente, vemos como estas clases utilizan c贸digo antes escrito en torch.nn.functional; para el caso de la clase MSELoss vemos que utiliza

torch.nn.functional.mse_loss
:

Adem谩s, el paquete

torch.nn
tiene lo necesario para crear nuestras propias capas utilizando su clase base
torch.nn.Module
(en el subt铆tulo "Containers"):

En otro texto veremos c贸mo hacer nuestras propias clases utilizando esa clase base, por ahora nos basta saber donde encontrarla en la documentaci贸n.

Para los usuarios familiarizados con la forma en que se crean los modelos en Keras, PyTorch ofrece una funcionalidad muy similar y de tremenda conveniencia.

torch.nn.Sequential
(tambi茅n en el subt铆tulo "Containers") nos permite crear nuestras redes de manera ordenada y sencilla. Aqu铆 est谩 un peque帽o ejemplo en la documentaci贸n:

Hasta aqu铆 sabemos donde se encuentra pr谩cticamente todo lo necesario para dise帽ar nuestra red neuronal. Ahora veamos la 煤ltima secci贸n del front-end mencionado por la lead Developer Advocate for ML/AI en Facebook, Cami Williams.

El paquete
torch.nn.optim

Aqu铆 encontramos algoritmos para optimizar nuestras redes neuronales y las herramients para crearlos.

Para la creaci贸n de algoritmos de optimizaci贸n podemos seguir la clase

torch.optim.Optimizer
(se encuentra en el subt铆tulo "Algorithms"):

Tambi茅n encontramos algoritmos ya implementados por otros. Por ejemplo, el famoso algoritmo Adam:

Dado el car谩cter introductorio de este texto, no ahondaremos en la creaci贸n o implementaci贸n de los algoritmos de optimizaci贸n. Dejemos eso para un siguiente texto.

Resumen

Para hacer deep learning tenemos que estar preparados para todos los errores que vamos a cometer, sin excepci贸n. Lo importante es que sepamos como atender esos errores y c贸mo manejarnos dentro de nuestras herramientas.

Lamentablemente, pocos textos abordan c贸mo leer y entender nuestro framework seleccionado. Este fue precisamente el objetivo de este texto.

De acuerdo a un texto escrito por la lead Developer Advocate for ML/AI en Facebook, Cami Williams, PyTorch cuenta con un fron-ent definido por tres distintas secciones:

torch
,
torch.nn
y
torch.optim
. Podemos acceder a todas las funciones de cada una de estas secciones en la documentaci贸n oficial de PyTorch.

En

torch
encontramos operaciones para crear y manipular tensores, as铆 como operaciones matem谩ticas para ejercer sobre ellos.

En

torch.nn.functional
, vital para el entendimiento de PyTorch, encontramos todo tipo de funciones matem谩ticas.

En

torch.nn
podemos acceder a capas ya dise帽adas, crear nuestras porpias capas y acomodar las capas para crear nuestra red.

Finalmente, en

torch.optim
tenemos acceso a algoritmos de optimizaci贸n ya creados y a funcionalidades para crear los nuestros.

Tags

Join Hacker Noon

Create your free account to unlock your custom reading experience.