UNIVERSIDAD DE FUERZAS ARMADAS “ESPE” DEPARTAMENTO DE ELÉCTRICA Y ELECTRÓNICA ASIGNATURA: CONTROL INTELIGENTE Actividad No8. Aprendizaje del perceptrón multicapa mediante retropropagación del error Fecha: Nombre alumno: NRC: 1. Dibuje un perceptrón multicapa con 2 entradas, 2 neuronas escondidas y una neurona de salida. En el perceptrón de capa simple existen ciertos problemas que no pueden ser resueltos por éstos, una compuerta XOR no puede ser implementada con un perceptrón de capa simple Es necesario añadir a cada una de las entradas de éste, un par de perceptrones adicionales, que apoyen en el proceso de aprendizaje de la red. Este nuevo par de perceptrone, se constituye en una segunda capa de perceptrones 1 Net 1 a01 ∑ ʃ 1 y1 a11 b0 x1 b1 a21 ∑ a12 Net 2 1 ∑ ʃ Z b2 x2 a21 ʃ y2 a02 Figura 1. Estructura de una red neuronal multicapa. 2. Escriba las fórmulas de actualización de cada uno de los pesos de conexión entre las neuronas de la capa oculta y la capa de salida. Utilice la nomenclatura del ejercicio 1. Partiendo de los conceptos matemáticos empleados para implementar al perceptrón de capa simple, y sabiendo que la función de activación es la función sigmoide. ( ( ( ) ) ) ( ( Página 1 ( ) ) ) 3. Escriba las fórmulas de actualización de cada uno de los pesos de conexión entre las entradas y las neuronas de la capa oculta. Utilice la nomenclatura del ejercicio 1. ( ) ( ) ( ) ( ( ( ) ( ) ( ( ( ( ) )( ) ) ) ( ) ( ) )( ( ( ( ) ) ) ) ) ( ( ( ) ) ) 4. Escriba el programa para realizar el aprendizaje por retropropagación del error para que la red neuronal del ejercicio 1 aprenda a partir de los patrones de entrenamiento de una compuerta XOR. Considere un factor de aprendizaje de 0.1; alfa=4. Grafique la curva de aprendizaje. Considere aprendizaje en línea (ejemplo por ejemplo). Grafique las líneas de frontera de la red neuronal de acuerdo a lo realizado en la actividad 7. clc;clear all; % entradas compuerta entradas XOR % in1(1)=0; in2(1)=0; in1(2)=0; in2(2)=1; in1(3)=1; in2(3)=0; in1(4)=1; in2(4)=1; % Salidas buscadas en la compuerta XOR (targets) targ = [0;1;1;0]; % Los pesos se incializan de forma aleatoria a01=rand(1);a11=rand(1); a12=rand(1);a02=rand(1); a21=rand(1); a22=rand(1); b0=rand(1); b1=rand(1); b2=rand(1); % Coeficiente de aprendizaje n = 0.25; alfa=4; Error_Epoca = zeros(50,1); epocas=input('Numero de epocas '); for j = 1 : epocas Suma_Error = 0; for i = 1:length(targ) Página 2 %--------------------------------------------------------------------% CAPA OCULTA %--------------------------------------------------------------------%net1 net1 = a01*1 + a11*in1(i) + a21*in2(i); y1 = 1./(1+exp(-alfa*net1)); % 2da Neurona - NET2 net2 = a02*1 + a22*in2(i) + a12*in1(i); y2 = 1./(1+exp(-alfa*net2)); %--------------------------------------------------------------------% CAPA SALIDA %--------------------------------------------------------------------% Capa de salida net = b0*1 + b1*y1 + b2*y2; z = 1./(1+exp(-alfa*net)); % Calculo de error error = 1/2*(targ(i)-z)^2; Suma_Error = Suma_Error + error; % Actualización de pesos capa salida Db0 = n*(targ(i)-z)*alfa*z*(1-z); Db1 = n*(targ(i)-z)*alfa*z*(1-z)*y1; Db2 = n*(targ(i)-z)*alfa*z*(1-z)*y2; % Actualización de pesos Da01 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b1*y1*(1-y1); Da11 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b1*y1*(1-y1)*in1(i); Da12 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b2*y2*(1-y2)*in1(i); Da02 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b2*y2*(1-y2); Da21 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b1*y1*(1-y1)*in2(i); Da22 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b1*y1*(1-y1)*in2(i); b0 = b0 + b1 = b1 + b2 = b0 + a01 = a01 a11 = a11 a12 = a12 a02 = a02 a21 = a21 a22 = a22 Db0; Db1; Db2; + Da01; + Da11; + Da12; + Da02; + Da21; + Da22; end Error_Epoca(j) = Suma_Error; end figure(1); plot(Error_Epoca); title('ERROR VS EPOCAS'); Página 3 [x y] = meshgrid(0:0.01:1.5,0:0.01:1.5); net1 = a01*1 + a11*x + a21*y; y1 = 1./(1+exp(-alfa*net1)); net2 = a02*1 + a22*x + a12*y; y2 = 1./(1+exp(-alfa*net2)); net = b0*1 + b1*y1 + b2*y2; z = 1./(1+exp(-alfa*net)); figure(2) subplot(121); mesh(x,y,z); title('SALIDA DE LA RED NEURONAL'); subplot(122); mesh(x,y,round(z)); title('LINEA DE FRONTERA'); A continuación se tienes la salidas del programa en la figura 2 de observa como el error va disminuyendo según el número de épocas para este ejemplo ponemos 1000 épocas y el error se redice casi a cero. Figura 2. Gráfica de error vs épocas. En la figura 3 se observa la salida de la red multicapa en forma de 3D donde el color rojo y azul muestran que existieron cambias a la salida de red, es decir que, se puede considerar que este método de usar más de una neurona es el adecuado para obtener una salida como la compuerta xor. Página 4 Figura 3. Gráfica de salida de la neurona. 5. Repita el numeral 4 pero con aprendizaje en paquete (“batch”). Grafique las líneas de frontera de la red neuronal de acuerdo a lo realizado en la actividad 7. Para el aprendizaje en paquete se han aumentado variables auxiliares para que la actualización de los pesos sea al finalizar cada época. for j = 1 : epocas Suma_Error = 0; ax_a01 = 0; ax_a11 = 0; ax_a12 = 0;ax_a02 = 0; ax_a21 = 0; ax_a22 = 0; ax_b0 = 0; ax_b1 = 0; ax_b2 = 0; for i = 1: length(targ) %--------------------------------------------------------------------% CAPA OCULTA %--------------------------------------------------------------------%net1 net1 = a01*1 + a11*in1(i) + a21*in2(i); y1 = 1./(1+exp(-alfa*net1)); % 2da Neurona - NET2 net2 = a02*1 + a22*in2(i) + a12*in1(i); y2 = 1./(1+exp(-alfa*net2)); %--------------------------------------------------------------------% CAPA SALIDA %--------------------------------------------------------------------% Capa de salida net = b0*1 + b1*y1 + b2*y2; z = 1./(1+exp(-alfa*net)); % Calculo de error error = 1/2*(targ(i)-z)^2; Suma_Error = Suma_Error + error; Página 5 % Actualización de pesos Da01 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b1*y1*(1-y1); Da11 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b1*y1*(1-y1)*in1(i); Da12 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b2*y2*(1-y2)*in1(i); Da02 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b2*y2*(1-y2); Da21 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b1*y1*(1-y1)*in2(i); Da22 = n*(targ(i)-z)*(alfa^2)*z*(1-z)*b1*y1*(1-y1)*in2(i); % Actualización de pesos capa salida Db0 = n*(targ(i)-z)*alfa*z*(1-z); Db1 = n*(targ(i)-z)*alfa*z*(1-z)*y1; Db2 = n*(targ(i)-z)*alfa*z*(1-z)*y2; ax_a01 ax_a11 ax_a12 ax_a02 ax_a21 ax_a22 = = = = = = ax_a01 ax_a11 ax_a12 ax_a02 ax_a21 ax_a22 + + + + + + Da01; Da11; Da12; Da02; Da21; Da22; ax_b0 = ax_b0+Db0; ax_b1 = ax_b1+Db1; ax_b2 = ax_b2+Db2; end a01 = a01 a11 = a11 a12 = a12 a02 = a02 a21 = a21 a22 = a22 b0 = b0 + b1 = b1 + b2 = b2 + + ax_a01; + ax_a11; + ax_a12; + ax_a02; + ax_a21; + ax_a22; ax_b0; ax_b1; ax_b2; Error_Epoca(j) = Suma_Error; end En la figura 4 muestra el resultado de este nuevo algoritmo en el cual se observa que con menos época se consigue eliminar el error con lo cual se puede decir que este algoritmo se torna eficiente en comparación al anterior. Página 6 Figura 4. Error vs Epocas. En la figura 5 se conserva la respesta del nuevo algoritmo en la cual se mustra que cumple ya que mustra los cambias que hay a las salida de la red neuronal multicapa. Figura 5. Gráfica de salida de la neurona. Yo Diego Soria afirmo que esta actividad es de mi autoría y establezco que para la elaboración de la misma he seguido los lineamientos del Código de Ética de la Universidad de las Fuerzas Armadas ESPE Página 7