Escolar Documentos
Profissional Documentos
Cultura Documentos
BELÉM-PA
2018
ISAIAS FERREIRA
JOEL ALISON RIBEIRO CARVALHO
Belém- PA
2018
RESUMO
Neste trabalho está descrito o desenvolvimento de uma Rede Neural de classificação, mediante
o algoritmo backpropagation utilizando o software MatLabⓇ (2016), com sua base de dados
cancer de mama (cancer_dataset), disponível em seu pacote instalado. O código desenvolvido
visa variar o número de neurônios na camada escondida e o número máximo de épocas do
processo de treinamento. A metodologia para o critério de parada foi a validação cruzada
(cross-validation) e finalmente foram avaliadas 4 topologias a fim de verificar a que teve
melhor desempenho. Essa avaliação foi feita através da matriz de confusão e a taxa de acertos
média, variando os pesos iniciais 20 vezes para cada topologia. O desenvolvimento do
algoritmo proporcionou resultados satisfatórios, uma vez que a taxa de acertos foi superior a
95%, e a melhor topologia apresentou uma taxa de acertos média de 97% aproximadamente.
𝑦 = ∑ 𝑤𝑖 𝑥𝑖 − 𝜃 (1).
𝑖=1
a) b)
c)
Fonte: (TEX)
2 O ALGORITMO BACKPROPAGATION
O algoritmo utilizado é o backpropagation em que os pesos são atualizados
primeiramente na camada de saída e depois nas camadas escondidas, utilizando o que a
literatura denomina de regra Delta generalizada.
As fórmulas de atualização dos pesos da camada de saída (equação 1), das camadas
intermediárias (equação 2) e da camada imediatamente após a entrada (equação 4) são
mostradas abaixo:
(𝐧) (𝐧) (n) (n−1)
𝐖𝐣𝐢 = 𝐖𝐣𝐢 + η ⋅ δj ⋅ Yi (2)
(𝐧−𝟏) (𝐧−𝟏) (n−1) (n−2) (3)
𝐖𝐣𝐢 = 𝐖𝐣𝐢 + η ⋅ δj ⋅ Yi
(𝟏) (𝟏) (1) (𝒊)
𝐖𝐣𝐢 = 𝐖𝐣𝐢 + η ⋅ δj ⋅ 𝐱𝐤 (4)
Em que xK está associado a entrada i da amostra k, enquanto que o termo δ refere-se ao
gradiente local da camada n e é calculado da seguinte forma:
(n) (n) (n)
δj = (dj − Yj ) ⋅ g ′ (Ij ) (5)
n3
(n−1) (n) (n) (n−1)
δj = (∑ δk ⋅ Wji ) ⋅ g ′ (Ij ) (6)
k=1
3 METODOLOGIA
3.1 VALIDAÇÃO CRUZADA (CROSS-VALIDATION)
Uma das formas mais eficientes para parar o treinamento de uma rede neural é o critério
de validação cruzada, em que a base de dados de treinamento se divide em duas: uma para
validação e uma para o o treinamento. A base de dados de treinamento é a que vai ser utilizada
para ajustar os pesos sinápticos. A base de dados de validação apenas para comparar seu erro
quadrático médio em analogia com o erro de treinamento. O treinamento irá parar no instante
em que o erro quadrático médio de validação começar a crescer, como mostra a Figura 5.
Figura 5: Validação cruzada
Fonte: (Autor)
Observa-se que a função rng proporciona melhor controle sobre a geração de números
aleatórios. Dessa forma pode-se garantir que todas as topologias tenham as mesmas variações
de pesos iniciais afim de se retirar um desempenho médio em razão dessas variações.
4 DESENVOLVIMENTO DO ALGORITMO
4.1 ARQUITETURA
A Figura 7 mostra a arquitetura proposta: 9 entradas cada amostra, N indica o número
de neurônios da camada escondida e 2 neurônios na camada de saída que apresentará uma saída
desejada (Target) binária de acordo com a classificação da amostra: [1 0] para a primeira classe
e [0 1] para a segunda classe.
Figura 7: Arquitetura da RNA
Fonte: (Autor)
W1 simboliza os pesos da camada escondida, W2 representa os pesos da camada de
saída, I1 a entrada dos neurônios da camada escondida, Y1 a saída dos neurônios da camada
escondida, I2 a entrada dos neurônios da camada de saída e Y2 a saída da Rede Neural.
Com a bias presente na rede é necessário fazer alguns ajustes para seguir o treinamento.
Sendo x o vetor de entradas da rede, N o número de neurônios da camada escondida, F a função
de ativação da camada escondida e G a função de ativação da camada de saída tem-se:
1×10
x = [x1 , x2 , … , x9 ] →acrescentando a bias → x = [−1, x (1) , x (2) , … , x (9) ]
Logo os pesos da camada escondida deverão ser da seguinte forma:
(1.1) (1.2) (1.N) (10×N)
W1 W1 … W1
(2.1) (2.2) (2.N)
W1 W1 … W1
W1 = W1
(3.1)
W1
(3.2)
… W1
(3.N)
⋮
(10.1) (10.2) (10.N)
[W1 W1 … W1 ]
(1×N)
(10×N) (1×N) (1) (2) (N)
I1 = x (1×10) × W1 ⇒ I1 ⇒ 𝑌1 = [F(I1 ), F(I1 ), … , F(I1 )]
Acrescentando a bias:
(1×N+1)
(1) (2) (N)
𝑌1 = [−1, F(I1 ), F(I1 ), … , F(I1 )]
Fonte: (Autor)
Cada coluna corresponde a classe real, ou seja, o padrão que a rede deveria identificar
corretamente; e a linha indica qual classe a rede classificou. A diagonal principal refere-se aos
acertos da rede, e por conseguinte, o que estiver fora da diagonal principal a rede classicou
incorretamente. Dessa forma a taxa de acertos de cada rede neural é calculada em cima da
matriz de confusão pela Equação 8:
∑𝑛𝑘=1 𝑚𝑖𝑗 ∀ 𝑖 = 𝑗
𝑇𝑎𝑥𝑎 = × 100 (8)
∑𝑛𝑘=1 𝑚𝑖𝑗
Sendo n o número de amostras utilizadas para teste, e com a Equação 8 pode-se calcular
a taxa de desempenho média de cada topologia variando o gerador de sementes aleatórias do
MATLAB (rng) 20 vezes, de acordo com a Equação 9:
∑𝑘𝑖=1 𝑇𝑎𝑥𝑎(𝑖)
𝑇𝑎𝑥𝑎𝑚𝑒𝑑𝑖𝑎 = (9)
k
Sendo k o número de vezes que os pesos iniciais foram variados. As topologias
utilizadas estão descritas na Tabela 2:
Tabela 2: Topologias avaliadas
Topologia 1 2 3 4
Número de
neurônios da camada 5 10 15 20
escondida
Fonte: (Autor)
Com 4 topologias e 20 variações no gerador de sementes aleatórias foram treinadas no
total 80 redes neurais.
5 RESULTADOS
Inicialmente foi testado o código backpropagation com apenas 5 neurônios na camada
escondida e o erro quadrático médio de treinamento e validação, em que é ressaltado o
momento em que o treinamento é parado:
Figura 9: Treinamento da rede
Fonte: (Autor)
Fonte: (Autor)
Utilizando-se a Equação 8, determina-se a taxa de acertos:
56 + 30
𝑡𝑎𝑥𝑎 = × 100 ⇒ 𝑡𝑎𝑥𝑎 = 98,85%
56 + 30 + 1
Fonte: (Autor)
Percebe-se que a melhor topologia foi a de 5 neurônios na camada oculta pois obteve a
maior taxa de acertos média.
5 PARÂMETROS DA MELHOR TOPOLOGIA
Fonte: (Autor)
fold=6;
ind = find(x==2);
g = [datasample(ind,1,'Replace',false)];
entrada(:,g) = [];
desejado(:,g)=[];
[~,x] = max(desejado);
n = length(entrada(1,:));
% Indices para cada classe
for i=unique(x)% Variando as classes
ind = find(x==i); % índices onde estão localizadas as amostras da
classe i
quant_class(i) = length(ind); %Indica a quantidade de cada classe
quant = length(ind)/6; %quantidade de números sorteados de cada classe
para treinamento
b = datasample(1:length(ind),quant,'Replace',false);% Sortear os
índices de teste classe i
c{i}=ind(b); %armazena os índices correspondentes ao sorteio acima
ind(b)=[];%Exclui os índices sorteados para sortear os restantes sem
repetições
end
% subconjunto de teste
entrada_test = entrada(:,indice_tev);
entrada_test(:,[c{1} c{2}]) = [];
desejado_test = desejado(:,indice_tev);
desejado_test(:,[c{1} c{2}]) = [];
% subconjunto de validação
input = entrada(:,indice_tev);
target = desejado(:,indice_tev);
entrada_valid = input(:,[c{1} c{2}]);
desejado_valid = target(:,[c{1} c{2}]);
entrada_train = entrada_train';
desejado_train = desejado_train';
entrada_valid = entrada_valid';
desejado_valid = desejado_valid';
entrada_test = entrada_test';
desejado_test = desejado_test';
entrada = entrada';
Pesos_Camada_Oculta = rand(size(entrada,2)+1,t);
x = Pesos_Camada_Oculta;
Pesos_Camada_Saida = rand(t+1,size(desejado,1));
y = Pesos_Camada_Saida;
function s = calcula_saida(input,w1,w2,f,g)
% segunda camada
s.I2 = s.Y1*w2;
s.Y2 = arrayfun(g,s.I2);
(6) Código para verificar melhor topologia