5 Implementações e Experimentos do modelo computacional NeuroPON NeuroPON
5.3 RNA MLP com Framework PON C++ 2.0: Treinamento BP para IRIS Dataset
A segunda experiência de implementação de RNA MLP utilizando o Framework PON C++ 2.0 visou o treinamento para o reconhecimento dos padrões de classificação da Flor Iris (IRIS Dataset). A classificação IRIS Dataset, assim como a função XOR, também é um sistema clássico nos trabalhos de RNA. Tal banco de dados consiste em cento e cinquenta amostras de dados, com as medidas de comprimento e largura, em centímetros, das pétalas e sépalas da flor de IRIS. A partir deste conjunto de dados de entrada, é possível classificar os três subtipos de flores de Iris: Setosa, Virginica e
Versicolor. O conjunto de dados consiste em 150 amostras de cada uma das espécies
da flor de IRIS (FISCHER, 1926; HEATON, 2015).
5.3.1 Desenvolvimento do Experimento
A estrutura principal da aplicação segue a implementação da RNA MLP treinada para a função XOR. Para o sistema de classificação IRIS Dataset, aumentou-se a quantidade de estruturas geradas, bem como algumas funções foram especializadas. Neste caso, a configuração utilizada para o sistema foi de quatro entradas, cinco neurônios acomodados em uma camada escondida, e três neurônios de saída. A função de ativação utilizada foi a tangente hiperbólica.
5.3.2 Codificação
O processo de treinamento para a base de dados da flor de Iris é maior do que para a função XOR. Consequentemente, a estrutura da RNA criada foi expandida perante a estrutura utilizada na função XOR, bem como a própria estrutura de código do NeuroPON criado. Assim, um maior controle de processamento entre as camadas foi realizado, resultando numa quantidade maior de Premises dentro de cada entidade
Condition das Rules da aplicação.
Ainda, conforme exposto na seção 4.4.2, as FBE dos neurônios foram especializadas. A título de exemplo, o Código 15 apresenta a FBE que representa um neurônio da camada escondida da RNA.
Código 15 - FBE NeuronHidden em código Framework PON C++ 2.0 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21
class NeuronHidden : public FBE { public:
NeuronHidden(Network *netw); virtual ~NeuronHidden(); void createPON(); public:
Double *attBias; // entrada de Bias Double *attOutput; // saida
Double *attGradient; // gradiente para atualização dos pesos Boolean *attDone; // controle de sincronização de cálculo Double *attDerivative; // derivada utilizada na função de ativação double i0, i1, i2, i3; // entradas
double w0, w1, w2, w3; // pesos public:
Premise *preCalcHidden; // Premises Premise *preCalcHiddenF;
Method *mthCalcHidden; // Method RuleObject *rleCalcHidden;// Rule private:
void calcHidden(); };
Fonte: Autoria Própria
Nas linhas 12 e 13 do Código 15, pode se notar que as entradas e os pesos, respectivamente, não estão sendo declarados como Attributes PON. Isso se dá pois tais elementos não serão reativos, ou seja, ao ter seu valor alterado, não notificarão nenhuma outra entidade pertinente. Neste contexto, até mesmo a título de experimentação, optou-se pela criação de variáveis com tipos “tradicionais”, pertencentes à própria linguagem.
O processo de treinamento da base de dados da flor de Iris é o mesmo efetuado para a função XOR, tanto para neurônios da camada escondida intermediária quanto para a camada de saída. Isto posto, a seção 5.3.3 apresenta os resultados do experimento.
5.3.3 Resultados do Experimento
Os testes foram conduzidos com 1000 épocas de treinamento. A inicialização dos pesos sinápticos foi aleatória, tanto para a implementação Framework PON C++ 2.0 quanto para a implementação procedural em Linguagem C com PI, variando os valores de 0 a 1.
Em cada execução do algoritmo de treinamento, tanto na implementação procedural PI utilizando a linguagem C quanto na implementação PON utilizando o
erros médios foram muito próximos, sendo que o tempo de execução foi (naturalmente) maior na versão implementada em PON, com Framework PON C++ 2.0.
No exemplo do IRIS Dataset, o treinamento foi conduzido utilizando-se 80% dos padrões de entrada, aleatoriamente selecionados. Os mesmos dados foram utilizados tanto na aplicação PON quanto na aplicação PI. Em cada implementação, tal seleção resultou em 120 padrões de treinamento (40 para cada tipo de flor do banco de dados), com quatro entradas (comprimento e largura de pétala e sépala), e três possibilidades de saída binárias. Os resultados obtidos estão apresentados na Tabela 11.
Tabela 11 – Resultados comparativos entre o treinamento BP de uma RNA MLP: NeuroNOP utilizando o
Framework PON C++ 2.0 versus Linguagem C Procedimental (classificação IRIS Dataset)
Framework PON C++ 2.0 Linguagem C Procedimental ORD Erro geral Tempo (ms) Erro geral Tempo (ms)
1 0.046 4820 0.039 1292 2 0.037 2494 0.048 1150 3 0.015 3091 0.011 791 4 0.031 2509 0.019 913 5 0.018 2463 0.021 932 Média 0.029 3075 0.028 1016 Desvio Padrão 0.013 1010 0.015 202
Fonte: Autoria Própria
As cinco execuções, com 1000 épocas cada, gastaram um tempo médio de, aproximadamente 3 segundos na implementação Framework PON C++ 2.0. Neste contexto, avaliou-se que o algoritmo que implementou o treinamento pelo método BP com PON atingiu bons resultados utilizando 0,1 como taxa de aprendizagem, atingindo um erro médio de 0,029.
Na implementação em PI procedimental utilizando a linguagem C, o tempo gasto nas cinco execuções, com mil épocas cada, foi de aproximadamente 1 segundo. Também com a taxa de aprendizagem ajustada em 0,1, o erro médio geral por de 0,028. Nos testes de classificação utilizando o IRIS Dataset, subsequentemente ao processo de treinamento, a solução também mostrou-se plausível pois a RNA MLP atingiu resultados em um tempo de execução equivalente aos trabalhos de Swain et al. (2012) e Vyas e Upadhyay (2014), por exemplo.
5.3.4 Considerações sobre o experimento
Apesar do experimento utilizando a base de dados da flor de IRIS (IRIS
Framework PON C++ 2.0), houve uma evolução no processo de implementação. A
quantidade de padrões de treinamento é maior, a criação de Methods específicos para aquisição de dados foi necessária. Além disso, a quantidade de saídas na RNA a ser treinada para IRIS DataSet é maior do que para o XOR, que possui apenas um neurônio na camada de saída. Tal fator motivou a criação de Methods que permitiram maior desacoplamento entre os neurônios de saída, facilitando assim uma futura paralelização dos cálculos entre tais entidades.
Outro conceito importante que pode ser verificado no presente experimento foi quanto à escalabilidade. Mesmo que algumas mudanças na codificação do primeiro experimento tenham sido efetuadas, a RNA foi treinada pela utilização da mesma lógica, em termos de entidades PON, do primeiro experimento.
Por fim, o modelo computacional NeuroPON também permitiu a criação de entidades desacopladas devido à sua natureza notificante, o que facilitaria paralelismo e mesmo distribuição. Neste contexto, as dificuldades em se definir estruturas desacopladas durante o desenvolvimento de RNA em PI são suprimidas pela utilização do NeuroPON. Por meio da utilização de FBE e Rules ao invés de estruturas matriciais e laços de repetição, o desacoplamento acontece de forma natural, em tempo de construção (SIMÃO; STADZSIZ, 2008; SIMÃO et al, 2012b).
A Seção 5.4 apresenta um primeiro experimento visando a execução concorrente dos neurônios implementados em PON. O desenvolvimento de tal experimento foi guiado pelo trabalho de Belmonte et al. (2016), porém com modificações na implementação do Framework PON C++ 3.0, a fim de adequar sua execução conforme as regras do modelo computacional NeuroPON.