问题分析
该问题描述如下:给定1000组数据,找到一条直线
使得该直线能够最好地表达
与
之间的线性关系。因此,我们需要找到相应的指标对于找到的直线进行评价。常用的模型是最小化其平方损失函数,即
显然,当直线越能较好地表达与
之间的线性关系,
的值应该越小。倘若
,则说明
与
完全线性相关,此时的
就是
与
之间的线性表达式。
对于这类线性回归问题,往往存在着相应的闭式解,即最小二乘回归法得到的解。这里不对此闭式解进行描述。我们使用最速下降,或者说梯度下降的方法求解参数,尝试使得达到最小。
梯度下降法
梯度下降法是求解优化问题的常用方法,其步骤相对比较简单。即给定一个待求参数的初始值,对于需要最小化的目标函数,求其关于参数的梯度,之后沿着负梯度方向对参数进行移动,即可以实现使得目标函数值下降的目的。其背后的数学原理主要用到了泰勒展开式
我们希望经过的一段移动,
的函数值相对于
可以有所下降。在不考虑高阶无穷小的情况下,问题则转化成找到合适的
使得
最小(同时也需要使得
)。对于这样一个内积形式,我们使用余弦公式
将其展开,可以发现在和
固定的情况下,如果我们使得
的值最小,即
与
的方向相反时,
可以取到最小。因此,参数移动过程中,目标函数下降最快的方向
即负梯度方向。
而我们的可以表达为
,所以最终我们得到了梯度下降的迭代格式:
凸函数
梯度下降法固然是一个很有效的方法,通过沿着负梯度方向移动参数,使得目标函数以较快的速度下降。但是当梯度下降法移动到局部最优点时,考虑到此时局部最优点处的梯度为0,参数就没有动力继续进行移动了。如图,当参数由A点移动到B点时,就无法使用梯度下降法作进一步移动了,而全局最优点位于C处。
![](https://img.haomeiwen.com/i13194574/feb04756baf66e7e.png)
为了避免这种情况,我们可以提出一些有效的扰动机制,使得参数可以从B点跳动到D点,再从D点通过梯度下降到达C点。但是实际问题往往比较复杂,扰动机制也不像图片中那样明显。
而如果我们的目标函数相对于参数是一个凸函数,则不存在这种收敛到局部最优的情况了。对于定义在凸集上的凸函数,其局部最优点就是全局最优点。所以,如果我们求解的目标函数是一个定义在凸集上的凸函数,梯度下降法必然可以下降到其全局最优点处。
由于目标函数是一个关于
的二元函数,所以令
,则对于,若有
则是一个凸函数(来源于微积分课本)。
经过计算,
则
所以,目标函数是一个定义在凸集上的凸函数,梯度下降法可以得到其全局最优解。
代码实现
原理已经完全清晰,并且证明了梯度下降法的有效性,下一步就是代码实现。代码实现相对比较简单,首先给定参数的初始值和学习率
。然后计算出相应的梯度分量
之后便可以在终止条件达到之前,不断进行迭代,即
至于终止准则,考虑到对于该目标函数,梯度下降可以收敛到全局最优点,所以我们设定终止准则为,即迭代前后参数向量差的二范数小于某个较小的值时,迭代终止。
代码见附件。
结果及参数分析
结果分析
我们取初值为,学习率
,
,最终结果收敛于
。
![](https://img.haomeiwen.com/i13194574/05737a2ceb7c4330.png)
我们使用matlab的curve Fitting工具箱中的线性拟合函数,直接对给定数据进行拟合,得到的结果是。说明我们使用的梯度下降法基本收敛到最优解。
![](https://img.haomeiwen.com/i13194574/0e575cd7675a7bc5.png)
参数分析
由于我采用的是定步长梯度下降,所以算法中主要有初值、学习率以及这三个参数。接下来我们分析一下参数的变化对于结果的影响。为了直观的展示参数的不同取值对于结果的影响,这里使用“均方误差的下降曲线”来呈现梯度下降法的下降效果。
初值的变化
考虑到最终的结果是,位于
附近,所以可以以
为参考点,选择不同的初值观察其迭代情况。这里
.
![](https://img.haomeiwen.com/i13194574/53f9c449ced35c22.png)
首先选择周围八个点作为初始值,观察其迭代情况。
![](https://img.haomeiwen.com/i13194574/e74ed3cbdb919eef.png)
从最终的收敛性来看,八个不同方位的初值经过不同次数的梯度下降迭代后,都可以收敛到处。说明对于该问题给出的凸目标函数,从任何一个方位进行出发,选择恰当的学习率后,都可以很好地迭代到最优解的位置。
这八个初始值虽然最终都可以收敛到最优解,但其迭代次数具有一定的区别,其中有三个位置迭代了948次,有三个位置迭代了947次,还有两个位置分别迭代了734和740次。迭代次数的差异,我认为主要与数据集本身的特征有关,因为八个初始位置距离最优解的距离是差不太多的,而采取的学习率与终止准则又是相同的,所以应该是数据集本身的特征带来了迭代次数的差异。
为了进一步说明梯度下降在该问题中的强大的效果,我们采取几个较为“遥远”的位置作为初始的参数,分别为并观察他们的下降情况。
![](https://img.haomeiwen.com/i13194574/023c76b6c08b685a.png)
实验后可知,这四个初始位置最终都顺利收敛到最优解,其迭代次数分别为次。由此我们可以认为,对于不加约束的二元凸优化问题,初始位置的选取对于是否收敛并没有太大的影响。
学习率的变化
学习率是一个非常重要的参数,决定了梯度下降能否收敛到最优解以及其收敛速度。由于该问题数据集较大,一般点处的梯度分量较大,所以为了使得解的每一步变化在一个合适的范围内,学习率应该取一个较小的值,最终我取了
。我们取
,初值取
,终止准则取
。同时,考虑到发散的情况,我们设置一个最大迭代次数为2千万次。
由于最终的结果较难用均方误差下降曲线表示,我们使用表格来表示这一结果
|
迭代次数 | 是否收敛到最优解 |
---|---|---|
1 | 否 | |
16725705 | 接近最优解 | |
397517 | 是 | |
51261 | 是 | |
6273 | 是 | |
737 | 是 | |
20000000 | 否 | |
20000000 | 否 |
由表格可以发现,学习率对于能够收敛以及收敛速度都具有非常大的影响。虽然还未考虑终止准则,但是理论分析来看,终止准则主要影响收敛时的解的精度,初始位置主要影响迭代次数,所以学习率对于梯度下降法的影响是最大的。
对于该问题,当,由于一次迭代过程中的变动太小,很容易就小于
,所以仅迭代一次就收敛了。倘若改变
,也有可能在很久的迭代之后收敛。当
次方时,同样的,由于每次迭代过程中的变化幅度太小,所以需要迭代一千多万次才能收敛到一个近似最优解的地方。如果我们将
设置的再小一些,也是有可能收敛到最优解的。当
时,我们可以发现,经过足够多的迭代次数,最终总能收敛到最优解的位置。但是
越大时,每一步的变化幅度越大,也就能以更快地速度收敛到最优解,相应的迭代次数也就越少。当
时,由于这时候一步的跨度太大,以至于其偏离最优解越来越远,最终导致结果发散无法收敛。
![](https://img.haomeiwen.com/i13194574/73510bfe76c55110.png)
所以,的选取必须要合适。太小会导致一次就收敛,较小会导致收敛较慢,较大又会导致结果发散。我认为
的选取主要与梯度分量的大小有关。我们可以观察
取不同的值的时候,梯度分量,例如
的变化。由图可知,一个恰当的
应该使得梯度分量在迭代的过程中慢慢趋于0,也就是
需要与梯度的大小相匹配。
![](https://img.haomeiwen.com/i13194574/b30af531ceec0686.png)
如果与梯度不匹配的话,例如
时,我们发现即使迭代次数在十次以内,其梯度分量就开始呈震荡趋势,且其绝对值越来越大。因此,一个合适的
必须与其梯度的规模相匹配,才能以较好的步伐收敛到最优解。
![](https://img.haomeiwen.com/i13194574/e67076f6147f49ee.png)
的变化
迭代次数 | 收敛结果 | |
---|---|---|
53 | ||
281 | ||
509 | ||
737 | ||
965 |
显然,一般情况下,越小,迭代次数越多,相应的收敛结果也越精确。
总结
首先,我们可以作出一张的函数图像。
![](https://img.haomeiwen.com/i13194574/09da03d9f7a6a89b.png)
可以发现,其确实明显存在一个下凸的形状,这也直观解释了为什么初始位置的选择不太影响其收敛的结果。
对于定步长的梯度下降法,我们发现它可以很好地解决一元函数线性拟合的问题,且往往可以快速收敛到最优解。在所有的参数中,初始位置的重要性不大,因为该目标函数是一个典型的凸函数,且其定义域是,也不存在迭代过程中离开定义域的可能。终止准则的设定对于结果的精度有较大的影响,但是对于结果的收敛性影响不太大,一般而言,精度越大,需要的迭代次数越多。学习率
对于是否收敛以及收敛的速度具有十分重大的影响。一般而言,
太小或太大时,往往导致梯度下降法迭代效率极低,亦或者无法收敛。
的选取与梯度有很大的关系,但对于更加复杂的函数,其相关因素应该会更多。所以
的值需要多多尝试。
对于变步长梯度下降法,我也进行了实验,例如每次取,但是实际效果甚至没有定步长好,所以在此不做过多阐述。事实上对于这一题,定步长已经可以在很快的速度内得到最优解了。
以上就是本次分析报告的全部内容。
下面附上代码(写得有点儿烂,请勿介意)
%主函数
clear;clc;
load a1data.mat
a=[0;0];% 初始值,a(1)=a; a(2)=b; y=ax+b
alpha=1e-5; %学习率 alpha
eps=1e-8; %终止准则 eps
[q,s,num]=MSE(a,x,y,alpha,eps); %q是最终的解,s的均方误差的变化向量,num是迭代次数
figure(1);
plot(1:length(s),s);
disp("迭代了"+num+"次"+" 收敛结果是"+q)
title("均方误差下降曲线")
xlabel("迭代次数")
ylabel("均方误差")
y1=q(1)*x+q(2);
figure(2);
plot(x,y,'or',x,y1,'b');
%作出SSE关于参数的三维图像
figure(3)
[n,m]=meshgrid(-10:0.01:10);
v=n.^2*sum(x.^2)+2*n.*m*sum(x)+1000*m.^2+sum(y.^2)-2*sum(x.*y)*n-2*m*sum(y);
mesh(n,m,v);
%迭代函数
function [q,s,num,daa]=MSE(a,x,y,alpha,eps)
i=1; %迭代序号
s=1:10; %MSE向量
num=0; %迭代次数
q=[inf;inf]; %返回结果的初值
daa=1:10; % 梯度对a的分量向量
while 1
% disp(i);
da=2*(a(1)*sum(x.^2)+a(2)*sum(x)-sum(x.*y)); %梯度对a的分量
db=2*(a(1)*sum(x)+length(x)*a(2)-sum(y));%梯度对b的分量
a1=a-alpha*[da;db]; %迭代格式
%disp(a1);
num=i;
if norm(a1-a)<eps %终止准则
q=a1;
break;
end
if i>20000
disp("迭代了20000次也没有收敛,停下来改一下最大迭代次数试试")
break;
end
a=a1;
s(i)=sum((a1(1)*x+a1(2)-y).^2)/length(x); %计算MSE
daa(i)=da;
i=i+1;
end
end
原始数据
链接:https://pan.baidu.com/s/1ZdnBWuG8ToCYD4d1VbJc8g
提取码:cybr
网友评论