Neste post pretendo demonstrar como implementei um neurônio artificial com a ajuda de uma planilha eletrônica. O uso da planilha permite que implementemos, sem grandes preocupações com programação, toda a estrutura do neurônio assim como os comportamentos que representam seu aprendizado.
1 — Anatomia básica do neurônio
Entradas: São os valores que usamos pra alimentar o neurônio e permitir que ele aprenda. Quando o neurônio já aprendeu usamos entradas pra obter uma saída onde o neurônio indica o que entende sobre o que aquelas entradas representam.
Pesos: São valores que o neurônio usa pra fazer seus cálculos e a partir deles indicar qual sua conclusão sobre as entradas. Os pesos representam o aprendizado do neurônio. Bons pesos são aqueles que permitem que o neurônio tire boas conclusões a respeito das entradas que recebe. Para cada entrada existe um peso específico associado.
Ativação: São os cálculos que o neurônio faz usando entradas e pesos pra decidir o que ele entende que uma entrada representa. A ativação basicamente é onde o neurônio indica o quão relevante uma entrada é para o seu conjunto de pesos, e dependendo dessa relevância será acionada uma determinada ação que chamo aqui de ativação. Na prática teremos uma função que terá como saída um número e esse deve ser interpretado como por exemplo -1 para não ativado e 1 para ativado.
2 — Processo de aprendizado
Chamaremos de processo de aprendizado, o conjunto de passos que levará ao encontro dos pesos que fazem o neurônio ter a ativação adequada para um determinado conjunto de entradas. Quando um neurônio consegue dar as respostas esperadas para entradas aplicadas dizemos que o mesmo aprendeu. Em outras palavras os pesos foram calibrados corretamente e o neurônio agora funciona como uma espécie de balança que entende bem o peso das entradas.
Detalhes do processo
O neurônio é confrontado com um conjunto de dados de entrada e produzirá saídas de acordo com seus pesos atuais. As saídas podem estar corretas ou não, porém, cada vez que alguma estiver incorreta isso indicará que os pesos atuais não são os adequados para todos os dados e por isso alguma estratégia de melhoria nos pesos será executada. Esse processo deve se repetir passando várias vezes pelo conjunto de dados até que os pesos consigam gerar saídas adequadas para todas as entradas.
Para o processo de aprendizado entram em cena novos elementos que exibiremos abaixo:
Taxa de aprendizado: É um valor percentual que definimos e que indica quanto de cada ponderação errada (cada erro) que o neurônio faz sobre uma entrada, deve gerar atualizações nos valores dos pesos. Para o caso deste post foi escolhido uma taxa de aprendizado de 1% (0.01).
Bias: É um peso global que não está ligado a uma entrada específica, mas ao neurônio, seu uso é para ajustes finos quando as entradas causam atualizações muito pequenas nos pesos. Seu valor pode ser atualizado durante o treinamento ou ficar fixo, dependendo da estratégia abordada. No nosso caso esse valor será fixo e valerá -1.
Classe ou valor esperado: Como o nome diz é um valor que se espera para uma entrada. Para que se possa avaliar se as respostas do neurônio estão corretas ou não, usaremos um conjunto de valores que são os esperados ou corretos. A Figura 2 exibe a tabela verdade que será a base para avaliarmos o aprendizado do neurônio em relação a função lógica AND.
Erro: É a quantificação que indica o quanto a saída do neurônio está longe do esperado. Esse valor é importante pois servirá como base para a sugestão de correção nos pesos. O erro será o valor esperado menos o valor encontrado.
Alteração de peso: Com o valor do erro podemos extrair um percentual desse valor e adicionar ao peso atual de um determinada entrada. Dessa forma estaremos fazendo uma pequena correção que pode fazer com que o valor dos pesos consiga entender melhor os dados. A formula para isso será : Taxa de apredizado * Erro * Peso.
Montando a planilha
A planilha seguirá o esquema da Figura 3, onde cada linha representará uma instância de neurônio e cada célula representa uma parte do mesmo.
No intervalo P8:R11 está a base de dados de referência. Alimentaremos as entradas com essas informações inclusive com valor esperado de classe (colunas A,B e C).
Colunas D e E temos os pesos que são fixos na primeira linha e nas demais linha tem como entrada o peso sugerido na linha anterior pelas colunas N e O respectivamente. Assim D7 teria o valor 0.2, D8 a fórmula =N7, D9 a fórmula =N8 e assim por diante. Esse processo fará com que cada nova linha aproveite o aprendizado da linha anterior. Em outras palavras o neurônio da ultima linha acumula o aprendizado de todos os seus antecessores.
Apenas para ficar didático, separamos as fórmulas de forma mais detalhada como poderemos ver abaixo:
Nas Colunas F e G estão os valores de peso X entrada com a fórmula da Figura 4. Representando o nível de estímulo percebido para a entrada em específico.
Na coluna H é feita a soma de todos os estímulos com o valor do Bias na célula B3. Essa soma representa o nível geral de estímulo de todas as entradas juntas e. A Figura 5 exibe o detalhe da fórmula de suma em uma célula de exemplo.
Nas células da coluna I encontramos a função de ativação e que para este caso foi implementada uma função degrau como pode ser notado na Figura 6.
Na coluna J encontramos funções de conversão, pois nossa ativação precisa ser interpretada como 1 ou 0 que são os valores da classe previstos em nossa base de dados. Assim todo valor de ativação 1 será interpretado como classe 1 e valor diferente classe 0 como pode ser notado pelo detalhe da Figura 7.
O erro será a diferença entre o que foi predito na função de interpretação da classe (Prediction) e do real valor da classe (Class) de acordo com a fórmula em detalhe na Figura 8.
A sugestão de alteração no peso de uma entrada será feita levando em conta o valor da entrada, erro e taxa de aprendizado que é fixo na célula D7 e para este caso foi configurado em 0.01. A Figura 9 detalha a fórmula da variação peso sugerido para uma entrada.
Por fim o novo peso será o valor do peso na linha atual acrescido da variação de peso sugerida de acordo com o detalhe exibido na Figura 10.
A partir da configuração de uma linha as demais serão cópias coladas abaixo variando o valor das entrada e atualizando o valor do peso de acordo com a linha anterior. No treinamento realizado para aprender uma função lógica AND foram necessárias cerca de 134 instâncias até o valor de erro ficar em 0 (zero) para cada entrada inserida. A Figura 11 mostra como ficou o erro a partir da linha 140 quando passaram 134 instâncias do neurônio representando cerca de 34 épocas de treinamento.
Conclusão
Foi possível montar um modelo de neurônio e aprendizado usando planilha eletrônica. Não foram necessários macros ou programação, apenas uso de fórmulas, mas nada impede que esse processo possa ser enriquecido com uso desses recurso.
Uma versão completa da planilha está disponível para download aqui.