Gradiente descendente e retropropagação em Python
Treinar é ajustar os pesos para reduzir a perda. O gradiente mostra a direção em que a perda cresce, então o gradiente descendente dá pequenos passos na direção oposta. A retropropagação usa a regra da cadeia para calcular esse gradiente para cada peso.
O conceito em palavras simples
Treinar é ajustar os pesos para reduzir a perda. O gradiente mostra a direção em que a perda cresce, então o gradiente descendente dá pequenos passos na direção oposta. A retropropagação usa a regra da cadeia para calcular esse gradiente para cada peso.
Treine um neurônio com gradiente descendente: use a regra da cadeia para descobrir como cada peso afeta a perda e desça a encosta.
Ideias principais
- O gradiente é a inclinação da perda em relação a cada peso.
- A taxa de aprendizado define o tamanho do passo: grande demais passa do ponto, pequena demais é lenta.
- A retropropagação aplica a regra da cadeia da saída até a primeira camada.
- Uma época é uma passagem por todos os dados de treinamento.
Quando usar?
- Entender o que acontece dentro das redes neurais e das bibliotecas de IA.
- Aprender a ideia antes de implementá-la nos desafios correspondentes.
- Se preparar para cursos de aprendizado de máquina, entrevistas e projetos.
Veja na prática
Clique em Executar para treinar. A reta se aproxima dos pontos enquanto o caminho laranja desce o relevo da perda até o ponto mais baixo.
Código de exemplo
# Train one neuron y = w * x + b to fit points on the line y = 2x + 1.
data = [(0, 1), (1, 3), (2, 5), (3, 7)]
w, b = 0.0, 0.0
learning_rate = 0.05
for epoch in range(1, 201):
grad_w = grad_b = 0.0
for x, y in data:
error = (w * x + b) - y # prediction minus target
# Chain rule: d(error²)/dw = 2 * error * x, d(error²)/db = 2 * error
grad_w += 2 * error * x
grad_b += 2 * error
# Step against the gradient to make the loss smaller.
w -= learning_rate * grad_w / len(data)
b -= learning_rate * grad_b / len(data)
if epoch in (1, 10, 50, 200):
loss = sum(((w * x + b) - y) ** 2 for x, y in data) / len(data)
print(f"epoch {epoch:>3}: w={w:.3f} b={b:.3f} loss={loss:.4f}")
Saída esperada
epoch 1: w=0.850 b=0.400 loss=7.0587
epoch 10: w=2.009 b=0.958 loss=0.0009
epoch 50: w=2.005 b=0.989 loss=0.0000
epoch 200: w=2.000 b=1.000 loss=0.0000
Como funciona
Para cada ponto, o erro é a previsão menos o alvo. A regra da cadeia dá o gradiente do erro quadrático, 2·error·x para w e 2·error para b. Tirando a média sobre os dados e andando contra o gradiente, w e b se aproximam de 2 e 1, e a perda cai quase a 0.
Altere os valores e execute o programa no compilador Python online CodeUtility sem instalar Python.
Exercícios práticos
Altere as entradas e teste casos de borda antes de usar conjuntos de dados maiores.
- Mude as entradas ou os pesos e preveja a saída antes de executar.
- Imprima os valores intermediários para acompanhar cada passo do cálculo.
- Resolva os desafios indicados abaixo para implementar a ideia você mesmo.
Pratique com um desafio
Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.
- Derivadas de funções de ativação Calcule a derivada de sigmoid, ReLU, Leaky ReLU ou tanh em cada valor, as inclinações de que a retropropagação precisa. Fácil
- Gradientes de um único neurônio Use a regra da cadeia para descobrir como a perda muda com cada peso e o viés de um neurônio sigmoide. Médio
- Retropropagação em uma rede de duas camadas Calcule todos os gradientes de pesos e vieses de uma rede com uma camada oculta sigmoide e uma saída sigmoide. Difícil
- Treine um neurônio com descida do gradiente Repita propagação direta, cálculo dos gradientes e atualização dos pesos para ensinar um neurônio sigmoide a partir de exemplos. Médio
- Treine uma rede neural para resolver o XOR Junte tudo: treine uma rede sigmoide 2-2-1 com retropropagação até ela aprender o XOR. Difícil