Regressão Linear com PyTorch: Implementação Prática

Este artigo explora a implementação da regressão linear usando o framework PyTorch. Abordaremos desde a preparação dos dados até o treinamento do modelo, destacando conceitos-chave da biblioteca.

A regressão linear é um método fundamental para modelar a relação entre uma variável dependente contínua e uma ou mais variáveis independentes. A formulação matemática básica pode ser expressa como:

A manipulação de tensores é operações básicas são cruciais para trabalhar com o PyTorch. A função torch.unsqueeze altera a dimensionalidade de um tensor, adicionando uma dimensão na posição especificada:

tensor_original = torch.tensor([1, 2, 3])
tensor_alterado = torch.unsqueeze(tensor_original, dim=0)  # Adiciona dimensão na posição 0

Para gerar dados distribuídos uniformemente em um intervalo, utilize torch.linspace, que cria uma sequência de valores igualmente espaçados:

pontos = torch.linspace(start=0.0, end=10.0, steps=20)

A camada torch.nn.Linear(in_features, out_features) implementa a transformação linear. Para uma regressão simples, usamos Linear(1, 1), que mantém dois parâmetros treináveis: um peso (weight) e um viés (bias). A operação realizada é:

O código a seguir demonstra a criação e treinamento de um modelo de regressão linear. Observe a estrutura da rede neural simplificada e o processo de otimização.

import torch

# Hiperparâmetros
epocas = 5000
taxa_aprendizado = 0.02

# Gerando dados sintéticos
caracteristicas = torch.unsqueeze(torch.linspace(1, 8, 25), dim=1)
alvos = 3.5 * caracteristicas + 2.8 + torch.randn(caracteristicas.size()) * 0.5

# Definição do modelo
class ModeloRegressao(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.camada_linear = torch.nn.Linear(1, 1)
    
    def forward(self, entrada):
        previsao = self.camada_linear(entrada)
        return previsao

# Instanciação
modelo = ModeloRegressao()
otimizador = torch.optim.SGD(modelo.parameters(), lr=taxa_aprendizado)
funcao_perda = torch.nn.MSELoss()

# Loop de treinamento
for epoca in range(epocas):
    saidas_previstas = modelo(caracteristicas)
    perda = funcao_perda(saidas_previstas, alvos)
    
    otimizador.zero_grad()
    perda.backward()
    otimizador.step()
    
    if epoca % 1000 == 0:
        print(f'Época {epoca}, Perda: {perda.item():.4f}')

# Resultados finais
print("\nPesos treinados:", modelo.camada_linear.weight.data)
print("Viés treinado:", modelo.camada_linear.bias.data)
print("Perda final:", perda.item())

Análise dos Resultados

Ao executar o código, o modelo aprende a aproximar a relação linear presente nos dados. Os valores dos parâmetros treinados devem convergir para os valores reais utilizados na geração dos dados (peso ≈ 3.5, viés ≈ 2.8), com uma perda relativamente baixa devido ao ruído adicionado.

A precisão da aproximação depende de vários fatores, incluindo a taxa de aprendizado, o número de épocas e a quantidade de dados disponíveis. É importante monitorar a perda durante o treinamento para garantir a convergência do modelo e evitar tanto o underfitting quanto o overfittting.

Tags: Pytorch Redes Neurais regressão linear tensores gradientes

Publicado em 6-18 22:36