梯度下降法

1 序

机器学习方法都是由模型,策略和算法构成,即机器学习方法由三要素构成,可以简单地表示为:方法=模型+策略+算法; 机器学习首先考虑的问题便是选择什么样的模型,常见的模型有SVM(support vector machine),CNN(convolution neural network),RNN(recurrent neural network),感知机…等。策略即是指按照什么样的准则学习或者选择最优模型,策略部分最重要的可以说是确定损失函数(loss function)与代价函数(cost function)。本文使用的损失函数为 l ( y ^ , y ) = − ( y log ⁡ y ^ + ( 1 − y ) log ⁡ ( 1 − y ^ ) ) l(\hat y,y)=-(y\log\hat y + (1-y)\log (1-\hat y)) l(y^,y)=(ylogy^+(1y)log(1y^))其中 y y y 为实际输出, y ^ \hat y y^ 为模型预测的输出,我们的目的是想让实际输出与模型预测的输出越接近越好,所以损失函数越小越好。其对应的代价函数为 J ( w , b ) = 1 n ∑ i = 0 n l ( y ^ i , y i ) J(w,b)=\frac1n\sum_{i=0}^n l(\hat y_i,y_i) J(w,b)=n1i=0nl(y^i,yi) 损失函数表示的是单个训练样本的误差,由公式容易看出代价函数表示的即是n个样本的误差和,其中w,b即是模型中的参数,我们的目的便是找到合适的参数使得代价函数 J ( w , b ) J(w,b) J(w,b)取值最小。找w,b最小值的过程,便是三要素中的算法。这样监督学习问题就变成了代价函数的最优化问题,这时代价函数是最优化的目标函数。而本文的主角,梯度下降法便是求解最优化问题的常用的算法。

2 梯度下降法

2.1 简介

由上文可知,梯度下降法的目的是找到目标函数的最小值 m i n J ( w , b ) min J(w,b) minJ(w,b) 。梯度是一个向量,目标函数在具体某点沿着梯度的相反方向下降最快,一个形象的比喻是想象你下山的时候,只能走一步下山最快的方向即是梯度的相反方向,每走一步就相当于梯度下降法的一次迭代更新。如图一所示,横轴b与纵轴w表示目标函数中的两个参数(为了方便展示此处只有两个参数,通常情况下有多个参数),蓝线即是梯度下降的路径,w,b 的初始值根据经验任意选取。

图1.梯度下降示意图

梯度下降法中参数每次的迭代更新公式如下,其中符号 : = := := 表示赋值, α \alpha α 指每次更新的步长

p : = w − α ∂ ∂ p J ( P ) p:=w-\alpha \frac{\partial}{\partial p}J(P) p:=wαpJ(P)

2.2 实例

       以下为对线性回归模型使用梯度下降算法进行一次迭代的具体实例,此处涉及的知识有链式求导,反向传播原理。

图2.导数流程图
上图 $x,y$ 分别表示训练样本的输入输出,此处输入 $x$ 为二维向量 $[x_1,x_2]^T$,对应的 $w=[w_1,w_2]$ 。$\sigma(z) = \frac{1}{1+e^{-z}}$,损失函数为 $L(a,y)$ 。使用梯度下降法首先需要求得损失函数对参数 $w,b$ 的偏导数。根据导数流程图从右往左依次求导,则大大增加了求导结果的复用性,即所谓的反向传播,求导结果如下:$$\mathrm{d}a=\frac{\mathrm dL}{\mathrm da}=-\frac ya+\frac{1-y}{1-a}$$ $$\mathrm dz=\frac{\mathrm dL}{\mathrm dz}=\frac{\mathrm dL}{\mathrm da}\cdot\frac{\mathrm da}{\mathrm dz}=a-y$$ $$\mathrm dw_1=x_1\mathrm dz;\quad \mathrm dw_2=x_2\mathrm dz;\quad \mathrm db=\mathrm dz$$ 有了以上求导结果便可以编程实现梯度下降算法,以下是在 m 个样本条件下进行一次梯度下降运算对参数进行更新的伪代码
J = 0, dw_1 = 0, dw_2 = 0, db = 0 ;    #初始化参数与代价函数值为0
for i=1 to m:                          # m个样本
	Z[i] = w_1*x_1[i] + w_2*x_2[i] + b #图二中 Z 的表达式
	a[i] = σ(Z[i])                     #a[i]即模型预测的输出值
	J += L(a[i],y[i])                  #L(a,y)表达式见图二,累加损失函数
	dz[i] = a[i] - y[i]                #上面求导的结果
	dw_1 += x_1[i]*dz[i]                 #累加m个样本的导数,最后求平均值
	dw_2 += x_2[i]*dz[i]
	db += dz[i]
J /=m, dw_1 /=m, dw_2 /=m, db /=m      #各除以m得到m个样本的平均梯度
# 以步长α对参数w_1,w_2,b进行一次更新
w_1 = w_1 - α*dw_1
w_2 = w_2 - α*dw_2
b = b - α*db

实际工程中在大量数据的情况下使用 显式 for 循环跑梯度下降算法严重影响效率,所以通常是使用 向量化技术 ,但是看懂上面代码可以加深对梯度下降法的理解。

2.3 总结

       以上只是最基础的梯度下降算法,根据训练数据的采集情况又分为批量梯度下降法,随机梯度下降法,小批量梯度下降法等,简单来说梯度下降法分为以下几个步奏:

  1. 取参数初始值
  2. 计算目标函数梯度表达式
  3. 带入训练数据计算具体梯度,若梯度 ||g|| < ϵ \epsilon ϵ 时,停止迭代,当前位置即为目标函数最小值(局部最小值)
  4. 根据表达式 p : = w − α ∂ ∂ p J ( P ) p:=w-\alpha \frac{\partial}{\partial p}J(P) p:=wαpJ(P) 更新参数
  5. 完成一次迭代,转 3

在基础梯度下降法的基础上,出现了很多优化的梯度下降法,可加快梯度下降的速度,下面是一些优化的梯度下降法,有兴趣可以继续深入了解

  • 冲量梯度下降法(momentum optimization)
  • NAG(Nesterov Accelerated Gradient)
  • AdaGrad
  • RMSprop
  • Adam

3 参考资料

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值