首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

论梯度下降

本文首先浅析梯度下降的原理,然后通过线性回归、BP神经网络和TensorFlow深度学习网络三个场景分析梯度下降的应用,让“AI调包左侍郎”知道一句代码背后的波涛汹涌。

一、什么是梯度下降?

梯度下降法,GradientDescent,是一种最优化算法,是求解无约束优化问题最简单和最古老的方法之一,也是求解机器学习算法中模型参数的最常用方法之一。梯度下降要解决的问题就是,给定函数,如何求得,即给定了初始化的,不断改变,直到达到一个全局最小值,或者局部最小值。

梯度下降法的直观解释就是如下图,人在大山的某处(初始位置),如何寻找最快的下山路径?那么从初始位置起,求解当前位置的梯度,也就是当前最陡峭的位置向下根据步长走一步,然后继续求解当前位置梯度,这样一步步走下去直至山脚。但是梯度下降法也有一个缺点,即可能会产生局部最优,而不是全局最优,比如下图右侧的那条下山路径。

根据上面的形象例子,有两个直观的概念:

1 梯度。各个参数的偏导数以向量的形式写出来,就是梯度。其几何意义,就是函数变化增加最快的地方。沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,更加容易找到函数的最小值。如下图所示就是对不断求偏导的过程,红色的线就是当前位置的梯度,也就是斜率,也就是变化最快的方向。

2 步长。步长决定了在梯度下降迭代的过程中,每一步沿梯度方向前进的长度。步长也叫做学习率。形象点说,步长(学习率)就是在当前所在位置沿着最陡峭最易下山的位置走的那一步的长度。步长通常是一个0~1之间的数字,既不能太大,也不能太小,因为如果太大会有震荡(如下图)而无法收敛,如果太小则收敛太慢,这也就是机器学习中需要不断调参的地方。

在前述概念的基础上,梯度下降的算法就按如下方法同步更新迭代即可:

二、梯度下降应用在线形回归中

首先把梯度回归应用在线形回归求解中。大家知道,在线形回归中,不管是二元线形回归还是多元线形回归,假设函数(hypothesis function即模型)为线性组合,而损失函数(lossfunction)为二次代价函数。这里普及一个基本概念,模型拟合好坏的效果,通常是通过损失函数来衡量的,二次代价函数为最常见的损失函数,表示各个实际值与预测值之间差值的平方的平均值,当然那个1/2是为了求导时约去平方而存在的。即:

应用梯度下降法中梯度的原理,对求偏导数如下。求偏导的方法没有还回数学老师吧,根据链式法则,平方2和1/2约掉了,然后

,当对求偏导时为1,当对求偏导时为x。

应用梯度下降法中同步更新的原理,根据步长或者学习率不断更新参数

,直至收敛就完成了线形回归的模型求解。

虽然梯度下降法能够求解线形回归参数,不过在机器学习库Sklearn里调用LinearRegression.fit(x_data, y_data)时,使用的却是标准方程法,来对线形回归的loss函数求解。

三、梯度下降应用在BP神经网络中

接下来看梯度下降在神经网络方向传播中的求解。在典型的神经网络求解中,通常权值矩阵是随机初始化的,然后利用梯度下降法,最小化预测值与真实值之间的误差,通过反向传播的方式不断更新权值。说白了也就是调包左侍郎在调用多层感知器时背后发生的事情,例如下面代码设置了分别是100个神经元、50个神经元的2个隐藏层,整个神经网络的最大迭代次数为500次。

mlp =MLPClassifier(hidden_layer_sizes=(100,50) ,max_iter=500)

mlp.fit(x_train,y_train)

那么这里max_iter的迭代过程,就是使用梯度下降法进行反向传播不断更新权值,训练网络的过程,也叫做Delta学习法则。这里损失(代价)函数依然是二次代价函数:

根据梯度下降法则计算权值更新的梯度,其中为最终输出层的学习信号,为第l层的学习信号,如下式所示。

最后,如果神经网络的激活函数是sigmoid函数,那么可根据

代入后进一步展开。

四、梯度下降应用在深度学习网络中

最后再看下梯度下降在TensorFlow深度学习网络的求解。跟神经网络类似,深度学习网络也是先随机化权值矩阵,然后使用梯度下降法,不断迭代,最小化代价函数,更新神经网络权值矩阵。例如W = tf.Variable(tf.zeros([784,10])) 就使用tensorflow初始化了一个784*10的全零权值矩阵,然后基于此不断梯度迭代。跟神经网络不太相同的是,深度学习网络通常会选用交叉熵作为损失(代价)函数,来有效克服二次代价函数训练“慢启动”的问题。如下面调包左侍郎的TensorFlow代码:

train_step= tf.train.GradientDescentOptimizer(0.2).minimize(loss)

就是使用了交叉熵cross_entropy作为损失函数,然后使用梯度下降法SDG进行权值的迭代优化,其中学习率步长为0.2. 当然TensorFlow里除了梯度下降法外,还有很多其他的优化器,比如最常用的Adam优化器等。交叉熵函数对参数W求导如下式所示:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180123G00LNP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券