山东大学机器学习基本梯度下降和牛顿法Word文档格式.docx
《山东大学机器学习基本梯度下降和牛顿法Word文档格式.docx》由会员分享,可在线阅读,更多相关《山东大学机器学习基本梯度下降和牛顿法Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
Email:
714366968@
实验目的:
1.掌握线性分类器的原理并且明白它的应用范围。
2.了解并掌握梯度下降和牛顿法的原理并且熟练应用公式。
3.比较两种方法的数学运算量和优缺点。
4.掌握学习率和迭代次数以及收敛时间的关系
硬件环境:
windows10操作系统
软件环境:
matlab环境
实验步骤:
一、背景知识及原理
在机器学习的优化问题中,梯度下降法和牛顿法是常用的两种凸函数求极值的方法,他们都是为了求得目标函数的近似解。
在逻辑回归模型的参数求解中,一般用改良的梯度下降法,也可以用牛顿法。
我们直接假定判别函数的参数形式已知,而用训练的方法来估计判别函数的参数值。
属于非参数化的形式。
这些判别函数是X的各个分量的线性函数或者是关于以X为自变量的某些函数的线性函数。
寻找线性判别函数的问题将被形式化为极小化原则函数的问题,以分类为目的的准则函数可以是样本风险,或者是训练误差。
准确的计算极小风险线性判别函数通常是很困难的,所以用一些比较易于分析的准则函数。
判别函数:
两类情况的判定原则:
如果g(x)>
0则判定w1,如果g(x)<
0,则判定w2。
基本梯度下降法:
标量函数极小化
分类原理:
为了找到使成本函数最小的参数,采用搜索算法:
给定一个的初值,然后不断改进,每次改进都使更小,直到最小化的的值收敛。
这其实就是梯度下降法的基本思想。
求解方法:
随意选择一个a
(1),计算其梯度向量deltaJ(a
(1)),下一个值a
(2)由a
(1)向下降最抖的方向移动一段距离,得到,即延梯度的负方向。
a(k+1)=a(k)-lr(k)deltaJ(a(k))直到收敛
关键:
步长的学习率(式子中的lr,learningrate)如何选择?
太小,收敛慢;
太大,overshoot
解决方法:
①求J(a)的一阶导数,得到学习率的设定
②牛顿法
牛顿法:
考虑一个设定学习率的原则性的方法,假定准则函数可以由它在a(k)附近的二阶展开来近似:
a(k+1)=a(k)-H^-1deltaJ(a(k))
H表示海森矩阵
两种方式比较:
1.即使有了最佳的学习率,牛顿法一般也比梯度下降法每一步都给出了最好的步长。
2.牛顿法的缺陷:
①H为奇异阵时不能用
②计算H伪逆时间复杂度是O(d^3)
3.用梯度下降法,将学习率设置为较小的常数,在实际中更实用。
牛顿法比梯度下降法好的原因:
牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。
如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。
所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。
二、实验步骤
1.5.4节主要就是第一问,用两种算法对2维数据设计判别器。
这两个算法课本上面虽然都给出了公式,但是离直接上手使用还差好多,关键就是理解公式。
所以我最一开始没有直接就做题,而是去网上查了很多关于线性判别的知识和关于梯度下降与牛顿法的区别,通过结合老师的PPT,我才大体上有了思路。
但是实验的结果很曲折。
大概经历了3个阶段:
开始的时候我想的是就像以前贝叶斯的实验一样,把数据的一些规律代入公式,设计出一个判别器(也就是画出一条分界线)然后再画个图表示出哪个点分错,哪个点分对。
但是刚一上来画了原始样本的图,竟然发现这不是线性可分的,就直接蒙了,难道题出错了?
拿着图和同学讨论,也询问老师,讨论结果是没有关系,这才是常态,毕竟可以线性可分的点是很少的,只需要稍微改一下公式里面的循环跳出来的条件就可以。
如果循环跳不出来就让迭代次数到达某个足够大的数然后break。
这样数据的问题就处理好了,后来发现其实我画数据代入分类器的结果没有太大意义,和题目要求的关系不大,因为设置不同的学习率会有不同的分类结果,整体上考察的应该是学习率与迭代次数的关系。
所以就老老实实按照书上的要求来画图。
2.处理完数据的问题,又出现了另外一个错误。
就是第一次写了两个函数,一个是做梯度下降方法,另一个是牛顿法。
梯度下降方法中就没有设置变量,而且两个方法都没有设置阈值权w0,本来以为不设置是简单的,都在二维空间中做还不用再给样本加一行,后来发现在牛顿法中没法求偏导,也没法得到hessian矩阵。
最后还是乖乖的设置了3个变量,改了很多,a的初始化也要是3行一列的(使用random的方法,一行就可以),也要给原始样本加上第一行全都是1。
这样梯度下降和牛顿法就可以都调用一个函数,还方便了些。
3.第一问还出现了一个问题(感觉在第一问走不下去了)就是所有方法都写完了,也运行出来了,梯度下降没错,但是牛顿法本来2次迭代就可以完成的,现在每次都运行20多次。
后来是和同学讨论,发现好多人出现过这个问题,是因为开始初始化a的时候,在梯度下降那个方法里改了值,所以需要加一行。
4.5.4节的第三问是画出收敛时间-学习率曲线,为了便于判断自己画的曲线是否正确,我是先画了迭代次数-学习率曲线。
设置学习率的范围是通过在第一问中的测试。
我的结果是发现在eta=0.003的时候还收敛不了,0.002的时候可以收敛,所以设置
应该会得到一个先下后上的曲线。
三、实验结果
5.4节第一问:
1.原始样本点的分布:
非线性分布
2.梯度下降法判别:
(阈值为0.1。
分别是eta=0.1,0.001,0.003的结果)
设置的循环到迭代次数=100时停止:
发现0.1和0.003都不收敛
3.牛顿法判别:
(分别是theta=0.1,9的结果)
发现一般都是迭代两次就收敛了
5.4节第二问:
估计这两种方法的数学运算量:
通过这个实验可以发现,即使有了最佳的学习率,牛顿法一般也比梯度下降法每一步都给出了最好的步长。
但是当hessian矩阵H为奇异矩阵时就不能用牛顿算法了。
而且,即使H是非奇异的,每次递归时计算H逆矩阵所需要的O(d^3)的时间可以轻易的把牛顿算法带来的好处抵消了。
所以虽然牛顿法比梯度下降法的收敛次数少,但是总体来讲,运算量还是很大的。
而且如果选择一个合适的学习率赋给梯度下降法的话,迭代次数不多而且运算速度快(比如第一问eta=0.001的时候)
5.4节第三问:
迭代次数-学习率曲线:
(学习率设置
)
迭代次数设置到k==40时就停止,这样省运行时间。
收敛时间-学习率曲线:
收敛时间是通过matlab中自带的方法来算的。
结论分析与体会:
这次的实验总体来说考察的是对公式的理解,那两个分类方法都是有些类似,所以调用的函数是一样的。
牛顿法在学习率不确定的情况下是好用的,迭代次数少,因为它相当于比梯度下降法多看了下一步。
但是梯度下降法算法复杂度小,所以运算速度快一些。
这次实验的收获很多,关键是和同学讨论的重要性,不然自己一个人做可能陷在死胡同里很长时间。
特别是这次解决了过程中的好几个问题,还多了解到好几个matlab的自带函数,比如hessian可以直接做矩阵,diff求协方差,subs代入常数求值等等。
综上,机器学习道阻且长。