INE 5443
Programa
Links
Bibliografia
Plano
de Ensino
|
3.
Técnicas Subsimbólicas:
Redes Neurais
Parte
I - Backpropagation
Parte I:
3.1. Filosofia
Geral da Aplicação do Raciocínio
Subsimbólico
a Padrões: Redes Neurais Aprendendo Dados, Classificadores e
Agrupadores
3.2. O
Simulador SNNS - Stutgarter Neural Network Simulator
3.3. Classificadores:
Usando Aprendizado Supervisionado para Reconhecer Padrões
Parte II:
3.4. Desenvolvimento
de Aplicações: Usando Aprendizado Supervisionado
Parte III:
3.5. Agrupadores:
Usando Aprendizado Não Supervisionado para Organizar
Padrões
3.5.1. O
Modelo de Kohonen e Quantização de Vetores
3.5.2. O
Modelo ART: Teoria da Ressonância Adaptativa
Parte IV:
3.6. Explorando
Dados Agrupados em Redes
3.1.
Filosofia Geral da Aplicação do Raciocínio
Subsimbólico
a Padrões: Redes Neurais Aprendendo Dados, Classificadores e
Agrupadores
Chamamos de Raciocínio
Subsimbólico ao procesamento de informação em
um nível onde os padrões representam conjuntos de dados
mas
onde não podemos associar um significado imediato a cada dado
processado.
Isto significa que trabalhamos com dados, que em seu conjunto podem ser
chamados de informação e assumir um significado, mas onde
não sabemos ou não podemos determinar o significado de
cada
parte do conjunto de informação em separado. O mesmo vale
para as representações internas, intermediárias
desses
dados: usamos sistemas que representam essa informação,
mas
eles são sistemas black box - caixa preta - produzindo
classificações
dos padrões e resultados numéricos, sem no entanto fazer
isto de forma explícita. As redes neurais são o melhor
exemplo
de um sistema subsimbólico: mesmo que cada parte de um
padrão
apresentado a uma rede tenha um significado explícito,
associável
a um símbolo de nosso modelo do mundo real, a
representação
interna dos dados no procesador (a rede) não é
explícita
e não possui significado. Um método subsimbólico
tipicamente
é incapaz de explicar porque chegou a uma determinada
conclusão,
uma vez que um mapeamento explícito de causa-e-efeito não
existe.
Fica mais
fácil ilustrar
este conceito através de um exemplo. Imagine um sistema militar
para classificar tipos de navios ("inimigos") a partir do padrão
de ruído emitido por estes, da forma como é captado por
um
submarino ("nosso"). Hipotetize que nós sabemos que um
determinado
padrão de ruídos corresponde a um porta-aviões de
determinada classe de uma determinada nacionalidade. Este padrão
inclue um conjunto de freqüências e as
variações
de amplitude dessas freqüências, além de algumas
outras
informações. Nós podemos associar um conjunto de
símbolos
a esse padrão: "Porta-Aviões modelo Banheirão
de
Corto Maltese", mas classificamos o padrão como um todo.
Nós
não sabemos dizer que papel tem uma freqüência X
qualquer do ruído neste padrão ou que parte
mecânica
do navio em questão ela representa. Talvez não saibamos
nem
mesmo, se vamos continuar cnseguindo classificar o padrão, caso
retiremos os valores correspondentes a esta freqüência do
padrão.
Este é um
exemplo
típico. Mesmo em situações onde os dados possuem
um
significado conhecido, como no caso de dados de um paciente
cardíaco
potencial, onde eu sei o significado da freqüência
cardíaca,
mas onde eu não sei o relacionamento entre a
freqüência
cardíaca e a chance deste paciente ter um infarte numa
determinada
situação futura. É esse relacionamento, que eu
não
posso mapear de forma explícita que eu quero que um sistema
subsimbólico
mapeie implicitamente para mim. E os sistemas subsimbólicos
fazem
isto, mas o fazem de forma fechada, sem gerar mapas, tabelas
estatísticas
ou conjuntos de regras de como criam este mapeamento.
As Redes
Neurais Artificiais
são o mais difundido e popular conjunto de métodos
subsimbólicos,
sendo em geral caixas-pretas por excelência. Existem outros
métodos
que não vamos abordar aqui. O fato das redes neurais serem
caixas
pretas muitas vezes é citado como uma de suas desvantagens.
Neste
capítulo nós vamos ver que isto é relativo. Este
capítulo
pressupõe que você já viu Teoria das Redes Neurais
na cadeira de Inteligência Artificial e que você tem o
conhecimento
teórico básco sobre os métodos: aqui nós
vamo
ver aplicações de redes neurais e técnicas de
integração
das mesmas em sistemas mais complexos.
3.2.
O Simulador SNNS - Stutgarter Neural Network Simulator
O SNNS é um
dos melhores
simuladores de Redes Neurais existentes. Porisso nós vamos
vê-lo
aqui. O objetivo de alocarmos um capítulo a ele é o de
prover
ao aluno com uma ferramenta poderosa para a execução dos
exercícios propostos, livrando-o da necessidade de ter de
programar
ele mesmo as redes.
O SNNS
possui outra vantagem: após treinada um rede, você pode
gerar
com o SNNS um arquivo em linguagem "C" contendo a rede treinada. Este
arquivo
compilado pode ser utilizado como prorama standalone ou então
como
biblioteca (.dll ou .so) linkada ao programa aplicativo que você
for usar. Isto é uma vantagem para as aplicações
em
Smalltalk que você vai desenvolver, pois permite que você
utilize
o pacote "DLL & C connect" para usar estas redes em Smalltalk.
- Versão
do SNNS em Java para Windows
- Java
Runtime Environment completo que você precisa para o software
acima
- Versão
compilada do SNNS 4.2 para Linux (se você possue RedHat ou
Conectiva
instalado pode ter problemas para rodar pois a versão do Athena
suprida com RedHat e seus clones é meio estranha. Teste estas
opções:
a) Mude a profundidade de seu vídeo para 8 bits ou b) Não
carregue os arquivos de configuração dos exemplos, apenas
as redes e os arquivos de treinamento.
- Versão
do SNNS para SunOS ou Solaris: Os fontes do SNNS compilam sem
problemas
nas plataformas Sun. Acesse a homepage do SNNS e baixe os fontes. As
bibliotecas
do Athena podem ser baixadas para Sun em vários lugares.
3.3. Classificadores:
Usando Aprendizado Supervisionado para Reconhecer Padrões
Há dois
modelos de redes
neurais utilizados na prática como classificadores
passíveis
de serem gerados através de aprendizado supervisionado. Ambos os
modelos baseiam-se nos Perceptrons feed-forward , variando o número de camadas e a função de
ativação e, por conseguinte, a regra de aprendizado: a)
As
Redes Backpropagation e
b) as Redes de Base Radial.
Por
serem as mais utilizadas e, do ponto de vista prático, mas mais
importantes, vamos nos ocupar aqui das Redes Backpropagation,
também
chamadas redes-BP. As redes de Base Radial, conhecidas também
por
redes-RBF podem ser usadas, em teoria, para representar os mesmos tipos
de problemas que uma rede Backpropagation equivalente. Alguns autores
argumentam
que são mais eficientes durante o treinamento. Por outro lado, a
compreensão de seu algoritmo de aprendizado envolve uma
matemática
bastante mais complexa. Como são utilizadas para resolver o
mesmo
tipo de problemas que os onde Backpropagation encontra
aplicação,
sem vantagens consideráveis na qualidade do resultado final,
vamos
ignorá-las aqui. No final desta seção há
uma
comparação entre redes-RBF e redes-BP, extraída de
[Haykin] e um comentário nosso sobre redes-RBF e sua
relação
com Nearest Neighbour e métodos que utilizam NN, como IBL*.
Como
esta disciplina pressupõe que você já viu o assunto
Redes Neurais, vamos aqui apenas recordar alguns conceitos
matemáticos
importantes para que você entenda a nossa discussão mais
adiante
de como se deve aplicar corretamente Backpropagation.
3.3.1.
Princípios Matemáticos de Redes-BP
Existem
várias convenções amtemáticas para a
nomenclatura
dos elementos de uma rede neural. Durante todo o capítulo de
Redes
Neurais vamos utilizar a simbologia matemática descrita em
[Hertz
et.ali.].
Um
conjunto de treinamento é um conjunto p de padrões, todos
de mesmo tamanho, cada qual dividido em duas partes: vetor de
entrada
e vetor de saída . O
vetor
de saída representa a atividades esperada nos neurônios de
saída quando é apresentado o vetor de entrada nos
neurônios
de entrada da rede.
Princípios
Básicos das Redes Backpropagation
A
idéia básica de toda rede neural feedforward com
aprendizado
supervisionado é que, durante o seu treinamento, aplicamos
à
sua camada de entrada o padrão que desejamos que seja aprendido
e propagamos a ativação
gerada por este padrão na camada de neurônios de entrada,
camada a camada, até gerarmos uma ativação nos
neurônios
da camada de saída.
Cada
neurônio i de uma camada está tipicamente ligado a todos
os
neurônios j da camada anterior e recebe o sinal h de todos estes,
cada qual ponderado pelo peso wij da conexão
correspondente.
Cada
neurônio possui uma função de
ativação
g() cuja variável independente é a entrada h do
neurônio.
Todo
neurônio i possui um sinal de saída, que será
denominado
Vi se o sinal for dirigido para outra camada da rede (neurônios
de
entrada e internos) ou Oi se o neurônio for de saída. A
relação
entre o sinal de saída e a ativação g(h) do
neurônio
tipicamente é a identidade. A separação da
ativação
e do sinal de saída em duas variáveis permite realizar-se
de forma elegante o sincronismo de toda a rede (inerentemente paralela)
quando se simula a mesma em uma máquina de von Neumann
(seqüencial):
Atualizamos os valores de saída dos neurônios de uma
camada
somente depois de termos calculado todas as ativações
desta
camada. Isto é especialmente importante em redes BP recorrentes
e outros modelos de rede onde neurônios possuem
ligações
com neurônios da própria camada.
O
objetivo do treinamento supervisionado é modificar os pesos das
conexões da rede de tal forma que a saída
gerada para o vetor de entrada
do padrão m pela rede seja o mais próximo possível
do vetor de saída
deste
padrão, de forma que no futuro, quando apresentarmos um outro
vetor
similar a , a rede produza
uma
resposta o mais próxima possível de
.
Para
realizarmos esta modificação dos pesos, representamos o
erro
de saída da rede como uma função do conjunto dos
pesos,
E(w), e utilizamos a técnica denominada descida em
gradiente
(gradient descent ou Gradientenabstieg) para realizar
alterações
iterativas dos pesos de forma a reduzir o erro. Para isto,
representamos
inicialmente E(w) como uma função-custo baseada na
soma dos quadrados dos erros:
A
função acima representa o erro do resultado apresentado
pela
rede como uma função da diferença entre o
resultado
esperado e os pesos das ligações entre a camada de
saída
e a anterior e a entrada desta camada. Como os valores de entrada e de
saída são dados, o conjunto de variáveis
independentes
é formado pelos pesos e o erro está representado como
função
dos pesos.
A
variação do erro em função dos pesos pode
então
ser representada pelo vetor das derivadas parciais do erro em
função
dos pesos, também denominado gradiente do erro:
.
Este
vetor possui a propriedade de apontar no sentido do maior
acréscimo
de erro. Portanto para reduzir E(w) da forma mais rápida
possível
movemo-nos no sentido contrário e definimos a
modificação
dos pesos como:
Chamamos
a
esta fórmula de regra-delta.
Como
esta modificação dos pesos deve ser gradativa, para
evitar
que uma modificação brusca de pesos faça a rede
desaprender
outro padrão já aprendido, utilizamos os seguintes
princípios:
- introduzimos
uma taxa de aprendizado h,
tipicamente de valor < 0,2
- apresentamos
os padrões de treinamento em ordem aleatória, garantindo
que tenhamos apresentado todos antes de reapresentarmos algum.
Podemos
também representar a alteração dos pesos
individualmente
para cada padrão m
:
No
treinamento
de redes neurais, ao invés de falarmos de
iterações,
chamamos a cada ciclo de apresentação de todos os
padrões
de época. Antes de iniciar uma nova época, reorganizamos
os padrões em uma nova ordem aleatória. A cada
época
todos os padrões são apreseentados.
A
regra-delta, tal qual está representada acima, ainda não
nos permite treinar a rede, apenas expressa um vetor de
modificação
dos pesos para a camada de saída. Vamos agora recapitular
brevemente
a regra de aprendizado das redes-BP.
Aprendizado
das Redes-BP
O
fato que fez com que a pesquisa em redes neurais ficasse quase 20 anos
(1968 - 1984) parada no cenário internacional foi o seguinte
conjunto
de fatos:
- para
que uma rede neural feedforward possa representar uma
função
qualquer (universalidade representacional) ela necessita de pelo menos
uma camada intermediária, além da camada de entrada e da
de saída e a função de ativação de
pelo
menos parte dos neurônios deve ter caráter
não-linear.
- para
que a rede possa aprender, é necesário que possamos
calcular
a derivada do erro em relação aos pesos em cada camada,
de
tràs para frente, de forma a minimizar a função
custo
definida na camada de saída. Para isto ser possível, a
função
de ativação deve ser derivável.
Já
o modelo de rede de McCulloch & Pitts possuía um
caráter
representacional quase universal, mas não apresentava a
possibilidade
de treinar-se redes com camadas intermediárias, pois a
função
de limiar por eles desenvolvida não era derivável.
A
regra de aprendizado do modelo do Perceptron podia treinar redes com
quantas
camadas se quisesse, mas estas camadas intermediárias eram
inúteis
pois a função de ativação linear do
neurônio
do Perceptron fazia com que camadas adicionais representasssem
transformações
lineares sobre transformações lineares, o que é
equivalente
a uma única transformação linear e incapaz de
representar
problemas linearmente inseparáveis.
Como
resolver este problema? Através de uma idéia muito
simples:
introduzir uma não linearidade "bem
comportada"
através de funções
quaselineares
contínuas e deriváveis. Com isto conseguimos:
- introduzir
uma não linearidade sem no entanto alterar de forma radical a
resposta
da rede (ela se comporta de forma similar a uma rede linear para casos
"normais") e
- possibilitar
o cálculo da derivada parcial do erro em relação
aos
pesos (o que nós queríamos desde o começo) de uma
forma elegante e generalizável para todas as camadas.
As
funções de ativação quaselineares que se
costuma
utilizar têm a forma geral do desenho abaixo.
Esta
família de funções possue comportamento
assintótico,
significando que para valores valores muito grandes ou muito pequenos
de
y elas tendem a um valor constante. Além disso é
derivável
e, próxima de sua parte "mais normal", possue um comportamento
muito
semelhante ao de uma reta inclinada, como em uma função
linear.
As
duas funções mais utilizadas são a tangente
hiperbólica e a função
logística, mostradas abaixo, juntamente com suas
derivadas:
O
parâmetro b
é um parâmetro livre com b
> 0 que permite parametrizar o comportamento da
função. Na
prática utilizamos geralmente b
=1.
Estas
duas funções possuem a propriedade adicional de se poder
definir suas derivadas em função delas mesmas,
significando
que se pode reutilizar o valor já calculado para a
ativação
ao se realizar a retropropagação do erro, sem necessidade
de novos cálculos complexos.
A
função tangente hiperbólica possui domínio
no intervalo aberto ]-1, +1[ e a função logística
no domínio ]0, 1[ . Podemos escolhê-las de acordo com
nosso
domínio de aplicação ou fazer, como o fazem a
maioria
dos simuladores de redes-BP, tomar a função
logística
como função padrão e suprir valores negativos de
saída
através da adição de uma constante. Essa constante
é muitas vezes provida através de um neurônio
virtual
a mais em cada camada, denominado bias neuron, que possui saída
constante e negativa.
E
a regra para modificação dos pesos imediatamente
após
a apresentação de cada padrão:
Aprendizado
para Redes de Várias Camadas
As
fórmulas deduzidas acima nos permitem implementar uma descida em
gradiente, realizando o aprendizado, em redes de duas camadas. Como
já
discutimos, porém, necessitamos de redes com pelo menos uma
camada
interna. Para extender o aprendizado a redes de uma camada interna,
temos
de primeiramente extender a nossa função-custo de forma
que
ela diferencie entre pesos de neurônios internos e pesos de
neurônios
de saída.
Para
isto observemos a figura 3.3 abaixo, que representa uma rede de 9
neurônios
divididos em três camadas. Você pode observar na figura que
os pesos k -> j são representados por wjk
e os pesos j -> i são representados por Wij
.
Lembrando
que a nossa função-custo tem a forma geral:
...e
que desejamos minimizar E(w) modificando gradualmente o vetor dos pesos
w = (w11 ,....,W11 ,....).
Para
isso, vamos inicialmente definir como surge o vetor de saída da
rede O i :
Esta
função E(w) é contínua e
diferenciável
para todos os wjk ,, Wij
. Isto permite que se utilize o método de descida
em gradiente para construir o algoritmo de
aprendizado.
Faremos
a descida em gradiente em etapas, uma para cada conjunto de pesos entre
camadas. Para uma rede BP com uma camada interna, isto é feito
de
trás para frente (por isso retropropagação do
erro)
em duas etapas, uma para Wij e outra
para wjk
.
Observe
que esta é praticamente a mesma regra que havíamos
escrito
antes, somente substituímos os valores do vetor de entrada pelos
valores da ativação dos neurônios internos.
Para
o caso dos pesos entrada -> interno nós
vamos ter de aplicar a regra da cadeia também para as derivadas
internas:
Observe
que esta fórmula possui caráter genérico
extensível
a qualquer camada interna, pois se criarmos um buffer para
os
deltas da adaptação da camada anterior, podemos
utilizá-los
para a atual, de trás para frente.
Dessa
forma, a regra-delta generalizada para
a m-ésima camada de uma rede backpropagation fica assim
(considerando-se
a camada de entrada como camada 0 e a camada de saída como
camada
M):
Algoritmo
Backpropagation
- uma
rede feedforward de M camadas
- um
conjunto de conexões ponderadas por pesos e dirigidas da camada
m-1 para a camada m:
- uma
função de ativação não-linear
contínua
e diferenciável no domínio dos valores a serem treinados
na rede
- uma
taxa de aprendizado h
- um
conjunto de treinamento contendo xm
entradas e zm
saídas.
3.3.2. O que
Aprende
uma Rede-BP ?
Como citamos em
outras partes
deste texto, uma rede backpropagation, ao contrário de redes-RBF
ou classificadores baseados em Nearest Neighbour, como IBL, aprende uma
função capaz de mapear a entrada à saída,
caso
esta exista. Se o conjunto de treinamento for inconsistente a rede
não
aprenderá nada ou aprenderá cada exemplo individual do
conjunto
de treinamento, caso a criemos grande o suficiente.
Em
princípio, o mapeamento
entrada-saída em uma rede-BP está distribuído
sobre
o total dos pesos e conexões da rede, sendo bastante
difícil
associarmos um determinado neurônio e suas conexões a uma
determinada classe.
Do ponto de vista
matemático,
existem várias interpretações do significado dos
pesos
aprendidos por uma rede neural. Uma discussão detalhada deste
assunto
foge do escopo de uma disciplina de graduação e
nós
remetemos à literatura, principalmente [Hertz et.ali.].
Existem,
porém, algumas
situações interessantes, onde o aprendizado da rede
neural
pode ser visualizado e podemos realmente associar um ou um conjunto de
neurônios a uma determinada classe. Isto tende a acontecer quando
o conjunto de treinamento contém classes realmente muito bem
comportadas.
O exemplo
clássico
para este comportamento é o encoder (codificador). Este
exemplo
está incluído na coleção de exemplo
sprontos
do SNNS e sugerimos ao leitor que faça alguns experimentos com
ele.
O encoder é um exemplo onde podemos fazer os padrões de
ativação
dos neurônios da camada interna representarem uma
compressão
dos dados de treinamento e ainda utilizar esta compressão de
dados
como um código representando os mesmos.
O encoder toma um
valor de
entrada de 0 a 7 e aprende a asociá-lo a mesma saída,
possuíndo
8 neurônios de entrada, um para cada valor e 8 neurônios de
saída, com a mesma representação. Na camada
intermediária
possui apenas 3 neurônios. O objetivo é que, ao aprender a
associação entrada-saída, ele codifique os dados.
A figura abaixo mostra o encoder recebendo o número 1 como
padrão
de entrada (01000000) e representando internamente este número
como
101.
O conjunto de
treinamento
do encoder não é só linearmente separável,
mas é também linearmente independente e, portanto, um
conjunto
extremamente fácil de aprender, que não necessitaria de
uma
camada interna, podendo ser representado por um perceptron simples.
Mesmo
assim é interessante de se observar o fenômeno da
representação
interna. Este fenômeno porém não ocorre sempre
dessa
forma, com a rede “inventando” seu próprio código
binário.
Às vezes os pesos se distribuem de uma forma tal na rede que
não
é possível uma interpretação visual da
“representação
interna”.
Exercício:
Observando
o Encoder
Vamos ver com que
freqüência
o encoder realmente aprende uma representação interna que
para nós, humanos, faz “sentido”. Carregue o exemplo do encoder
no SNNS. Reinicialize a rede e treine-o. Bastam 100 épocas
pois o conjunto é aprendido extremamente rápido. Feito
isto,
vá para o modo “updating” e repasse todo o conjunto de
treinamento
pela rede. Foi possível criar-se um arepresnetação
interna similar a algum código binário conhecido ? Repita
este processo várias vezes, reincializando, treinando e testando
a rede para ver como ela se comporta.
3.3.3.
Aspectos Práticos de Métodos de Descida em Gradiente
Como citamos
brevemente antes,
o processo de redução do erro E(w) pertence a uma
categoria
de métodos matemáticos denominado Métodos de
Descida
em Gradiente (Gradient Descent Methods). Nocaso específico das
redes-BP,
que nos interessa, podemos imaginar a idéia de que o erro
é
uma (hiper) superfície em um espaço definido pelos pesos
[w] da rede neural. O estado atual da rede (conjunto de valores
específico
dos pesos das conexões entre os neurônios) é um
ponto
sobre esta superfície. O nosso objetivo é mover este
ponto
através da alteração dos valores do spesos de
forma
a encontrar uma posição onde o erro seja o menor
possível.
O movimento é realizado sempre no sentido de reduzir-se o erro,
ou seja sempre descendo a superfície de erro de forma que o
próximo
ponto seja uma posição mais funda nesta
superfície,
até encontrar uma posição de onde não sejja
possível descer-se mais. Se imaginarmos uma
situação
3D, onde há apenas dois pesos definindo os espaços x e Y
e a coordenada z sendo definida pelo erro, podemos imaginar o processo
como o mostra a figura abaixo.
O material abaixo
é
um resumo do tutorial
de redes neurais disponibilizado pela Neuro-Fuzzy
AG (Grupo de Trabalho Neuro-Fuzzy) do Departamento de
Matemática
da Universidade de Muenster, Alemanha.
Mínimo
Local: Partindo-se da configuração de pesos inicial w1,
o método de descida em gradiente não encontrará a
solução (mínimo global). |
|
Platô
encontrado em E(w) durante treinamento da rede neural. Durante
um
longo período não haverá mudanças
significativas
em E(w). Após um tempo, porém, o mínimo
absoluto
(global) é encontrado. |
|
Oscilações
ocorrem quando o processo de descida de gradiente cai em uma ravina de
onde não sai mais. Também é uma espécie de
mínimo local. O passo de modificação dos pesos
(taxa
de aprendizado) é grande demais para que a rede caia na ravina,
mas pequena demais para sair do mínimo. Ao conrário do
mínimo
local comum, aqui a rede não encontra um estado estável. |
|
A Oscilação
Indireta é uma situação de
oscilação
mais complexa, onde a rede também fica "presa" em um
mínimo
local e não encontra um estado estável. Neste caso
porém,
existem estados intermediários entre os estados extremos da
oscilação,
onde o erro por momentos se permite reduzir. |
|
Saída
do mínimo ótimo para um subótimo. Se a
mudança
dos pesos se inicia numa área de gradiente muito grande, os
primeiros
ajustes podem ser excessivamente grandes e levar a rede a passar do
vale
onde está o mínimo global, para uma região com um
mínimo local. |
|
Existem
várias técnicas
para "turbinar"a descida em gradiente de forma e evitar alguns dos
problemas
descritos acima. Estas técnicas são implementadas em
parte
no SNNS. Na aula vamos discutir suas vantagens e
limitações.
The Cyclops
Project
German-Brazilian
Cooperation
Programme on IT
CNPq GMD DLR
|
|
|
|