PyTorch: biblioteca com novas funcionalidades para redes neurais

O PyTorch é um projeto open-source cujo principal desenvolvedor é o laboratório de Pesquisa em AI do Facebook (FAIR, Facebook’s AI Research). Ele foi escrito usando uma combinação de Python, C++ e CUDA, sendo pensado como uma ferramenta para Python. Lançado em 2016, atualmente ele é o principal concorrente da biblioteca TensorFlow, do Google, vindo a ser preterido em ambientes de desenvolvimento e pesquisa, pela flexibilidade que disponibiliza.

O PyTorch foi desenvolvido tendo como objetivo realizar cálculos em tensores. Tensores são arrays especiais que no PyTorch foram projetados com duas propriedades adicionais: eles podem carregar a informação de todas as operações realizadas neles, e podem ser operados em processadores de aceleração do tipo GPU. De certa forma, o PyTorch faz com tensores o que o Numpy faz com arrays, mas com o adicional de guardar o histórico das operações matemáticas nos próprios objetos manipulados, e de ser mais rápido pelo processamento em GPU. Essa característica do PyTorch o habilita para sua principal função: a de ser uma biblioteca para o desenvolvimento de redes neurais.

Conheça a Formação em Deep Learning com PyTorch e Python

Os módulos principais que compõem a biblioteca PyTorch são:

Tensor: É o módulo básico, que implementa a classe dos tensores, com todos os seus atributos e métodos. O tensor é tão similar aos arrays que é possível convertê-los entre si com métodos deste módulo. A memória física dos tensores é armazenada em CPU ou em GPU.

Autograd: É o sistema que permite a diferenciação automática das operações realizadas nos tensores, quando invocado. Para isso, este módulo usa o histórico das operações matemáticas realizadas nos tensores para calcular os gradientes, aplicando a derivada dessas operações. Como em toda rede neural, os gradientes são então usados para ajustar os parâmetros internos da rede (como peso e bias) ao final de um passo de treinamento.

Optimizer: Contém a implementação dos principais algoritmos de otimização, sendo chamados para de fato implementar os ajustes nos parâmetros da rede depois que os gradientes são determinados.

Neural Network: Define as classes que podem ser usadas como camadas de uma rede neural. Essas classes possuem a estrutura da camada, que devem ser conectadas por operações matemáticas explicitadas pelo programador de acordo com seu objetivo. Este módulo também possui implementações das principais funções de custo, usadas para calcular a perda durante o treinamento e, a partir dela, os gradientes.

O grande diferencial do PyTorch em relação ao TensorFlow é que ele gera grafos computacionais dinâmicos, enquanto que o TF trabalha com grafos estáticos. Isso quer dizer que, enquanto no TensorFlow o desenvolvedor define todas as operações matemáticas (e assim constrói o grafo) na instanciação do modelo, no PyTorch o grafo é construído em tempo real, a cada operação realizada. Assim, é possível definir uma estrutura de rede flexível, que seja diferente a cada época de treinamento por exemplo. Por isso se diz que o sistema autograd do PyTorch é do tipo fita: ele funciona como se estivéssemos usando e depois reproduzindo um gravador de fitas. Depois que o otimizador ajusta os parâmetros da rede, o grafo é descartado e outro começa a ser construído. O vídeo abaixo demonstra o processo de construção dinâmica do grafo.

Fonte: https://github.com/pytorch/pytorch
W_h e W_x são matrizes de pesos, h e x são tensores. Estes tensores são multiplicados pelas matrizes correspondentes, depois seus resultados são somados, e este resultado é ativado por uma função tanh.
A perda é definida como a soma do resultado final, e o método backward aplicado à perda é responsável
por calcular os gradientes.

Outra vantagem é que o PyTorch possui uma API muito mais simples que o TensorFlow, amigável aos desenvolvedores que já estão acostumados a trabalhar no ambiente Python. Ele foi projetado para ser leve, rápido, intuitivo, linear e fácil de usar. Construir extensões é simples; é possível, por exemplo, escrever novas estruturas de rede a partir das classes já implementadas na biblioteca.

Conheça a Formação em Deep Learning com PyTorch e Python

Já existem bibliotecas que usam o PyTorch como backend, como o skorch, que é um wrapper que funciona para dar funcionalidades da biblioteca Scikit-Learn ao PyTorch, facilitando a implementação de métodos de tuning, por exemplo; e o Transformers, uma biblioteca que usa o PyTorch para implementar os modelos mais recentes de processamento de linguagem natural.

O PyTorch está atualmente disponível na versão 1.4 e pode ser baixado no site oficial.