Perceptron: Bloco de Construção da Rede Neural Artificial

Nó Fonte: 1216283

Se você é um entusiasta do aprendizado de máquina e da IA, deve ter se deparado com a palavra perceptron. O Perceptron é ensinado no primeiro capítulo de muitos cursos de aprendizado profundo. Então, o que é exatamente? Qual é a inspiração por trás disso? Como exatamente isso resolve o problema de classificação? Neste artigo, começaremos com a inspiração biológica por trás do perceptron e depois nos aprofundaremos em seus aspectos técnicos matemáticos e, finalmente, construiremos um classificador binário do zero usando uma unidade perceptron.

Inspiração biológica de redes neurais

Um neurônio (célula nervosa) é o bloco de construção básico do sistema nervoso. O cérebro humano consiste em bilhões de neurônios interconectados entre si. Eles são responsáveis ​​por receber e enviar sinais do cérebro. Como pode ser visto no diagrama abaixo, um neurônio típico consiste em três partes principais – dendritos, um axônio e corpo celular ou soma. Os dendritos são ramos semelhantes a árvores originados do corpo celular. Eles recebem informações dos outros neurônios. Soma é o núcleo de um neurônio. É responsável por processar as informações recebidas dos dendritos. O axônio é como um cabo através do qual os neurônios enviam as informações. Perto do final, o axônio se divide em muitos ramos que fazem conexões com outros neurônios por meio de seus dendritos. O A conexão entre o axônio e outros dendritos do neurônio é chamada de sinapses.

1: Neurônio Biológico versus Rede Neural Artificial

Fonte da imagem: Willems, K. (2017, 2 de maio). Tutorial Keras: aprendizado profundo em Python.

Como a RNA é inspirada no funcionamento do cérebro, vamos ver como o cérebro funciona. O cérebro consiste em uma rede de bilhões de neurônios. Eles se comunicam por meio de sinais elétricos e químicos por meio de uma sinapse, na qual as informações de um neurônio são transmitidas a outros neurônios. O processo de transmissão envolve um impulso elétrico denominado “potencial de ação”. Para que a informação seja transmitida, os sinais de entrada (impulso) devem ser fortes o suficiente para cruzar uma determinada barreira de limiar, então apenas um neurônio é ativado e transmite ainda mais o sinal (saída).

Inspirado pelo funcionamento biológico de um neurônio, o cientista americano Franck Rosenblatt surgiu com o conceito de perceptron no Laboratório Aeronáutico Cornell em 1957.

  • Um neurônio recebe informações de outros neurônios na forma de impulsos elétricos de intensidade variável.
  • O neurônio integra todos os impulsos que recebe dos outros neurônios.
  • Se a soma resultante for maior que um determinado valor limite, o neurônio “dispara”, desencadeando um potencial de ação que é transmitido aos outros neurônios conectados.

Principais componentes do Perceptron

O perceptron de Rosenblatt é basicamente um classificador binário. O perceptron consiste em 3 partes principais:

  • Nós de entrada ou camada de entrada: A camada de entrada leva os dados iniciais para o sistema para processamento posterior. Cada nó de entrada está associado a um valor numérico. Pode assumir qualquer valor real.
  • Pesos e polarização: os parâmetros de peso representam a força da conexão entre as unidades. Quanto maior o peso, mais forte é a influência do neurônio de entrada associado para decidir a saída. O viés funciona da mesma forma que a interceptação em uma equação linear.
  • Função de ativação: A função de ativação determina se o neurônio irá disparar ou não. Na sua forma mais simples, a função de ativação é uma função escalonada, mas com base no cenário, diferentes funções de ativação podem ser usadas.

Veremos mais sobre isso na seção subsequente.

Funcionamento de um Perceptron

Na primeira etapa, todos os valores de entrada são multiplicados por seus respectivos pesos e somados. O resultado obtido é denominado soma ponderada ∑wi*xi, ou declarado de forma diferente,  x1*w1 + x2*w2 +…wn*xn. Esta soma dá uma representação adequada dos insumos com base na sua importância. Além disso, um termo tendencioso b é adicionado a esta soma ∑wi*xi + b. O viés serve como outro parâmetro do modelo (além dos pesos) que pode ser ajustado para melhorar o desempenho do modelo.

Na segunda etapa, uma função de ativação f é aplicado sobre a soma acima ∑wi*xi + b para obter a saída Y = f(∑wi*xi + b). Dependendo do cenário e da função de ativação utilizada, o saída é também binário {1, 0} ou um valor contínuo. 

Funcionamento de um Perceptron

(Muitas vezes, ambas as etapas são representadas como uma única etapa em perceptrons multicamadas, aqui eu as mostrei como duas etapas diferentes para melhor compreensão)

Funções de ativação

Um neurônio biológico só dispara quando um determinado limite é excedido. Da mesma forma, o neurônio artificial também só disparará quando a soma das entradas (soma ponderada) exceder um determinado valor limite, digamos 0. Intuitivamente, podemos pensar em uma abordagem baseada em regras como esta –

Se ∑wi*xi + b > 0: saída = 1 senão: saída = 0

Seu gráfico será mais ou menos assim:

Funções de ativação

Esta é na verdade a função de ativação Unit Step (Threshold) que foi originalmente usada por Rosenblatt. Mas como você pode ver, esta função é descontínua em 0, por isso causa problemas em cálculos matemáticos. Uma versão mais suave da função acima é a função sigmóide. A saída é entre 0 e 1. Outra é a tangente hiperbólica(tanh), que produz a saída entre -1 e 1. Ambas as funções sigmóide e tanh sofrem de problemas de gradientes de desaparecimento. Hoje em dia, ReLU e Leaky ReLU são as funções de ativação mais utilizadas. Eles são comparativamente estáveis ​​em redes profundas.

Perceptron como classificador binário

Até agora, vimos a inspiração biológica e a matemática do perceptron. Nesta seção, veremos como um perceptron resolve um problema de classificação linear.

Importando algumas bibliotecas –

de sklearn.datasets importar make_blobs importar matplotlib.pyplot como plt importar numpy como np% matplotlib inline

Gerando um conjunto de dados fictício usando make_blobs funcionalidade fornecida pelo scikit learn –

# Gera conjunto de dados X, Y = make_blobs(n_features = 2, centers = 2, n_samples = 1000, random_state = 12)
# Visualize o conjunto de dados plt.figure(figsize = (6, 6)) plt.scatter(X[:, 0], X[:, 1], c = Y) plt.title('Ground Truth', fontsize = 18) plt.show()
Perceptron como classificador binário

Digamos que os pontos azuis sejam 1s e os pontos verdes sejam 0s. Usando a lógica perceptron, podemos criar um limite de decisão(hiperplano) para classificação que separa diferentes pontos de dados no gráfico.

Antes de prosseguirmos, vamos adicionar um(s) termo(s) de polarização ao vetor de entrada –

# Adicione um viés ao vetor de entrada X_bias = np.ones([X.shape[0], 3]) X_bias[:, 1:3] = X

O conjunto de dados será parecido com isto

conjunto de dados

Aqui, cada linha do conjunto de dados acima representa o vetor de entrada (um ponto de dados). Para criar um limite de decisão, precisamos descobrir os pesos apropriados. Os pesos são 'aprendidos' no treinamento usando a regra abaixo –

w = w + (esperado - previsto) * x

Perceptron w

Isso significa subtrair o resultado estimado da verdade básica e, em seguida, multiplicar isso pelo vetor de entrada atual e adicionar pesos antigos a ele para obter o novo valor dos pesos. Se nossa saída for igual à da classe real, os pesos não mudam. Mas se a nossa estimativa for diferente da verdade básica, então os pesos aumentam ou diminuem de acordo. É assim que os pesos são ajustados progressivamente em cada iteração.

Começamos atribuindo valores arbitrários ao vetor de peso e, em seguida, ajustamos-os progressivamente em cada iteração usando o erro e os dados disponíveis –

# inicializa pesos com valores aleatórios w = np.random.rand(3, 1) print(w)

Saída:

[[0.37547448] [0.00239401] [0.18640939]]

Defina a função de ativação do perceptron –

def ativação_func(z): se z >= 1: retorne 1 senão: retorne 0

A seguir, aplicamos a regra de aprendizagem do perceptron –

for _ in range(100): for i in range(X_bias.shape[0]): y = activate_func(w.transpose().dot(X_bias[i, :])) # Atualizar pesos w = w + (( Y[i] - y) * X_bias[i, :]).reshape(w.shape[0], 1)

Não é garantido que os pesos convergirão em uma passagem, então alimentamos todos os dados de treinamento no algoritmo perceptron 100 vezes enquanto aplicamos constantemente a regra de aprendizado para que eventualmente consigamos obter os pesos ideais.

Agora que obtivemos os pesos ótimos, prever a classe para cada ponto de dados usando Y = f(∑wi*xi + b) ou Y = wT.x em forma vetorial.

# prevendo a classe dos pontos de dados result_class = [activation_func(w.transpose().dot(x)) for x in X_bias]

Visualize o limite de decisão e os rótulos de classe previstos –

# converte para vetor unitário w = w/np.sqrt(w.transpose().dot(w))
# Visualize os resultados plt.figure(figsize = (6, 6)) plt.scatter(X[:, 0], X[:, 1], c = result_class) plt.plot([-10, -1], hiperplano ([-10, -1], w), lw = 3, c = 'vermelho') plt.title('Classificação Perceptron com limite de decisão') plt.show()
Classificação Perceptron com limite de decisão

Você pode comparar a imagem da verdade básica com a imagem do resultado previsto e ver alguns pontos que foram classificados incorretamente. Se calcularmos a precisão, chega a cerca de 98% (deixo isso como exercício para os leitores).

Se você observar, aqui nossos dados originais estavam bastante separados, por isso podemos obter uma precisão tão boa. Mas este não é o caso dos dados do mundo real. Usando um único perceptron, só podemos construir um limite de decisão linear; portanto, se os dados forem misturados, o algoritmo do perceptron terá um desempenho ruim. Esta é uma das limitações do modelo perceptron único.

Notas finais

Começamos entendendo a inspiração biológica por trás do perceptron de Rosenblatt. Em seguida, avançamos para a matemática do perceptron e das funções de ativação. Finalmente, usando um conjunto de dados de brinquedo, vimos como o perceptron pode realizar uma classificação básica construindo um limite de decisão linear que separa os pontos de dados pertencentes a diferentes classes.

Sobre o autor

Pratik Nabriya é um cientista de dados qualificado, atualmente empregado em uma empresa de análise e IA com sede em Noida. Ele é proficiente em aprendizado de máquina, aprendizado profundo, PNL, análise de série temporal, manipulação de dados, SQL, Python e está familiarizado com o trabalho em um ambiente de nuvem. Nas horas vagas, adora competir em Hackathons e escrever artigos técnicos.

A mídia mostrada neste artigo não é propriedade da Analytics Vidhya e é usada a critério do Autor.

Fonte: https://www.analyticsvidhya.com/blog/2021/10/perceptron-building-block-of-artificial-neural-network/

Carimbo de hora:

Mais de Análise Vidhya