梯度 & 梯度下降算法
先看下定义比较合适:
在向量微积分中,标量场的梯度是一个向量场。标量场中某一点上的梯度指向标量场增长最快的方向,梯度的长度是这个最大的变化率。
一个标量函数的梯度记为:或者
表示微分算子。
在三维直角坐标系中为:
在单变量的情况下,梯度只是个导数,对于一个线性函数,梯度就是个斜率。
梯度下降算法是一个最优化算法,通常也称为最速下降法。顾名思义:沿着梯度下降的方向求解最小值,或者沿着梯度上升的方向求解最大值。
迭代的公式为:
其中代表梯度负方向,
表示梯度方向的搜索步长。
梯度方向可以通过对函数求导得到。
因为一般情况下,梯度向量为0的话说明是到了一个极值点,此时梯度的幅值也为0,而采用梯度下降算法进行最优化求解时,算法迭代的终止条件是梯度向量的幅值接近0即可,可以设置个非常小的常数值。
话说到这里,一般情况下就该举个例子了。
———————————下边是例子————————————————————-
求函数的最小值
利用梯度下降法解题步骤:
1. 求梯度,
2. 向梯度相反的方向移动,
,其中
为步长。如果步长足够小,则可以保证每一次迭代都在减小,但可能导致收敛太慢,但是如果步长太大的话,则不能保证每一次迭代都减少,也不能保证收敛。
3. 循环迭代步骤2,知道的值变化到使得
在两次迭代之间的差值足够小,比如0.000000001,也就是说,知道两次迭代计算出来的
基本没有变化,则说明此时
已经达到局部最小值。
4. 此时,输出,这个
就是使得函数
最小时的
取值。
MATLAB演示代码如下:
%%梯度下降法
%设置步长为0.1,f_change为改变前后的y值的变化,仅设置了一个退出条件。
function tidu=tidu()
syms x;f=x^2;
step=0.1;x=2;k=0;%设置步长,初始值,迭代记录数
f_change=x^2; %初始化差值
f_current=x^2 ; %计算当前函数值
ezplot(@(x,f)f-x^2);%画出函数图像
axis([-2,2,0,4]); %固定坐标值
hold on
while f_change>0.000000001
x=x-step*2*x;%-2x为梯度反方向,step为步长
f_change=f_current-x^2;%计算两次函数值之差
f_current=x^2;%重新计算当前的函数值
plot(x,f_current,'ro','markersize',7)%标记当前位置
drawnow;pause(1.0);
k=k+1;
end
hold off
fprintf('在迭代%d次后找到函数最小值为%e,对应的x值为%e\n',k,x^2,x);
end