Alura > Cursos de Data Science > Cursos de Machine Learning > Conteúdos de Machine Learning > Primeiras aulas do curso Redes Neurais: Deep Learning com PyTorch

Redes Neurais: Deep Learning com PyTorch

História das Redes Neurais - Introdução

Olá, pessoas! Meu nome é Camila, eu tenho um canal no YouTube chamado Peixe Babel sobre tecnologia e eu também dou aula na federal de Minas Gerais em cursos de extensão sobre deep learning.

Então o que eu trouxe aqui para vocês foi uma introdução sobre redes neurais e a ideia é nós construirmos juntos uma rede neural. Então para isso vamos usar uma ferramenta que é um framework chamado Pytorch. É um framework muito popular da área de deep learning e vamos aprender desde o básico de como que usa tensores no Pytorch, que é a principal estrutura de dados, até a teoria por trás do que uma rede neural produz, que tipo de modelos ela constrói e como nós replicamos isso, utilizando a sintaxe do Pytorch.

Então vamos usar, vamos fazer chamadas de como produzimos cada uma das camadas de uma rede neural, o que é uma ativação, o que é um perceptron, o que é cada elemento de uma rede neural. E a ideia é que alternemos entre aulas teóricas e práticas, para que eu possa explicar para vocês a limitação de cada pequeno elemento de uma rede neural, até que estejamos aptos a construir uma arquitetura completa no Pytorch.

E nesse curso, nós não vamos entrar ainda na parte de como você treina essa rede, o nosso foco é como você constrói e conhecendo cada um dos elementos. Então para que não fiquemos totalmente sem saber como funciona o processo de utilização, o que vamos fazer é fazer alguns modelos a mão, então vai ter atividade de como você constrói alguns modelos a mão e também vamos usar algumas ferramentas, algumas implementações didáticas de como otimizamos esse tipo de rede.

Então a ideia é que vocês tenham uma visão de como funciona o processo de otimização e entenda os primeiros passos que é como você constrói essa rede. Então vamos ver desde modelos mais simples como esse.

Até modelos um pouco mais complexos, que consegue aprender funções mais complexas e vamos saber quando construir cada tipo de modelo. Sobre a parte de como treinar, não vamos chegar lá, como eu já comentei, a última etapa, a conclusão desse nosso curso é construindo uma rede completa usando framework do Pytorch.

História das Redes Neurais - História das Redes Neurais

Olá, pessoal, seja muito bem-vindo a essa aula, onde vamos falar sobre a história das redes neurais. Vamos aproveitar que estamos falando da história para falar também da evolução do modelo neural ao longo dos anos, porque uma coisa interessante de ver é que a história das redes neurais começa em 1940.

Então vamos ver desde o primeiro modelo neural, que foi há mais de 70 anos atrás, passando pelo perceptron, que é o neurônio que usamos até os dias atuais, até o Problema do XOR, que foi um dos principais limitadores, marcou bem a história das redes neurais, passando pelo Multi-Layer Perceptron, que é a rede efetivamente, com múltiplas camadas, até o conceito de deep learning, que se popularizou tanto.

Então o primeiro modelo neural foi proposto por dois pesquisadores, o primeiro deles um neurocientista, o Warren McCulloch, que queria simular um cérebro humano, só que de forma bem realista, ele queria um modelo computacional que fosse inspirado no funcionamento do cérebro humano. E aí ele fez uma parceria com o Walter Pitts, um lógico, um profissional de lógica computacional, que juntos conseguiram chegar em um modelo efetivo e palpável e possível de ser desenvolvido.

Só para entendermos de onde vem a inspiração, vamos entender por alto o neurônio biológico, que é como o nosso cérebro funciona. O neurônio é dividido em 3 componentes principais: Os dendritos, que são os receptores de sinal, então dos bilhões de neurônios do seu cérebro, todos eles têm receptores, que vão receber estímulos de outros neurônios, então eles recebem os sinais, o corpo processa os sinais recebidos do próprio neurônio e o axônio transmite o sinal para os próximos neurônios.

E o legal do axônio é que ele pode ou não ativar a depender do estímulo que ele recebeu, nem sempre ele vai passar a informação adiante. Se ele achar que aquela informação vai morrer ali, não vai passar adiante, ele não vai transmitir aquele sinal.

Então esses neurônios são combinados em uma rede, são bilhões de neurônios conectados formando padrões. Então quando você ouve uma música boa, sua música favorita, você vai ter um padrão de ativação, um conjunto de neurônios vai ativar. Já quando você ouve um barulho estridente, um garfo arranhando um prato, você vai ter um outro padrão de ativação, diferentes neurônios vão ativar, de formas diferentes.

E o mesmo acontece com as redes neurais, elas vão aprender padrões de ativação, conjuntos de neurônios que vão ativar de formar diferentes, a depender do estímulo que elas receberem, ou seja, da entrada delas.

Então o primeiro modelo neural era bem isso, ele tinha dendritos, ou seja, ele recebia entradas, mas vale destacar aqui brevemente que eram entradas binárias, então x varia entre 0 e 1. E ele tinha um corpo, ou seja, ele agregava essas funções, e era uma simples soma, então se temos aqui x1, x2, x3, esse corpo, esse g(x), ele fazia x1+x2+x3. E ele tinha um axônio que é essa função f, que decidia se o neurônio ia ativar ou não, conforme a saída de g.

Então a saída também era binária, ele ativava ou não ativava a depender da saída de g, então ele definia um limiar. Se g(x), por exemplo, for maior que o limiar l, o neurônio vai ativar, se não ele não vai ativar. Então era um modelo bem simples e só com o ajuste do limiar de f já era possível realizar diferentes funções.

Eu trouxe aqui exemplos mais simples, era possível realizar operações mais completas, cálculos até, usando esse tipo de neurônio. Mas os exemplos mais simples são a operação lógica do i. Então você ajustando o limiar para g(x) maior ou igual que 2, você está fazendo uma porta lógica i. Porque se x1=1 e x2 = 1, então g(x)=2, ou seja, vai atender o critério e o neurônio vai ativar.

Já, por outro lado, se um deles for igual a 0 e o outro for igual a 1, g(x) vai ser igual a 1 e o neurônio não vai ativar, porque o critério não é atendido. Então só ajustando o valor para o limiar ser igual a 2, construímos uma porta lógica i. O mesmo para porta lógica ou que é se g(x) for maior ou igual q1. Ou seja, se x1 ou x2 for igual a 1, ele vai ativar.

O Frank Rosenblatt propõe uma versão melhorada do modelo, simplesmente atribuindo pesos a cada entrada e permitindo que esses pesos sejam otimizados através de algoritmos. Então ele mudou o que tínhamos antes, que era g(x)= x1+x2, enfim, mais x3 em diante, mudou para g(x) = w1x1+w2x2 e daí por diante. Então, esses pesos foram o grande acréscimo que o perceptron trouxe e o fato de podermos otimizar os W’s foi a grande diferença que permitiu criarmos modelos tão versáteis, é só ajustar os pesos, que o mesmo modelo, o mesmo neurônio pode realizar diferentes funções.

Então diferente do anterior, que você tinha que manualmente definir valor, definir coisas, aqui nós temos o aprendizado. Então o Frank Rosenblatt introduziu pela primeira vez o aprendizado nos modelos neurais. Já existia aprendizado de máquina de outras formas, mas no contexto de redes neurais, o Frank Rosenblatt introduziu isso.

Na prática, o modelo do perceptron, a rede de perceptrons, ele era um hardware, isso que eu acho mais bacana, ele fez com que cada, cada conexão do neurônio fosse um potenciômetro, que deixava, mais ou menos, tensão passar. Então se o potenciômetro estava mais solto, ou seja, passava mais tensão, ele dava um peso maior para aquela conexão. Se o potenciômetro estivesse barrando a tensão, ou seja, pouca tensão passava, ele estava dando pouca importância para aquela conexão.

Então ele criou dessa forma uma rede capaz de detectar padrões visuais, então ele estava conectado com uma câmera e cada nova imagem que ele via, se ele visse um triângulo, ele ativava, se ele visse outras formas geométricas, ele não ativava. Então ele fez isso em um hardware que está lá no Smithsonian e que eu sou louca para conhecer, só queria compartilhar esse amor com vocês.

Em 1969, o Marvin Minky e o Seymour Papert resolveram destacar as já conhecidas limitações do perceptron, então eles queriam mostrar que o perceptron não era tudo isso e escreveram um livro falando sobre as limitações das redes neurais. O livro está linkado para quem quiser olhar os slides depois. Mas a grande limitação é que perceptrons só aprendem funções lineares, só aprendem retas. Então se você tem problema de classificação linear, que são dois conjuntos que você precisa separar, se eles são separáveis por uma reta, então um perceptron resolve.

Ou uma regressão linear que é só um conjunto e você precisa ajustar uma função a esse conjunto. Se você consegue ajustar uma reta, o perceptron resolve. Agora, se você precisar de funções mais complexas, funções não-lineares, aí o perceptron não resolve. E o que ficou marcado na história foi o “ou exclusivo”, a operação do XOR, para quem conhece já da lógica matemática.

O XOR é verdadeiro e é o que está destacado no canto superior esquerdo, quando as duas entradas são diferentes, é um “ou exclusivo”, os dois eventos não podem ser iguais. Então eles são verdadeiros quando os eventos diferem e são falsos quando os eventos são iguais. Então não existe reta que separe essas duas classes, nós precisaríamos de uma função não-linear para solucionar esse problema e perceptrons não fazem isso.

Essa época foi o início do inverno da I.A., desde a popularização do livro, do Minsky e do Papert e esse inverno durou de 69 até 86, quando surgiu o Geoffrey Hinton, com o novo algoritmo de otimização desses pesos, o Backpropagation. Então o Geoffrey Hinton propôs que se você coloca múltiplas camadas de neurônios, e daí vem o aprendizado profundo, com muitas camadas, o algoritmo dele, o Backpropagation, consegue ajustar essas funções mais complexas, essas funções não-lineares.

Então aqui está um exemplo de fronteira de decisão com uma rede de múltiplas camadas, usando o Backpropagation, que é o algoritmo do Geoffrey Hinton. Então você vê que a rede com múltiplas camadas consegue aprender uma função não-linear, essa função com a forma mais torta, uma curva. Ela consegue aprender esse tipo de função para separar as duas classes.

Então estava tudo dando tão certo, que foi postulado o Teorema da Aproximação Universal, dizendo que uma rede feed forward, que é uma rede simples, da entrada para a saída, com apenas uma camada escondida, o que significa que ela tem duas camadas, uma escondida e uma camada de saída, vamos entrar em detalhes sobre isso no curso sobre redes neurais. Uma rede neural com uma camada escondida é suficiente para representar qualquer função. Aí tem os poréns, a camada pode ser invariavelmente grande, pode falhar em aprender, porque tem requisitos específicos para que essa teoria funcione.

Mas teoricamente, ela pode representar qualquer função, inclusive as mais complexas. Se existe uma função, existe uma rede que resolve, teoricamente.

Então, apesar de ter definido que teoricamente era possível modelar qualquer função, na época não era possível validar essa afirmação. Por quê? Grandes modelos neurais são computacionalmente custosos, ou seja, não tínhamos hardware para testar essa afirmação, apesar do Geoffrey Hinton ter publicado. “Olha só, funciona. Teoricamente funciona para qualquer tipo de função.”

As pessoas continuaram falando, “Nós não temos hardware para confirmar se você tem razão.” E é necessário um grande volume de dados para treinar um grande modelo, nós não tínhamos dados. Então não era possível validar com certeza que o modelo era tão versátil e tão poderoso assim. Por isso ficou por um tempo parado também, a pesquisa, não tínhamos como testar, então não vale a pena perseguir isso.

Finalmente em 2006, quando surge o deep learning como algo popular, o aprendizado profundo, nós tínhamos não só a teoria, como hardware robusto, as GPU’s que mudaram tudo no cenário de redes neurais e abundância de dados, para conseguirmos fazer modelos profundos o suficiente e grandes o suficiente, capazes o suficiente para solucionar problemas mais complexos, como classificação de imagens, isso vale a pena visitar esse link depois, porque é uma rede rodando em tempo real no seu browser para fazer classificação de imagem.

Transferência de estilo, também vale muito a pena visitar esse projeto depois, porque é uma rede capaz de dada um vídeo original, que é um cavalo, ele consegue transferir o estilo de uma zebra para um cavalo do vídeo. Ele transformou o cavalo em uma zebra.

E modelos de linguagem. Vou ser redundante, vale super a pena visitar esse link depois, porque é um modelo capaz de completar textos. Então dado que você entra com um parágrafo na sua rede, a rede vai te dizer o complemento daquele texto. Vai contar uma história, inventar uma história sobre aquele texto de entrada que você deu.

Então estamos atualmente no ponto em que soluções com redes neurais estão no ápice, tudo é feito com redes neurais, quer dizer, as coisas mais populares hoje em dia são feitas com redes neurais, isso afeta tanto o mercado quanto a academia. Então tem se usado muito. Mas tem gente que diz que é só uma febre e que vai passar. Então eu deixo aí essa reflexão para concluirmos. O que você acha? Do que você conhece de redes neurais, do que você veio a conhecer agora, você acha que é só mais uma hype ou que tem futuro mesmo?

Tensores - O que são Tensores

Sejam muito bem-vindos. Na aula de hoje vamos falar um pouco sobre tensores. Então vamos usar essa aula para explicar o que são tensores e, porque eles se tornaram tão importantes quando se fala de redes neurais.

Bom, se você vai trabalhar com problemas do mundo real e você quer usar uma rede neural, você quer usar deep learning, é bem necessário aprender um framework, porque por mais que seja possível aprender os conceitos de redes neurais sem usar nenhum framework, usando só NumPy, ou usando só a linguagem básica, para você implementar soluções otimizadas, não precisar reinventar a roda, é importante aprender um framework que já vai trazer bastante coisa pré-pronta para você usar e poder concentrar na parte da modelagem, na parte da criatividade, do alto nível.

Por isso que estamos fazendo esse curso com o PyTorch como base, porque eu acredito que já acelera bastante o processo de conseguir usar deep learning.

Então a estrutura de dados mais utilizada pela maioria dos frameworks, não só esses que eu trouxe aqui, é o tensor. Não por acaso essa palavra é muito ouvida quando você está estudando redes neurais. E quando você estuda qualquer tipo de framework, a palavra tensor vai aparecer bastante. Tanto é, que um dos frameworks se chama TensorFlow. O TensorFlow tem motivos para ser uma estrela.

Então a partir de agora, a princípio, o que você precisa saber é que as entradas, as saídas e as transformações de uma rede neural, são representadas através dessas estruturas de dados. É basicamente uma eterna matemática de matrizes e essas matrizes são representadas em uma estrutura tensorial.

Então vamos falar um pouco sobre tensores. Se você aprendeu estrutura de dados na aula de programação, você conheceu essas coisas com outros nomes, mas estamos aqui para simplificar. Então o primeiro conceito importante é saber que um tensor é uma generalização de coisas que já conhecemos, como, por exemplo, dadas as seguintes estruturas, aqui nós temos um escalar, um vetor com dois elementos e uma matriz com 4 elementos, 2 linhas por 2 colunas.

Como chamamos essa estrutura que tem 3 dimensões? Então você tem 4 matrizes dentro de uma outra dimensão. Como chamamos essa estrutura? Na programação, talvez você aprendeu da seguinte forma:

Você tem o a = 2 em escalar, um vetor ou um array, uma matriz ou um array 2D, você pode chamar dessas duas coisas, na introdução a programação chamamos de matriz. E no array 3D, ou já vi até gente chamar de matriz 3D. Então você simplesmente adiciona um 3D, um 4D, um 5D a estrutura da sua linguagem de programação.

Então a quantidade de dimensões d > 2, consideramos um nd-array, ou seja, um array de n dimensões. Na matemática, os nd-arrays recebem o nome de tensores ou nd-tensores. Então o tensor nada mais é do que um array n-dimensional. Então só para colocar as terminologias da computação em comparação com as da matemática, o que na programação chamamos de número, na matemática chama escalar.

O que chamamos de array é um vetor, o que chamamos de array 2D, é uma matriz e o que chamamos de array 2D, 4D, é um tensor. Então é só uma nomenclatura da matemática que foi absorvida para os frameworks.

Então por convenção, nos frameworks nós chamamos as estruturas pelo nome de tensor independente da dimensão. Então aqui temos a nomenclatura original. Número, array, escalar, vetor, matriz, tensor 3D. Essa é a nomenclatura original.

Nos frameworks vamos ter essa nomenclatura matemática, que são os tensores 0D, que são os escalares, tensor 1D, que é o vetor, tensor 2D, que é a matriz e daí por diante.

Então toda estrutura que você manipular nesses frameworks são tensores de alguma dimensão. Até os escalares são tensores de 0 dimensões. Então é importante se familiarizar com nomenclatura e não se assustar com ela, porque é uma estrutura de dados específica para trabalhar com múltiplas dimensões.

Em machine learning é muito comum trabalhar com dados em alta dimensionalidade e os tensores são as melhores estruturas para trabalhar com alta dimensionalidade. Você consegue representar de forma genérica desde um vetor até milhões de dimensões como uma rede neural pode ter, mesma estrutura de dados e consegue realizar operações de forma eficiente. Então por se tratar de uma abordagem baseada em dados, ou seja, tudo é matriz, tudo é vetor, tudo é multidimensional, o tensor virou a estrela do deep learning.

Então, como eu já falei, inclusive nomeando um dos frameworks mais famosos da atualidade. Faltou só eu dizer que o TensorFlow é da Google, então a própria Google exaltou o tensor no nome do frameworkdeles.

Nós vamos trabalhar com PyTorch ao longo do curso, eu vou justificando o porquê da escolha do PyTorch, só para não ficar essa questão no ar, sobre porque não o TensorFlow, porque os dois mais populares são o TensorFlow e o PyTorch, mas eu fiz essa escolha bem pensada para ensinar para vocês vários elementos muito bacanas do framework.

No próximo vídeo vamos conhecer a sintaxe básica do PyTorch e como manipulamos tensores, que, na verdade, é muito parecido com os arrays da programação normal.

Sobre o curso Redes Neurais: Deep Learning com PyTorch

O curso Redes Neurais: Deep Learning com PyTorch possui 170 minutos de vídeos, em um total de 37 atividades. Gostou? Conheça nossos outros cursos de Machine Learning em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Machine Learning acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas