如果海森矩阵 在所有可能的参数值上都是正定 的,则该函数是凸的;函数将呈现为光滑的碗状,使得训练过程相对简单。存在单 一的全局最小值,不会有局部最小值或鞍点。
沿着梯度方向,函数变化最快。
x,y点的更新:x和y每次更新一点点,z根据公式可以计算出一个新的坐标点,但新的z不一定落在f(x,y)上,除非x,y的变化非常非常小。为了演示梯度的方向,我们将变化调大一些。
原理:
如果进行梯度下降,可以找到全局最优点。
程序:梯度下降版
Matlab
clear;
syms x y;
z= x^2+y^2; % 定义函数
u=linspace(-10,10,100);
v=linspace(-10,10,100);
[U,V]=meshgrid(u,v);
z_value = subs(z, {x, y}, {U, V});
plot3(U,V,z_value,'g')
xlabel('X')
ylabel('Y')
zlabel('Z')
hold on;
dz_dx=diff(z,x);
dz_dy=diff(z,y);
learning=0.01;
epoch = 200;
Init_x=10;
Init_y=10;
for i=1:epoch
dzx=subs(dz_dx,{x,y},{Init_x,Init_y});
dzy=subs(dz_dy,{x,y},{Init_x,Init_y});
z1=subs(z, {x, y}, {Init_x,Init_y});
New_x=Init_x-learning*dzx;
New_y=Init_y-learning*dzy;
New_z=z1-learning*dzy-learning*dzx;%绘制箭头使用
x1=[Init_x New_x];
y1=[Init_y New_y];
Z1=[z1 New_z];
if(mod(i,10)==0)
plot3(x1,y1,Z1,'r-')
scatter3(New_x,New_y,New_z,'b>')
hold on;
end
Init_x=New_x;
Init_y=New_y;
end
程序:显示梯度方向版
为了更好的让大家看每一次迭代的梯度方向,所以在这一版中绘制了梯度的方向。
Matlab
clear;
syms x y;
z= x^2+y^2; % 定义函数
u=linspace(-10,10,100);
v=linspace(-10,10,100);
[U,V]=meshgrid(u,v);
z_value = subs(z, {x, y}, {U, V});
plot3(U,V,z_value,'g')
xlabel('X')
ylabel('Y')
zlabel('Z')
hold on;
dz_dx=diff(z,x);
dz_dy=diff(z,y);
learning=0.01;
epoch = 200;
Init_x=10;
Init_y=10;
for i=1:epoch
dzx=subs(dz_dx,{x,y},{Init_x,Init_y});
dzy=subs(dz_dy,{x,y},{Init_x,Init_y});
z1=subs(z, {x, y}, {Init_x,Init_y});
New_x=Init_x-learning*dzx;
New_y=Init_y-learning*dzy;
%New_z=z1-learning*dzy-learning*dzx;%绘制箭头使用
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%梯度方向绘制
if(mod(i,10)==0)
New_x1=Init_x-3;
New_y1=Init_y-3;
New_z1=z1-3*dzy-3*dzx;
x1=[Init_x New_x1];
y1=[Init_y New_y1];
Z1=[z1 New_z1];
plot3(x1,y1,Z1,'r-')
scatter3(New_x1,New_y1,New_z1,'b>')
hold on;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Init_x=New_x;
Init_y=New_y;
end