Universidad de las Fuerzas Armadas “ESPE”
Control Inteligente
Descenso de Gradiente
Nombre: Jordy Cevallos
Fecha: 03/05/2018
Tarea1
1
Graficar f ( x )= (función sigmoide) y su derivada para los valores de
1+e−α . x
α =1,2,4 . Comparar con la función signo
En la Figura1 se muestra la gráfica de la función sigmoide para los 3 valores de alfa.
1
alfa=1
0.9 alfa=2
alfa=4
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
-3 -2 -1 0 1 2 3
Figura 1. Función sigmoide.
En donde pondemos observar que mientras mayor es el número de alfa , la función
se aproxima más a la funcion signo, con la gran ventaja que la funcion sigmoide si
es derivable en todo si rango.
En la Figura2 se observa la grafica de la derivada de la funcion sigmoide para los 3
alfas.
1
alfa=1
0.9 alfa=2
alfa=4
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
-3 -2 -1 0 1 2 3
Figura 2. Derivada de la función sigmoide
Tarea2
Realizar el algoritmo de aprendizaje por descenso de gradiente para la clasificación
de aviones (online).
Para determinar los pesos se utilizó los datos presentados en la siguiente tabla.
Para la clasificación de aviones mediante el método de descenso de gradiente se
procede primero a seleccionar un factor de aprendizaje, en este caso 0.6 y a crear
una matriz que contenga los valores de masa y velocidad ya que estos conformaran
las entradas como se puede observar en la Figura3.
Figura 3. Representación de una neurona
Donde In1 es la “Mass”, In2 es la “Speed” y In0 es el Sesgo que tendrá un valor de
1; mediante el algoritmo presentado a continuación se encuentra los valores de los
pesos para lograr el “Target” requerido.
%Descenso de gradientes Aviones
n=0.6 %FACTOR DE APRENDIZAJE
in0=1; %SESGO
alfa=4;
w0=rand;w1=rand;w2=rand;
p=[1 0.1;2 0.2;0.1 0.3;2 0.3;0.2 0.4;3 0.4;0.1 0.5;1.5 0.5;0.5 0.6; 1.6 0.7;];
targ=[ 1 1 0 1 0 1 0 1 0 0];
errorv=[]; epocav=[];
for epoca=[Link] %EPOCAS
Error=0;
for i=[Link]
in1=p(i,1);
in2=p(i,2);
net=w0*in0+w1*in1+w2*in2;
out=sigmoidev(net,alfa);
e=targ(i)-out;
deltaw0=-n*e*(-1)*alfa*out*(1-out)*in0;
deltaw1=-n*e*(-1)*alfa*out*(1-out)*in1;
deltaw2=-n*e*(-1)*alfa*out*(1-out)*in2;
%Actualizacion de Pesos
w0=w0+deltaw0;
w1=w1+deltaw1;
w2=w2+deltaw2;
Error=Error+(targ(i)-out)^2;
end
errorv=[errorv Error];
epocav=[epocav epoca];
plot(epocav,errorv)
grid on
title('Evolucion del error por época')
end
for i=1:10
in1=p(i,1);
in2=p(i,2);
out=hardlim(w0+w1*p(i,1)+w2*p(i,2));
outf(i)=out;
end
outf
En el algoritmo presentado se entiende que si el valor es 1 corresponde a un avión
“Bomber” y si el valor es 0 el avión es “Figther”.
Al ejecutar el algoritmo con 20 décadas tenemos la evolución del error de la
Figura4.
Evolucion del error por época
5
4.5
3.5
2.5
1.5
1
0 2 4 6 8 10 12 14 16 18 20
Figura 4. Evolución del Error en 20 épocas
Donde si bien el error converge este no llega a cero, lo que se ve representado en
que las respuestas son diferentes al target como se muestra en la Figura5.
Figura 5. Resultados en 20 épocas
Al incrementar el número de décadas a 200 se puede observar que el error converge
a cero como muestra la Figura6.
Evolucion del error por época
5
4.5
3.5
2.5
1.5
0.5
0
0 20 40 60 80 100 120 140 160 180 200
Figura [Link]ón del error en 200 épocas.
Corroborando en los resultados mostrados en la Figura7 donde los resultados finales
son iguales al target.
Figura 7. Resultados en 200 épocas
Tarea3
Realizar el algoritmo de aprendizaje por descenso de gradiente para XOR
Para realizar el algoritmo de la compuerta XOR se crea 3 neuronas como se observa
en la Figura8.
Para el algoritmo se calculan los pesos de las dos entradas w1, w2, w3, w4 y los
pesos de las dos salidas correspondientes w5, w6 y el peso de los sesgos b0, b1, b2.
Las nets están definidas de la siguiente manera:
net=out 1∗w5+ out 2∗w 6+ b 2
net 1=¿ 1∗w 1+ ¿2∗w 3+ b 0
net 2=¿ 1∗w 2+ ¿ 2∗w 4+ b 1
Mediante aprendizaje “On line” el Error es:
1
E= e2
2
Donde:
e=targ−out
Las salidas de cada neurona están definidas:
out 1=sigmoide (net 1)
out 2=sigmoide(net 2)
out=sigmoide(net )
Y para el cálculo de los pesos tenemos que:
W i ( t+1 ) =W i (t ) +∆ W i (t)
Donde:
−η∗∂ E
∆ W i ( t )=
∂Wi
Para el cálculo de estos pesos se realizan las derivadas parciales como se muestra a
continuación:
−η∗∂ E
∗∂ e
∂e
∗∂ out
∂ out
∗∂ net
∂net
∗∂ out 1
∂ out 1
∗∂ net 1
−η∗∂ E ∂ net 1
∆ b 0= =
∂b0 ∂b 0
−η∗∂ E
∗∂ e
∂e
∗∂ out
∂ out
∗∂ net
∂ net
∗∂ out 2
∂ out 2
∗∂ net 2
−η∗∂ E ∂ net 2
∆ b 1= =
∂ b1 ∂b 1
−η∗∂ E
∗∂ e
∂e
∗∂ out
∂ out
∗∂ net
−η∗∂ E ∂ net
∆ b 2= =
∂b2 ∂b2
−η∗∂ E
∗∂ e
∂e
∗∂ out
∂ out
∗∂ net
∂ net
∗∂ out 1
∂ out 1
∗∂ net 1
−η∗∂ E ∂ net 1
∆ W 1= =
∂W 1 ∂W 1
−η∗∂ E
∗∂ e
∂e
∗∂ out
∂ out
∗∂ net
∂ net
∗∂ out 2
∂ out 2
∗∂ net 2
−η∗∂ E ∂ net 2
∆ W 2= =
∂W 2 ∂W 2
−η∗∂ E
∗∂ e
∂e
∗∂ out
∂ out
∗∂ net
∂ net
∗∂ out 1
∂ out 1
∗∂ net 1
−η∗∂ E ∂ net 1
∆ W 3= =
∂W 3 ∂W 3
−η∗∂ E
∗∂ e
∂e
∗∂ out
∂ out
∗∂ net
∂ net
∗∂ out 2
∂ out 2
∗∂ net 2
−η∗∂ E ∂ net 2
∆ W 4= =
∂W 4 ∂W 4
−η∗∂ E
∗∂ e
∂e
∗∂ out
∂ out
∗∂ net
−η∗∂ E ∂ net
∆ W 5= =
∂W 5 ∂W 5
−η∗∂ E
∗∂ e
∂e
∗∂ out
∂ out
∗∂ net
−η∗∂ E ∂ net
∆ W 6= =
∂W 5 ∂W 6
Resolviendo las fracciones parciales tenemos las siguientes ecuaciones:
∆ b 0=−η∗( targ−out )∗−1∗(α∗out ( 1−out ) )∗W 5∗( α∗out 1 ( 1−out 1 ) )∗1
∆ b 1=−η∗( targ−out )∗−1∗(α∗out ( 1−out ))∗W 5∗(α∗out 2 ( 1−out 2 ) )∗1
∆ b 2=−η∗( targ−out )∗−1∗(α∗out ( 1−out ))∗1
∆ W 1=−η∗ (targ−out )∗−1∗( α∗out ( 1−out ) )∗W 5∗α∗out 1 ( 1−out 1 )∗¿ 1
∆ W 2=−η∗ ( targ−out )∗−1∗( α∗out ( 1−out ) )∗W 6∗α∗out 1 ( 1−out 1 )∗¿ 1
∆ W 3=−η∗( targ−out )∗−1∗(α∗out ( 1−out ))∗W 5∗out 2 ( 1−out 2 )∗¿ 2
∆ W 4=−η∗( targ−out )∗−1∗(α∗out (1−out ))∗W 6∗out 2 ( 1−out 2 )∗¿ 2
∆ W 5=−η∗( targ−out )∗−1∗( α∗out ( 1−out ))∗out 1
∆ W 6=−η∗( targ−out )∗−1∗( α∗out ( 1−out ) )∗out 2
Mediante el software MatLab se implementa el algoritmo para realizar el número de
épocas necesarias para que el error converja en 0.
%GradienteCompuertaXOR
n=0.5 %FACTOR DE APRENDIZAJE
in0=1; %SESGO
alfa=4;
b0=rand;b1=rand;b2=rand;w1=rand;w2=rand;w3=rand;w4=rand;w5=rand;w6=rand;
p=[0 0;0 1;1 0;1 1];
targ=[ 0 1 1 0];
errorv=[]; epocav=[];
for epoca=[Link] %EPOCAS
Error=0;
for i=[Link]
in1=p(i,1);
in2=p(i,2);
net1=in1*w1+in2*w2+b0;
net2=in1*w3+in2*w4+b1;
out1=sigmoidev(net1,alfa);
out2=sigmoidev(net2,alfa);
net=out1*w5+out2*w6+b2;
out=sigmoidev(net,alfa);
e=targ(i)-out;
deltab0=-n*e*(-
1)*dersigmoidev(net,alfa)*w5*dersigmoidev(net1,alfa)*1;
deltab1=-n*e*(-
1)*dersigmoidev(net,alfa)*w5*alfa*dersigmoidev(net2,alfa)*1;
deltab2=-n*e*(-1)*alfa*out*(1-out)*1;
deltaw1=-n*e*(-
1)*dersigmoidev(net,alfa)*w5*dersigmoidev(net1,alfa)*in1;
deltaw2=-n*e*(-
1)*dersigmoidev(net,alfa)*w6*dersigmoidev(net1,alfa)*in1;
deltaw3=-n*e*(-
1)*dersigmoidev(net,alfa)*w5*dersigmoidev(net2,alfa)*in2;
deltaw4=-n*e*(-
1)*dersigmoidev(net,alfa)*w6*dersigmoidev(net2,alfa)*in2;
deltaw5=-n*e*(-1)*dersigmoidev(net,alfa)*out1;
deltaw6=-n*e*(-1)*dersigmoidev(net,alfa)*out2;
%Actualizacion de Pesos
b0=b0+deltab0;
b1=b1+deltab1;
b2=b2+deltab2;
w1=w1+deltaw1;
w2=w2+deltaw2;
w3=w3+deltaw3;
w4=w4+deltaw4;
w5=w5+deltaw5;
w6=w6+deltaw6;
Error=Error+(targ(i)-out)^2;
end
errorv=[errorv Error];
epocav=[epocav epoca];
plot(epocav,errorv)
grid on
title('Evolucion del error por época')
end
for i=1:4
in1=p(i,1);
in2=p(i,2);
out=hardlim(w1*p(i,1)+w2*p(i,2));
outf(i)=out;
end
outf
targ
Se obtiene la evolucion del error mostrada en la siguiente Figura
Evolucion del error por época
2.5
1.5
0.5
0
0 50 100 150 200 250 300 350 400 450 500
Y se obtiene los siguientes valores:
b0=-0.3198
b1=0.6357
b2=-0.3754
w1=2.1450
w2=1.4320
w3=1.8250
w4=-0.7923
w5=1.7372
w6=-1.3050