随机梯度下降实现 - MATLAB
Posted
技术标签:
【中文标题】随机梯度下降实现 - MATLAB【英文标题】:Stochastic gradient Descent implementation - MATLAB 【发布时间】:2011-07-04 07:00:27 【问题描述】:我正在尝试在 MATLAB 中实现“Stochastic gradient descent”。我完全遵循了算法,但我得到了一个非常非常大的 w (系数)用于预测/拟合函数。我的算法有错误吗?
算法:
x = 0:0.1:2*pi // X-axis
n = size(x,2);
r = -0.2+(0.4).*rand(n,1); //generating random noise to be added to the sin(x) function
t=zeros(1,n);
y=zeros(1,n);
for i=1:n
t(i)=sin(x(i))+r(i); // adding the noise
y(i)=sin(x(i)); // the function without noise
end
f = round(1+rand(20,1)*n); //generating random indexes
h = x(f); //choosing random x points
k = t(f); //chossing random y points
m=size(h,2); // length of the h vector
scatter(h,k,'Red'); // drawing the training points (with noise)
%scatter(x,t,2);
hold on;
plot(x,sin(x)); // plotting the Sin function
w = [0.3 1 0.5]; // starting point of w
a=0.05; // learning rate "alpha"
// ---------------- ALGORITHM ---------------------//
for i=1:20
v = [1 h(i) h(i).^2]; // X vector
e = ((w*v') - k(i)).*v; // prediction - observation
w = w - a*e; // updating w
end
hold on;
l = 0:1:6;
g = w(1)+w(2)*l+w(3)*(l.^2);
plot(l,g,'Yellow'); // drawing the prediction function
【问题讨论】:
【参考方案1】:如果你使用太大的学习率,SGD 很可能会发散。 学习率应该收敛到零。
【讨论】:
【参考方案2】:通常,如果 w 以太大的值结束,则存在过度拟合。我并没有真正仔细查看您的代码。但我认为,您的代码中缺少的是适当的正则化术语,它可以防止训练过度拟合。另外,这里:
e = ((w*v') - k(i)).*v;
这里的v不是预测值的梯度,不是吗?根据算法,您应该更换它。让我们看看这样做之后会是什么样子。
【讨论】:
以上是关于随机梯度下降实现 - MATLAB的主要内容,如果未能解决你的问题,请参考以下文章
随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比实现对比