PDF de programación - Back-Propagation learning

Imágen de pdf Back-Propagation learning

Back-Propagation learninggráfica de visualizaciones

Publicado el 18 de Octubre del 2018
587 visualizaciones desde el 18 de Octubre del 2018
157,6 KB
21 paginas
Creado hace 21a (01/01/2003)
3. Para p=1, 2, … (los patrones, cíclicamente)
Para l = L, L-1, … (las capas)
Para todos los k,j en la capa l (los pesos)
εk
p w p
l
,
(
Calcule el error
kj
τ
y
p
L
(
(
)

]
k
k

N

+
l
ε
+
l
1

v

p w p
,
(


(

ε
l
k

[

]

)
1

[



=

l
kj

l
kj



=
1

l
v

v

l

1

)

1
)

)− 1 así:
p w
l
,
[
kj

p w p
,
(
(
E p W, 
en w pkj
l (
[

f u p w p
(

]
)
p w p
w
1
(
,
)
)− 1 así:
]


f u

1
))

1
))





)

y



(

l
kj

,

1

l
kj


l
1
j

(

p

)



si
)

l=L
otro
l
1
)

(



p

(

+

+
l
1
vk

BACK-PROPAGATION LEARNING


1. Asigne pesos iniciales w
2. Seleccione la constante de aprendizaje η( )0 -puede decrementarse
con el tiempo-.

( )0 para todos los k,j,l.

l=
w
kj

l
kj

Calcule el gradiente de

)

(


E p W
,

w
l
kj

= −

ε
l
k

(

p w p
,
(

l
kj


Actualice el valor de este peso mediante
)

l
k

(


E p W

w

,
l
kj

w p
(

l
kj

)



−1 η
)
(

p

)

=

w p
(

l
kj



Siguiente peso
Siguiente capa
Siguiente patrón (cíclicamente, hasta que el cambio en
los pesos sea insignificante)



El anterior es el algoritmo de aprendizaje BPL, como aparece en la mayoría de libros sobre
redes neuronales. Resulta muy difícil de leer y, con mayor razón, de entender. Sin embargo,
entre toda esa maraña de subíndices y superíndices, podemos descubrir en la última
ecuación que unas variables w se están actualizando con un incremento negativamente
proporcional a la derivada de una función E(w). Parece ser que el algoritmo BPL quiere
minimizar E(w), de acuerdo con el “método del gradiente”….


Método del Gradiente



f(x)

df x
(
dx
df x
(
dx
df x
(
dx

)2

)3

)1

0<



x
aumentar



1

0=



x
dejar

0>



x
disminuir



2

3

df x
− η (
ant
dx



)



=

x 1

x2

x 3

x

sig

=

x

ant

x

Efectivamente, si queremos encontrar el mínimo de f(x) y estamos en un punto donde f’(x)
es negativa, será necesario incrementar x en busca del mínimo. Pero si f’(x) es positiva,
debemos decrementar x. Esto es, debemos movernos en el sentido contrario al de la
derivada, como parecía sugerir el algoritmo BPL. Una constante de proporcionalidad η
determinará la magnitud de ese movimiento.

f(x)

1.0

0.8

0.6

0.4

0.2

0

-2

0

2

4

6

x

1

(

)
5

2

+

+





2

3

x

2

x

3

x

05
.

1000

f x
( )

double derivada(double x)
{
return (x3+6x2-4x+10)(1.5x2+6x-2)/1000;
}
void main(void)
{
double x, xant, Eta;
cout << " Eta ? "; cin >> Eta;
cout << "x inicial ? "; cin >> x;
do
{
xant = x;
x = xant - Eta * derivada(xant);
} while(fabs(x - xant) > 0.000001);
}


El anterior programa en C muestra el procedimiento para buscar el mínimo de una f(x)
particular, dados un punto inicial y una constante de proporcionalidad η. El algoritmo
termina cuando el incremento sea insignificante.



f(x)

1.0

0.8

0.6

0.4

0.2

0

-2

0

2

4

6

x



f '() = -1
f '() = -0.1995

1

n

n

n

x



+ =

η (
f x

x
Eta ? 1
x inicial ? -2
0: f(-2) = 0.625

1: f(-1) = 0.11025

2: f(-0.8005) = 0.0770863
f '() = -0.136338
3: f(-0.664162) = 0.0608111 f '() = -0.103663
4: f(-0.5605) = 0.0511443
f '() = -0.0834473
5: f(-0.477052) = 0.0447711 f '() = -0.069637

222: f(0.366984) = 0.0215793
223: f(0.366985) = 0.0215793


NO LLEGO AL VERDADERO MINIMO!



d
dx

)

f '() = -1.04596e-006
f '() = -9.98351e-007



f '() = -0.1425

f '() = 0.124007
f '() = -0.124007
f '() = 0.124007
f '() = -0.124007

Eta ? 5
x inicial ? 5

0: f(5) = 0.05625
1: f(5.7125) = 0.00300695
f '() = 0.0578272
2: f(5.42336) = 0.00693551 f '() = -0.0715223
3: f(5.78098) = 0.00842207 f '() = 0.101246 INESTABLE!
….
2147: f(5.81376) = 0.0121104
2148: f(5.19372) = 0.0301088
2149: f(5.81376) = 0.0121104
2150: f(5.19372) = 0.0301088

Eta ? 2
x inicial ? 5
0: f(5) = 0.05625
1: f(5.285) = 0.0194959
2: f(5.50024) = 0.00243065 f '() = -0.0448307 A VECES
3: f(5.5899) = 5.17009e-005 f '() = -0.00697191 FUNCIONA!
4: f(5.60384) = 1.57654e-007
5: f(5.60462) = 2.65361e-010
6: f(5.60465) = 4.29573e-013
7: f(5.60466) = 6.94282e-016


Las anteriores ejecuciones muestran que, con distintos valores de xinicial y η, el algoritmo
anterior puede tener resultados insatisfactorios : Convergir a un mínimo local o,
sencillamente, no convergir. Sin embargo, !A veces funciona!


f '() = -0.000388774
f '() = -1.59587e-005
f '() = -6.42109e-007
f '() = -2.58142e-008

f '() = -0.1425
f '() = -0.10762



w

1
w2
w
3
wN

x1

x2

x

3

xN



z

z

= 
f



w0
x = -1
0



N



=

n

0

w xn

n







Modelo de un elemento computacinal



Para un X = { x1, x2, …, xN }, debería producirse zi
pero, dados unos pesos W = {w0, w1, …, wN}, la

neurona produce zr.


Pues bien, en un elemento computacional de una red neuronal que recibe como entrada un
patrón {x1, x2, …, xN } se produce un error si la salida real zr difiere de la salida ideal zi. ¿Si
zr es función de los pesos wk, porqué no seleccionar los pesos para minimizar el error zi - zr?
zi - zr |zi - zr| (zi - zr)2



0

2

4

0

2

4

0

2

4



Bueno, en principio minimizar el error podría conducirnos a un gran error negativo y lo que
queremos es que el error sea cero. La función valor absoluto incluye mínimos en los puntos
en que el error sea cero, pero como el método del gradiente exige derivar, preferimos
trabajar con el error cuadrado:


APRENDER : Minimizar el error cuadrado


W
n

+ =

1


W
n

− ∇
η



z
i

(



(

z W
r

)
)

2






Como cada peso se va a actualizar de acuerdo con la respectiva derivada parcial del error
cuadrado, el vector de pesos completo se actualiza de acuerdo con el vector gradiente.

Por ejemplo, queremos enseñar a la siguiente red neuronal a que responda con zi cuando a
la entrada tenga un punto particular (x,y), y para eso buscaremos los pesos (a,b,c) que
minimicen el error. La función de activación utilizada es la sigmoide.


b

c

z = f(s)

s = ax + by - c

f s
( )

=

+

1

1
exp(



s

)



1.0

0.5

0.0

-10

-5

0

5

10

a

x

y

-1



E


a

i=
z
(



z

) 2

=

2

e

(Error cuadrado)

+ =

1

n

a

n




E
η
∂ b
a

n

+ =

1

b
n



n


E
η
∂ c
b
n

+ =

1

n

c

n



η


E
∂ (método del gradiente)
c

n



=

z

)

z

)

2

(

z


(


Las derivadas parciales del error cuadrado están en términos de la derivada de la función de
activación:


E
∂α
+ =
a

En este caso particular, la derivada de z=f(s) se expresa fácilmente en términos de z:
z


z
i
∂α
η '( )
ef
s x

df s
( )
ds
+ =


s
∂α

c
n

(
2

= −


z
∂α
η '( )
s y
ef

η '( )
ef
s

c
n

b
n

f s
( )

+ =

1

(
2

= −

= −

2

ef

(
1

b
n

z

i



s
( )

z

i

+

a

n

+

n

1





s

e



)

z

)

z

)



1

+

=

1

i




s
∂α

=



1
+
e
+
e

1
(
)
1 1

=
)



s



s

f

s
'( )

= −
(

2



(

)
1

e



s

=

(
1
f s
( )

)



e
+
e
(
1

s



s



s



1
+
e
)
=

=

2

1
f s
( )

1

z



+
1
(
1

e
s
+
e


1



s

=

1
+
e

1



s



1




1
+
e

1



s




z

)



f

s
'( )

=

+ =

1

n

a

n

+

1η (
ez



z x
)

b
n

+ =

1

b
n

+

1η (
ez



z y
)

c
n

+ =

1

c
n



1η (
ez



z

)


a


Las anteriores tres ecuaciones determinan el algoritmo de entrenamiento para la red
mostrada arriba


1
exp(



s

)



f s
( )

=

+

1

1.0

0.5

a

x

y

-1

b

c

z = f(s)

s = ax + by - c

0

5

10

0.0

-10

-5


double f(double s)
{
return 1.0/(1.0 + exp(-s));
}
void main(void)
{
double x = -1, y = 2, zi = 1;
double Eta=2, a = 1, b = 1, c = 1;
double z, e, Delta;
do
{
z = f(a*x + b*y - c);
e = zi - z;
Delta = Eta*e*z*(1-z);
cout << a << b << c << z << e << Delta << endl;
a += Delta*x;
b += Delta*y;
c -= Delta;
} while(fabs(e) > 0.1);
}

Por ejemplo, el anterior programa busca los pesos a,b,c que minimicen el error cuadrado si
se quiere que la red produzca 1.0 cuando las entradas sean (-1,2). Como se dijo, la función
sigmoide utilizada tiene la particularidad de que f’(s) = f(s)*(1-f(s)), y el programa usa esta
propiedad al calcular Delta en el tercer renglón de la iteración. La siguiente tabla muestra la
salida del programa anterior, que después de 5 iteraciones le enseñó a la red a clasificar
el punto (-1,2). Por supuesto, una red neuronal que sepa clasificar un punto y tenga una
salida incierta para los demás puntos es absolutamente inútil!

--------------------------------------------------------------------------------------------------------------------------------------------
a
---------------------------------------------------------------------------------------------------------------------------------------------

1
0.75

0.695584
0.662464
0.638451

0.5

0.182426
0.138656
0.116581
0.102542

0.5

0.817574
0.861344
0.883419
0.897458


1
0.75

0.695584
0.662464
0.638451

b



1
1.5

1.60883
1.67507
1.7231

z



c



e



d



0.25
0.0544162
0.0331195
0.0240133
0.0188733

0.619578


1.76084

0.619578

0.90742
  • Links de descarga
http://lwp-l.com/pdf13933

Comentarios de: Back-Propagation learning (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad