Aprendizaje profundo (2), finalmente comprenda el principio del aprendizaje profundo: el principio de realización del algoritmo de optimización SPGD (SGD)

El principio de realización del algoritmo de optimización SPGD:

Este editor no es realmente muy fácil de usar. . .
El algoritmo SGD se usa ampliamente en varios algoritmos de modelo de optimización de aprendizaje profundo. En los últimos días, finalmente se entendió el principio de optimización del algoritmo. Primero, asumimos
una función y = 2x-1, correspondiente a
x = 1, 2 , 3, 4,5,6,7,8,9
y = 1,3,5,7,9,11,13,15,17
Pero si no sabemos la relación matemática correspondiente a la función, pero solo el valor de x,y, ¿Cómo dejar que la computadora calcule la función matemática de este modelo y prediga el valor cuando x = 20?
El código está al final. .


Principio del algoritmo SPGD:

Primero construye el modelo, asumiendo que esta función es una ecuación cuadrática en una variable: y = a x x + b x + c; y a = 1, b = 1, c = 1; luego obtenemos dos curvas, que son como entre
inserte la descripción de la imagen aquí
ellos, La curva roja corresponde a y = 2x-1,
la curva negra corresponde a y = x
x+x+1,
lo que tenemos que hacer es acercar el modelo a los datos existentes modelo real y = 2x -1;
primero genero aleatoriamente algunos decimales, como [0.1,0.2,0.3]; (el número aleatorio es diferente cada vez)
y luego [1,1,1], primero sumo el número aleatorio y luego resto el número aleatorio para obtener
y = 1.1 x x +1.2 x+1.3;
y y = 0.9x
x+0.8x+0.7;
dos curvas de funciones, y luego restar y = 2x-1 de la unidad (debe ser [x = 1, 2,3,4,5, 6, 7, 8, 9; y = 1, 3, 5, 7, 9, 11, 13, 15, 17] Los valores se incorporan al cálculo por turno, aquí para facilitar la comprensión, use la función y = 2x-1 en su lugar); Obtenga:
y = 1.1 x x-0.8 x+0.3;
y y = 0.9x
x-1.2x-0.3;
Finalmente, encuentre la desviación estándar de estas dos funciones (de hecho, la desviación estándar se usa como estándar de evaluación, cuanto menor sea la desviación estándar, la prueba Cuanto más cerca del valor real)
use la diferencia de dos desviaciones estándar para multiplicar [0.1, 0.2, 0.3]; entonces suma [1,1,1], obtiene un nuevo coeficiente polinomial;
Por ejemplo, [0.8, 1.3, 0.9] y luego ingrese el polinomio para obtener la función:
y = 0.8x*x+1.3x+0.9;
cicle nuevamente, después de múltiples cálculos, la curva calculada estará cada vez más cerca de la datos reales; por ejemplo, después de 5 optimizaciones, registré los resultados de cada optimización como se muestra en la figura a continuación:
inserte la descripción de la imagen aquí
Como se muestra en la figura anterior, los resultados del cálculo del modelo de arriba a abajo se acercan cada vez más a los datos reales . Se puede ver que el proceso de optimización es convergente, y el proceso de cambio del coeficiente es como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí
Se puede ver que después de unas 15 veces de optimización, el resultado del cálculo que es muy cercano al valor real puede el resultado del cálculo puede referirse a la figura a continuación: todavía hay
inserte la descripción de la imagen aquí
errores de optimización obvios Sí, esto se debe a que el valor del número aleatorio que configuré es demasiado grande y el número de optimizaciones es muy pequeño. Si la configuración es más pequeña , o el número de optimizaciones es mayor, puede lograr una mayor precisión.
Además, considerando que el modelo de optimización que establecí es una función cuadrática, el efecto de optimización será mucho peor, y si es una función de una sola vez, será muy alto. Como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí
La función optimizada aquí es y = 2x-0.9524;
cuando se usa esta función para predecir x = 20, y = 39.0476; está muy cerca del resultado del cálculo teórico de 39.


resumen:

En este punto, apenas lo aprendí y, sin saberlo, completé el proceso de optimización del modelo de algoritmo de aprendizaje profundo y también hice una predicción de datos simple.
Luego aprenda y registre la red neuronal convolucional. Adjuntemos el código más tarde. Lo escribí en MATLAB. Puede intentarlo nuevamente con Python más tarde.


El primero es el modelo de optimización cuadrática.

% 
clc;clear;                % 初始化
close all;

x = 1:1:15;               % 横坐标
y = 2*x+1;                % 纵坐标

len = length(x);          % 数据长度
coe_last = [1,1,1];       % 初始多项式系数

step = 0.1;               % 优化步长
amp = 0.1;                % 扰动系数
cal_last = coe_last(1)*x.^2+coe_last(2)*x+coe_last(3);   % 初始系数的函数曲线

figure,subplot(2,1,1),plot(x,y,'r');                     % 绘图函数
hold on,plot(x,cal_last,'k');
title('Before Optimize');
legend('Ideal curve','hypothesis curve');

% 循环优化
for i = 1:100
    wg = amp*wgn(1,3,1);                                 % 扰动量
    coe_add = coe_last+wg;                               % 原始系数+扰动量
    cal_add = coe_add(1)*x.^2+coe_add(2)*x+coe_add(3);   % 原始系数+扰动量的函数曲线
    error_add = std(y-cal_add);                          % 计算加系数后的标准差
    coe_sub = coe_last-wg;                               % 原始系数-扰动量
    cal_sub = coe_sub(1)*x.^2+coe_sub(2)*x+coe_sub(3);   % 原始系数-扰动量的函数曲线
    error_sub = std(y-cal_sub);                          % 计算减系数后的标准差
    error_e = (error_add-error_sub)*step*wg;             % 计算每各系数优化量
    coe_last = coe_last-error_e;                         % 更新多项式系数
end

cal = coe_last(1)*x.^2+coe_last(2)*x+coe_last(3);        % 计算优化后函数曲线
subplot(2,1,2),plot(x,y,'r');                            % 绘图函数
hold on,plot(x,cal,'k');
title('After Optimize');
legend('Ideal curve','Optimize curve');

Entonces un modelo optimizado

clc;borrar;% inicializar
cerrar todo;

x = 1:1:15; % abscisa
y = 2*x+1; % ordenada

len = longitud (x); % longitud de datos
coe_last = [1,1]; % coeficiente polinomial inicial

step = 0.1; % tamaño de paso de optimización
amp = 0.1; % coeficiente de perturbación
cal_last = coe_last(1)*x+coe_last(2); % curva de función del coeficiente inicial

figure,subplot(2,1,1),plot(x,y,'r'); % 绘图函数
esperar,trazar(x,cal_last,'k');
title('Antes de Optimize');
legend('Curva ideal','curva de hipótesis');

% optimización de bucle
para i = 1:100
wg = amp*wgn(1,2,1); % perturbación
coe_add = coe_last+wg; % coeficiente original + perturbación
cal_add = coe_add(1)*x+coe_add(2); % coeficiente original + curva de perturbación
error_add = std(y-cal_add); % calcular la desviación estándar después de sumar el coeficiente
coe_sub = coe_last-wg; % coeficiente original - perturbación
cal_sub = coe_sub(1)*x+coe_sub( 2); % coeficiente original -curva de la función de perturbación
error_sub = std(y-cal_sub); % Calcula la desviación estándar
error_e = (error_add-error_sub) step wg; % Calcula la cantidad óptima de cada coeficiente
coe_last = coe_last- error_e; % actualiza el coeficiente del polinomio
final

cal = coe_last(1)*x+coe_last(2); % calcular la curva de función optimizada
subplot(2,1,2),plot(x,y,'r'); % dibujar función
retener,plot(x, cal,'k');
title('Después de optimizar');
legend('Curva ideal','Curva optimizada');

Supongo que te gusta

Origin blog.csdn.net/ruredfive/article/details/118118094
Recomendado
Clasificación