Imagem gerada pela Lexica.art

Bibliotecário em ciência de dados: Uma introdução ao gradiente e descendente

Francisco Foz
8 min readDec 13, 2022

Quando li o termo “gradiente e descendente” pela primeira vez, pensei:

“mas que raios será gradiente e descendente?”

Nunca tinha ouvido ou lido em algum lugar… pelo menos não que eu me lembrasse.

Li ele no título do capítulo 8 do livro “Data Science do Zero”, de Joel Grus.

Bom, fui ler o capítulo e… tudo ficou ainda mais confuso.

Li de novo e de novo… e ainda nada.

Havia alguns conceitos de cálculo que eu não estava compreendendo. Tentei estudar esses conceitos e começou a ficar mais claro.

Basicamente, o algoritmo do gradiente e descendente será para encontrar os melhores valores que minimizam uma função de forma iterativa.

Já faz algum tempo que não escrevo a respeito do livro “Data Science do Zero”, porque “travei” nesse capítulo (iniciei a ler como um dos elementos norteadores de estudo em ciência de dados).

Durante esse ano eu prometi para mim mesmo, que escreveria um texto por semana e apenas se tivesse um mínimo de segurança na compreensão do tema.

Bom e esses dois fatores em conjunto não me permitiram escrever esse texto antes.

Mas também tem um terceiro fator: procrastinação.

Quando leio algum conceito que não entendo logo de cara (sem nem mesmo dar uma googlada), dou um espaço para voltar a ele. Fiz isso mais do que uma vez com o gradiente e não deu certo. Percebi que precisava estudar ainda mais outros conceitos.

Mas não faltava apenas esse conceito para que eu avançasse em meus estudos pessoais, então eu fui estudar outros temas…

E esse foi ficando como última prioridade.

Mas hoje, ele saiu.

No texto de hoje farei uma introdução ao algoritmo do gradiente e descendente, indicando algumas fontes que podem te ajudar nessa jornada de aprendizado e exemplificando a previsão da quantidade de visitas mensais a uma biblioteca baseado na quantidade de eventos realizados por mês.

Bora lá?!

Sumário

O que é gradiente e descendente?

Prevendo a quantidade de visitas à biblioteca a partir da quantidade de eventos realizados

Considerações finais

O que é gradiente e descendente?

Vamos pensar que você está fazendo uma trilha em um vale que leva a uma cachoeira. Ela está no ponto mais baixo da montanha e existem diversos caminhos para se chegar a ela.

  • Alguns serão longos, com vários pontos de subida e descida no meio do caminho = maior gasto de energia.
  • Outros serão mais longos, apenas porque a inclinação é mais leve = menor gasto de energia, porém ainda alto.
  • Apenas um é ideal para se chegar até ela e gastar menos energia.

O algoritmo do gradiente e descendente percorrerá todos os caminhos e te dirá qual é o melhor para se gastar menos energia.

Gradiente descendente é um dos algoritmos de maior sucesso em problemas de Machine Learning. O método consiste em encontrar, de forma iterativa, os valores dos parâmetros que minimizam determinada função de interesse. — Laboratório de Estatística e Geoinformação — LEG/UFPR

Como funciona isso na fórmula?

Vamos pegar por exemplo a equação de uma reta:

FONTE

m → coeficiente angular (grau de inclinação da reta)

n (ou b)→ coeficiente linear ou intercepto (ponto onde a reta cruza o eixo y)

y → variável resposta

x → variável explicativa

Eu precisarei encontrar os melhores valores de M e de B que possam ter um Y com a menor diferença do Y real, ou seja: o custo da equação.

Para encontrar os melhores valores, eu precisarei:

  • Derivar a equação a partir de M (mantendo as demais variáveis constantes) em relação ao custo;
  • Multiplicar ela por uma constante (também chamado de taxa de aprendizado ou learning rate) para apenas igualar as grandezas dos dois valores (às vezes os valores de m e de b são bem diferentes do que os valores de x,y e isso normaliza eles);
  • Fazer o mesmo processo para B;
  • Verificar as duas em conjunto para obter o custo;
  • Fazer de novo, subtraindo e atualizando os valores de m e b pelos números encontrados, até encontrar os melhores valores para o menor custo possível.

Ficou confuso, principalmente em como derivar uma equação?

Ou mesmo o que é uma derivada?

Não se assuste.

Basicamente a derivada é um ponto de uma função y=f(x) que representa a taxa de variação de y em relação a x neste ponto.

Bom, eu também tinha ficado mas essas duas séries de vídeos me ajudaram muito para entender:

Além de fazer outros cursos específicos de correlação e regressão linear na Alura:

Fonte do curso
Fonte do curso

Prevendo a quantidade de visitas à biblioteca a partir da quantidade de eventos realizados

Vamos pensar no seguinte cenário:

Uma biblioteca gostaria de prever a quantidade de visitas mensais que ela terá. A direção da biblioteca deduz que quanto maior o número de eventos realizados durante o mês, maior a quantidade de visitas à biblioteca.

Será que existe uma relação entre elas?

Se existir, será possível prever a quantidade de visitas pela quantidade de eventos?

Bom, vamos visualizar os dados:

Parece existir uma relação entre elas, certo?

Vamos verificar o coeficiente de correlação:

Hum… há uma correlação forte.

Poderia traçar uma reta e verificar através do método dos mínimos quadrados quais são os valores de m e b.

Se quiser saber mais sobre esse processo de regressão linear, confira esse texto:

Mas como fazer isso com o método do gradiente e descendente?

Fiz essa função em Python para encontrar:

A função irá receber os valores de X e Y dos dados, um m e b aleatório, dois valores de “learning_rate” (para cada elemento de m e b) e um número de iterações limite para ficar testando.

def gradiente_descendente_regressao(X,Y,m,b,learning_rate_b,learning_rate_m,n_iters):
'''
Essa função tem como objetivo treinar um modelo iterativo para encontrar
os melhores valores do coeficiente angular (m) e coeficiente linear (b),
para a equação da reta de regressão:

"Y = mX + b"

Input:

X = variável dependente
Y = Variável independente
m = coeficiente angular
b = coeficiente linear
learning_rate_m = Taxa de aprendizado do coenficiente angular
learning_rate_b = Taxa de aprendizado do coeficiente linear
n_iters = Número de iterações que será realizado para encontrar os melhores valores

Output:

df_historico_iteracoes = Pandas DataFrame com o historico de m,b e custo de cada iteração realizada

'''

#Gerando equação
y_pred = regressao(X,m,b)

#Variáveis de custo
custo_GD = sum((y_pred - Y)**2)
SQT = sum((Y - Y.mean())**2)

#listas das métricas
lista_m = []
lista_b = []
lista_custo_GD = []
lista_previsao = []

#Laço de iterações de atualização dos valores de m e b de acordo com os valores de x
for i in range(1,n_iters):

derivada_m = sum(2 * X * (y_pred - Y))
derivada_b = sum(2 * (y_pred - Y))

m = m - (derivada_m * learning_rate_m)
b = b - (derivada_b * learning_rate_b)

y_pred = regressao(X,m,b)
custo_GD = np.sum((y_pred - Y)**2)

lista_m.append(m)
lista_b.append(b)
lista_custo_GD.append(custo_GD)
lista_previsao.append(y_pred)


R2 = (SQT - custo_GD)/SQT

df_historico_iteracoes = pd.DataFrame({'m': lista_m,
'b': lista_b,
'custo':lista_custo_GD})

print(f'Coeficiente angular (m): {m}\nCoeficiente linear (b): {b}\nCusto: {custo_GD}\nR2: {R2}')
return df_historico_iteracoes

A partir disso, inseri esses valores:

E tive o resultado:

X = eventos_biblioteca['quantidade_eventos']
Y = eventos_biblioteca['visitas']
m = -2
b = 100

#Melhores valores encontrados
learning_rate_b = 0.0001
learning_rate_m = 0.0000001
n_iters = 3000

historico_iteracoes = gradiente_descendente_regressao(X,Y,m,b,learning_rate_b,learning_rate_m,n_iters)

Coeficiente angular (m): 5.11835488616479

Coeficiente linear (b): 673.6614706928144

Custo: 1247563.6085987508

R2: 0.6838355228471638

Se você não sabe o que é R2, ele é uma medida de quanto o modelo de regressão está se ajustando aos dados.

Não deixe de conferir os vídeos que indiquei, que lá eles explicam sobre isso.

Eu também posso visualizar como o M e o B foram “descendo o gradiente” em relação ao custo da equação:

Podemos ver o valor M aumentando enquanto a taxa de custo diminui. Nesse caso, conseguimos visualizar que quando quase atingiu o valor de 10, precisou começar a diminuir para descer ainda mais o gradiente do custo.

Isso porque o custo também dependia do b.

Podemos ver o custo em relação a quantidade de iterações:

E que a técnica do gradiente e descendente ajusta logo de cara o erro da equação e ao longo das iterações é mais sensível.

Por exemplo podemos ver que apenas nas primeiras 10 iterações é mais plana:

O ajuste fino é realizado para não haver um salto muito grande e ultrapassar o mínimo, fazendo ela ficar pulando de um lado para o outro.

Fonte da imagem

Podemos ver nesse gif com as primeiras 100 iterações, da reta se ajustando:

Agora é só inserir os valores na equação e prever a quantidade de visitas.

Considerações finais

O custo do modelo do gradiente e descendente se mostrou praticamente igual ao modelo do método dos mínimos quadrados, mas utilizando mais gasto computacional devido as iterações.

Para uma regressão linear simples esse talvez não seja o melhor método para prever o valor, entretanto ele pode ser um poderoso algoritmo quando se tem outras variáveis.

Vi que o conceito de gradiente e descendente veio antes do de regressão linear no livro e isso pode ter ficado meio confuso para entender, pois em todos os outros exemplos que vi utilizavam a regressão para exemplificar.

Talvez seja apenas pela didática, mas se por acaso você tiver dificuldade com o gradiente e descendente e ainda não tiver visto regressão linear, pode ser um bom sinal para ver ela antes.

Caso queira ler outro texto a respeito, eu gostei muito da forma de como o Rodrigo explicou.

Confira esse texto dele:

De qualquer forma, esse tema e essa experiência me mostrou o quanto ainda preciso estudar mais alguns fundamentos como por exemplo “cálculo” e entender de fato cada etapa.

Agora me diga, você já conhecia esse modelo?

Se não… achou ele fácil ou difícil?

Se sim… tem outra referência para indicar?

Se você chegou até aqui e curtiu, dê palmas, compartilhe e se inscreva para me acompanhar.

Ainda há muito a se explorar.

--

--

Francisco Foz
Francisco Foz

Written by Francisco Foz

Bibliotecário | Analista de dados | Disseminando informações para produzir conhecimento.

No responses yet

Write a response