Ideia geral
A ideia do algoritmo de redes neurais surgiu como uma tentativa de imitar o cérebro e sua incrível capacidade de aprender. Apesar de ser uma ideia relativamente antiga (surgiu em torno dos anos 80 - 90), hoje em dia redes neurais são consideradas estado da arte em diversas aplicações.
O algoritmo de redes neurais se baseia na hipótese de que o cérebro possui apenas um algoritmo que consegue aprender todas as funcionalidades do corpo, ou seja, qualquer área de cérebro seria capaz de aprender a ver ou ouvir, se recebesse os estímulos apropriados.
Representação
No cérebro, cada neurônio recebe impulsos nervosos através dos dendritos, realiza um determinado “cálculo” no corpo celular e transmite a resposta através de outro impulso nervoso, utilizando o axônio. O algoritmo de redes neurais copia esse sistema, como mostram as Figuras 1 e 2 abaixo.
Figuras 1 e 2 - representação de um neurônio (à esquerda) e de uma unidade de rede neural (à direita).
Neste tipo de algoritmo, vários "neurônios" são conectados entre si de modo a formar uma rede. Essa rede é formada por 3 tipos de camadas, chamadas de camada de entrada (input), camada de saída (output) e camadas ocultas (hidden), como mostrado na Figura 3 abaixo.
Figura 3 - representação de uma rede neural.
A camada de entrada recebe os dados de entrada e o valor final é gerado na camada de saída. As camadas chamadas ocultas fazem cálculos intermediários que auxiliam a rede a encontrar os valores finais. Em redes mais complexas, pode-se utilizar várias camadas ocultas entre a camada de entrada e saída. Os valores dos neurônios em cada uma das camadas irá depender da quantidade de dados de entrada e do tipo de problema a ser resolvido. Por exemplo, se o algoritmo foi projetado para determinar se um paciente é ou não portador de uma determinada doença, tem-se como entrada os dados relevantes deste paciente e como saída apenas um valor, ou seja, um único neurônio na camada de saída.
Exemplo: propagação de valores
Em uma aplicação na área de saúde, deseja-se determinar se um determinado tumor é maligno ou benigno baseado em algumas de suas características. Para este problema, é necessário que a rede neural tenha apenas um neurônio na camada de saída, que irá retornar o valor 1 se o tumor for maligno ou 0 se for benigno. Um exemplo de rede que pode ser utilizada é mostrado na Figura 4 abaixo.
Figura 4 - exemplo de rede neural.
Neste caso, tem-se 3 características do tumor que são as entradas do algoritmo, além de um neurônio extra, chamado de "bias unit", que sempre gera o valor 1. Este neurônio extra é adicionado em todas as camadas, com exceção da camada de saída e faz com que a rede se adapte melhor ao conjunto de entradas e saídas.
Este algoritmo visa encontrar o resultado, ou seja, o valor de realizando uma propagação de valores desde a camada de entrada até a camada de saída. Para isso, é necessário definir variáveis
, onde l se refere a camada que está sendo tratada, também conhecidas como matrizes de pesos. Os valores contidos nessas matrizes são obtidos durante o treinamento do algoritmo e representam o peso de cada neurônio no valor do neurônio da próxima camada.
Como este exemplo refere-se a um problema de classificação com apenas dois possíveis valores de saída (0 ou 1), é possível utilizar a função sigmoidal como função de ativação. Esta função, cujo gráfico está representado na Figura 5 abaixo, gera o valor 0 quando os valores de entrada são muito negativos e 1 quando são muito positivos.
Figura 5 - gráfico da função sigmoidal.
O processo de propagação começa na camada de entrada, onde cada neurônio assume o valor de um dado do tumor, ou seja, eles assumem os valores x1, x2 e x3, sendo x um vetor com todos os valores de entrada.
O segundo passo consiste em calcular os valores dos neurônios da camada oculta, usando, para isso, os valores da matriz . Obtem-se:
onde a1(2), a2(2) e a3(2) são os valores dos neurônios na camada oculta.
Por fim, é necessário calcular o valor da camada de saída, ou seja, .
Portanto, o valor obtido será 0 ou 1, dependendo das características do tumor que foram especificadas nas variáveis de entrada x1, x2 e x3.
Treinamento do algoritmo
O objetivo do treinamento do algoritmo é encontrar os valores das matrizes que fazem com que o algoritmo gere as saídas corretas. Para isso é necessário coletar vários exemplos de tumores, ou seja, é necessário saber não apenas suas características, como também se ele é benigno ou maligno.
Uma maneira de calcular as matrizes de peso de maneira eficiente é utilizar uma função chamada fmincg. Esta função tem como entrada os seguintes dados:
- Função de custo -
;
- Derivada da função de custo;
- Dados de entrada (dados dos exemplos do treinamento).
A função de custo é uma função que varia para cada problema e situação e seu objetivo é calcular o erro cometido pelo algoritmo. Várias funções de custo já foram determinadas por matemáticos e podem ser utilizadas para resolver diversos problemas.
Para calcular a derivada da função de custo, utiliza-se um processo chamado "back propagation", cuja ideia é calcular o erro de cada neurônio da rede em cada exemplo do treinamento, ou seja, qual a diferença entre o valor calculado do neurônio e o valor correto que ele deveria assumir. Esse erro pode ser representado pela letra grega delta minúsculo .
Primeiramente, é necessário inicializar as matrizes com valores aleatórios, sendo que l varia de 1 a L - 1, onde L é o número total de camadas da rede neural. No exemplo utilizado é necessário inicializar duas matrizes:
e
.
Com as matrizes inicializadas, para cada exemplo do treinamento é necessário realizar alguns passos:
1. Propagação de valores
2. Cálculo dos erros de cada neurônio
Para a camada de saída, o erro corresponde a diferença do valor real e do valor calculado pela rede:
Para as camadas ocultas, esse erro corresponde a uma propagação do erro da camada de saída e pode ser calculado, neste exemplo, pela fórmula:
3. Cálculo da derivada da função de custo
Para cada exemplo do treinamento, é possível provar que a derivada da função de custo equivale a .
Considerando que o treinamento possui vários exemplos, foi provado que a derivada total da função de custo é igual a média dos valores calculados para cada exemplo.
Portanto, como todos os valores necessários à função fmincg foram encontrados, o próximo passo é aplicar a função e obter os valores de e
.
Conclusão
Apesar de ser um modelo de algoritmo mais complexo e talvez de mais difícil compreensão, as redes neurais são extremamente úteis e versáteis. Mudando apenas os dados de entrada, a função de custo e a função de ativação é possível modelar diversos problemas diferentes, encontrando os valores adequados de .