Gradiente Descendente — Uma breve introdução

Anwar Hermuche
6 min readSep 1, 2022

--

Neste artigo, vou abordar o que realmente você precisa saber sobre gradientes aplicados em Machine Learning.

Quando nos deparamos com ele pela primeira vez, geralmente tomamos um susto, porque envolve conceitos avançados para quem está chegando agora na área de exatas que é o cálculo em si (derivadas parciais, funções etc.), mas te garanto que se você ler este artigo com o coração aberto, suas dúvidas serão esclarecidas!

Gradiente Descendente

Imagem 1

O Gradiente Descendente é um método utilizado com o intuito de otimização. E quando falamos sobre otimização, no caso da aplicação em Machine Learning, falamos sobre a otimização dos parâmetros do nosso algoritmo para que a taxa de assertividade do modelo só aumente.

Como você pode ver pelo GIF da imagem 1, essa malha laranja representa o resultado da função de custo para todas as combinações possíveis de parâmetros do nosso modelo. Sendo assim, algumas combinações vão gerar erros maiores — representados pelos picos na malha — e determinadas combinações de parâmetros vão gerar os erros mínimos (mínimo global ou local), que é justamente o ponto que queremos alcançar.

Esse método do gradiente descendente é feito a partir de iterações, onde, a cada iteração, o gradiente move-se passo a passo em direção ao maior declive da curva, alcançando o mínimo local (ou global), como está mostrando o GIF.

Aplicação em Machine Learning

Vamos, então, para a prática. Começaremos com o seguinte dataset:

Imagem 2

Vendo assim, não dá para perceber se há alguma relação entre os dados. Então, para uma melhor visualização, vou utilizar o “scatterplot” do seaborn. Observe como nossa variável X está relacionada com a variável y:

Imagem 3

Pelo gráfico, podemos ver que há uma correlação positiva forte entre as duas variáveis. Então, nosso objetivo agora é tentar achar qual é a equação da reta da forma y = a*x + b que melhor se aproxima desses pontos. Para isso, vamos começar com a seguinte equação de reta: y = 0*x + 0, ou seja, a = 0 e b = 0. Observe como fica sua representação gráfica:

Imagem 4

De fato, esta não é a melhor representação da reta que mais se aproxima da configuração dos datapoints. Para poder mensurar o erro do nosso modelo, vamos fazer uso da função de custo. Se fizermos os cálculos, chegaremos em 390.09. Caso não saiba como fazer, recomendo que leia meu artigo sobre Função de Custo clicando aqui e confira o código deste artigo no meu GitHub.

Com este resultado em mente, nosso objetivo agora é ir diminuindo cada vez mais o erro. Mas como fazemos isso? Simples, ajustamos os parâmetros de tal forma que o resultado da função de custo seja mínimo. Para isso, vamos recapitular sobre derivadas parciais para, de fato, implementarmos o gradiente descendente neste problema.

Nós vamos atualizar os pesos de acordo com a seguinte equação:

Imagem 5

Se você não faz ideia do que se passa nessas duas equações, vou explicar. Neste caso, a e b são o slope (coeficiente angular) e o intercept (coeficiente linear) da nossa reta, respectivamente. A letra grega eta (η) representa o passo de aprendizagem ou o learning rate, ele que determina o tamanho do passo a cada iteração. Por fim, o termo que provavelmente a maioria ficou em dúvida: ∂. Este é o símbolo da derivada parcial. Note que tanto em “a” quanto em “b” estamos subtraindo o seu próprio valor pelo passo de aprendizagem multiplicado pela derivada parcial da Função de Custo em relação a “a” ou “b”. Para simplificar os cálculos, vou colocar qual seria esse resultado de forma pronta, mas caso você já tenha estudado Cálculo II, recomendo fortemente que veja a demonstração desse resultado, que, caso você já tenha estudado, é bem simples.

Imagem 6
Imagem 7

Nas imagens 6 e 7, podemos ver a forma simplificada do algoritmo do gradiente descendente. Lembre-se de que todos os parâmetros (a e b, nesse caso) são atualizados no mesmo instante, ou seja, o resultado da atualização de um, na mesma iteração, não afeta o resultado do outro. Além disso, “n” é o número de amostras do nosso dataset.

Então, vamos atualizar os parâmetros “a” e “b” com um learning rate igual a 0.005:

Imagem 8
Imagem 9

Atualizando os parâmetros e “replotando” a nossa reta, temos:

Imagem 10

Olha que massa. A reta se aproximou mais de como os nossos dados estão distribuídos. Se recalcularmos a função de custo, chegamos em 99.63. Se fizermos esse procedimento várias e várias vezes, vamos chegar em um valor mínimo para a função de custo que significará que encontramos a reta que melhor se aproxima da distribuição dos nossos dados.

Um detalhe importante a se notar é que em uma regressão linear, a função é convexa, ou seja, o mínimo local é o mínimo global. Em funções de custo utilizadas em redes neurais, por exemplo, temos exemplos de funções não convexas, onde não necessariamente o mínimo local é o mínimo global.

Para finalizar, vou colocar aqui o resultado dos parâmetros que minimizam a função de custo para o nosso dataset. Utilizando a classe LinearRegression do pacote sklearn, podemos calcular quais são os melhores parâmetros para o nosso modelo.
Sendo assim, a nossa equação de reta que possui o mínimo valor de custo nos pontos do nosso dataset é y = 0.674x - 10.848, que nos devolve um custo igual a 7.042. Note que saímos de um custo de 390 para um de 7, o que significa uma baita melhora da nossa reta.

Para melhor compreensão, vou colocar o resultado final da nossa reta:

Imagem 11

Conclusão

Chegamos ao final de mais um artigo aqui no Medium falando sobre conceitos importantes para Machine Learning. Espero que você tenha compreendido o funcionamento do algoritmo do gradiente descendente, porque realmente não é fácil entender de primeira. Caso não tenha entendido, recomendo pesquisar outras fontes no Google para ter diversas referências e conseguir de fato consolidar o conhecimento. E não se esqueça de que o código feito para utilizar nessa aula está no meu GitHub!

Até já, pessoal!

--

--