BÖLÜM 4: ĠġLEMLEġTĠRME VE VERĠLER
5.1 Zaman Serisi Analizi
5.1.5 Modelin Özellikleri
5.2.3.4 Vektör Otoregresif (VAR) Modeli
O algoritmo Upstart [Frean 1990a] para problemas com duas classes visto na Seção 4.5 constrói a rede neural como uma árvore binária de TLUs. Uma extensão natural desse algoritmo para o tratamento de problemas multiclasses seria um algoritmo que construísse m árvores binárias, cada uma delas responsável por uma das m classes encontradas no conjunto de treinamento. Esse método, no entanto, não considera uma possível relação existente entre as m diferentes classes.
Uma abordagem aproximada, porém mais eficiente é a do algoritmo MUpstart, proposto em [Parekh et al. 1997a]. O MUpstart, diferente do Upstart, cria os neurônios intermediários em uma única camada intermediária. Todo neurônio intermediário é conectado diretamente a todos os m neurônios da camada de saída. A camada de entrada, por sua vez, é conectada aos neurônios da camada intermediária, bem como a todos os neurônios da camada de saída (ver arquitetura geral de uma rede MUpstart na Figura 7.5).
Figura 7.5 – Arquitetura geral de uma rede MUpstart
O MUpstart, assim como o Upstart, distingue entre dois tipos de erros: erro de negativo e erro de positivo. Como descrito no Capítulo 4 (ver Figura 4.5), um erro de positivo ocorre quando uma instância de classe positiva é classificada como sendo de classe negativa,
. . .
. . .
u1 u1 u2 u2 uj um X0(bias) X1 X2 Xp Camada intermediária Camada de entrada Camada de saída u3. . .
. . .
. . .
Capítulo 7 - O Algoritmo Multiclasse MUpstart
145 e um erro de negativo ocorre quando uma instância pertencente à classe negativa é classificada como positiva. Os neurônios no MUpstart, assim como no Upstart, geram 0 ou 1 como saída, diferente de outros algoritmos nos quais os neurônios geram –1 ou 1.
O MUpstart começa a construção da rede treinando os m neurônios da camada de saída. Se esses neurônios classificarem todos os exemplos de treinamento corretamente o algoritmo termina, caso contrário, o algoritmo começa a adicionar neurônios intermediários para a correção dos erros existentes. Os neurônios intermediários são adicionados um a um até que um dos três critérios de parada seja satisfeito, a saber: (1) a rede converge; (2) a adição do último neurônio piora o desempenho da rede; ou (3) o número máximo de neurônios intermediários foi atingido.
O processo de inserção dos neurônios intermediários é baseado nos erros de cada neurônio da camada de saída. Como a camada de saída é composta por m neurônios, seja
k m k 2 k 1 k D ,..., D , D
D = a saída esperada para a instância Ek e Ok = O1k,O2k,...,Omk a saída obtida pela rede para essa instância. Seja uj, com 1 ≤ j ≤ m, um neurônio da camada de saída.
Um erro de positivo cometido pelo neurônio uj para a instância k, ocorre quando Dkj= 1 e k
j
O = 0. De maneira semelhante um erro de negativo ocorre quando Dkj= 0 e Okj =1.
Para criar um novo neurônio intermediário o algoritmo encontra o neurônio de saída que comete o maior número de erros (de positivo ou de negativo). Note que um neurônio pode cometer os dois tipos de erro, porém o que se busca é o maior número de um determinado tipo de erro em um neurônio. Suponha que o neurônio uj tenha sido identificado como o neurônio
que cometeu o maior número de erros, e que o tipo do erro cometido seja erro de positivo. Dessa forma o algoritmo deve criar um neurônio para corrigir esses erros.
O conjunto de treinamento que será usado para treinar este novo neurônio (conjunto A) será composto pelas instâncias de treinamento originais, porém com suas classes trocadas de acordo com as saídas do neurônio uj e as saídas esperadas para cada instância. Para toda
instância Ek, com k ∈ {1,..., n}, as classes C do novo conjunto de treinamento são kA
determinadas de acordo com a regra dada em (7.1).
• Se k j D = Okj, então C = –1 k • Se k j D ≠ Okj e Dkj = 1 então C = 1 kA senão k A C = –1 (7.1)
Capítulo 7 - O Algoritmo Multiclasse MUpstart
146 Suponha agora que o neurônio uj tenha sido identificado como o neurônio que mais
cometeu erros, e que os erros cometidos foram erros de negativo. O procedimento seria o mesmo: criar um neurônio para corrigir esse tipo e erro e inserí-lo na camada intermediária. O conjunto de treinamento usado para criar um neurônio que corrija erros de negativo também é o conjunto original de treinamento com suas classes trocadas. As classes, dessa vez, são trocadas de acordo com a regra dada em (7.2).
• Se k j D = Okj, então C = –1 kA • Se k j D ≠ Okj e Dkj = 0 então C = 1 kA senão C = –1 kA (7.2)
Note que ambos os conjuntos de treinamento para a criação de um novo neurônio intermediário possuem apenas duas classes. Dessa forma, o algoritmo usado para treiná-los deve ser um algoritmo para o treinamento de TLUs com duas classes, como o PMR (Capítulo 2, Seção 2.4) ou o BCPMin (Capítulo 3, Seção 3.4). Cada vez que um neurônio intermediário é adicionado, os neurônios de saída são retreinados, pois agora cada neurônio tem uma entrada adicional. Como conseqüência desta entrada os m vetores de peso de cada neurônio têm suas dimensões acrescidas de um.
O Algoritmo 7.4 apresenta o pseudocódigo orientado a objeto do algoritmo MUpstart. Nele, as classes NeuronioM e Neuronio são usadas para o treinamento dos neurônios. A classe NeuronioM, implementa algum método de treinamento para problemas multiclasses (WTA ou individual), usado neste algoritmo apenas para treinar os neurônios de saída. A classe Neuronio implementa algum algoritmo de treinamento de TLUs para duas classes.
Os métodos neuronioErro() e tipoErro() retornam, respectivamente, o neurônio que mais cometeu erros e o tipo do erro cometido. O índice do neurônio que mais cometeu erro é retornado na variável neuronioErro. Essa variável é passada como parâmetro para um dos métodos (criaTreinamentoPos() ou criaTreinamentoNeg()) que criará o conjunto de treinamento do próximo neurônio intermediário, dependendo do tipo do erro retornado na variável tipoErro. Note que no método criaTreinamentoPos(), mostrado no pseudocódigo, o método saidaMU() é usado, e não o método saidaM() como nos algoritmos anteriores. Considere o método saidaMU() sendo idêntico ao metodo saidaM(), no entando, retornando as saídas 0 e 1 e não –1 e 1 como no metodo saidaM().
Capítulo 7 - O Algoritmo Multiclasse MUpstart
147 O objeto saida, da classe NeuronioM, representa a camada de saída da rede. Antes da camada de saída ser retreinada, sempre que um neurônio intermediário é inserido na rede, o objeto saida é salvo em saidaAnt para o caso da rede piorar com adição do último neurônio. Nesse caso, o último neurônio é retiradado da rede e o objeto saidaAnt é compiado para saida. O vetor Camadas[] representa a camada intermediária da rede. Como mencionado anteriormente, cada vez que um neurônio intermediário é adicionado, os neurônios de saída devem ser retreinados. No pseudocódigo, o método criaTreinamentoSaida() cria o treinamento para retreinar os neurônios de saída. Este método adiciona as saídas dos neurônios intermediários (geradas pelo conjunto de treinamento original) ao conjunto de treinamento original mantendo as classes originais inalteradas.
Capítulo 7 - O Algoritmo Multiclasse MUpstart
148 Algoritmo 7.4 – Pseudocódigo do algoritmo MUpstart
Class MUpstart 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, pre-determinado} {Saída: objeto mUpstart que representa a rede neural criada}
nroNeuronios ← 0{ número de camadas intermediarias da rede} neuronioMax ← MAX
Camada[neuronioMax] {vetor de neurônios, representa a camada intermediária da rede}
D ← criaSaidaEsperada() {D matriz com as saídas esperadas} method MUpstart(Matrix E)
begin precisao ← 0 precisãoAnterior ← 0
saida ← new NeuronioM(E) {objeto saida é a camada de saída da rede} 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) Camada[nroNeuronios] ← new Neuronio(Epos) end
else if tipoErro = erro de negativo then begin
Eneg ← criaTreinamentoNeg(neuronioErro) Camada[nroNeuronios] ← new Neuronio(Eneg) end
nroNeuronios ← nroNeuronios + 1 Esaida ← criaTreinamentoSaida() saidaAnt ← saida
saida ← NeuronioM(Esaida) {retreina a saída} precisao ← precisao()
end {do while}
if precisao ≤ precisaoAnterior then begin
apaga(Camada[nroNeuronio])
nroNeuronio ← nroNeuronio – 1
saida ← saidaAnt {retoma última saída} end
end
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
S ← saida.saidaMU(i)
if D[i][k] ≠ S[k] and D[i][k] = 1 then
Ck A ← 1 else CkA← –1 end return A end end {Class}
Capítulo 7 - O Algoritmo Multiclasse MPerceptron Cascade
149