Inteligência Artificial
3.7 Perceptrons de múltiplas camadas
3.7.1 Limitações em redes de camada única
Até agora foram vistas redes neurais com apenas uma camada (além da camada de entrada) ou, no máximo, como é o caso das redes Madaline, redes com duas camadas, na qual a camada de saída possui seus pesos fixos funcionando como uma combinação lógica (OR ou AND) dos nós da camada anterior.
Não foram abordadas ainda as limitações deste tipo de redes, como
mostrado por Minsky e Papert, onde se provou que estas topologias não são capazes de separar classes de determinadas funções.
Seja a função “ou exclusivo” (XOR), cuja tabela-verdade (bipolar) e
representação neural estão indicadas abaixo.
Se usarmos uma rede com uma só camada de um só neurônio, com duas
entradas e uma saída, teríamos como entrada líquida do neurônio o valo expresso pela equação abaixo.
Com uma função de ativação de limiar zero, os casos de valores da entrada
líquida u que correspondem à saída abaixo do limiar zero, estarão situados na k ,
fronteira de separação das classes correspondentes à condição:
Portanto, a fronteira de separação é dada por uma reta, cuja equação é dada
por:
Entretanto, os valores de w e b da equação que definem uma reta que separe
adequadamente os valores de saída da função XOR em duas classes distintas não podem ser encontrados, haja vista que não há nenhuma reta que separe
estes valores, como ilustrado na Figura 3.13 (ao contrário de retas de separação para as funções AND e OR, que podem ser encontradas, como indicado na mesma figura).
FIGURA 3.13 Retas de separação de classes em funções lógicas típicas.
3.7.2 Perceptrons Multicamadas
Minsky e Papert mostraram que esta limitação de classificação pode ser contornada acrescentando mais uma camada de nós, formando assim uma rede conhecida como Perceptron de Múltiplas Camadas. Para o exemplo específico citado (XOR), basta acrescentar outra camada, constituída de um único nó (situado na saída do já existente), para que o problema passe a ter solução, isto é, para que a rede passe a ser capaz de separar os valores de entrada em duas
classes de saída distintas. A arquitetura da rede está representada na Figura
3.14a, onde os valores dentro dos nós são os limiares, e a superfície de
separação que a arquitetura gera está ilustrada na Figura 3.14b.
FIGURA 3.14 Arquitetura da rede e superfície separadora do exemplo.
A rede resultante definiu uma superfície separadora (plano separador), que
separou os resultados da combinação de entradas possíveis em um plano tridimensional.
Foi mostrado de forma genérica que para qualquer sistema de dimensão N é
possível achar uma superfície separadora para as classes do problema usando uma rede de múltiplas camadas. Entretanto, encontrar os valores dos pesos necessários ou mesmo a arquitetura adequada constitui outro problema. A dificuldade configura-se em não saber o valor desejado na(s) saída(s) do(s nó(s) da camada oculta e, portanto, não se poder usar a regra de atualização do Percepetron para atualizar os pesos que ligam a camada de entrada à camada oculta.
3.7.3 Treinamento de Perceptrons
Multicamadas
Apesar das descobertas interessantes de Minsky e Papert (1969) quanto à aplicabilidade das redes, os autores não sugeriram nenhum método que fosse capaz de encontrar os parâmetros delas. Um algoritmo para esta finalidade
surgiu a partir das pesquisas independentes de Paul Werbos (1974) e
Rumelhart, Willians e Hinton (1986). O que estes autores propuseram foi um método de propagar o erro da camada de saída (que se conhece) para a(s camada(s) oculta(s). Dessa forma, tornou-se novamente possível alterar os parâmetros de todas as camadas da rede, a partir do erro na saída, ou seja procurando-se, como nas redes de uma só camada, qual é a alteração dos parâmetros que minimiza o erro na saída de uma determinada rede.
Este algoritmo de treinamento ficou conhecido como Backpropagation, e
consiste basicamente nos seguintes passos:
1. Apresentar um padrão à rede.
2. Calcular o erro na saída da rede.
3. Retropropagar o erro na rede, calculando de que forma as mudanças nos
pesos afetam o erro.
4. Modificar os pesos de forma a minimizar o erro médio. 5. Retornar ao passo 1 enquanto ainda houver padrões que não foram
apresentados nesta iteração.
6. Se um erro máximo desejado não tiver sido atingido, retornar ao passo 1
para a próxima iteração (apresentação de todos os padrões novamente).
Com o objetivo de minimizar o erro médio para todos os padrões
apresentados, são feitas, portanto, modificações nos pesos a cada padrão. O algoritmo de treinamento trata de forma diferenciada os neurônios da camada
de saída e os das camadas ocultas, baseando-se em uma rede genérica (Figura
3.15).
FIGURA 3.15 Topologia típica dos perceptrons em múltiplas camadas.
Em um neurônio k da camada de saída, o erro da n-ésima iteração é dado
por (3.11).
(3.11)
A soma dos erros quadráticos na camada de saída pode ser escrita como
(3.12).
(3.12)
Onde k varia de 1 até o número de elementos da camada de saída. O erro
médio para os N padrões apresentados no treinamento é dado por (3.13).
(3.13)
A entrada líquida do neurônio K é expressa por (3.14).
(3.14)
Onde p é o número de elementos da camada oculta e j = 0 simboliza a
polarização do nó k. A informação de saída do neurônio k na iteração n é
definida por (3.15).
(3.15)
As modificações nos pesos W são proporcionais ao valor do gradiente do kj
erro em relação aos pesos (3.16).
(3.16)
O desenvolvimento da expressão (3.16) é efetuado de acordo com a regra
da cadeia, obtendo-se (3.17).
(3.17)
O primeiro fator de (3.17) é dado por (3.18), e assim por diante para os
outros termos, obtendo-se (3.19), (3.20) e (3.21).
(3.18)
(3.19)
(3.20)
(3.21)
Substituindo os respectivos termos em (3.17), tem-se (3.22).
(3.22)
A computação do gradiente dá a direção de máximo crescimento do erro em
relação à variação dos pesos. Assim, se deseja que a variação dos pesos leve
na direção contrária (regra delta), resultando em (3.23).
(3.23)
Logo, tem-se (3.24).
(3.24)
Onde:
(3.25)
Ou seja, se k é um nó da camada de saída, é necessário atualizar os pesos
que o ligam à camada anterior usando as fórmulas acima. Para um nó j da camada oculta, o problema é que não se conhece ej(n). Agora, se deseja obter
(3.26).
(3.26)
Usando novamente a regra da cadeia:
(3.27)
E sabendo que:
(3.28)
Derivando a expressão do erro, tem-se (3.29):
(3.29)
Que expandida pela regra da cadeia resulta em (3.30):
(3.30)
Sabe-se que:
(3.31)
Derivando (3.31), obtém-se (3.32):
(3.32)
Sabe-se também que:
(3.33)
Substituindo (3.32) e (3.33) em (3.30), obtém-se (3.34):
Logo: (3.34)
OceanofPDF.com
(3.35)
Onde q é o número de elementos da camada de entrada, e i = 0 simboliza a
polarização do nó j.
Sabendo que:
(3.36)
Substituindo os termos, obtém-se (3.37):
(3.37)
Logo, têm-se:
(3.38)
(3.39)
Onde:
(3.40)
Ou seja, se j é um nó da camada oculta, deve-se atualizar os pesos que o
ligam à camada de entrada usando as fórmulas (3.39) e (3.40).
É possível mostrar que estes cálculos são extensíveis para N camadas. O
algoritmo abaixo enumera os passos correspondentes: 1. Apresentar um padrão de entrada.
2. Propagar a informação à frente calculando as saídas correspondentes. 3. Calcular os δ para os neurônios da camada de saída. j
4. Retropropagar o erro da saída calculando os δ das camadas ocultas. i 5. Atualizar os pesos, apresentar novo padrão e retornar ao passo 1.
Alguns aspectos relevantes sobre a função de ativação a ser empregada
dadas as características do algoritmo:
a) A função de ativação precisa ser diferenciável em todo o seu domínio. b) A função de ativação precisa ser não decrescente, para que a sua derivada
não troque de sinal de modo a comprometer a convergência do algoritmo.
Por estes motivos e também pela facilidade de obtenção da derivada da
função de ativação utilizada (que pode ser expressa em termos da própria função), é comum que sejam empregadas funções, tais como a função
sigmoide (Figura 3.16) e a tangente hiperbólica (cuja diferença é a variação entre −1 e 1).
FIGURA 3.16 Ilustração da função sigmoide.
A função sigmoide é definida por:
, onde >0.
Diferenciando ambos os lados, tem-se:
Ou ainda:
3.7.4 Alguns exemplos de aplicações
Os exemplos a seguir estão relacionados com as aplicações dos conceitos apresentados sobre redes MLPs e o procedimento de treinamento po retropropagação.
Exemplo 3.1
Neste exemplo será considerado o problema de aproximação de função
apresentado no Capítulo 2, no qual se empregou regras fuzzy na modelagem de um determinado sistema, sendo que agora será utilizada uma rede neural com o mesmo propósito.
O processo a ser modelado possui os seguintes dados provenientes de
medidas realizadas no mesmo: x1 = [0,00; 0,25; 0,50; 0,75; 1,00; 1,25;
1,50; 1,75; 2,00; 2,25; 2,50; 2,75; 3,00; 3,25; 3,50; 3,75; 4,00; 4,25; 4,50;
4,75; 5,00; 5,25; 5,50; 5,75; 6,00; 6,25; 6,50; 6,75; 8,00; 8,25; 8,50; 8,75;
9,00; 9,25; 9,50; 9,75; 10,00]; y = [2,0000; 2,2197; 2,3811; 2,5136; 2,7310;
2,7827; 2,8327; 3,0351; 2,9551; 3,3973; 3,5117; 3,5909; 3,7345; 3,8419;
4,0952; 4,2879; 4,4000; 4,8764; 5,2843; 5,9241; 6,3302; 6,9608; 7,3044; 7,6791; 8,2819; 9,0139; 9,3387; 10,0420; 10,4000; 10,6437; 10,4786; 10,4928; 10,7082; 10,6233; 10,8862; 10,6830; 10,8393; 10,9186; 10,8814; 10,9779; 11,0000].
Neste exemplo será considerada uma rede neural MLP com três
neurônios na camada escondida que utiliza funções de ativação do tipo sigmoide, e uma camada de saída com função de ativação linear. O fator de
aprendizado escolhido foi de 0,005 e a somatória do erro quadrado do
critério de parada ficou em 0,35. Os valores iniciais dos pesos e bias foram
aleatórios na faixa [−1, +1]. O gráfico da Figura 3.17 contém os dados
originais do sistema e os resultantes do treinamento da rede neural em questão.
FIGURA 3.17 Resultado do treinamento.
No Anexo 3.1 tem-se o código do programa desenvolvido para este
exemplo. O treinamento resultou nos seguintes valores de pesos da camada escondida: −1,8742; −0,241; −1,201. Valores de bias da camada escondida: 11,9436; 0,431; 5,8041. Pesos da camada de saída: −1,2746; −2,2714;
−1,5554. Bias da camada de saída: 5,8644. A Figura 3.18 ilustra a capacidade de interpolação da RNA resultante para valores intermediários
aos utilizados no treinamento.
FIGURA 3.18 Teste da capacidade de interpolação da rede.
Como exemplo numérico da capacidade de estimação da rede resultante,
seja o valor x1 = 5,1267 que não consta do vetor de entrada de treinamento. Os valores dos dados totalizados por cada um dos três neurônios da camada escondida são:
Os valores de saída das funções de ativação são:
Logo, o valor estimado pela rede na sua camada de saída é y = 5,8644 –
1,2746 × 0,9814 – 2,2714 × 0,6665 – 1,5554 × –0,339 = 6,6546 (um valor bem próximo de um dado eventualmente medido).
Esta capacidade de aproximação de funções é que possibilita aplicações
de RNAs na modelagem e controle de sistemas dinâmicos complexos
(Narendra e Parthasarathy, 1990).
Exemplo 3.2
Neste exemplo será considerado o problema da função XOR descrito anteriormente.
Foi especificada uma rede neural MLP com três neurônios na camada
escondida que utiliza funções de ativação do tipo sigmoide, e uma camada de saída com função de ativação linear. O fator de aprendizado escolhido foi de 0,005 e a somatória do erro quadrado para critério de parada ficou em 0,0001. Os valores iniciais dos pesos e bias foram aleatórios na faixa [−1, +1]. Os valores dos vetores de treinamento são: x1 = [0;0;1;1]; x2 = [0;1;0;1]; y = [0;1;1;0].
No Anexo 3.2 tem-se o código do programa desenvolvido para este
exemplo. Após 2600 épocas de treinamento atingiu-se o critério de erro de parada, resultando-se nos seguintes valores de pesos da camada escondida: 0,2157; 1,5795; −1,4056; 0,3791; −1,6998; 1,3715. Valores de bias da camada escondida: 0,7665; −0,8902; −0,7295. Pesos da camada de saída: 0,3134; 0,9981; 1,0155. Valor do offset da camada de saída: 1,1478.
Para exemplificar numericamente a capacidade de classificação da rede
resultante, seguem os dados e computações correspondentes. Para x1 = 0 e x2 = 1, os valores dos dados totalizados por cada um dos três neurônios da camada escondida são:
Os valores de saída das funções de ativação associadas são:
Logo, o valor estimado pela rede na sua camada de saída é y = 1,1478 +
0,3134 × 0,8163 + 0,9981 × −0,9888 + 1,0155 × 0,5663 = 0,9918 que é classificado como nível lógico “1”. De modo similar para x1 = 1 e x2 = 0,
tem-se y = 0,9930 (nível lógico “1”). Para x1 = 1 e x2 = 1, tem-se y = 0,0049 classificado como nível lógico “0”. E finalmente para x1 = 0 e x2 =
0, tem-se y = 0,0073 (nível lógico “0”). Desta forma, a rede consegue mapear adequadamente os valores típicos da tabela-verdade da função XOR exemplificada.
Este tipo de exemplo serve de base em aplicações de redes neurais no
reconhecimento de caracteres alfanuméricos de um texto ou da numeração de uma placa de um veículo, por exemplo. Valores unitários representam pixels acesos de um caractere de uma determinada imagem, e valores nulos, pixels apagados. Uma tabela com padrões de pixels de um caractere específico de uma imagem, por exemplo, fornece os dados de treinamento para uma RNA com este propósito. Depois de treinada, a rede em questão é capaz de reconhecer os caracteres fornecidos na etapa de treinamento, de modo que esta possa reconhecer ou classificar os dados de interesse em um conjunto de caracteres diversos de uma ou mais imagens em geral.
Os programas nos Anexos 3.1 e 3.2 foram desenvolvidos (baseados no
algoritmo descrito em Fausett (1994)) com finalidades didáticas, onde se utilizou variáveis singelas nos códigos-fonte correspondentes. A utilização
de variáveis com representações matriciais e a elaboração de sub-rotinas
específicas nos programas possibilitam a construção de aplicativos mais
compactos e eficientes.
Pacotes computacionais como o MatLab possuem toolboxes para RNAs
que disponibilizam linhas de comando ou ferramentas gráficas apropriadas para o desenvolvimento e testes de modelos neurais em geral.
Exemplo 3.3
Como ilustração, seja resolver o problema de aproximação de função
similar ao Exemplo 3.1.
Será utilizado o toolbox nntool. Inicialmente, carrega-se na área de
trabalho do MatLab os vetores de dados de treinamento, por exemplo: x1 = [0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 4.25 4.50 4.75 5.00 5.25 5.50 5.75 6.00 6.25 6.50 6.75 8.00 8.25 8.50 8.75 9.00 9.25 9.50 9.75 10.00]; y = [2.0000 2.2197 2.3811 2.5136 2.7310 2.7827 2.8327 3.0351 2.9551 3.3973 3.5117 3.5909 3.7345 3.8419 4.0952 4.2879 4.4000 4.8764 5.2843 5.9241 6.3302 6.9608 7.3044 7.6791 8.2819 9.0139 9.3387 10.0420 10.4000 10.6437 10.4786 10.4928 10.7082 10.6233 10.8862 10.6830 10.8393 10.9186 10.8814 10.9779 11.0000].
Aciona-se a ferramenta em questão através do comando: nntool <Enter
>. Na tela aberta do aplicativo aciona-se o botão “Import...”, e na janela
correspondente seleciona-se o vetor x1, marcando a opção “Input Data”, pressionando o botão “Import” e, depois, “Close”. O procedimento anterior
é repetido para selecionar o vetor y, marcando a opção “Target Data”,
pressionando o botão “Import” e, depois, “Close”. A seguir é acionada a
opção “New...”, para criar um modelo de rede neural, onde na janela correspondente é selecionado o tipo da rede (Feed-Forward backprop, neste caso), o “Input Data” e o “Target Data” (x1 e y, respectivamente), o número de camadas (“Number of layers = 2”, para uma camada escondida e outra de saída), o número de neurônios da camada escondida (“Number of neurons = 3”, neste caso), o tipo de função de ativação (“Transfer Function = “TANSIG”, neste exemplo), e finalmente se aciona os botões “Create” e “Close”. Na tela principal do aplicativo aparece o nome da rede especificada, cujo nome default é network1. Clicando no nome em questão,
surge uma janela com a estrutura da rede e abas de opções do aplicativo.
Acionando a aba “Train”, inclui-se nos campos “Inputs” e “Targets”, os
vetores x1 e y, respectivamente, e aperta-se o botão “Train Network”, para se treinar a rede (onde uma janela é aberta com as informações do treinamento: número de épocas utilizadas, erro obtido etc.). Na aba “View/Edit Weights” pode-se visualizar os valores dos pesos e bias obtidos na etapa de treinamento. Na tela principal do aplicativo aparece, no campo “Output Data”, os dados (com o nome default network1_outputs) obtidos pela rede treinada para o padrão de entrada de treinamento. Esses dados e os parâmetros da rede podem ser transferidos para a área de trabalho do
MatLab, ou gravados para posterior utilização. Para tanto, basta acionar o botão “Export...” e selecionar os arquivos a serem exportados (Export neste exempo) ou salvos (Save) no computador. Os comandos de linha a seguir mostram como gerar um gráfico com os dados originais do sistema e os obtidos pelo treinamento da rede em questão:
A Figura 3.19 ilustra os dados correspondentes à resolução do problema
de aproximação de função com a ferramenta citada.
FIGURA 3.19 Resultado do treinamento com a ferramenta citada.
3.7.4.1 Características práticas do backpropagation: quanto ao instante de atualização dos pesos
Se a atualização dos pesos for realizada a cada apresentação de um novo padrão, ao final de uma iteração é razoável imaginar que a atualização dos pesos corresponda mais às alterações feitas pelos últimos padrões apresentados do que aos primeiros. Se a ordem de apresentação é a mesma a cada iteração, então a alteração será tendenciosa.
Portanto, caso se deseje alterar os pesos a cada apresentação de um novo
padrão, é conveniente variar a ordem de apresentação dos padrões a cada iteração, por exemplo, sorteando essa ordem. A este esquema de apresentação dos padrões chamamos atualização iterativa.
Outra opção é não alterar o peso a cada apresentação de padrões após o
cálculo das variações desejadas pelo padrão, acumular a alteração deste padrão com as alterações determinadas pelos demais padrões e realizar a alteração nos pesos somente ao final da iteração. A este método chamamos atualização por batelada. Quanto à parada do treinamento, este geralmente é encerrado quando ocorre um dos seguintes casos: I. Erro atingiu um valor predeterminado;
II. Erro está caindo a uma taxa suficientemente pequena de acordo com um
parâmetro predeterminado; ou.
III. A atualização está prejudicando a generalização (medida com um conjunto
de validação). Isto é, o erro está crescendo para o conjunto de validação, apesar de possivelmente estar caindo para o conjunto de treinamento.
Quanto à escolha dos pesos iniciais, Rumelhart (1986) mostrou que uma rede neural pode jamais conseguir aprender se todos os pesos forem iniciados com um mesmo valor, uma vez que todos os pesos seriam alterados de uma mesma maneira. Os pesos são mudados proporcionalmente à derivada da função de ativação, portanto, quanto mais próximo do centro da função estiver, maior será a modificação. Nas extremidades da função de ativação (regiões de saturação), as derivadas são próximas de zero e, consequentemente, há pouca variação nos pesos, mesmo que o erro seja significativo. Isto sugere que o processo de aprendizado deva ser iniciado utilizando-se valores de pesos de pequena amplitude, que sejam aleatoriamente gerados a partir de uma distribuição uniforme. Sugere-se, por exemplo, tomar os valores iniciais dos pesos e das
polarizações a partir de uma distribuição uniforme no intervalo [−0,5; +0,5].
3.7.4.2 Modificações no procedimento de retropropagação
O algoritmo de retropropagação possui algumas características que devem ser levadas em consideração para acelerar a convergência, evitar oscilações ou mesmo para impedir que o treinamento da rede falhe (não ocorrendo uma convergência efetiva).
3.7.4.3 O termo momento
Na prática, uma forma de aumentar a taxa de aprendizado sem causar
oscilações é modificar a equação (3.39) para incluir um termo chamado termo de momento. Esta alteração consiste na utilização da parcela de atualização dos pesos (Δ ) da iteração anterior no processo de atualização dos pesos da w
iteração corrente, conforme indicado a seguir (e de forma similar para o ajuste de pesos de outras camadas):
O índice n indica a iteração (etapa de treinamento ou época), e o coeficiente
α a taxa de momento que determina o efeito de alterações anteriores na direção do movimento no espaço dos pesos. O efeito dessa alteração é a aceleração do treinamento por um fator de 1/(1-α).
3.7.4.4 Mínimos locais
Outro problema que pode afetar o treinamento de uma rede neural é a questão dos mínimos locais. O algoritmo do gradiente decrescente pode encontra mínimos locais na busca da solução do problema de ajustes dos pesos de uma rede. Isto normalmente está ligado à amplitude do valor inicial dos pesos e ao fator de normalização. Se os valores estiverem concentrados nos extremos da função de ativação (perto de 0 ou 1 para a função logística, ou de −1 ou 1 para a função tangente hiperbólica), o processo de treinamento pode ficar parado ou estacionar em um mínimo local.
Uma maneira de minimizar este problema é escolher como faixa de trabalho
uma porção mais central da função de ativação, onde a função apresenta um comportamento mais linear. Outra forma de se contornar o problema dos mínimos locais é estabelecer uma tolerância satisfatória para a convergência do algoritmo. O processo de aprendizado é interrompido quando a tolerância é atingida. Assim, o fato do mínimo ser global ou local torna-se irrelevante, uma vez que uma solução satisfatória foi encontrada. Se a solução não é satisfatória, é possível mudar os pesos iniciais e executar novamente o procedimento de treinamento com outros fatores de aprendizado e/ou taxa de momento.
3.7.4.5 Função de erro alterada
Alguns autores sugerem a alteração da função de erro a ser minimizada como forma de agilização do processo de aprendizado da rede. A utilização da função de erro descrita na equação abaixo incrementa o processo em 50%, em vez da tradicional função de erro médio quadrático.
3.7.4.6 Alterações no algoritmo de minimização
Alguns autores propõem a substituição do algoritmo de minimização como
forma de incrementar o processo de treinamento. Waltrous (1987) e White
(1990), entre outros, utilizaram o algoritmo de Newton, enquanto Nowlan &
Hinton (1992) utilizaram o algoritmo de gradiente conjugado. O problema na utilização do primeiro método é que o algoritmo requer o cálculo da inversa da matriz Hessiana, o que torna praticamente impossível seu emprego em redes de grandes dimensões. O segundo método apresenta algumas vantagens em relação à técnica do gradiente decrescente, principalmente em funções quadráticas.
Existem autores que sugerem regras empíricas para atualização dos valores
do fator de aprendizado e da taxa de momento. Jacobs (1988) sugere a utilização de uma taxa de aprendizado por peso, enquanto outros — por
exemplo, Ritter (1992) — sugerem a utilização de uma taxa variável ao longo do treinamento, mas única para todos os pesos. Nenhuma destas técnicas se mostrou superior às demais, dado que o desempenho de todas as abordagens está relacionado ao problema estudado.
3.7.4.7 Algoritmos de poda em redes feedforward
Um dos principais problemas quando se usa treinamento supervisionado é a capacidade de generalização, isto é, a capacidade da rede de responder adequadamente a padrões que não fizeram parte do conjunto de treinamento Os pesos das ligações são modificados durante o treinamento de forma a minimizar o erro para os padrões apresentados. Se a quantidade de padrões apresentados é suficientemente representativa da função, a tendência durante o treinamento com o algoritmo de retropropagação é que o erro, tanto do conjunto de padrões de treinamento quanto do conjunto de padrões de validação, vá diminuindo à medida que a rede vá generalizando o aprendizado
(conforme ilustrado na Figura 3.10). Após certo tempo, o erro do conjunto de validação atinge um mínimo, e começa a crescer, enquanto o erro do conjunto de treinamento continua a cair, indicando uma tendência da rede de incorpora informações que são específicas do conjunto de treinamento, tal como, por exemplo, os erros de medidas daquele conjunto. Uma solução é parar o treinamento quando a tendência de erro do conjunto de validação começa a divergir da tendência do conjunto de treinamento. Dessa forma, o conjunto de treinamento é usado para modificar os pesos, enquanto o conjunto de validação é usado para estimar a capacidade de generalização. Entretanto, isso pode não ser possível se o conjunto de dados disponíveis for pequeno, na medida em que a divisão em dois conjuntos pode agravar a falta de representatividade do conjunto de padrões.
Outra abordagem para evitar o excesso de treinamento é limitar a
capacidade da rede de absorver as correlações espúrias entre os dados de entrada. Isto acontece basicamente quando a rede possui mais graus de liberdade (que são proporcionais ao número de ligações entre os neurônios) do que o número de padrões de treinamento. Assim, o problema da generalização está diretamente ligado ao problema do dimensionamento da rede. Ou seja basicamente a ideia é conseguir a menor rede que consiga acomodar as informações contidas no conjunto de dados de treinamento. O problema é justamente estimar qual é esse tamanho mínimo que permite que a rede ainda aprenda sem incorporar os dados espúrios do conjunto de treinamento Estudos no sentido de estimar esse tamanho, relacionam a complexidade do sistema com o número de exemplos de treinamento necessários para aprende uma determinada função. Se o número de exemplos de treinamento for pequeno em relação ao tamanho da rede, o erro de generalização é alto. A abordagem mais simples, embora trabalhosa, é simplesmente executar várias redes de diversos tamanhos e verificar qual é a rede mínima que consegue aprender os padrões de entrada. Mesmo que seja possível determinar a meno rede por este processo, ainda fica-se muito susceptível aos parâmetros de treinamento, de forma que pode ser muito difícil determinar se a rede é muito pequena para aprender os padrões, se ela simplesmente aprende lentamente ou se devido a valores de iniciação ou parâmetros de treinamento mal escolhidos ela caiu em algum mínimo local. A abordagem escolhida por vários autores parte do princípio comum de iniciar o treinamento com uma rede maior do que o necessário e ir podando (removendo) partes da rede que não sejam necessárias. Como inicialmente a rede é grande, possui graus de liberdade suficientes para acomodar rapidamente as características gerais dos dados de entrada de uma forma pouco sensível às condições iniciais e aos mínimos locais. Após a acomodação inicial, então, a rede pode ser podada de modo a eliminar características específicas do conjunto de treinamento, favorecendo os critérios desejáveis de generalidade.
3.7.4.8 Eliminação de conexões
Uma ideia básica para simplificar a estrutura de uma rede neural é cortar as conexões entre os seus nós. Para tanto, uma primeira abordagem pode ser a de simplesmente zerar o peso de uma conexão e verificar qual a influência disso no erro do modelo resultante. Se o erro aumentar muito, então se restaura o peso desconsiderado, se não houver mudança significativa, remove-se definitivamente o peso e espera-se um determinado tempo para que as demais conexões absorvam as características das entradas que estavam representadas naquela ligação. Se a rede possui uma quantidade X de pesos, o tempo para cada propagação é da ordem de O(X). Como a operação deve ser executada para cada peso e para cada um dos Y padrões de entrada, então cada passo de poda é da ordem de O(Y × X2), sem contar o tempo de acomodação do processo de treinamento. Caso se queira adotar um procedimento mais cauteloso, que analise a influência no erro de cada peso para cada padrão, se remove apenas o peso de menor influência, repetindo-se o procedimento até que a menor alteração de erro atinja um limiar de parada, então o tempo de propagação é da ordem de O(Y × X3). Naturalmente, esses são procedimentos bastante lentos, principalmente para redes de maior porte. Assim, os algoritmos de poda citados a seguir adotam outras abordagens mais interessantes.
3.7.4.9 Métodos de cálculo de sensibilidade
Existem alguns métodos que procuram estimar a sensibilidade da função de erro perante a remoção de uma ligação, para então remover as ligações com menor influência. Em geral esses métodos atuam após o treinamento da rede Ou seja, primeiramente a rede é treinada para um tamanho maior que o necessário, depois é estimada a sensibilidade de cada peso e então os de meno sensibilidade são retirados. O problema com esses métodos é que eles não levam em consideração a correlação entre os pesos da rede. A sensibilidade de cada peso w é calculada como se ele fosse o único candidato a ser retirado, ou ij
como se o nó i fosse o único candidato a ser podado. Quando um dos pesos é retirado, as demais sensibilidades calculadas não continuam necessariamente válidas para a nova configuração da rede. Isto pode ser facilmente compreendido imaginando um exemplo com dois nós que se cancelem mutuamente na contribuição para a informação de saída. Vistos como um par eles não têm contribuição para a saída em questão, mas são vistos individualmente, onde cada um tem uma forte contribuição e, portanto provavelmente não serão cortados. Com nós que estejam parcialmente correlacionados acontece o mesmo, e eles são bastante comuns na maioria das redes.
3.7.4.10 Métodos com termos de penalização
A ideia central do algoritmo de backpropagation é minimizar uma função de custo, no caso, o erro na saída da rede. Como a hipótese dos algoritmos de poda é de se ter a menor rede que seja capaz de responder aos padrões de treinamento, e que apresentará a melhor generalização, surgiu a ideia de dividir a função de custo em uma soma de dois termos, um representando o custo devido ao erro e outro representado o custo devido à complexidade da rede. Esse termo adicional é chamado termo de penalização, na medida em que representa uma penalização que a função de custo sofre devido à complexidade da rede. Os métodos que introduzem esse termo procuram minimizar a nova função de custo (que inclui um termo de custo de complexidade). Assim, a tendência é que haja uma redução na complexidade da rede, forçada pela tendência de que pesos sejam levados para valores nulos tendendo à minimização do custo de complexidade.
3.7.4.11 Decaimento de pesos
Alguns dos métodos que usam fatores de penalização incluem termos que provocam um decaimento dos pesos durante o processo de treinamento
Chauvin (1989) adicionou um termo à equação de custo com esse objetivo cuja expressão é dada a seguir.
A derivada do segundo termo da expressão em relação a W é 2μ w , o que ij w ij
introduz efetivamente um termo de decaimento dos pesos na equação do algoritmo. Pesos que não sejam essenciais à solução tendem a decair para zero e podem ser retirados. Este método é conhecido como Weigth Decay. Ishikawa (1990) propôs outra função de custo na forma descrita a seguir.
O segundo termo desta expressão introduz uma mudança na regra de
atualização dos pesos que passa agora a ter um termo da forma Se W > 0, então o peso é decrementado de λ, caso contrário, (w < 0), o peso ij ij é incrementado de λ.
3.7.4.12 Método de Weigth-Elimination
Este método foi proposto por Weigend (1991), e consiste na adição de um termo de penalização na forma do segundo termo abaixo.
Onde C é o conjunto de todas as conexões e w é a escala para as conexões 0
dos pesos da camada em questão. O primeiro termo desta equação mede o desempenho da rede, enquanto o segundo termo avalia o tamanho (complexidade) da rede. O parâmetro λ representa a importância relativa do termo de complexidade com relação ao termo de desempenho. Weigend
mostra o custo de complexidade como função de w /w (Figura 3.20). As i 0 regiões onde os valores absolutos das conexões |w | são muito grandes ou i muito pequenos são facilmente interpretadas. Para ||wi|| w0, o custo de uma conexão aproxima-se de 1 (multiplicado por λ), e isso justifica a interpretação do termo de complexidade como um contador de conexões com magnitude significativa. Para |w | w , o custo se aproxima de zero. Valores grandes ou i 0
pequenos são definidos em relação à escala w , que é um parâmetro livre do 0 procedimento para eliminação das conexões. Segundo Weigend, a escolha de w de ordem unitária é um bom valor, e o parâmetro λ é ajustado 0
dinamicamente durante o processo de treinamento.
FIGURA 3.20 Custo complexidade versus pesos.
O método de Chauvin (1990) (Weigth Decay) produz um decaimento
proporcional ao quadrado do valor do peso, e tende a dar preferência a uma grande quantidade de pesos pequenos, em detrimento de poucos pesos com
valores altos. O método de Weight-Elimination (Weigend, 1991) tende a preservar poucos pesos grandes em relação à média dos pesos, eliminando os pesos menores. O parâmetro de escala w permite expressar a preferência po 0 muitos pesos pequenos (w grande), ou poucos pesos com valores de pesos 0