O futuro da programação? Algoritmo de um Perceptron Linear criado com Ajuda do ChatGPT

Maurício Pinheiro

1. Introdução

1.1. Neurônios:

Os neurônios são os blocos de construção básicos do sistema nervoso e são responsáveis pela transmissão de informações por todo o corpo. Eles foram descobertos e estudados pela primeira vez por cientistas como Santiago Ramón y Cajal e Camillo Golgi no final do século XIX. A principal função dos neurônios é receber, processar e transmitir sinais eletroquímicos, o que permite que eles se comuniquem com outros neurônios e facilitem várias funções corporais. Os neurônios consistem em um corpo celular, dendritos e um axônio, que trabalham juntos para passar sinais entre as células. O processo de comunicação entre neurônios é conhecido como transmissão sináptica e envolve a liberação de neurotransmissores que se ligam a receptores nos dendritos de outros neurônios. Nas redes neurais artificiais, os neurônios são modelados como funções matemáticas que recebem entradas, aplicam pesos e vieses e produzem um resultado. Esses neurônios artificiais são então conectados para formar camadas, que podem ser treinadas usando vários algoritmos, como o algoritmo perceptron. Com essa compreensão dos neurônios e suas funções, podemos apreciar como o algoritmo perceptron pode emular o processo de tomada de decisão de neurônios biológicos de maneira simplificada, permitindo a classificação binária de dados com um limite linear simples.

Neurônio multipolar. Por BruceBlaus Creative Commons Attribution 3.0 September 30, 2013. Fonte: Wikimedia Commons.

1.2. Perceptrons Lineares – Neurônios Artificiais

Perceptrons lineares são um dos modelos mais simples de neurônios artificiais e formam a base para arquiteturas de redes neurais mais complexas. Em sua essência, os perceptrons lineares são classificadores binários que podem aprender a separar os dados de entrada em duas classes. Eles são baseados no conceito de uma função de limite, que separa os dados de entrada em duas classes com base em um valor de limite.

Um perceptron linear recebe dados de entrada, aplica pesos a cada entrada xi e soma as entradas ponderadas wij para produzir uma saída Σ (netj). Se a saída estiver acima de um certo limite θj, o perceptron classifica a entrada em uma classe oj e, se estiver abaixo do limite, classifica a entrada em outra classe. Os pesos são aprendidos durante uma fase de treinamento onde o perceptron é apresentado com exemplos rotulados de dados de entrada e ajusta seus pesos para minimizar o erro de classificação. O resultado é uma classificação binária.

Diagrama do modelo de um neurônio artificial (Linear Perpceptron). Por Chrislb, Creative Commons Attribution-Share Alike 3.0. Published on 14. Jul. 2005. Fonte: Wikimedia Commons.

O algoritmo perceptron foi introduzido pela primeira vez por Frank Rosenblatt em 1957 como uma forma de criar um modelo simples de como os neurônios no cérebro podem funcionar. No entanto, não foi até a década de 1980 que os pesquisadores mostraram que perceptrons lineares poderiam ser usados para resolver muitos problemas práticos de classificação. Hoje, perceptrons lineares são amplamente usados em muitas áreas de aprendizado de máquina e inteligência artificial, incluindo visão computacional, processamento de linguagem natural e reconhecimento de fala.

Um exemplo de aplicação de perceptrons lineares é na classificação de e-mails de spam. Os filtros de spam geralmente usam algoritmos de aprendizado de máquina para classificar e-mails como spam ou não spam. Os perceptrons lineares podem ser treinados em um conjunto de mensagens de e-mail rotuladas, em que os recursos de entrada correspondem às características do e-mail, como o endereço de e-mail do remetente, a linha de assunto e o corpo da mensagem. A saída do perceptron é “spam” ou “não spam”, dependendo da função de limite. Ao treinar o perceptron em um grande conjunto de dados de mensagens de e-mail rotuladas, ele pode aprender a classificar com precisão novas mensagens como spam ou não spam. Este é apenas um exemplo de como os perceptrons lineares podem ser usados para resolver problemas práticos de classificação.

Quanto a um problema para o qual este algoritmo pode ser usado, problemas de classificação binária são aplicações comuns de perceptrons lineares. Por exemplo, o algoritmo pode ser usado para classificar mensagens de e-mail como spam ou não spam, com base no conteúdo do e-mail. As características usadas para representar os e-mails podem ser frequências de palavras, presença ou ausência de certas palavras, etc. Outro exemplo pode ser o reconhecimento de imagem, onde o algoritmo é treinado para distinguir entre imagens de cães e gatos com base nos valores de pixel das imagens.

2. Exemplo: o Perceptron linear

No exemplo a seguir acima, desenvolvi um código para um perceptron linear com a ajuda do ChatGPT e o compilei em um IDE Python. Este exemplo serviu a vários propósitos:

  • Primeiro, mostrou como o ChatGPT pode gerar código AI em Python, mesmo que o usuário não esteja familiarizado com a sintaxe ou codificação. Esta ferramenta é incrível, pois pode criar código em qualquer linguagem de programação e traduzi-lo para uma linguagem que o usuário conheça, como Pascal ou Basic. O ChatGPT é um excelente recurso para aprender programação e novas linguagens, pois inclui linguagens de programação de “computador”.
  • Em segundo lugar, este exemplo serve como prova de conceito dos recursos de modelos de linguagem grande baseados em IA, como ChatGPT, para criar código de IA funcional, como o perceptron apresentado aqui. Como o campo de IA e aprendizado de máquina continua crescendo, é possível que algumas tarefas de programação possam ser automatizadas usando esses modelos, levando a possíveis mudanças no mercado de trabalho para programadores e desenvolvedores.
  • Terceiro, o perceptron é um conceito fundamental em redes neurais artificiais e pode ser aplicado para resolver problemas de classificação. Ao aprender sobre neurônios e perceptrons, podemos entender melhor como as redes neurais funcionam e como elas podem ser aplicadas em vários campos.
  • Quarto, este foi um experimento didático para mim depois de ler sobre perceptrons.

2.1. O código

O código Python fornecido é uma implementação básica de um algoritmo perceptron para classificação binária. Inicialmente, as bibliotecas necessárias, ou seja, NumPy e Matplotlib, são importadas. A classe Perceptron é então definida, que contém três métodos – init(), predict() e train().

O método init() inicializa os pesos para o perceptron com uma matriz de zeros e define a taxa de aprendizado para a atualização dos pesos. O método predict() pega um vetor de entrada e calcula o produto escalar com o vetor de peso e termo de viés, que é passado pela função step para prever o rótulo de classe da entrada. A função step retorna 1 se a ativação for maior ou igual a 0 e -1 caso contrário.

O método train() treina o perceptron iterando sobre os pares de entrada e rótulo e atualizando o vetor de peso para minimizar os erros. Ele usa o rótulo de classe previsto e o rótulo real para calcular o erro e ajustar os pesos. O número de erros de classificação em cada época é armazenado em uma lista, que é plotada em relação ao número de épocas. O método plot_errors() plota os erros de treinamento em função da época.

O método plot_data() plota os pontos de dados de entrada com rótulos codificados por cores e o limite de decisão determinado pelo perceptron treinado. As entradas e rótulos training_in são gerados pela função aleatória do NumPy e o perceptron é treinado usando 20 épocas. Finalmente, o método plot_data() é chamado para visualizar os pontos de dados e o limite de decisão.

import numpy as np
import matplotlib.pyplot as plt

class Perceptron:
    def __init__(self, input_size, learning_rate=0.1):
        # Initialize the perceptron with an array of weights (input_size + 1), initialized to 0
        self.weights = np.zeros(input_size + 1)
        # Set the learning rate for updating the weights
        self.learning_rate = learning_rate
    
    def predict(self, input_vector):
        # Calculate the dot product of the input vector and the weights, and add the bias term (weights[0])
        activation = np.dot(input_vector, self.weights[1:]) + self.weights[0]
        # Apply the step function to return the predicted class label
        return 1 if activation >= 0 else -1
    
    def train(self, training_inputs, labels, num_epochs):
        # Initialize an empty list to store the number of misclassifications in each epoch
        errors = []
        for epoch in range(num_epochs):
            error = 0
            # Loop through each training input and label
            for input_vector, label in zip(training_inputs, labels):
                # Predict the class label based on the current weights
                prediction = self.predict(input_vector)
                # Calculate the error as the difference between the predicted and actual label
                error += int(label != prediction)
                # Update the weights based on the error and the learning rate
                self.weights[1:] += self.learning_rate * (label - prediction) * input_vector
                self.weights[0] += self.learning_rate * (label - prediction)
            # Append the number of misclassifications for this epoch to the errors list
            errors.append(error)
        # Plot the training errors as a function of epoch
        self.plot_errors(errors, num_epochs)
    
    def plot_errors(self, errors, num_epochs):
        # Plot the training errors as a function of epoch
        plt.plot(range(1, num_epochs+1), errors)
        plt.xlabel('Epoch')
        plt.ylabel('Number of errors')
        plt.title('Training errors over epochs')
        plt.show()
    
    def plot_data(self, training_inputs, labels):
        # Plot the data points with color-coded labels
        plt.figure(figsize=(8,8))
        plt.scatter(training_inputs[:,0], training_inputs[:,1], c=labels, cmap='bwr')
        # Define the plot limits based on the range of the data points
        x_min, x_max = training_inputs[:,0].min() - 1, training_inputs[:,0].max() + 1
        y_min, y_max = training_inputs[:,1].min() - 1, training_inputs[:,1].max() + 1
        # Create a mesh grid for the decision boundary plot
        xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))
        Z = np.array([self.predict(np.array([x, y])) for x, y in np.c_[xx.ravel(), yy.ravel()]])
        Z = Z.reshape(xx.shape)
        # Plot the decision boundary as a contour line
        plt.contour(xx, yy, Z, levels=[0], colors='k')
        plt.title('Classification of Data Points')
        plt.xlabel('Feature 1')
        plt.ylabel('Feature 2')
        plt.show()

# Generate some random data points with binary labels
np.random.seed(0)
training_inputs = np.random.randn(100, 2)
labels = np.array([1 if np.dot(x, [1, 2]) + 0.5 > 0 else -1 for x in training_inputs])

# Train a perceptron to classify the data points
perceptron = Perceptron(input_size=2)
perceptron.train(training_inputs, labels, num_epochs=20)

# Plot the data points with the decision boundary determined by the trained perceptron
perceptron.plot_data(training_inputs, labels)

Encorajo você a copiar este código para o Python IDE e executá-lo. Sinta-se à vontade para modificá-lo e testar novas possibilidades, como criar uma rede neural com camadas de perceptrons.

2.2. Os resultados

2.2.1. Evolução do treinamento do Perceptron

O algoritmo perceptron é um algoritmo simples de aprendizado de máquina usado para problemas de classificação binária. Ele recebe dados de entrada e rótulos e aprende a classificar novos pontos de dados atualizando os pesos do perceptron com base nos erros cometidos durante o treinamento. A eficácia do algoritmo depende do número de épocas para as quais ele é treinado. A figura “epoch” gerada pelo código acima mostra o erro de treinamento do algoritmo perceptron sobre o número de épocas. A figura consiste em um gráfico de linha com o número de erros no eixo y e o número de épocas no eixo x. À medida que o algoritmo perceptron é treinado sobre os dados de entrada, o número de erros cometidos pelo algoritmo diminui e o gráfico de linhas mostra essa tendência. O gráfico mostra que o número de erros inicialmente começa alto e diminui gradualmente à medida que o número de épocas aumenta. A figura ajuda a visualizar o processo de treinamento do algoritmo perceptron e pode ser usada para determinar o número ideal de épocas necessárias para atingir uma baixa taxa de erro. O algoritmo perceptron pode ser interrompido quando a taxa de erro é suficientemente baixa ou quando o número de épocas atinge um máximo predeterminado.

O eixo y representa o número de erros cometidos pelo algoritmo perceptron durante o treinamento, enquanto o eixo x representa o número de “épocas”. A linha azul na figura representa o número de erros cometidos pelo algoritmo perceptron ao longo das épocas.

A figura gerada pelo código acima mostra a classificação dos pontos de dados usando um algoritmo perceptron. A figura consiste em um gráfico de dispersão de 100 pontos de dados bidimensionais, com um recurso no eixo x e outro no eixo y. Os pontos de dados são coloridos em vermelho ou azul, dependendo de seu rótulo de classe, que é +1 ou -1. O algoritmo perceptron é usado para desenhar um limite de decisão que separa os pontos de dados vermelhos e azuis. O limite de decisão é mostrado como uma linha preta, que separa os pontos de dados em duas regiões. Todos os pontos de dados de um lado da linha são classificados como +1 e todos os pontos de dados do outro lado da linha são classificados como -1.

O algoritmo perceptron treina o modelo perceptron nos dados de entrada e minimiza o erro de classificação atualizando os pesos do modelo. O processo de treinamento é mostrado como um gráfico do número de erros cometidos pelo algoritmo perceptron ao longo das épocas. O gráfico mostra como o número de erros diminui ao longo do tempo, à medida que o algoritmo do perceptron se torna melhor na classificação dos pontos de dados. A figura fornece uma visualização clara do desempenho do algoritmo perceptron e pode ser usada para avaliar a precisão do modelo. Ao analisar a figura, pode-se determinar se o modelo está funcionando bem ou se são necessários ajustes adicionais no modelo. No geral, a figura ajuda a entender as capacidades e limitações do algoritmo perceptron para tarefas de classificação.

A figura acima mostra um gráfico de dispersão de 100 pontos de dados bidimensionais classificados usando um algoritmo perceptron. Os pontos de dados vermelho e azul representam duas classes diferentes, +1 e -1, respectivamente (que por exemplo, podem ser e-mails importantes +1 e Spam -1). A linha preta no gráfico mostra o limite de decisão gerado pelo algoritmo perceptron que separa os pontos de dados em duas regiões. O processo de treinamento do algoritmo perceptron também é representado no gráfico, mostrando o número de erros cometidos pelo algoritmo ao longo das épocas. À medida que o algoritmo é treinado, o número de erros diminui, indicando melhor precisão de classificação.

3. Limitações

Embora o algoritmo perceptron seja um método poderoso e simples para problemas de classificação binária, ele possui algumas limitações. Uma limitação importante é que ele só pode separar pontos de dados linearmente separáveis, o que significa que o limite de decisão deve ser uma linha reta ou um hiperplano em dimensões superiores. Se os dados não forem linearmente separáveis, o algoritmo do perceptron não convergirá e não poderá classificar os dados com precisão.

Para superar essa limitação, os pesquisadores desenvolveram modelos de redes neurais mais avançados, como perceptrons multicamadas (MLP) e redes neurais convolucionais (CNN), que podem lidar com dados não lineares e tarefas de classificação mais complexas. Esses modelos têm várias camadas de perceptrons e usam funções de ativação que introduzem não linearidade no limite de decisão.

Outra limitação do algoritmo perceptron é que ele pode ser sensível a outliers e dados ruidosos, o que pode fazer com que o algoritmo superajuste ou subajuste os dados. Para resolver esse problema, técnicas de regularização, como regularização L1 e L2, podem ser usadas para controlar a complexidade do modelo e evitar o overfitting. Além disso, técnicas de pré-processamento, como dimensionamento de recursos e normalização de dados, podem ser usadas para reduzir o impacto de outliers e melhorar o desempenho do algoritmo.

4. Conclusões

O algoritmo perceptron é um algoritmo de aprendizado de máquina simples, mas poderoso, que pode ser usado para problemas de classificação binária. Ele recebe dados de entrada e rótulos e aprende a classificar novos pontos de dados atualizando os pesos do perceptron com base nos erros cometidos durante o treinamento. A figura “epoch” gerada pelo código acima mostra o erro de treinamento do algoritmo perceptron sobre o número de épocas, permitindo visualizar o processo de treinamento e determinar o número ideal de épocas necessárias para atingir uma baixa taxa de erro. No entanto, os perceptrons lineares têm suas limitações, como a incapacidade de lidar com dados não linearmente separáveis. Para resolver essa limitação, funções de ativação não lineares podem ser usadas ou modelos mais complexos, como perceptrons multicamadas ou redes neurais profundas, podem ser empregados. No entanto, perceptrons lineares continuam sendo uma ferramenta valiosa e amplamente utilizada no campo de aprendizado de máquina, e sua simplicidade e interpretabilidade os tornam uma opção atraente para certas aplicações. Com mais pesquisa e desenvolvimento, podemos continuar a melhorar a eficácia e a versatilidade do algoritmo perceptron e suas variantes.

Em conclusão, este exemplo de desenvolvimento de um perceptron linear com a ajuda do ChatGPT serve como uma ilustração do incrível potencial dos modelos baseados em IA no campo da programação e aprendizado de máquina. Ao permitir que os usuários gerem código funcional sem conhecimento prévio de sintaxe ou linguagens de programação, o ChatGPT pode democratizar o acesso à programação e capacitar mais pessoas a se dedicarem a esse campo. Além disso, este exemplo destaca a importância de entender conceitos fundamentais como perceptrons no campo de redes neurais artificiais. Ao obter uma compreensão mais profunda desses conceitos, podemos apreciar melhor o potencial das redes neurais para resolver problemas complexos em vários campos, desde visão computacional até processamento de linguagem natural. À medida que a IA e o aprendizado de máquina continuam a evoluir e impactar nossas vidas diárias, é crucial que continuemos aprendendo e nos mantendo informados sobre os últimos desenvolvimentos nesses campos.

5. Referência

Buduma, N., Buduma, N., & Papa, J. (2022). Fundamentals of deep learning. ” O’Reilly Media, Inc.”



Copyright © 2023 AI-Talks.org