• Nenhum resultado encontrado

O Algoritmo Multiclasse MPerceptron Cascade

A extensão do algoritmo Perceptron Cascade [Burgess 1994] para problemas multiclasses proposta em [Parekh et al. 1995] e chamada de MPerceptron Cascade é bastante semelhante ao MUpstart discutido na Seção 7.5. A diferença entre os dois está na arquitetura da rede neural criada, uma vez que no MPerceptron Cascade, os neurônios intermediários são inseridos em novas camadas, ao invés de serem inseridos em uma única camada, como acontece no MUpstart.

Cada novo neurônio inserido na rede é conectado à camada de saída e recebe conexões da camada de entrada e de todos os neurônios intermediários previamente inseridos, como mostra a Figura 7.6. Dessa forma, cada novo neurônio intermediário inserido possuirá uma dimensão a mais no vetor de pesos do que o do neurônio intermediário adicionado previamente.

Figura 7.6 – Possível arquitetura de uma rede MPerceptron Cascade, os neurônios intermediários são notados por uh.

. . .

uh1 u1 uh2 u2 um X0(bias) X1 X2 Xp Camada de saída uh3

. . .

Camadas intermediárias Camada de entrada

. . .

. . .

Capítulo 7 - O Algoritmo Multiclasse MPerceptron Cascade

150 Assim como na versão original para duas classes, a versão multiclasses começa a construção da rede pela camada de saída, treinando os m neurônios de saída com algum algoritmo de treinamento de TLUs para multiclasse. Se a saída atual não classificar todos os exemplos de treinamento corretamente, o algoritmo adiciona neurônios intermediários para corrigir os erros da saída. Os critérios de parada, são os mesmos do MUpstart, i.e. (1) a rede converge; (2) a inserção de um neurônio piora o desempenho da rede ou (3) o número de neurônios intermediários chegou ao seu limite pré-determinado.

O processo de inserção de neurônios intermediários é parecido com aquele do MUpstart. O algoritmo procura por erros de positivo e de negativo dos m neurônios da camada de saída. Um neurônio então é treinado para corrigir o erro mais freqüente existente em um dos m neurônios de saída. Esse neurônio é adicionado em uma camada imediatamente abaixo da camada de saída e é conectado aos m neurônios de saída. Cada vez que um neurônio intermediário é adicionado, o seu vetor de pesos permanece inalterado e os neurônios de saída são retreinados com a adição das saídas do novo neurônio no conjunto de treinamento.

Como os neurônios intermediários são alocados para corrigir um de dois tipos de erro, eles deverão se ativados somente para as instâncias em que o erro ocorreu e deverão permanecer inativos para todas as outras instâncias. Os neurônios intermediários, portanto, assim como no MUpstart, são treinados por algoritmos de treinamento de TLU para duas classes. O conjunto de treinamento usado para treinar um neurônio intermediário dependerá do tipo de erro que este neurônio deverá corrigir.

Desse modo, o conjunto de treinamento (conjunto A) que será usado para treinar este novo neurônio será composto pelas instâncias do conjunto de treinamento original mais as saídas dos neurônios intermediários já adicionados, com as classes determinadas de acordo com as saídas do neurônio, da camada de saída, que cometeu os erros. Caso esse neurônio tenha cometido erros de positivo, as classes devem ser trocadas de acordo com (7.1). Se, no entanto, o maior número de erros cometidos foram erros de negativo, as classes são trocadas de acordo com (7.2).

Para que o procedimento de correção de um tipo de erro funcione, é necessário que os neurônios, adicionados para corrigir esse tipo de erro, não atrapalhem na classificação dos demais exemplos de treinamento. Dessa forma, a saída inativa dos neurônios intermediários, bem como a saída dos neurônios de entrada deve ser 0, como nas versões do Upstart.

O Algoritmo 7.5 apresenta o pseudocódigo do algoritmo MPerceptron Cascade; note que este é idêntico ao algoritmo do MUpstart. A única diferença na criação da rede são os

Capítulo 7 - O Algoritmo Multiclasse MPerceptron Cascade

151 métodos criaTreinamentoPos() e criaTreinamentoNeg(), que, neste algoritmo, adicionam as saídas de todos os neurônios intermediários já presentes na rede. O método criaTreinamentoSaida(), no entanto, é idêntico ao do MUpstart, pois ambos criam o conjunto de treinamento juntando o conjunto de treinamento original com as saídas de todos os neurônio intermediários da rede, toda vez que um neurônio intermediário é inserido.

O vetor Camadas[], que no MUpstart representa uma única camada, aqui representa as camadas intermediária da rede i.e. cada posição do vetor representa uma camada. Os demais métodos, como neuronioErro() e tipoErro(), são idênticos aos do MUpstart. Também como no MUpstart, somente a camada de saída é objeto da classe NeuronioM, os neurônios intermediários são objetos da classe Neuronio. Como mencionado anteriormente a primeira classe implementa um algoritmo de treinamento para m TLUs e a segunda, um algoritmo de treinamento de TLUs para duas classes.

Como todo neurônio em uma rede MPerceptron Cascade deve gerar saídas binárias (0 ou 1), as saídas dos neurônios da camada de saída são dadas pelo método saidaMU(), como no MUpstart. Já as saídas dos neurônios da camada intermediária são dadas pelo método saidaU(); este método, idêntico ao método saida() e também membro da classe Neuronio, retorna saídas 0 e 1 ao invés de –1 e 1 como faz o método saida().

Capítulo 7 - O Algoritmo Multiclasse MPerceptron Cascade

152 Algoritmo 7.5 – Pseudocódigo do algoritmo MPerceptron Cascade

Class MPerceptronCascade begin

{Entradas: E - conjunto de treinamento com n instâncias, distribuídas em m (m > 2) classes, da forma: (‘xk0’, xk1, xk2,..., xkp, Ck), sendo que 1 ≤ k ≤ n

MAX - número máximo de neurônios na camada intermediária, pré-determinado} {Saída: objeto mPerceptronCascade que representa a rede neural criada}

nroNeuronios ← 0 {número de camadas intermediárias da rede} neuronioMax ← MAX

Camadas[neuronioMax] {vetor de neurônios, representa a camada intermediária da rede}

method MPerceptronCascade(Matrix E) begin

precisao ← 0 precisãoAnterior ← 0

saida ← new NeuronioM(E) {objeto saida é a camada de saída da rede, formada por m neurônios} precisao ← precisao()

while (precisao > precisaoAnterior and precisao ≠ 1 and nroNeuronios ≤ neuronioMax) do begin

precisaoAnterior ← precisao neuronioErro ← neuronioErro() tipoErro ← tipoErro()

if tipoErro = erro de positivo then begin

Epos ← criaTreinamentoPos(neuronioErro) Camadas[nroNeuronios] ← new Neuronio(Epos) end

else if tipoErro = erro de negativo then begin

Eneg ← criaTreinamentoNeg(neuronioErro) Camadas[nroNeuronios] ← new Neuronio(Eneg) end

nroNeuronios← nroNeuronios+ 1 Esaida ← criaTreinamentoSaida() saidaAnt ← saida

saida ← NeuronioM(Esaida) {retreina a saída} precisao ← precisao()

end

if precisao ≤ precisaoAnterior then begin apaga(Camadas[nroNeuronios]) nroNeuronios ← nroNeuronios – 1 saida ← saidaAnt end end {method}

method Matrix criaTreinamentoPos(Integer k) begin

A ← E {A é inicializado com o conjunto de treinamento original sem a classe} for i ← 1 to n do

begin

for j ← 1 to nroNeuronios do

A[p+j] ← Camadas[j].saidaU(i)

S ← saida.saidaMU(i)

if D[i][k] ≠ S[k] and D[i][k] = 1 then

CkA← 1 else Ck A← –1 end return A end end {Class}

153

8

8

8.1 Introdução

Neste capítulo são apresentados e discutidos os resultados das avaliações empíricas realizadas com os algoritmos apresentados neste trabalho em vários domínios de conhecimento. Os resultados foram obtidos usando validação cruzada 10 (10-fold cross validation) e estão organizados por domínio nas Tabelas 8.1 a 8.120.

Toda tabela apresenta os valores em porcentagem das precisões de treinamento e de teste, com os respectivos desvios padrões seguidas do maior e menor valores obtidos durante o treinamento e teste, respectivamente. As tabelas também mostram o número médio de neurônios, (e respectivo desvio padrão) seguido do maior e do menor número de neurônios obtidos na criação de uma rede. Os algoritmos que constroem a rede em camadas com mais do que um neurônio nelas mostram também o número médio de camadas (e respectivo desvio padrão), bem como os valores referentes ao maior e menor número de camadas obtidas.

O capítulo é dividido em três seções. Na Seção 8.2 são descritos os experimentos realizados com os algoritmos para treinamento de TLUs bem como com os algoritmos construtivos para problemas com duas classes. Os resultados relativos aos algoritmos construtivos têm duas versões: a que usa o PMR e a que usa o BCPMin como algoritmo básico para o treinamento de TLUs.

Na Seção 8.3 são descritos os experimentos realizados com as extensões para o tratamento de problemas multiclasses, dos algoritmos Tower, Pyramid, Tiling, Upstart e Perceptron Cascade.

Os resultados são usados para subsidiar uma avaliação quanto ao desempenho e comportamento de cada algoritmo, em cada domínio de conhecimento.

Uma Avaliação Empírica do Aprendizado Neural Construtivo em Diferentes Domínios de Conhecimento

Capítulo 8 - Avaliações dos Algoritmos Duas Classes

154

8.2 Avaliações de Algoritmos para Treinamento de TLUs e de