Um guia visual e interativo para os fundamentos das redes neurais

João Ricardo Mendes
12 min readOct 31, 2024

--

Atualização : A Parte 2 já está no ar: Uma visão visual e interativa da matemática básica de redes neurais

Motivação

Não sou especialista em aprendizado de máquina. Sou engenheiro de software por formação e tive pouca interação com IA. Sempre quis me aprofundar mais no aprendizado de máquina, mas nunca realmente encontrei meu “in”. É por isso que quando o Google tornou o TensorFlow de código aberto em novembro de 2015, fiquei super animado e sabia que era hora de entrar de cabeça e começar a jornada de aprendizado.

Não quero soar dramático, mas para mim, na verdade, parecia como se Prometeu entregasse fogo à humanidade do Monte Olimpo do aprendizado de máquina.

No fundo da minha cabeça estava a ideia de que todo o campo de Big Data e tecnologias como Hadoop foram amplamente acelerados quando os pesquisadores do Google lançaram seu artigo Map Reduce. Desta vez não é um artigo — é o software real que eles usam internamente após anos e anos de evolução.

Então comecei a aprender o que pude sobre os fundamentos do tópico e vi a necessidade de recursos mais gentis para pessoas sem experiência na área. Esta é minha tentativa nisso.

Comece aqui

Vamos começar com um exemplo simples. Digamos que você esteja ajudando uma amiga que quer comprar uma casa. Ela recebeu uma cotação de $ 400.000 por uma casa de 2000 pés quadrados (185 metros). Esse é um bom preço ou não?

Não é fácil dizer sem um quadro de referência. Então você pergunta aos seus amigos que compraram casas naquele mesmo bairro, e você acaba com três pontos de dados:

Área (pés quadrados) (x)Preço (y)2.104399.9001.600329.9002.400369.000

Pessoalmente, meu primeiro instinto seria obter o preço médio por metro quadrado. Isso dá US$ 180 por metro quadrado.

Bem-vindo à sua primeira rede neural.

Ainda não está no nível da Siri, mas agora você conhece o bloco de construção fundamental. E parece com isso:

Diagramas como este mostram a estrutura da rede e como ela calcula uma previsão. O cálculo começa no nó de entrada à esquerda. O valor de entrada flui para a direita. Ele é multiplicado pelo peso e o resultado se torna nossa saída.

Multiplicar 2.000 pés quadrados por 180 nos dá $ 360.000. É tudo o que há para fazer neste nível. Calcular a previsão é uma multiplicação simples. Mas antes disso, precisamos pensar sobre o peso pelo qual multiplicaremos.

Aqui começamos com uma média, depois veremos algoritmos melhores que podem ser dimensionados conforme obtemos mais entradas e modelos mais complicados. Encontrar o peso é nosso estágio de “treinamento”. Então, sempre que você ouvir falar de alguém “treinando” uma rede neural, isso significa apenas encontrar os pesos que usamos para calcular a previsão.

Esta é uma forma de predição. Este é um modelo preditivo simples que pega uma entrada, faz um cálculo e fornece uma saída (já que a saída pode ser de valores contínuos, o nome técnico para o que temos seria um “modelo de regressão”)

Vamos visualizar esse processo (para simplificar, vamos mudar nossa unidade de preço de US$ 1 para US$ 1.000. Agora nosso peso é 0,180 em vez de 180):

Mais forte, melhor, mais rápido, mais forte

Podemos fazer melhor do que estimar o preço com base na média dos nossos pontos de dados? Vamos tentar.

Vamos primeiro definir o que significa ser melhor neste cenário. Se aplicarmos nosso modelo aos três pontos de dados que temos, quão bom seria o trabalho?

Isso é um bocado de amarelo. Amarelo é ruim. Amarelo é erro. Queremos encolher o amarelo o máximo que pudermos.

Área (x)Preço ($1000) ( y_ )Previsão ( y )s_ — s( y_ — y )²².104399,9379214491.600329,92884217562.400369432–633969Média:2.058

Aqui podemos ver o valor do preço real , o valor do preço previsto e a diferença entre eles . Então, precisaremos calcular a média dessas diferenças para termos um número que nos diga quanto erro há neste modelo de previsão.

O problema é que a terceira linha tem -63 como seu valor. Temos que lidar com esse valor negativo se quisermos usar a diferença entre a previsão e o preço como nossa medida de erro. Essa é uma das razões pelas quais introduzimos uma coluna adicional que mostra o erro ao quadrado, livrando-nos assim do valor negativo.

Esta é agora a nossa definição de fazer melhor — um modelo melhor é aquele que tem menos erro. O erro é medido como a média dos erros para cada ponto em nosso conjunto de dados.

Para cada ponto, o erro é medido pela diferença entre o valor real e o valor previsto, elevado à potência de 2. Isso é chamado de Erro Quadrático Médio . Usá-lo como um guia para treinar nosso modelo o torna nossa função de perda (também, função de custo ).

Agora que definimos nossa régua de medição para o que torna um modelo melhor, vamos experimentar mais alguns valores de peso e compará-los com nossa escolha média:

Não podemos melhorar muito o modelo variando mais o peso. Mas se adicionarmos um viés, podemos encontrar valores que melhoram o modelo.

Nossas linhas podem aproximar melhor nossos valores agora que temos esse valor b adicionado à fórmula da linha. Neste contexto, chamamos isso de “viés”. Isso faz com que nossa rede neural fique assim:

Podemos generalizar dizendo que uma rede neural com uma entrada e uma saída ( aviso de spoiler: e sem camadas ocultas) se parece com isto:

Neste gráfico, W e b são valores que encontramos durante o processo de treinamento. X é a entrada que colocamos na fórmula (área em pés quadrados em nosso exemplo). Y é o preço previsto.

O cálculo de uma previsão agora usa esta fórmula:

Então, nosso modelo atual calcula previsões substituindo a área da casa como x nesta fórmula:

Treine seu dragão #

Que tal você tentar treinar nossa rede neural de brinquedo? Minimize a função de perda ajustando os mostradores de peso e viés. Você consegue um valor de erro abaixo de 799?

05001,0001,5002,0002,5000100200300400

Erro799 Peso0,100Viés150,0

0.100150.0

Automação #

Parabéns por treinar manualmente sua primeira rede neural! Vamos ver como automatizar esse processo de treinamento. Abaixo está outro exemplo com uma funcionalidade adicional semelhante ao piloto automático.

Esses são os botões GD Step. Eles usam um algoritmo chamado “Gradient Descent” para tentar avançar em direção aos valores corretos de peso e viés que minimizam a função de perda.

05001,0001,5002,0002,5000100200300400

05010015020020,00040,00060,00080,000100,000120,000ErrorError Log

0.00.10.20.30.40100200300400WeightBiasWeight vs. Bias vs. Error

Erro134.972Longe, amigo Peso0,000Viés0,0

0.0000.0

Os dois novos gráficos são para ajudar você a rastrear os valores de erro conforme você mexe com os parâmetros (peso e viés) do modelo. É importante manter o controle do erro, pois o processo de treinamento é todo sobre reduzir esse erro o máximo possível.

Como a descida do gradiente sabe onde seu próximo passo deve ser? Cálculo. Veja bem, sabendo a função que estamos minimizando (nossa função de perda, a média de (y_ — y)² para todos os nossos pontos de dados), e sabendo as entradas atuais nela (o peso atual e o viés), as derivadas da função de perda nos dizem em qual direção empurrar W e b para minimizar o erro.

Saiba mais sobre a descida do gradiente e como usá-la para calcular novos pesos e vieses nas primeiras aulas do curso de Aprendizado de Máquina da Coursera .

E então sobraram dois #

O tamanho da casa é a única variável que entra em quanto ela custa? Obviamente, há muitos outros fatores. Vamos adicionar outra variável e ver como podemos ajustar nossa rede neural a ela.

Digamos que sua amiga faça um pouco mais de pesquisa e encontre um monte de pontos de dados. Ela também descobre quantos banheiros cada casa tem:

Área (pés quadrados) (x1)Banheiros (x2)Preço (y)2.1043399.9001.6003329.9002.4003369.0001.4162232.0003.0004539.9001.9854299.9001.5343314.9001.4273198.9991.3803212.0001.4943242.500

Nossa rede neural com duas variáveis ​​se parece com isso:

Agora temos que encontrar dois pesos (um para cada entrada) e um viés para criar nosso novo modelo.

O cálculo de Y fica assim:

Mas como encontramos w1 e w2? Isso é um pouco mais complicado do que quando tínhamos que nos preocupar apenas com um valor de peso. O quanto ter um banheiro extra muda a forma como prevemos o valor de uma casa?

Tente encontrar os pesos e vieses corretos. Você começará aqui a ver a complexidade em que começamos a entrar conforme o número de nossas entradas aumenta.

Começamos a perder a capacidade de criar formas 2D simples que nos permitem visualizar o modelo rapidamente. Em vez disso, teremos que confiar principalmente em como o valor do erro está evoluindo conforme ajustamos nossos parâmetros do modelo.

05010015020025030020,00040,00060,00080,000100,000

Erro108.268 Peso #10,000Peso #20,000Viés0,000

0.0000.0000.0

Nossa confiável descida de gradiente está aqui para ajudar mais uma vez. Ela ainda é valiosa para nos ajudar a encontrar os pesos e vieses corretos.

Características

Agora que você viu redes neurais com um e dois recursos, você pode descobrir como adicionar recursos adicionais e usá-los para calcular suas previsões.

O número de pesos continuará a crescer, e nossa implementação de gradiente descendente terá que ser ajustada conforme adicionamos cada recurso para que ele possa atualizar os novos pesos associados ao novo recurso.

É importante notar aqui que não alimentamos cegamente a rede com tudo o que sabemos sobre nossos exemplos. Temos que ser seletivos sobre quais recursos alimentamos o modelo. A seleção/processamento de recursos é uma disciplina inteira com seu próprio conjunto de melhores práticas e considerações.

Se você quiser ver um exemplo do processo de examinar um conjunto de dados para escolher quais recursos alimentar um modelo de previsão, confira A Journey Through Titanic . É um caderno onde Omar EL Gabry narra seu processo para resolver o desafio do Titanic do Kaggle. O Kaggle disponibiliza o manifesto do passageiro do Titanic, incluindo dados como nome, sexo, idade, cabine e se a pessoa sobreviveu ou não. O desafio é construir um modelo que preveja se uma pessoa sobreviveu ou não, dadas suas outras informações.

Classificação

Vamos continuar a ajustar nosso exemplo. Suponha que sua amiga lhe dê uma lista de casas. Desta vez, ela rotulou aquelas que ela acha que têm um bom tamanho e número de banheiros:

Área (pés quadrados) (x1)Banheiros (x2)Etiqueta (e)2.1043Bom1.6003Bom2.4003Bom1.4162Ruim3.0004Ruim1.9854Bom1.5343Ruim1.4273Bom1.3803Bom1.4943Bom

Ela precisa que você use isso para criar um modelo para prever se ela gostaria de uma casa ou não, dado seu tamanho e número de banheiros. Você usará essa lista acima para construir o modelo, então ela usará o modelo para classificar muitas outras casas. Uma mudança adicional no processo é que ela tem outra lista de 10 casas que ela rotulou, mas ela está escondendo isso de você. Essa outra lista seria usada para avaliar seu modelo depois que você o treinou — tentando assim garantir que seu modelo capte as condições que realmente a fazem gostar das características da casa.

As redes neurais com as quais estivemos brincando até agora estão todas fazendo “regressão” — elas calculam e produzem um valor “contínuo” (a saída pode ser 4, ou 100,6, ou 2143,342343). Na prática, no entanto, as redes neurais são mais frequentemente usadas em problemas do tipo “classificação”. Nesses problemas, a saída da rede neural tem que ser de um conjunto de valores discretos (ou “classes”) como “Bom” ou “Ruim”. Como isso funciona na prática, é que teremos um modelo que dirá que tem 75% de certeza de que uma casa é “Boa” em vez de apenas cuspir “boa” ou “ruim”.

O aplicativo TensorFlow que discuti no meu post anterior é um bom exemplo de um modelo de classificação na prática.

Uma maneira de transformar a rede que vimos em uma rede de classificação é fazer com que ela produza dois valores — um para cada classe (nossas classes agora são “boas” e “ruins”). Então passamos esses valores por uma operação chamada “ softmax ”. A saída do softmax é a probabilidade de cada classe.

Por exemplo, digamos que a camada da rede produza 2 para “bom” e 4 para “ruim”, se alimentarmos [2, 4] para o softmax, ele retornará [0,11, 0,88] como a saída. O que traduz os valores para dizer que a rede tem 88% de certeza de que o valor inserido é “ruim” e nosso amigo não gostaria daquela casa.

O Softmax pega um array e gera um array do mesmo comprimento. Observe que suas saídas são todas positivas e somam 1 — o que é útil quando estamos gerando um valor de probabilidade.

Observe também que, embora 4 seja o dobro de 2, sua probabilidade não é apenas o dobro, mas é oito vezes maior que 2. Esta é uma propriedade útil que exagera a diferença na saída, melhorando assim nosso processo de treinamento.

saídasoftmax([ 1 ])[ 1 ]softmax([ 1, 1 ])[ 0,5, 0,5 ]softmax([ 0, 1 ])[ 0,26, 0,73 ]softmax([ 2, 4 ])[ 0,11, 0,88 ]softmax([ 5, 10 ])[ 0,007, 0,993 ]softmax([ -1, 0, 1 ])[ 0,09, 0,24, 0,66 ]softmax([ 1, 2, 4 ])[ 0,04, 0,11, 0,84 ]

Você pode ver nas duas últimas linhas, o softmax se estende a qualquer número de entradas. Então, agora, se nosso amigo adicionar um terceiro rótulo (digamos “Bom, mas terei que airbnb um quarto”), o softmax escala para acomodar essa mudança.

Reserve um segundo para explorar o formato da rede enquanto você varia o número de recursos (x1, x2, x3…etc) (que podem ser área, número de banheiros, preço, proximidade da escola/trabalho…etc) e varia o número de aulas (y1, y2, y3…etc) (que podem ser “muito caro”, “bom negócio”, “bom se eu for Airbnb”, “muito pequeno”):

Características (x):Aulas (y):

X1X2W1,1W2,1W1,2W2,2Y1Y2+b1+b2softmax

Você pode ver um exemplo de como criar e treinar essa rede usando o TensorFlow neste notebook que criei para acompanhar esta postagem.

Motivação Verdadeira

Se você chegou até aqui, tenho que revelar outra motivação minha para escrever este post. Este post pretende ser uma introdução ainda mais suave aos tutoriais do TensorFlow. Se você começar a trabalhar com o MNIST para iniciantes em ML agora e se deparar com este gráfico:

Escrevi este post para preparar pessoas sem experiência em machine learning para este gráfico no tutorial introdutório do TensorFlow. É por isso que simulei seu estilo visual.

Espero que você se sinta preparado e que tenha um entendimento desse sistema e de como ele funciona. Se quiser começar a mexer com código, sinta-se à vontade para continuar com o tutorial de introdução e ensinar uma rede neural a detectar dígitos escritos à mão.

Você também deve continuar sua educação aprendendo os fundamentos teóricos e matemáticos dos conceitos que discutimos aqui. Boas perguntas para fazer agora incluem:

  • Que outros tipos de funções de custo existem? Quais são melhores para quais aplicações?
  • Qual é o algoritmo para realmente calcular novos pesos usando a descida do gradiente?
  • Quais são as aplicações para machine learning nos campos em que você já tem conhecimento? Que nova magia você pode usar misturando esta magia com outras em seu livro de magias?

Ótimos recursos de aprendizagem incluem:

--

--

João Ricardo Mendes
João Ricardo Mendes

Written by João Ricardo Mendes

Hurb.com CEO and Founder. Be curious. Read widely. Try new things. What people call intelligence just boils down to curiosity.

No responses yet