IA 101

O que é Descida de Gradiente?

mm

O que é Descida de Gradiente?

Se você leu sobre como as redes neurais são treinadas, provavelmente já encontrou o termo “descida de gradiente” antes. Descida de gradiente é o método principal de otimização do desempenho de uma rede neural, reduzindo a taxa de erro/perda da rede. No entanto, a descida de gradiente pode ser um pouco difícil de entender para os iniciantes em aprendizado de máquina, e este artigo tentará fornecer uma intuição decente de como a descida de gradiente opera.

A descida de gradiente é um algoritmo de otimização. É usado para melhorar o desempenho de uma rede neural, fazendo ajustes nos parâmetros da rede de modo que a diferença entre as previsões da rede e os valores reais/esperados da rede (referidos como perda) seja o menor possível. A descida de gradiente toma os valores iniciais dos parâmetros e usa operações baseadas em cálculo para ajustar seus valores em direção aos valores que farão a rede tão precisa quanto possível. Você não precisa saber muito cálculo para entender como a descida de gradiente funciona, mas precisa ter uma compreensão de gradientes.

O que são Gradientes?

Suponha que há um gráfico que representa a quantidade de erro que uma rede neural comete. A parte inferior do gráfico representa os pontos de menor erro, enquanto a parte superior do gráfico é onde o erro é o maior. Queremos mover da parte superior do gráfico para a parte inferior. Um gradiente é apenas uma forma de quantificar a relação entre erro e os pesos da rede neural. A relação entre essas duas coisas pode ser grafada como uma inclinação, com pesos incorretos produzindo mais erro. A inclinação da inclinação/gradiente representa quão rápido o modelo está aprendendo.

Uma inclinação mais acentuada significa que reduções grandes no erro estão sendo feitas e o modelo está aprendendo rapidamente, enquanto se a inclinação for zero, o modelo está em um platô e não está aprendendo. Podemos mover em direção à parte inferior da inclinação, em direção a menos erro, calculando um gradiente, uma direção de movimento (mudança nos parâmetros da rede) para o nosso modelo.

Vamos mudar um pouco a metáfora e imaginar uma série de colinas e vales. Queremos chegar ao fundo da colina e encontrar a parte do vale que representa a menor perda. Quando começamos na parte superior da colina, podemos dar passos grandes para baixo da colina e ter certeza de que estamos nos movendo em direção ao ponto mais baixo do vale.

No entanto, à medida que nos aproximamos do ponto mais baixo do vale, nossos passos precisarão se tornar menores, ou podemos ultrapassar o verdadeiro ponto mais baixo. Da mesma forma, é possível que, ao ajustar os pesos da rede, os ajustes possam na verdade afastar a rede do ponto de menor perda, e, portanto, os ajustes devem se tornar menores com o tempo. No contexto de descida de uma colina em direção a um ponto de menor perda, o gradiente é um vetor/instruções que detalham o caminho que devemos seguir e quão grandes devem ser os nossos passos.

Agora que sabemos que os gradientes são instruções que nos dizem em que direção mover (quais coeficientes devem ser atualizados) e quão grandes devem ser os passos que devemos dar (quanto os coeficientes devem ser atualizados), podemos explorar como o gradiente é calculado.

Calculando Gradientes e Descida de Gradiente

Descida de gradiente começa em um lugar de alta perda e, através de múltiplas iterações, dá passos na direção de menor perda, visando encontrar a configuração ótima de pesos. Foto: Роман Сузи via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)

Para realizar a descida de gradiente, os gradientes devem ser calculados primeiro. Para calcular o gradiente, precisamos saber a função de perda/custo. Usaremos a função de custo para determinar a derivada. Em cálculo, a derivada se refere simplesmente à inclinação de uma função em um ponto dado, então estamos basicamente calculando a inclinação da colina com base na função de perda. Determinamos a perda executando os coeficientes através da função de perda. Se representarmos a função de perda como “f”, então podemos dizer que a equação para calcular a perda é a seguinte (estamos apenas executando os coeficientes através da nossa função de custo escolhida):

Perda = f(coeficiente)

Então calculamos a derivada, ou determinamos a inclinação. Obter a derivada da perda nos dirá em que direção é para cima ou para baixo da inclinação, dando-nos o sinal apropriado para ajustar nossos coeficientes. Representaremos a direção apropriada como “delta”.

delta = função_derivada(perda)

Agora sabemos em que direção é para baixo, em direção ao ponto de menor perda. Isso significa que podemos atualizar os coeficientes nos parâmetros da rede neural e, com sorte, reduzir a perda. Atualizaremos os coeficientes com base nos coeficientes anteriores, menos a mudança apropriada no valor, determinada pela direção (delta) e um argumento que controla a magnitude da mudança (o tamanho do nosso passo). O argumento que controla o tamanho da atualização é chamado de “taxa de aprendizado” e o representaremos como “alfa”.

coeficiente = coeficiente – (alfa * delta)

Então simplesmente repetimos esse processo até que a rede tenha convergido em torno do ponto de menor perda, que deve estar perto de zero.

É muito importante escolher o valor correto para a taxa de aprendizado (alfa). O valor escolhido para a taxa de aprendizado deve ser nem muito pequeno nem muito grande. Lembre-se de que, à medida que nos aproximamos do ponto de menor perda, nossos passos devem se tornar menores, ou podemos ultrapassar o verdadeiro ponto de menor perda e acabar do outro lado. O ponto de menor perda é pequeno e, se nossa taxa de mudança for muito grande, o erro pode acabar aumentando novamente. Se os tamanhos dos passos forem muito grandes, o desempenho da rede continuará a oscilar em torno do ponto de menor perda, ultrapassando-o de um lado e depois do outro. Se isso acontecer, a rede nunca convergirá para a configuração ótima de pesos.

Em contraste, se a taxa de aprendizado for muito pequena, a rede pode potencialmente levar um tempo extremamente longo para convergir para os pesos ótimos.

Tipos de Descida de Gradiente

Agora que entendemos como a descida de gradiente funciona em geral, vamos dar uma olhada em alguns dos diferentes tipos de descida de gradiente.

Descida de Gradiente em Lote: Este tipo de descida de gradiente processa todas as amostras de treinamento antes de atualizar os coeficientes. Este tipo de descida de gradiente é provavelmente o mais eficiente computacionalmente, pois os pesos são atualizados apenas uma vez que o lote inteiro foi processado, o que significa que há menos atualizações no total. No entanto, se o conjunto de dados contém um grande número de exemplos de treinamento, então a descida de gradiente em lote pode tornar o treinamento muito demorado.

Descida de Gradiente Estocástica: Na descida de gradiente estocástica, apenas um exemplo de treinamento é processado para cada iteração da descida de gradiente e atualização de parâmetros. Isso ocorre para cada exemplo de treinamento. Como apenas um exemplo de treinamento é processado antes que os parâmetros sejam atualizados, tende a convergir mais rapidamente do que a descida de gradiente em lote, pois as atualizações são feitas mais cedo. No entanto, como o processo deve ser realizado em cada item do conjunto de treinamento, pode levar muito tempo para concluir se o conjunto de dados for grande, e assim o uso de um dos outros tipos de descida de gradiente é preferido.

Descida de Gradiente em Mini-Lote: A descida de gradiente em mini-lote opera dividindo o conjunto de treinamento inteiro em subseções. Ela cria mini-lotes menores que são processados pela rede, e quando o mini-lote é usado para calcular o erro, os coeficientes são atualizados. A descida de gradiente em mini-lote atinge um meio-termo entre a descida de gradiente estocástica e a descida de gradiente em lote. O modelo é atualizado com mais frequência do que no caso da descida de gradiente em lote, o que significa uma convergência ligeiramente mais rápida e mais robusta para os parâmetros ótimos do modelo. É também mais eficiente computacionalmente do que a descida de gradiente estocástica

Blogueiro e programador com especialidades em Machine Learning e Deep Learning tópicos. Daniel espera ajudar os outros a usar o poder da IA para o bem social.