Gradiente Descendente

Autor

Douglas Braga

Nota

Este capítulo corresponde ao capítulo 8 de Grus (2019).

📓 Abrir o notebook deste capítulo no Colab ↗ — só o código, pronto para rodar.

🎛️ Gradiente passo a passo ↗ — a página interativa da aula: escolha a função, mexa no tamanho do passo e veja a derivada, o passo e o rastro a cada iteração, com uma variável ou com duas.

🏁 Lote, minibatch, estocástico ↗ — os três métodos da seção 5.6 treinando lado a lado, no mesmo orçamento de chamadas a gradient_step, com a perda e a reta ajustada ao vivo.

Quem se vangloria da própria descendência está se vangloriando daquilo que deve a outros.

— Sêneca

Boa parte da ciência de dados é resolver um problema de otimização disfarçado. “Ajustar um modelo” quase sempre significa achar os parâmetros que minimizam algum erro ou maximizam alguma verossimilhança — e “melhor modelo”, na prática, é o nome bonito que damos à solução desse problema. Este capítulo constrói, do zero, a técnica que este livro inteiro vai usar para resolver esses problemas: o gradiente descendente.

A ideia cabe numa frase: calcule a direção em que uma função cresce mais rápido, e ande na direção oposta, em passos pequenos, até quase não se mover mais. O capítulo constrói essa ideia em camadas — o que é o gradiente, como estimá-lo, como usá-lo para minimizar uma função, quanto andar a cada passo, como usar tudo isso para ajustar um modelo a dados, e como fazer isso em escala — e chega, já na seção 5.3, a uma função de cinco linhas, gradient_step: a peça que os capítulos seguintes de fato chamam.

ImportantePor que este capítulo pesa mais que os outros

gradient_step não é só mais um algoritmo do livro. É a máquina que treina praticamente tudo o que vem depois dela. Regressão linear simples e múltipla, regressão logística, redes neurais e deep learning chamam essa função — direta ou indiretamente — para ajustar os parâmetros dos modelos que constroem. Nenhum deles reimplementa a ideia: todos usam a mesma peça que você vai escrever aqui.

Os modelos que não passam por este capítulo são os que não se ajustam descendo um gradiente, e vale saber quais são desde já: o k-vizinhos mais próximos, cuja previsão é uma busca nos dados guardados; o Naive Bayes, que se treina contando; as árvores de decisão, construídas por uma escolha gulosa repetida; e o k-means, que alterna dois passos exatos.

Isso não quer dizer que esses quatro não tenham nada a ajustar — o k do k-vizinhos e o do k-means são escolhidos de fora, por quem usa o modelo, em vez de aprendidos a partir dos dados. A diferença é essa: um parâmetro que o gradiente descobre, contra um que você decide.

Isso inverte a ordem usual de aprender machine learning. Normalmente você vê um algoritmo, depois outro, e só bem mais tarde percebe que todos treinam do mesmo jeito por baixo. Aqui você constrói o “por baixo” primeiro. Depois deste capítulo, cinco capítulos inteiros deixam de ser caixas-pretas de treino e passam a ser “mais um jeito de calcular um gradiente e chamar gradient_step”.

Ao final deste capítulo, você será capaz de:

Seções

Seção Tópico
5.1 A Ideia por Trás do Gradiente Descendente
5.2 Estimando o Gradiente
5.3 Usando o Gradiente
5.4 Escolhendo o Tamanho do Passo
5.5 Ajustando Modelos com Gradiente Descendente
5.6 Minibatch e Gradiente Estocástico

Leituras adicionais

A seção “For Further Exploration” do capítulo 8 de Grus (2019) sugere:

  • Continuar lendo — o próprio autor observa que o livro vai usar gradiente descendente para resolver problemas até o fim.
  • Active Calculus 1.0, de Matthew Boelkins, David Austin e Steven Schlicker (Grand Valley State University Libraries), disponível gratuitamente, para quem quiser revisar cálculo.
  • O texto de Sebastian Ruder comparando gradiente descendente e suas muitas variantes — momentum, RMSProp, Adam — que reaparecem nos capítulos sobre redes neurais.
Grus, Joel. 2019. Data Science from Scratch: First Principles with Python. 2nd ed. O’Reilly Media.