matlab 实现梯度下降法(GradientDescent )的⼀个例⼦
在此记录使⽤matlab 作梯度下降法(GD)求函数极值的⼀个例⼦:
问题设定:
1. 我们有⼀个n 个数据点,每个数据点是⼀个d 维的向量,向量组成⼀个data 矩阵X ∈R n ×d ,这是我们的输⼊特征矩阵。
2. 我们有⼀个响应的响应向量y ∈R n 。
3. 我们将使⽤线性模型来fit 上述数据。因此我们将优化问题形式化成如下形式:
arg min w f (w )=1n ‖y −¯
X w ‖22
其中¯X =(1,X )∈R n ×(d +1) and w =(w 0,w 1,...,w d )⊤∈R d +1
显然这是⼀个回归问题,我们的⽬标从通俗意义上讲就是寻合适的权重向量w ,使得线性模型能够拟合的更好。
预处理:
1. 按列对数据矩阵进⾏最⼤最⼩归⼀化,该操作能够加快梯度下降的速度,同时保证了输⼊的数值都在0和1之间。x i 为X 的第i 列。
z ij ←
x ij −min (x i )
max (x i )−min (x i ) 这样我们的优化问题得到了转化:
arg min
u g (w )=1n ‖y −¯
Z u ‖22 2. 考虑对⽬标函数的Lipschitz constants 进⾏估计。因为我们使⽤线性回归模型,Lipschitz constants 可以⽅便求得,这样便于我们在梯度下降法是选择合适的步长。假如⾮线性模型,可能要⽤其他⽅法进⾏估计(可选)。
问题解决: 使⽤梯度下降法进⾏问题解决,算法如下:
我们可以看到,这⾥涉及到求⽬标函数f 对x k 的梯度。显然在这⾥,因为是线性模型,梯度的求解⼗分的简单:
∇f (x k )=−2
n ¯X ⊤(y −¯
X u k )
进⾏思考,还有没有其他办法可以把这个梯度给弄出来?假如使⽤Tensorflow ,Pytorch 这样可以⾃动保存计算图的东东,那么梯度是可以由机器⾃动求出来的。当然在这⾥我是⽤matlab 实现,暂时没有发
现这样的利器,所以我认为假如在这⾥想求出梯度,那么我们必须要把梯度的闭式解搞出来,不然没法继续进⾏。
下⾯是⼀段matlab 的代码:
function [g_result,u_result] = GD(N_Z,y,alpha,u0)
%GD 梯度下降法
% Detailed explanation goes here
[n,~] = size(N_Z);
u = u0;
k = 0;
t = y-N_Z*u;
disp("g(u):");
while(合理的终⽌条件)
k = k + 1;
u = u - alpha * (-2/n)*N_Z'*t;
t = y-N_Z*u;
if(mod(k,10)==0)
disp(t'*t/n);
end
end
g_result = (y-N_Z * u)' * (y-N_Z * u)/n;
u_result = u;
end
当然假如初始化的时候u 0选择不当,⽽且因为没有正则项,以上的算法将会有很⼤的问题:梯度消失,
导致优化到最后的时候⾮常慢。我花了好多个⼩时才将loss 讲到0.19左右,⽽闭式解法能够使得loss 为0.06⼏,运⾏时间也不会难以忍受。
正则化损伤识别matlab 问题推⼴:
在这⾥,我们的问题是线性模型,回归问题。能否有更⼴的应⽤?思考后认为,只要需要优化的⽬标是标量,且该⽬标函数对输⼊向量的梯度容易求得即可。只是因为该算法简单朴素,可能在实际应⽤的时候会碰见恼⼈的梯度消失问题。
Processing math: 100%
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论