Regressão Linear com Gradiente Descendente
Este é mais um artigo da série sobre Regressão. Seja bem-vindo🤟
Anteriormente aprendemos sobre Regressão Linear, conhecemos a função de custo MSE e como minimizá-la utilizando o Método dos Mínimos Quadrados. Caso tenha alguma dúvida sobre esses assuntos, recomendo fortemente que visite este material. A leitura irá levar apenas 4 minutinhos e você irá ficar por dentro de todos os conceitos 😉
No último artigo treinamos um modelo de Regressão Linear utilizando o Método dos Mínimos Quadrados. Este método se torna muito lento quando o número de características cresce bastante. A seguir, veremos um método mais adequado para um grande número de características.
Basicamente, o objetivo da tarefa da Regressão Linear é obter uma reta que melhor se ajusta aos dados de treinamento, sendo possível estimar um valor de interesse a partir dela:
- θ₀ é o coeficiente linear.
- θ₁ é o coeficiente angular.
- ε é o ruído gaussiano.
O Gradiente Descendente é um algoritmo de otimização que realiza o ajuste de parâmetros de forma iterativa com o objetivo de encontrar o valor θ₀ e θ₁ que minimiza a função de interesse. Ou seja, a reta que melhor se ajusta aos dados.
O método inicia preenchendo θ₀ e θ₁ com valores aleatórios, e melhora gradualmente a cada iteração, dando um pequeno passo de cada vez até que o algoritmo convirja para um mínimo. O tamanho dos passos é definido pelo hiperparâmetro taxa de aprendizado.
Se a taxa de aprendizado for muito pequena, o algoritmo levará muito tempo para convergir devido ao grande número de iterações.
Se a taxa de aprendizado for muito alta, o algoritmo poderá ultrapassar o mínimo, não encontrando uma boa solução.
A simulação acima pode ser realizada nesta página, sendo possível alterar a taxa de aprendizado e acompanhar o algoritmo a cada passo.
Gradiente Descendente em Lote
Para implementar o Gradiente Descendente, precisamos calcular quanto mudará a função custo se alterarmos apenas um pouco do θⱼ. Isto é chamado derivada parcial. A derivada nos dá a taxa de variação de uma função em um determinado ponto, quando temos uma taxa de variação igual a zero, significa que atingimos um ponto plano da função, esse ponto pode ser um mínimo local ou mínimo global. Mínimos locais são um dos principais desafios do Gradiente Descendente, pois a solução não é tão boa quanto o mínimo global.
Felizmente, a função de custo MSE (Erro Quadrático Médio) é convexa. Ou seja, se escolhermos quaisquer dois pontos na curva, a linha que os une nunca irá cruzar a curva. Dessa forma, não há a ocorrência de mínimos locais, apenas um mínimo global. Porém, se tivermos características com escalas muito diferentes, eventualmente alcançaremos o mínimo, mas iremos demorar muito. Portanto, ao utilizar o Gradiente Descendente, devemos garantir que todas as características tenham escalas similares.
A derivada parcial da função de custo em relação ao parâmetro θⱼ é calculada da seguinte forma:
- m é o número de instâncias no conjunto de dados.
- θᵀ é a transposição do vetor de parâmetro do modelo.
- x⁽ⁱ⁾ é o vetor contendo os valores das características e yⁱ seus respectivos rótulos.
Em vez de calcular cada derivada parcial individualmente, podemos calculá-las todas de uma vez através do vetor gradiente:
- n é o número de características;
- Xᵀ é transposição da matriz de características.
- y é o vetor dos valores do alvo.
No GD em Lote, todo o conjunto de treinamento (X) é utilizado no cálculo do vetor gradiente. Ou seja, ele utiliza todo o lote de dados em cada etapa.
O vetor gradiente aponta para o crescimento da função, como desejamos descer, basta caminharmos para o lado oposto (subtraindo o vetor de θ). A taxa de aprendizado é definida por η (Eta), multiplicamos o vetor gradiente por η para definir o tamanho do passo.
Vamos gerar um conjunto de dados lineares e em seguida obter θ utilizando o algoritmo do GD em Lote:
Obtemos θ₀ = 3.83 e θ₁ = 3.25.
Abaixo podemos observar o comportamento do algoritmo com diferentes taxas de aprendizado. Ao utilizar uma taxa muito baixa (η=0.02), o algoritmo demorará muito para alcançar a solução. Com a taxa de aprendizado η=0.1, o algoritmo atinge a solução com poucas iterações. Utilizando uma taxa muito alta (η=0.5), o algoritmo diverge se distanciando cada vez mais da solução.
O principal problema do GD em Lote é o fato dele utilizar todo o conjunto de treinamento em cada passo, tornando o processo muito lento para um grande conjunto de dados.
Gradiente Descendente Estocástico
O GD Estocástico escolhe aleatoriamente uma instância do conjunto de treinamento e realiza o cálculo do gradiente baseado apenas nesta instância. Isso torna o algoritmo mais rápido devido a pequena quantidade de dados para manipular a cada iteração. Além disso, permite realizar o treinamento em grandes conjuntos de dados que não cabem na memória principal (out-of-core learning), visto que apenas uma instância precisa estar na memória a cada iteração. No out-of-core learning, o algoritmo carrega parte dos dados, realiza o treinamento nesses dados e repete o processo até que o treinamento tenha sido realizado em todo o conjunto.
Devido a sua aleatoriedade, esse algoritmo é menos regular do que o GD em Lote, em vez de diminuir suavemente até o mínimo, a função custo irá oscilar e diminuir na média. Dessa forma, os valores obtidos serão bons, mas não ótimos.
A aleatoriedade é boa para escapar do ótimo local, porém o algoritmo pode nunca se estabelecer no mínimo. Felizmente existe uma solução para este dilema, que consiste em reduzir gradualmente a taxa de aprendizado, as etapas começam com uma taxa alta para fugir dos mínimos locais e diminuem para atingir o mínimo global. Porém, se a taxa for reduzida rapidamente, o algoritmo poderá ficar preso em um mínimo local. Se reduzida lentamente, poderá saltar em torno do mínimo e obter uma solução insuficiente. A função responsável por determinar a taxa de aprendizado em cada iteração é chamada de cronograma de aprendizado (learning schedule).
Implementando o algoritmo do GD Estocástico:
O algoritmo GD Estocástico encontrou θ₀ = 3.80 e θ₁ = 3.25. Uma boa solução realizando apenas 50 iterações, enquanto o GD em Lote passou 1000 vezes pelo conjunto de treinamento.
Otimizando a Regressão Linear com o GD Estocástico usando a biblioteca Scikit-Learn:
Gradiente Descendente em Minilotes
Diferentemente do GD em Lotes que utiliza todo o conjunto de treinamento em cada etapa ou do GD Estocástico que calcula os gradientes com base em apenas uma única instância por iteração, o GD em Minilotes utiliza pequenos conjuntos aleatórios de dados chamados minilotes para obter os gradientes. Como resultado, o GD em Minilotes é mais regular do que o GD Estocástico, ficando mais próximo do mínimo.
Implementando o GD em Minilotes:
Através do GD Minilotes encontramos θ₀ = 3.81 e θ₁ = 3.22.
Conclusão
Todos os algoritmos obtiveram resultados próximos, vamos analisar os caminhos seguido por eles:
Como podemos observar, o GD em Lote (Batch) caminha diretamente ao mínimo, enquanto o GD Estocástico (Stochastic) e Minilotes (Mini-batch) oscilam durante o caminho e continuam a caminhar mesmo após atingir o mínimo da função de interesse.
Por fim, compararemos os algoritmos tratados até o momento, recordando que m se refere ao número de instâncias de treinamento e n ao número de características. Lembrando que o Método dos Mínimos Quadrados, assim como Regressão Linear foram tratados de forma mais aprofundada neste artigo.
Alguns fatores irão te orientar na decisão de qual algoritmo utilizar para treinar seu modelo de Regressão Linear, como o tamanho do conjunto de treinamento, número de características ou suporte out-of-core.