Introducción. El momento es una aproximación de promediado que provee estabilidad
cuando se alcanzan los pesos óptimos en el aprendizaje. Este método toma en
cuenta el promedio de los cambios pasados (en los pesos) en el incremento de
peso, suavizando el cambio neto de peso. La idea es usar el promedio
exponencial de todos los cambios de peso previos para guiar el cambio
actual. La expresión matemática de
cambio de peso para cada peso es:
Donde: u es el parámetro de momento que debe estar entre 0 y 1. La variación de wm-1 es el cambio de peso en la época previa. dmw es la gradiente promedio de todos los patrones de entrenamiento (batch)
para el peso w en la época m.
Utilice 1000 épocas, pesos
iniciales aleatorios, y derivada de sigmoide con offset de 0.1.
1. Complete el algoritmo de retropropagación “batch” para que el cambio en
los pesos de cada época contenga momento.
Presente los resultados para (factor
de aprendizaje, momento) de a) (0.2 0.01); b (0.2 0.5);c) (0.2 0.9)
Gráfico a |
Gráfico b |
Gráfico c |
2. Presente los resultados para (factor
de aprendizaje, momento) de a) (0.5 0.01); b) (0.5 0.5) c) (0.5 0.9)
Gráfico a |
Gráfico c |
3.
Presente los resultados para (factor
de aprendizaje, momento) de a) (5 0.01); b)(5 0.5); c) (0.5 0.98)
Gráfico a |
Gráfico c |
Programa:
x = 0:0.1:1;
target = zeros(1,length(x)) + 0.25;
target(5:7) = 0.75;
out = zeros(1,length(x));
%% pesos aleatorios
b0 = randn();
b1 = randn();
b2 = randn();
a = randn(2,2);
alpha = 8;
%% parámetros n_min, n_max, E_min
n = 5; %razon de aprendizaje
epoca = 1000;
u = 0.98; %momento
Error = zeros(1,epoca);
%% Red neuronal
delta_b0 = 0;
delta_b1 = 0;
delta_b2 = 0;
delta_a11 = 0;
delta_a21 = 0;
delta_a12 = 0;
delta_a22 = 0;
for j = 1:epoca
MSE = 0;
d_b0 = 0;
d_b1 = 0;
d_b2 = 0;
d_a11 = 0;
d_a21 = 0;
d_a12 = 0;
d_a22 = 0;
for i =
1:length(x)
%%
Formar un patron de entrenamiento
u1 =
a(1,1) + x(i) * a(2,1);
u2 =
a(1,2) + x(i) * a(2,2);
y1 =
1/(1+exp(-alpha*u1));
y2 =
1/(1+exp(-alpha*u2));
%%
Calcular out de la red
z = b0 + b1.*y1 + b2.*y2;
out(i) = z;
%% Calcular d_w, a_d_w, MSE
d_b0 = d_b0 - (target(i)-z);
d_b1 = d_b1 - (target(i)-z) * y1;
d_b2 = d_b2 - (target(i)-z) * y2;
d_a11 = d_a11 - (target(i)-z) * b1 *
(alpha * y1 * (1-y1) + 0.1);
d_a21 = d_a21 - (target(i)-z) * b1 *
(alpha * y1 * (1-y1) + 0.1) * x(i);
d_a12 = d_a12 - (target(i)-z) * b2 *
(alpha * y2 * (1-y2) + 0.1);
d_a22 = d_a22 - (target(i)-z) * b2 *
(alpha * y2 * (1-y2) + 0.1) * x(i);
MSE = MSE + (target(i)-z)^2;
end
Error(j) =
MSE;
delta_b0 =
u * delta_b0 - (1-u) * n * d_b0;
delta_b1 =
u * delta_b1 - (1-u) * n * d_b1;
delta_b2 =
u * delta_b2 - (1-u) * n * d_b2;
delta_a11 =
u * delta_a11 - (1-u) * n * d_a11;
delta_a21 =
u * delta_a21 - (1-u) * n * d_a21;
delta_a12 =
u * delta_a12 - (1-u) * n * d_a12;
delta_a22 =
u * delta_a22 - (1-u) * n * d_a22;
b0 = b0 +
delta_b0;
b1 = b1 +
delta_b1;
b2 = b2 +
delta_b2;
a(1,1) =
a(1,1) + delta_a11;
a(2,1) =
a(2,1) + delta_a21;
a(1,2) =
a(1,2) + delta_a12;
a(2,2) =
a(2,2) + delta_a22;
end
figure(1)
plot(Error);
xlabel('Épocas');
ylabel('Error Cuadrático Medio');
title('Aprendizaje
de la red');
figure(2)
plot(x,out);
hold on;
plot(x,target,'r');
xlabel('Tiempo');
ylabel('Amplitud');
title('Salida
de la red');