最近在搞论文,需要用梯度下降算法求解,所以重新整理分享在这里。主要包括梯度介绍、公式求导、学习速率选择、代码实现。
梯度下降的性质:
1.求得的解和选取的初始点有关
2.可以保证找到局部最优解,因为梯度最终会减小为0,即步长会自动越来越小。
假设要学习这么一个函数:
那么损失函数可以定义成:
像这种优化问题有很多方法,那咱们先直接求导吧,对于求导过程,好多还是不理解,可以用这种方法:
首先定义损失变量:
那么损失函数就可以表示成:
一步一步的求导:
再求:
那么把分步骤合起来就是:
可以用最小二乘或者梯度下降来求解,这里我们看看梯度下降的实现,梯度下降的思想不难,只要确定好梯度以及梯度的方向就ok,因为是梯度的反方向去下降,所以在对参数更新的时候要注意:
下降速率可以从0.01开始尝试,越大下降越快,收敛越快。当然下降的速率可以改成自适用的,就是根据梯度的强弱适当调整步伐,这样效果还好一点儿。
clc; clear % load data heart_scale = load(‘heart_scale‘); X = heart_scale.heart_scale_inst; Y = heart_scale.heart_scale_label; epsilon = 0.0003; gamma= 0.0001; w_old=zeros(size(X,2),1);%参数初始值均设为0 k=1; figure(1); while 1 minJ_w(k) = 1/2 * (norm(X*w_old - Y))^2; w_new = w_old - gamma*(X‘*X*w_old - X‘*Y); fprintf(‘The %dth iteration, minJ_w = %f, \n‘,k,minJ_w(k)); if norm(w_new-w_old) < epsilon %这里采用两次迭代中优化目标是否变化来判定是否收敛,也可以通过判定优化函数值是否变化来判定是否收敛 W_best = w_new; break; end w_old = w_new; k=k+1; end plot(minJ_w);%观察收敛性
梯度下降算法(Gradient Descent),布布扣,bubuko.com
原文地址:http://blog.csdn.net/u010367506/article/details/25081727