随机梯度下降法 (Stochastic Gradient Descent,SGD) 是一种梯度下降法的变种,用于优化损失函数并更新模型参数。与传统的梯度下降法不同,SGD每次只使用一个样本来计算梯度和更新参数,而不是使用整个数据集。这种随机性使得SGD在大型数据集上更加高效,因为它在每次迭代中只需要处理一个样本。
以下是关于随机梯度下降法的详细描述:
然而,由于随机性的引入,SGD的参数更新可能会更加不稳定,因此学习率的选择变得尤为重要。为了解决这个问题,有一些SGD的变种,如Mini-batch SGD,它在每次迭代中使用小批量的样本来计算梯度。这样可以在保持高效性的同时减小参数更新的方差。
对于给出的函数
f
(
x
)
f(x)
f(x) :
f
(
x
)
=
x
(
1
)
2
+
x
(
2
)
2
?
2
?
x
(
1
)
?
x
(
2
)
+
sin
?
(
x
(
1
)
)
+
cos
?
(
x
(
2
)
)
f(x)=x(1)^2+x(2)^2-2 \cdot x(1) \cdot x(2)+\sin (x(1))+\cos (x(2))
f(x)=x(1)2+x(2)2?2?x(1)?x(2)+sin(x(1))+cos(x(2))
% 定义目标函数
f = @(x) x(1)^2 + x(2)^2 - 2*x(1)*x(2) + sin(x(1)) + cos(x(2));
% 定义目标函数的梯度
grad_f = @(x) [2*x(1) - 2*x(2) + cos(x(1)); 2*x(2) - 2*x(1) - sin(x(2))];
% 设置参数
learning_rate = 0.01;
max_iterations = 1000;
tolerance = 1e-6;
% 初始化起始点
x = [0; 0];
% 随机梯度下降
for iteration = 1:max_iterations
% 随机选择一个样本
i = randi(2);
% 计算梯度
gradient = grad_f(x);
% 更新参数
x = x - learning_rate * gradient;
% 检查收敛性
if norm(gradient) < tolerance
break;
end
end
% 显示结果
fprintf('Optimal solution: x = [%f, %f]\n', x(1), x(2));
fprintf('Optimal value of f(x): %f\n', f(x));
fprintf('Number of iterations: %d\n', iteration);