TensorFlow 实现深度网络–基于梯度的优化

阿里云2000元红包!本站用户参与享受九折优惠!

基于梯度的优化就是优化一个函数的最终取值。假设ω是函数的输入参数,J(ω)是需要优化的函数,那么基于梯度的优化指的就是改变ω以得到最小化或最大化的J(ω)(通常是最小化J(ω),最大化可经由最小化算法最小化-J(ω)来实现)。

在具体的深度神经网络的设计中,通常ω泛指神经网络中的参数,J(ω) 表示训练数据集上的损失函数( LossFunction )。使用梯度下降优化网络的大概思路就是寻找一个参数ω,使得损失函数J(ω)的值最小。换句话说,梯度下降算法会迭代式更新参数ω,不断沿着梯度的反方向让参数朝着损失更小的方向更新。图5-2 展示了梯度下降算法的原理。

如果图5 -2 中小圆点的位置代表了当前的参数和损失值,那么梯度下降算法会将参数朝着箭头的方向移动并达到最低点。

以一个具体的例子来说明梯度下降算法是如何工作的。设损失函数为J(ω)=ω2,参数初始值为m=lO ,学习率为0.2 。首先求得参数ω的梯度为

之后改变这个参数以使J(ω)的值尽可能小的过程可以总结为表5-1 。

从表5-1中可以看出,经过10次迭代之后,参数ω的值逐渐变成了0.0605。如果这个过程一直持续下去,那么ω将会无限趋近于0。从数学的角度而言,全局最小点(Global Minimum)是使J(ω)在其定义域内取得绝对最小值的点。函数有可能不只有一个全局最小点,或者全局极小点并不是全局最优点。如果损失函数非常复杂,比如含有许多不是最优的全局极小点,或者存在多个局部极小点混淆我们的判断,亦或存在许多鞍点等,所有的这些可能性都将使优化变得困难。因此,我们通常寻找使J(ω)非常小的点,将这一点作为一个近似最小点。对于一个深度学习任务,即使找到的解不是真正最小的,但只要它们显著低于损失函数的绝大部分值,我们通常就能接受这样的解,虽然这并不意味着一定是最小。图5 -4解释了这样的观点。

无论是一维输入的函数还是多维输入的函数,梯度下降算法总会存在以下两个问题。

首先,梯度下降算法并不能保证被优化的非凸函数达到全局最优解。如图5-4 所示,图中给出的函数就有可能只能得到局部最优解而不是全局最优解。假设参数在左侧第二个黑点处取值,损失函数的偏导为0 ,于是参数就不会再进一步更新。在这个样例中,如果参数ω 的初始值落在全局最小点附近的区间中(在左侧第一个黑点附近处取值),那么通过梯度下降得到的结果都会是全局最小点代表的局部最优解。由此可见,最后得到的结果在很大程度上会受到参数初始值的影响,或者说使用梯度下降算法达到全局最优解被限制为只有当损失函数为凸函数时才可以。

其次,梯度下降算法的计算时间太长。在实际训练时,参与训练的数据往往很多,并且损失函数J(w) 是在所有训练数据上的损失和,这样计算出所有训练数据的损失函数是非常消耗时间的。

在机器学习中,最简单就是没有任何优化的梯度下降(GD,GradientDescent),我们每一次循环都是对整个训练集进行学习,这叫做批量梯度下降(Batch Gradient Descent),我们之前说过了最核心的参数更新的公式,这里我们再来看一下:

所有的参数都在一个叫做parameters的字典类型的变量里面,我们来看看它怎样实现的吧。


如果为了加快每一轮参数更新的速度可以使用随机梯度下降算法( Stochastic Gradient Descent, SGD ) 。随机梯度下降相比于梯度下降算法进步的地方在于,这个算法并不会对全部训练数据上的损失函数进行优化,而是在每一轮迭代中随机选择某一个或多个训练数据上的损失函数进行梯度下降优化,但是随机梯度下降也不是完美的。

关注小鲸融创,一起深度学习金融科技!


https://www.jianshu.com/p/810a007ed5a1

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
Python
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论