Gradiente descendente, que bicho é esse?

Gabriel Pires
5 min readJul 5, 2022

--

Eaii galerinha, beleza? Nos dois últimos posts sobre regressão linear mencionei que precisamos minimizar nossa função de custo para encontrar o melhor valor para o parâmetro da nossa equação da reta. Mas como de fato fazemos isso?

Quero introduzir esse assunto da maneiras mais fácil possível, pois este tema será novamente reforçado na parte de redes neurais, bora nessa? :)

Para tratar sobre esse assunto, vou dividir esse post em duas etapas:

  • Função de custo;
  • Gradiente descendente.
Gradiente descendente em ação!

1. Função de custo

Antes de começarmos a discutir sobre o gradiente descendente, vamos entender um pouco melhor a função de custo. A função de custo que estamos utilizando é a MSE (Mean squared error) a qual é uma função convexa, e o que isso significa? Significa que a função apresenta um local, ou melhor um valor, onde é possível minimizar sua função.

Função de custo convexa.

Mas será que só existe esse tipo de função de custo? Não! Também há funções de custo não convexas, que geram alguns empecilhos na hora de utilizar o gradiente descendente. Em grande maioria dos casos, esses tipos de funções são utilizados em redes neurais.

2. Gradiente descendente

O gradiente descendente busca ajustar iterativamente os parâmetros com o intuito de minimizar a função de custo. E como isso funciona? Imagine que você está no topo de uma montanha e tenha que desce-la, mas você está vendado! Como faria isso? Uma maneira é seguir a direção onde o solo apresenta desnível, pois assim você saberá que estará, de fato, indo para baixo.

O caminho para descer de uma montanha vendado (Doideira).

Portanto, ele busca encontrar o valor que minimiza a função de custo através dos passos, sendo esses passos a “velocidade” em que você desce a montanha. Esses passos podem ser grandes ou pequenos e os dois extremos não são as melhores alternativas.

  • Se o passo for muito grande, ele pode acabar indo rápido demais e acabar “pulando” o mínimo global e andar em zig-zag.
  • Se o passo for muito pequeno, ele pode demorar para convergir para o valor de mínimo da função e seu modelo demorar muito tempo para rodar.

2.1 Como a função identifica para onde ir?

O gradiente descendente calculara primeira derivada da função de custo para cada ponto. O resultado desse gradiente é positivo, apontando para cima, buscando o valor máximo da função (gradiente ascendente). Para conseguirmos ir até o mínimo da função devemos então andar contra o gradiente, proporcionalmente negativo, dando origem ao nome de gradiente descendente.

Fórmula gradiente descendente.

Pronto, já temos a direção que temos que ir, mas agora, o quão rápido devemos ir?

2.2 Como medir o tamanho do passo?

Através do passo conseguimos atingir o mínimo da função através da descida do gradiente, além disso também vimos que esse passo pode variar de grande a pequeno. Como conseguimos então definir o tamanho desse passo? O responsável para isso é o hiperparâmetro da taxa de aprendizado.

Tipos de taxa de aprendizado.

Podemos observar na figura acima diferentes tipos de taxa de aprendizado.

a) Caso perfeito, onde uma iteração levaria ao mínimo global;

b) Caso onde a taxa de aprendizado é baixa, demorando para convergir ao mínimo global, mas convergindo;

c) Caso onde a taxa de aprendizado varia para ambos os lados da função (não ideal) mas ainda sim converge para o mínimo global;

d) Caso onde a taxa de aprendizado é muito alta e o gradiente não converge para o mínimo global.

2.2.1 Tudo é maravilhas?

Lembra que mencionei que funções não convexas poderiam ser um empecilho? Pois bem, com o gradiente descendente conseguimos minimizar realmente a função convexa, atingimos o mínimo global. Se a função de custo não for convexa podemos nos deparar com um problema: podemos parar no mínimo local e não global, e assim não minimizar a função de custo completamente.

Mínimos de uma função.

Como você resolveria esse problema?

3. Como implementar?

Vou implementar aqui um código do zero, acho que será mais fácil o entendimento sobre o assunto! A função de custo só foi transcrita pra forma pythonica, agora reparem no gradiente descendente. Usamos a taxa de aprendizado e o epoch, que é nosso passo! Quando chamamos nossa função do gradiente, o parâmetro w (nosso theta) tem inicialização em 0 (pode ser aleatória também) e então a função começa calcular a função da reta utilizando esse w e o atualiza através da perda vindo da função de custo, pela quantidade de vezes que o epoch foi definido (ou até o mínimo).

Gráficos sobre o gradiente.
O valor do R² é: 0.73
O valor para o coeficiente é: 3.04
O valor do intercepto é: 3.87

Teste esse método para taxas de aprendizado diferentes e vejam a diferença!

Todas as possíveis retas para uma taxa de aprendizado = 0.02

Por hoje é isso! O próximo post quero finalizar trazendo o que deve ser analisado antes de realizar uma regressão, assim como explicar suas métricas de avaliação.

Até mais =]

--

--