深度解析梯度下降及其详细知识(Gradient Descent)
本篇文章侧重于解析机器学习中梯度下降的原理。
目录:
前言:
在开始之前我们先笼统的描述一下什么是梯度下降,简单来说梯度下降用来解决机器学习中的模型优化问题。优化问题又分为凸优化问题和非凸优化问题:一个问题如果是凸优化问题,意味着其可以被彻底解决,而非凸优化问题常常无法解决。在实际问题中,我们常常将非凸优化问题转换为凸优化问题,凸优化问题的局部最优解就是全是最优解。
1. 什么是凸优化问题
凸集
- 首先我们要了解下什么是凸集,其表示一个区域内任意两点间的线段都可以包含在该区域内。
维基百科:什么是凸集
其次什么是凸函数
- 判断依据:f((x1+x2)/2)<=(f(x1)+f(x2))/2
- 简单来说如果任意两点连接而成的线段与函数没有交点,则可以说此函数为凸函数。
(a)是凸函数,(b)是非凸函数(原谅手画图不是太好hh)。
2. 解析梯度下降
在机器学习中,我们之所以寻找凸函数是因为凸函数的局部极小值就是全局最小值。
而对于非凸函数我们常常将其转化为凸函数,因为非凸函数不能保证我们找到的一个
相对局部极小值就是全局最小值。
很多机器学习算法都可以归结为凸优化问题,所以解决凸优化问题是非常重要的,而梯度下降
是最简单也是最常见的最优化问题求解方法,也可以说求函数极小值。
梯度下降过程
-
首先选取任意参数(w和b)作为起始点,因为我们并不知道使损失函数取得最小值的参数是多少。
-
其次明确迭代方向,找到一个最陡的方向下山,在数学上表现就是梯度,也就是负梯度方向下降 最能够到达山谷。
-
最后明确迭代步长,如果步子太大,虽然能快速到达山谷,但是容易错过最优点;反之步子太小会延长到达山谷的时间,会消耗计算资源和时间。通常控制步长的也就是我们说的学习率。
明确梯度是什么
在梯度下降的过程中,为什么是沿着负梯度下降方向最快呢。
在微分中,梯度就是对多变量微分的一种表示。
例如:
所以梯度就是一个向量,表示函数在该点处的方向导数沿该方向取最大值,即函数在该点处
变化率最大,变化最快。
因此我们可以说,梯度就是定义一个函数在某一个点的全部偏导数构成的向量。
- 单变量函数中,梯度就是函数的导数,表示在某一个点的切线斜率。
- 多变量函数中,梯度就是函数在某一点对各个变量进行微分的结果。表示函数在该点上升最快,所以我们说负梯度方向。
梯度下降及其参数
梯度下降是求解凸函数的方法,以损失函数作为基础。损失函数是模型预测值与真实值的差距也就是模型参数(w和b)的函数。有时候损失函数是训练数据中单个样本的预测值与真实值的差距,而有时候指代的是训练数据中所有样本的预测值与真实值的差距,简称成本函数。
成本函数描述的是样本总体的预测偏差情况,可以是损失函数之和也可以是其平均值之和。
实践中,我们应该考虑总体情况,例如有10个样本,我们得到一个损失函数对样本1最小,但是对其他最大,我们不能考虑决定这个损失函数的参数(w和b)。
梯度下降公式
简单描述:给定一组初始值 θ0,沿着损失函数J(θ)方向前进一段距离a,就可以得到新的参数θ1.
(θ0,θ1)就是模型参数(w和b)。
在梯度下降中,我们常设置阈值来控制迭代结束和迭代次数,当迭代次数达到时,迭代结束。一般来说只要设置的足够大,损失函数会在极值点附近徘徊。
3.梯度下降演练
一元函数梯度下降
我们尝试对 f(x) =x^2 +1进行梯度下降。这里原函数比较简单就不放原函数图了。
代码:
# f(x) =x^2 +1 的梯度为 2x
def my_gradient(x,iters,precision,learning_rate):
for i in range(iters):
print ('第',i,'次迭代x值为:',x)
grad_current = 2*x # 求梯度
if abs(grad_current)< precision:
break # 当梯度小于阈值
else:
x = x - learning_rate * grad_current
print ('极小值处x为:' ,x)
return x
if __name__=='__main__':
my_gradient(x=5,iters=10000,precision=0.000001,learning_rate=0.1)
第 0 次迭代x值为: 5
第 1 次迭代x值为: 4.0
第 2 次迭代x值为: 3.2
第 3 次迭代x值为: 2.56
第 4 次迭代x值为: 2.048
第 5 次迭代x值为: 1.6384
第 6 次迭代x值为: 1.31072
第 7 次迭代x值为: 1.0485760000000002
第 8 次迭代x值为: 0.8388608000000002
第 9 次迭代x值为: 0.6710886400000001
第 10 次迭代x值为: 0.5368709120000001
第 11 次迭代x值为: 0.4294967296000001
第 12 次迭代x值为: 0.3435973836800001
第 13 次迭代x值为: 0.27487790694400005
第 14 次迭代x值为: 0.21990232555520003
第 15 次迭代x值为: 0.17592186044416003
第 16