详解梯度下降法求解线性模型参数

有监督学习和无监督学习

机器学习,分为有监督学习和无监督学习。
有监督学习,就是有训练集,有label,我们是可以知道模型输出是什么样子的。而无监督学习,没有训练集,没有label,提前无法知道输出的样子。
有监督学习分为两种:回归和分类。模型输出若为连续变量,就是回归;模型输出为离散值,就是分类。
无监督学习常见的是聚类。给定一堆数据集,从中找出相似的类簇,这个过程没有label。

神经网络,深度学习,SVM和决策树,都是有监督学习。下面介绍的方法也只适用于有监督学习。

模型

机器学习最一般的模型就是下面这个图。
在这里插入图片描述
给定m个训练集,每个训练集有n个特征。训练集作为X输入给模型,经过训练后模型就是h(x)。
线性模型的求解,就是求解h(x)表达式的过程。

线性模型的表示

线性模型的表达式为

hθ(x)=θ0+θ1x1+θ2x2+…+θnxn

[1]
其中
x1~xn就是n个特征,作为模型的输入
θ0~θn,就是线性模型的n+1个参数

根据m个训练集,求解θ0θn的具体数值的过程,就是所谓的学习。求解线性模型,就是求其参数θ0θn的解。

线性模型求解思路

我们当然是希望求解出来的模型,预测值尽量逼近真实值。

为了更为直观的说明线性模型,以最简单的线性模型hθ(x)=θ0+θ1x为例,用下图表示,红色点为训练集。
在这里插入图片描述
图中有4(m)个训练集,h(x)是最终求得的模型。

我们希望模型的预测值与真实值之间的差别,尽量的小。用欧氏距离来表示:
J=(h(x(1))−y(1))2+(h(x(2))−y(2))2+(h(x(3))−y(3))2+(h(x(4))−y(4))2

[2]
其中 x(1),和y(1)表示第一个训练集的特征,和真实值

J 更一般的表达式为
在这里插入图片描述

[3]
这里的预测值与真实值之间的欧氏距离之和J,就是所谓的代价函数。找到能使代价函数最小值点的参数θ,就是线性模型的解。

代价函数

代价函数的定义如下

在这里插入图片描述

[4 ]
它的物理含义就是预测值与真实值之间的差别。差别越小,就说明我们的模型和真实模型越接近。代价函数J是其参数θ的二次函数。代价函数的表达式,就是均方差MSE(Mean Square Error)的定义。

这里还是用简化的线性模型来说明问题,另式[3]中的θ1=0和y(i)=1,可得代价函数的曲线为
在这里插入图片描述
这里把代价函数看成曲线,是最简单的情况。代价函数更多情况下是以多维曲面的形态出现的(曲面也有最低点)。

梯度下降法

图3中,代价函数的最小值是其导数为零的点。
在这里插入图片描述
在图中任意取一个θ值作为其初始值,然后不断迭代最终找到代价函数导数为0点(最小值)的过程,就是求解代价函数参数θ的过程(学习),也就是梯度下降法的物理含义。它的思想为,只要顺着梯度方向下降迭代,就能找到代价函数的最小值。

对于代价函数是多维曲面的情况,可以把曲面类比成山,想象梯度下降法就是从山上往下走,每一步顺着梯度方向,最终肯定就能走到山谷最低点。

无论是曲线还是曲面,会不会有多个局部最低点呢?答案是会的,梯度下降法很可能找不到真正的最低点,它可能只能找到局部最低点。

但好消息是,线性模型的代价函数,在数学上已经被证明为凸函数,即这种函数的局部最低点就是其最低点。所以我们在线性模型中用梯度下降思路求解最小值是没有问题的。

最小均方算法

最小均方算法``LMS(Least Mean Square)是梯度下降思想的具体实现,它是由Bernard Widrow和Marcian E. Hoff提出的,所以也叫Widrow-Hoff学习规则。

为什么叫最小均方呢,这是因为代价函数的表达式,就是均方差``MSE(Mean Square Error)的定义。

LMS算法是这样的

Repeat until convergence (for every j){
在这里插入图片描述
[5]
}(update θj simultaneously)

其中

			θj表示线性模型的某一个参数
			:=是赋值符号
			α表示学习速率
			convergence是收敛

它说明,为了求得任意一个参数θj的值,首先我们需要对θj取一个初值,然后顺着代价函数J的梯度方向( ∂/∂θj)不断迭代,直到θj的值收敛(即本次迭代和上次迭代的值为同一个),就找到了θj的值。

对每一个参数都一起进行这个迭代过程,就能求得每一个参数的值。不过这里要注意的是,要结束一轮迭代后,才对各个参数的值做更新。

这里要注意的是学习速率α,它会把梯度值放大。所以学习速率越大,寻找代价函数最小值过程中迭代的步长也就越大。

1.学习速率太大,有可能导致参数不收敛,或收敛到最后震荡较大
2.学习速率太小,则肯定会收敛,但收敛迭代次数会很大
3.一般情况下,每一次迭代后,梯度都会变小。所以即便学习速率是固定值,学习步长也会随着迭代次数增加而减小

代价函数的形状也与各个特征x的大小相关,为了让代价函数形状均衡,一般要对特征做归一化(比如-1)

最小均方算法的一般化表达推导

将代价函数的表达式[4]带入LMS算法式[5]中的α∂/∂θjJ(θ),用偏微分对表达式化简,可得
在这里插入图片描述
[6]
将线性模型的表达式[1]带入[6]中的∂/∂θj(h(x(i))−y(i))
在这里插入图片描述
[7]
所以,式[6]可简化为
在这里插入图片描述
[8]
将式[8]带入LMS算法表达式[5]中,可得LMS算法的一般化表达式为

Repeat until convergence (for every j){
在这里插入图片描述
[9]
}(update θj simultaneously)

参考

【1】Andrew NG. machine learning class at coursera

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 梯度下降是一种常见的数学优化方法,用于最小化一些目标函数。Matlab是一种常用的编程语言,用于数值计算及可视化。在Matlab中,可以通过编写代码实现梯度下降算法来求解目标函数的最小值。 梯度下降算法的基本思路是,找到目标函数的梯度(即方向导数)并将自变量沿着梯度方向移动一小步,直到达到目标函数的最小值。这个小步称为学习率。如果学习率太大,可能会导致算法无法收敛,如果学习率太小,可能会导致算法收敛速度太慢。因此,合适的学习率是非常重要的。 以下是一个简单的梯度下降Matlab代码的实现: ```matlab %初始化自变量和学习率 x = 5; lr = 0.01; %目标函数 function y = f(x) y = x^2 - 6*x + 8; end %计算梯度 function g = grad(x) g = 2*x - 6; end %梯度下降算法 while abs(grad(x)) > 1e-6 x = x - lr * grad(x); end %输出结果 fprintf('The optimal value of x is %.4f\n', x); fprintf('The optimal value of the objective function is %.4f\n', f(x)); ``` 这个代码首先定义了自变量x和学习率lr的初始值。然后定义了目标函数f和计算梯度的函数grad。在while循环中,采用梯度下降算法不断更新自变量x的值,直到梯度的绝对值小于某个阈值(本例中为1e-6)。最后输出了最优解和最小的目标函数值。 总而言之,梯度下降算法是一种数学优化方法,常用于最小化目标函数。在Matlab中,可以编写代码实现梯度下降算法来求解目标函数的最小值,需要注意学习率设置和算法的收敛性。 ### 回答2: 梯度下降算法是机器学习中常用的优化算法,可以根据损失函数的梯度来寻找最优解。在MATLAB中实现梯度下降算法可以分为以下几个步骤: 1.定义损失函数 在MATLAB中,可以通过定义一个函数来表示损失函数,例如: ``` function J = costFunction(X, y, theta) % Compute cost for linear regression m = length(y); % number of training examples J = 0; predictions = X*theta; sqrErrors = (predictions - y).^2; J = 1/(2*m) * sum(sqrErrors); end ``` 其中,X为特征矩阵,y为样本输出,theta为待求解参数,通过计算预测值与实际值的误差平方和来得到损失函数。 2.定义梯度函数 梯度函数表示损失函数对于每个参数的导数,即损失函数在当前参数值处的方向导数。在MATLAB中,可以定义一个函数来计算梯度值,例如: ``` function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) %GRADIENTDESCENT Performs gradient descent to learn theta % theta = GRADIENTDESCENT(X, y, theta, alpha, num_iters) updates theta by % taking num_iters gradient steps with learning rate alpha m = length(y); % number of training examples J_history = zeros(num_iters, 1); for iter = 1:num_iters predictions = X*theta; errors = predictions - y; delta = (1/m)*X'*errors; theta = theta - alpha * delta; J_history(iter) = costFunction(X, y, theta); end end ``` 其中,alpha表示学习率,num_iters表示迭代次数,通过迭代更新参数theta的值。 3.运行并可视化结果 在定义好损失函数和梯度函数之后,可以通过调用gradientDescent函数来得到参数估计值,例如: ``` initial_theta = zeros(size(X, 2), 1); num_iters = 1500; alpha = 0.01; [theta, J_history] = gradientDescent(X, y, initial_theta, alpha, num_iters); ``` 得到的theta就是我们需要的模型参数估计值,J_history则可以用来观察损失函数的变化情况,进而判断优化效果。我们可以通过可视化的方式来呈现损失函数随迭代次数的变化趋势,例如: ``` plot(1:num_iters, J_history, '-b', 'LineWidth', 2); xlabel('Number of iterations'); ylabel('Cost J'); ``` 以上就是使用MATLAB实现梯度下降算法的基本步骤,需要注意的是,选择合适的学习率alpha和迭代次数num_iters对于算法的收敛效果十分重要。 ### 回答3: 梯度下降算法是一种基于优化的方法,用于寻找函数最小值或最大值的过程。在机器学习中,它被广泛应用于训练模型,例如神经网络。 梯度下降的主要思想是通过迭代逐步调整参数,使得损失函数的值逐渐趋近于最小值。具体来说,对于每一次迭代,使用当前参数计算出损失函数的梯度,然后按照一定的步长调整参数的值,使得损失函数的值下降。这个过程一直持续到损失函数的值达到一个稳定的最小值。 以下是一个简单的梯度下降的MATLAB代码: function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) %初始化J_history: J_history = zeros(num_iters, 1); %执行num_iters次迭代: for iter = 1:num_iters %计算当前theta下的代价函数: J_history(iter) = computeCost(X, y, theta); %计算当前theta下的梯度: grad = (1/m) * X' * (X*theta - y); %更新参数: theta = theta - alpha * grad; end end 其中,X是样本矩阵,y是标签矩阵,theta是需要求解的权重向量,alpha是学习率,num_iters是迭代次数。computeCost函数用于计算当前参数下的代价函数。 这个代码是一个简单的批量梯度下降算法。在每次迭代中,它计算出当前参数下的代价函数和梯度,然后沿着负梯度方向更新参数。如果学习率设置得当,这个算法可以很快地收敛到最优解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子私房菜

给小强一点爱心呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值