Redes neuronais artificias — Backpropagation Perceptron

Leonardo Gerheim
gb.tech
Published in
6 min readMay 9, 2022

O artigo anterior mostrou que o modelo perceptron de uma camada consegue resolver problemas lineares, como por exemplo classificar um conjunto de entradas como uma porta lógica AND e OR. Entretanto vimos que ele limita-se a esse domínio de problemas. No mundo real, constantemente nos deparamos com problemas que não são lineares, ou seja, não podem ser separados em um plano cartesiano por meio de uma reta.

No modelo de multicamadas, teremos quantas camadas intermediárias, ou ocultas, forem necessárias para ser possível encontrar um conjunto de pesos para generalizar o suficiente a ponto de ser capaz de classificar uma entrada não conhecida. Mesmo tendo a adição de camadas ocultas, a função de soma continua a mesma, ou seja, ela é a soma do produto dos das entradas X pelos pesos W.

Figura 1 — Perceptron de multicamadas.

A função de ativação entretanto foi substituída pela função Sigmoid. Assim não mais ativamos o neurônio com valores zero ou um, mas agora temos um espectro de ativação entre 0:0.5 e 0.5:1.

FIgura 2 — Sigmoid

Seguindo a sequência de cálculos, vamos calcular a soma do produto dos pesos x entradas e também o valor da função Sigmoid.

Figura 3 — Função Sigmoid.
Figura 4 — cálculo dos pesos da camada oculta.

Parece muito número, mas não se assuste, não é complicado. O que trouxemos de novo é o valor de f(x) que nada mais é que a aplicação da função Sigmoid Figura 3. Nela o valor de x que é o expoente do número de Euler 2,71828 é o valor de x1 e x2 da camada de entrada conforme demonstrado abaixo.

Figura 5 — Aplicação função Sigmoid.

Os pesos da rede foram gerados de forma aleatória, poderiam ter sido iniciados usando algum algoritmo como PSO, mas isso é assunto para outro artigo. Os cálculos da Figura 4 devem ser feitos para todas as entradas de dados da porta lógica XOR conforme demonstrado na Figura 7.

Figura 6 — Porta lógica XOR.
Figura 7 — Cálculo dos valores estimados.

Observando a Figura 7, temos a forma mais simples de cálculo do erro, que simplesmente é a diferença entre o valor observado pelo valor previsto. Somando todos os erros e dividindo pela quantidade de observações chegaremos ao valor médio absoluto de 0.49 para o erro. Isso quer dizer que nossa taxa de acerto está em 51%, ou seja, algo ainda muito baixo para um modelo de respeito. Nosso objetivo será minimizar esse erro, caminhando para um melhor conjunto de pesos e aumentando assim a taxa de assertividade do modelo.

Avançaremos agora para o conceito do gradiente descendente, o que nos permitirá decidir se os valores dos pesos deverão ser aumentados, diminuídos e em qual intensidade, para minimizarmos o erro e aumentarmos a acurácia.

Podemos pensar no gradiente como soltar um soldado paraquedista em uma área cheia de outras montanhas, mais altas e mais baixas do ponto que ele aterrizou. Com o objetivo de encontrar a parte mais baixa do terreno, ele precisa decidir se há um ponto mais baixo do que ele está no momento e se esse avanço permitirá fazê-lo ir de encontro à área mais baixa.

Figura 8 — Ilustração descida do gradiente

Para esse cálculo usaremos uma técnica de derivadas parciais, capaz de arrepiar os cabelos de muita gente. Não entraremos nesses pormenores, mas caso tenha interesse, acesse este link. Basicamente vamos derivar a função Sigmoid e obter a fórmula para calcularmos a descida do gradiente. Uma vez obtido o valor de Y para a função Sigmoid, aplicamos este valor na derivada e obteremos o valor do gradiente, que nos dará a direção para onde "caminharmos". Olhando para a Figura 4 os neurônios da camada oculta possuem o valor 0.5 para sig(x) aplicando na função derivada obteremos o valor de 0.25.

Figura 9 — Derivada da função Sigmoid.

Não vá embora, tem um certo grau de sopa de letrinhas aí, mas é importante para que você não se torne somente um apertador de botões, mas de fato alguém que entende o que se passa por trás dos panos ;)

Iremos agora calcular o valor delta tanto para a camada de saída, quanto para a camada oculta.

Para a camada de saída calcularemos o valor da derivada conforme apresentado na Figura 9 e seu delta que é a derivada multiplicada pelo erro conforme sumarizado na tabela abaixo.

Figura 10 — Cálculo delta camada de saída.
Figura 11 — Cálculo delta camada oculta.

Com o delta calculado podemos finalmente fazer a atualização dos pesos. O algoritmo se divide em duas partes, calcular os pesos, ou propagá-los para os neurônios à frente da rede, ou no inglês feed forward. Depois os pesos serão recalculados com os valores da camada de saída para a camada oculta, retroalimento a rede, propagando para trás backpropagation. Usaremos a fórmula a seguir para atualizar os pesos da rede. Nela há um parâmetro chamado momento, que pode ser entendido como um acelerador da descida do gradiente.

Figura 12 — Atualização dos pesos backpropagation.

Vamos fazer o cálculo por partes, inicialmente faremos o produto da entrada * delta como sumarizado na Figura 13. Na Figura 12 observamos que esse cálculo é feito para cada um dos neurônios da camada oculta referente à cada uma das entradas separadamente.

Figura 12 — Cálculo do produto da das entradas pelo delta.

Usaremos uma taxa de aprendizagem de 0.3 e um momento de 1 para nossos cálculos. Importante deixar claro que esses valores podem ser alterados para tentar alcançar de forma mais rápida um conjunto satisfatório de pesos.

Figura 13 — Atualização dos pesos da camada oculta para a de saída.
Figura 14 — Novos pesos da camada de saída.

Vemos assim que os pesos da camada de saída foram atualizados a partir dos valores da camada oculta, falta agora apenas atualizar os pesos da camada oculta por meio da camada de entrada.
Tomemos como base os valores já calculados na Figura 11 para o delta da camada escondida. A única diferença que observamos no cálculo é que teremos que atualizar 6 pesos, uma vez que que cada neurônio da camada de entrada deve se conectar com todos os neurônios da camada oculta.

Figura 15 — Delta de cada neurônio da camada oculta.
Figura 16 — Cálculo da atualização dos pesos da camada oculta.
Figura 17 — Novos pesos da camada oculta.

Observamos na Figura 17 que nem todos os pesos foram atualizados, isso é perfeitamente normal, pois a velocidade na qual os pesos são atualizados, ou caminham para o valor ótimo depende da taxa de aprendizagem e do momento.

Com isso percorremos todo o caminho do modelo Perceptron multicamadas para aprendizado, ou seja, otimização do pesos da rede. A partir de agora o algoritmo entrará em loop tendo seu parâmetro de parada sendo um número específico de iterações ou épocas, ou então um valor para o erro. Assim o algoritmo repetirá todos os passos até que a condição de parada seja satisfeita.

Assim como no modelo Perceptron de uma camada, ou qualquer outro modelo de rede neuronal, o objetivo final é encontrar um conjunto de pesos a partir de um número conhecido de entradas de forma que estes possam ser generalizados para classificar, prever ou identificar um conjunto de entradas não conhecido até o momento.

Assim cobrimos de forma bem direta e simplificada como uma rede neural calcula seus pesos e obtém "conhecimento". Fique ligado que continuaremos postando conteúdo de redes neurais, até o próximo.

--

--