Coletânea Python do ZERO às Redes Neurais Artificiais
Perceptrons
Para finalmente darmos início a codificação de tais conceitos, começaremos com a devida codificação de um perceptron de uma camada, estrutura mais básica que teremos e que ao mesmo tempo será nosso ponto inicial sempre que começarmos a programar uma rede neural artificial para problemas de menor complexidade, chamados linearmente separáveis.
O modelo mais básico usado na literatura para fins didáticos é o modelo
abaixo, onde temos a representação de 3 espaços alocados para entradas (X, Y e Z), note que estas 3 figuras se conectam com uma estrutura central com o símbolo Sigma Σ, normalmente atribuído a uma Função Soma, operação aritmética bastante comum e por fim, esta se comunica com uma última estrutura lógica onde há o símbolo de uma Função de Ativação f(x).
Em suma, estaremos sempre trabalhando com no mínimo essas três estruturas lógicas, haverão modelos muito mais complexos ou realmente diferentes em sua estrutura, mas por hora o que deve ficar bem entendido é que todo perceptron terá entradas, operações realizadas sobre estas e uma função que resultará na ativação ou não deste neurônio em seu contexto.
A partir deste modelo podemos resolver de forma computacional os chamados problemas linearmente separáveis. De forma bastante geral podemos entender tal conceito como o tipo de problema computacional onde se resulta apenas um valor a ser usado para uma tomada de decisão. Imagine que a partir desse modelo podemos criar uma pequena rede neural que pode processar dados para que se ative ou não um neurônio, podemos abstrair essa condição também como fazíamos com operadores lógicos, onde uma tomada de decisão resultava em 0 ou 1, True ou False, return x ou return y, etc… tomadas de decisão onde o que importa é uma opção ou outra.
Partindo para prática, agora atribuindo valores e funções para essa estrutura, podemos finalmente começar a entender de forma objetiva o processamento da mesma:
Sendo assim, usando o modelo acima, aplicamos valores aos nós da camada de entrada, pesos atribuídos a elas, uma função de soma e uma função de ativação. Aqui, por hora, estamos atribuindo manualmente esses valores de pesos apenas para exemplo, em uma aplicação real eles podem ser iniciados zerados, com valores aleatórios gerados automaticamente ou com valores temporários a serem modificados no processo de aprendizagem.
A maneira que faremos a interpretação inicial desse perceptron, passo-a-passo, é da seguinte forma:
Temos três entradas com valores 1, 9 e 5, e seus respectivos pesos 0.8, 0.1 e 0.
Inicialmente podemos considerar que o primeiro neurônio tem um valor baixo mas um impacto relativo devido ao seu peso, da mesma forma o segundo neurônio de entrada possui um valor alto, 9, porém de acordo com seu peso ele gera menor impacto sobre a função, por fim o terceiro neurônio de entrada possuir valor 5, porém devido ao seu peso ser 0 significa que ele não causará nenhum efeito sobre a função.
Em seguida teremos de executar uma simples função de soma entre cada entrada e seu respectivo peso e posteriormente a soma dos valores obtidos a partir deles.
Neste exemplo essa função se dará da seguinte forma:
Soma = (1 * 0.8) + (9 * 0.1) + (5 * 0)
Soma = 0.8 + 0.9 + 0
Soma = 1.7
Por fim a função de ativação neste caso, chamada de Step Function (em tradução livre Função Degrau) possui uma regra bastante simples, se o valor resultado da função de soma for 1 ou maior que 1, o neurônio será ativado, se for uma valor abaixo de 1 (mesmo aproximado, mas menor que 1) este neurônio em questão não será ativado.
Step Function = Soma => 1 (Ativação)
Step Function = Soma < 1 (Não Ativação)
Note que esta é uma fase manual, onde inicialmente você terá de realmente fazer a alimentação dos valores de entrada e o cálculo destes valores manualmente, posteriormente entraremos em exemplos onde para treinar uma rede neural teremos inclusive que manualmente corrigir erros quando houverem para que a rede possa “aprender” com essas modificações.
Outro ponto importante é que aqui estamos apenas trabalhando com funções básicas que resultarão na ativação ou não de um neurônio, haverão situações que teremos múltiplas entradas, múltiplas camadas de funções e de ativação e até mesmo múltiplas saídas…
Última observação que vale citar aqui é que o valor de nossa Step Function também pode ser alterado manualmente de acordo com a necessidade.
Com base nesse processamento podemos concluir que de acordo com o parâmetro setado em nossa Step Function, este perceptron em sua aplicação seria ativado, desencadeando uma tomada de decisão ou classificação de acordo com o seu propósito.