miércoles, 6 de agosto de 2014

Mejoras al aprendizaje del perceptrón multicapa mediante retropropagación. Momento en variación de pesos


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 b


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 b
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');