• Nenhum resultado encontrado

Com !n "' e n q 0

n q

! !

"

( , onde ' é uma densidade de probabilidade arbitrária . Ao treinarmos uma rede neural utilizando o conjunto D de dados procuramos encontrar parâmetros W que tornem y(x;W) o mais próximo de f possível dado um modelo para o ruído definido pela densidade '. De forma equivalente, desejamos encontrar parâmetros para um modelo de densidade condicional p t x W( ; ). Parâmetros adequados podem ser encontrados, como procedemos anteriormente, maximizando a função verossimilhança sobre o conjunto D definida por:

( ) ( ) 1

( ) ( , )

P

n n

n

L W p t x W

=

=

. (4.3)

Para simplificarmos os cálculos, substituindo produtos por somas, introduzimos, como anteriormente, uma função erro (ou energia) :

( ) ( ) 1

( ) ln ( )

ln ( , )

P

n n

n

E L

p t

W W

x W

=

= −

= −

(4.4)

Com um modelo de ruído gaussiano teremos:

2 2

1 ( ( ; ))

( , ) ( ( ; )) exp

2 2

t y x

p t x p t y x W

W W

πσ σ

 − 

= − = − 

  (4.5)

Substituindo (4.5) em (4.4) e ignorando os termos que não dependem dos parâmetros W teremos:

( ) ( ) 2

1

( ) 1 ( ; )

2

P

n n

n

E W y x W t

=

 

=

 −  . (4.6)

Uma outra possibilidade é assumirmos um ruído com densidade exponencial generalizada:

( )

1

( , ) exp ( ; )

2 (1/ )

r r

p t x r t y x

W = β r −β − W

Γ , (4.7)

neste cado teremos a seguinte função erro para minimizar dado o conjunto de dados D.

( ) ( )

1

( ) 1 ( ; )

2

P n n r

n

E W y x W t

=

 

=

 −  (4.8)

Qualquer que seja o método de otimização que empregemos (Gradiente Conjugado Escalado, Quase-Newton, etc) é necessário cacular o gradiente da função erro. No caso de uma MLP, há uma maneira bastante eficiente de realizar este cálculo proposta inicialmente na década de sessenta e depois redescoberta várias vezes, esta técnica é conhecida como algoritmo Backpropagation2.

Backpropagation

No caso mais simples, devemos calcular o gradiente da seguinte função erro:

2

( ) ( )

0 0 0

1 1 1

( ) 1 2

P M N

n out n

m m jm j

n m j

E W w ϕ w x w w t

= = =

   

=   + + − 

   

 

∑ ∑ ∑

(4.9)

Para simplificarmos os cálculos, assumiremos, sem perda de generalidade que os limiares w0 são pesos sinápticos que recebem sinais constantes x=1. Também assumiremos que as funções de transferência da camada escondida são "( )z "tanh( )z Assim:

2

( ) ( )

0

1 1 1

( ) 1 tanh

2

P M N

n n

m jm j

n m j

E W w w x t

= = =

   

=   − 

   

 

∑ ∑ ∑

. (4.10)

Aqui introduzimos a notação wjm para indicar conexões sinápticas unindo a entrada j ao neurônio m da camada escondida . Agora definimos o campo pós-sináptico atuando sobre o neurônio m quando o sinal de entrada é x( )n :

( ) ( )

1 N

n n

m jm j

j

h w x

"

"

)

(4.11)

A função erro pode ser decomposta em contribuições de cada componente do conjunto D:

( ) 1

( ) ( )

P n n

E W E W

=

=

(4.12)

Com

2

( ) ( ) ( )

0 1

( ) 1 2

M

n n n

m m

m

E W w a t

=

 

= 

−  , (4.13)

onde aproveitamos a interpretação do modelo descrito por (4.1) como uma rede de neurônios para introduzimos am( )n "tanh(hm( )n ) como a saída do neurônio m da camada escondida quando o sinal de entrada é x( )n . Por consistência o campo pós-sináptico na camada externa é 0( ) 0 ( )

1 M

n n

m m

m

h w a

"

"

)

e a saída ( ) 0( )

n n

y "h . Graficamente teremos:

( )n

am

x

(n)

( )n

h

m ( )

0

hn y(n)

O gradiente em relação aos pesos sinápticos será:

( ) ( ) ( ) 1

n P n

m n

jm n m jm

h

E E

w " h w

*

* " *

*

)

* * (4.14)

Definimos o erro

( ) ( )

( ) n n

m n

m

E

# *h

"

* e assim teremos que :

( ) ( ) 1

P

n n

m m

jm n

E x

w #

"

* "

*

)

(4.15)

Para o neurônio de saída o cálculo de 0( )

#n é trivial resultando em:

( )

( ) ( ) ( )

0 ( ) 0

0 n

n n n

n

E h t

δ =∂h = −

∂ (4.16)

Lembrando que tanh( ) 2

1 tanh ( )

d z

dz " # z , para os neurônios da camada interna teremos:

( ) ( )

( ) ( ) ( )

0 0

( ) ( )

1

( ) ( ) ( )

0 0(1 )

n

n M

n n n m

m n m m m n

m m m

n n n

m m m

da

E w a t w

h dh

w a a

#

#

"

+ ,

* .

-" * ".../ # ---0

" #

)

, (4.17)

conhecida como fórmula de retropropagação (backpropagation).

Note que para o cálculo de derivadas na camada interna é necessário utilizar erros da camada mais externa. Pictorialmente o algoritmo consiste na seguinte seqüência:

1. Dada a entrada x( )n , calculam-se os campos pós-sinápticos hm( )n por toda a rede.

Assim ( ) ( )

1 N

n n

m jm j

j

h w x

"

"

)

e 0( ) 0 ( )

1

tanh( )

M

n n

m m

m

h w h

"

"

)

.

x

(n)

( )n

h

m ( )

0

hn

2. Calcula-se o erro na saída 0( )

# n e retropropaga-se para as camadas interiores utilizando #m( )n "#0( )n wm0(1#tanh (2 hm( )n )).

3. Calcula-se os gradiente utilizando ( ) ( )

1 P

n n

m j

jm n

E x

w #

"

* "

*

)

e 0( ) ( )

0 1 P

n n

m m n

E a

w #

"

* "

*

)

.

O Backpropagation reduz o número de operações necessárias para o cálculo de gradientes em MLPs de O W( 2) para O W( ), onde W é o número de parâmetros. Calculado o gradiente podemos utilizar qualquer um dos algoritmos de otimização conhecidos para efetuar o treinamento da rede.

Perceptron Multicamada: Classificação

Uma classificação simples é uma função f :!M ! #{ 1,1}. Uma rede neural pode ser treinada a reconhecer uma função de classificação a partir de um conjunto de treinamento

( ) ( )

{ n , n }nP 1

D" x t " . Um perceptron de camada única definido como

0 1

( ; ) ( )

N j j j

y " w x w

"

"

)

&

x w , (4.18)

( )n

a

m

( )n

x

j

( )n

#

m ( )

0

# n

onde "é uma função sigmoidal (tanh, erf, ...) divide o espaço em duas regiões separadas por um hiperplano definido por w x1 " #w0. Assim qualquer vetor com w x1 2 #w0 é classificado como +1 e qualquer vetor com w x1 3#w0 é classificado como -1. Ilustrando:

A distância do hiperplano até a origem é w0. Uma MLP com uma camada escondida pode representar qualquer região convexa no espaço. Cada neurônio da camada escondida define um hiperplano e a classificação é definida pela unidade de saída.

0 0 0 0

1 1

( , )

M N

out

m jm j

m j

y x W ϕ w ϕ w x w w

= =

   

=   + + 

   

∑ ∑

(4.19)

Normalmente se utiliza "( )z "tanh( )z para a camada interna e 0

( ) 1

1 z

z e

" " #

& para a camada externa. A região convexa definida é mais complicada que um simples polígono devido ao uso de funções diferenciáveis. Para obtermos regiões arbitrárias é necessário utilizar uma rede com duas camadas escondidas:

1 2 3

3 0 2 1 0 0 0

1 1 1

( , )

L M N

l ml jm j

l m j

y x W ϕ w ϕ w ϕ w x w w w

= = =

     

 

=    + + + 

   

   

∑ ∑ ∑

.

Este tipo de rede é um classificador universal do mesmo modo que uma MLP com uma camada escondida pode representar qualquer função contínua3.

+

-MLPs em Netlab

O Netlab trás um conjunto de funções para a implementação de MLPs com uma camada escondida. As principais funções disponíveis são:

mlp: cria uma MLP com uma camada escondida;

mlpinit: inicia os pesos com variância definida;

mlpgrad: calcula o gradiente do erro;

mlpfwd: calcula a sída da rede;

Outras funções podem ser obtidas entrando

> help netlab;

Demonstraremos agora o uso do Netlab para uma tarefa de regressão. O problema consiste na interpretação automática do resultado de doze sensores utilizados em oleodutos para a determinação da proporção de gás, óleo e água em um fluxo. Primeiro 500 medidas são efetuadas em laboratório, 400 destas medidas são então utilizadas para treinar uma MLP as outras 100 são utilizadas para teste. Os dados estão armazenados no arquivo "oleoduto.dat", as doze primeiras colunas deste arquivo são as medidas dos sensores as últimas duas colunas são a proporção de água e gás respectivamente.

Começamos por carregar o conjunto de dados em uma matriz "oleoduto":

> load 'oleoduto.dat'

A seguir separamos os dados em quatro vetores: inteste, intreino, outteste, outtreino.

>intreino=oleoduto(1:400,1:12);

>inteste = oleoduto(401:500,1:12);

>outtreino = oleoduto (1:400,13:14);

> outteste = oleoduto (401:500, 13:14);

De posse de nossos vetores de treinamento e teste, podemos agora criar uma MLP:

> net = mlp(12,7,2,'linear');

A arquitetura que escolhemos tem a seguinte representação:

As unidades de saída são lineares e as unidades internas são tanh. Podemos ver a rede criada digitando:

>net net =

type: 'mlp' nin: 12 nhidden: 7 nout: 2 nwts: 107 actfn: 'linear' w1: [12x7 double]

b1: [-0.1817 0.3313 -0.2486 0.0904 -0.1714 -0.3418 0.3177]

w2: [7x2 double]

b2: [0.1880 0.5289]

Note que o modelo contém 107 parâmetros. Agora inicializamos o vetor de controle dos algoritmos de otimização:

>options=foptions;

Ajustamos o vetor de controles para que os erros sejam exibidos na tela:

>options(1)=1;

Ajustamos o número máximo de iterações para 500;

>options(14)=500;

Agora treinamos a MLP utilizando o Gradiente Conjugado Escalado (scg):

> [net,options,erro] = netopt(net,options,intreino,outtreino,'scg');

Cycle 200 Error 0.160426 Scale 1.000000e-015 Cycle 201 Error 0.160335 Scale 1.000000e-015 Cycle 202 Error 0.160068 Scale 1.000000e-015 Cycle 203 Error 0.159740 Scale 1.000000e-015 Cycle 204 Error 0.159441 Scale 1.000000e-015 Cycle 205 Error 0.159200 Scale 1.000000e-015 Cycle 206 Error 0.159114 Scale 1.000000e-015 Cycle 207 Error 0.158751 Scale 1.000000e-015 Cycle 208 Error 0.158675 Scale 1.000000e-015 Cycle 209 Error 0.158466 Scale 1.000000e-015 Cycle 210 Error 0.158082 Scale 1.000000e-015 Cycle 211 Error 0.157837 Scale 1.000000e-015 Cycle 212 Error 0.157532 Scale 1.000000e-015 Cycle 213 Error 0.157437 Scale 1.000000e-015 Cycle 214 Error 0.157029 Scale 1.000000e-015 Cycle 215 Error 0.156953 Scale 1.000000e-015 Cycle 216 Error 0.156921 Scale 1.000000e-015

Agora plotamos a evolução do erro de treinamento com o número de iterações:

> plot(err,'o-');

Agora utilizamos o modelo treinado armazenado em net para realizar prediçõe no conjunto de teste:

> outmodel=mlpfwd(net,inteste);

A seguir plotamos as previsões contra os valores reais no conjunto de teste:

> plot(outmodel(:,1),outteste(:,1),'o');

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

> plot(outmodel(:,2),outteste(:,2),'o');

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

Se a qualidade das predições é adequada ou não irá depender da aplicação. Podemos quantificar esta qualidade calculando a diferença percentual média entre previsões e valores experimentais definida como:

(n) (n)

(n) 1

outmodel outteste 1

outteste

P

P n"

4 "

)

# (4.20)

>deltas=abs(outmodel-outteste)./outteste;

> delta=sum(deltas)./100 delta =

0.2654 0.1465

> plot(deltas(:,1),'o-'); figure; plot(outteste(:,1),'o-');

> plot(deltas(:,2),'o-'); figure; plot(outteste(:,2),'o-');

0 10 20 30 40 50 60 70 80 90 100

0 2 4 6 8 10 12 14 16 18

0 10 20 30 40 50 60 70 80 90 100

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

0 10 20 30 40 50 60 70 80 90 100

0 0.5 1 1.5 2 2.5 3 3.5 4

0 10 20 30 40 50 60 70 80 90 100

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

Nota-se que grandes erros estão relacionados com valores pequenos das saídas. Uma forma de melhorar a qualidade das previsões é utilizar apenas valores de saída acima de um certo limiar, para isso é necessário modificar a arquitetura da rede adicionando uma terceira saída definida como outtreino(:,3)=1 - outtreino(:,1) – outtreino (:,2) , treinar novamente o modelo e apenas utilizar as duas previsões que exibirem valores acima de um limiar definido (por exemplo: >0,1). A terceira previsão pode ser obtida da condição de normalização.

Aplicações de MLPs

O sucesso de uma aplicação de MLPs depende da natureza do problema. Se há uma função, mesmo que complexa, subjacente aos dados, as chances de sucesso são grandes.

Há uma grande quantidade de aplicações de MLPs e outras redes descritas na Internet, para citar alguns links:

http://www.brainstorm.co.uk/NCTT/Welcome.htm

http://www.emsl.pnl.gov:2080/proj/neuron/neural/products/

http://neuralnetworks.ai-depot.com/Applications.html

Exercício

1. Melhore a qualidade das previsões do modelo para composição de fluxos em oleodutos realizando as seguintes modificações :

a) Gere conjuntos de treinamento e teste com três saídas que somem um;

b) Treine uma rede com 7 neurônios na camada escondida do mesmo modo apresentado ;

c) Na etapa de teste, utilize o seguinte algoritmo para efetuar previsões:

tome as duas saídas com maior valor out1 e out2, obtenha a terceira saída com out3=1-out1-out2;

d) Calcule o erro percentual médio para cada uma das saídas assim obtidas.

e) Repita o treinamento para redes com 5,6,8,10 e 15 neurônios. Qual é a melhor arquitetura ?

Documentos relacionados