本文讨论一下对“梯度”的理解。
“梯度”是深度学习中基本又非常核心的概念,没有它就没有人工智能的今天。
然而,即使抛开令人眼花缭乱的术语(比如sgd、ada、moment、adam)不谈,即使最简单的“梯度”本身,也值得讨论一下。
- 提出问题
该如何理解梯度?
让我们结合具体的例子来体会一下。
- 定义例子
首先,我们定义一个简单的例子,来模拟一下深度学习的学习过程。
已知:
有一个正确的数据对(或者叫样本),(x,y)
其中,x代表输入值,y代表输出值。这里我们假定x等于 1, y也等于1。
也就是说这个已知的、正确的数据对为(1,1)
求:
根据上面的数据对,求出y和x之间的映射关系
该如何求呢?
解:
我们设计一个神经网络来求这个映射关系。
简单又不失一般性,我们设计一个只有一个参数w的神经网络。
用这个简单的神经网络来表示x和y之间的映射关系的话,如下表示:
Y = wx
现在我们已经知道 x等于1的时候,y也等于1,那么w等于多少能正确表达出他们之间的映射关系来呢?
- 解决问题:
聪明如你,肯定会脱口而出:w等于1!
完全正确,如果w等于1,那么用这个最简神经网络表示的x和y之间的映射关系就变成了
Y = 1*x
当x=1时,y=w1 = 11 = 1
正好完美符合了我们已知的数据点(1,1)
但是,这个“显然”的最优解,是因为我们把问题简化了的原因。
在实际中,w动辄会有成千上万个维度,这时候w等于多少就没这么容易得到了
所以,我们得有一套固定的套路,来解决w到底等于多少时,能最好的表达出x和y之间的变换关系的问题。
没错,梯度就是这个固定套路的核心。
那具体怎么做呢?
首先,我们不知道w取多少最好,那么不管三七二十一,先让w随便取个值,比如5。
当w=5的时候,如果x=1,那么y=多少? y= 5*1 = 5
这里的y=5是预测出来的值。但y的实际值应该为1。
预测值和实际值不一致。
那么怎么让他俩一致呢?
调整w的值。也就是我们常说的调整参数。
怎么调整?
有两个维度可调。
第一个维度,是调整的方向。
调整的方向只有两个,要么变大,要么变小。
比如,把w从5变大一些,预测值离实际值更远了还是更近了?
如果把w从5变小一些呢?
可以看到,调整的方向应该选择“变小” 才对。
变小w,预测值离实际值才会更近。比如w从5变小到4.
选择调整的方向(变大或者变小)是梯度的第一要素。
这也是很多人忽视的地方。
第二个维度,是变大或者变小的力度。
即如果变小的话,该变小多少?
变小0.1 ?0.01?还是1?
比如我们变小1吧,w就从5变成了4.
这时候预测值成了 4*1=4. 确实相比原来的5,离实际值1 近了一些。
如果变小0.1,w就从5变成了4.9
这时候预测值成了 4.9*1=4.9 和5相比,也离实际值1 近了一些。
实际中,我们调整的力度,是损失值对于w的导数(或者偏导数)的绝对值。
重复此操作,w会慢慢的接近最佳值1。
当w到达最佳值的时候,预测值和实际值变得完全一样。
这时候就得到了最优解 y = 1*x。
我们通过对w梯度下降,得到了y和x关系的最优解。
- 扩展
上面的例子中,只有w一个变量需要求最佳值
实际中,可能有 w1,w2…wn 很多个变量,都需要求最佳值。
那就对每一个w,分别进行上面例子中的操作就可以。
- 总结
所谓的梯度,其实就是对于每一个变量来说,首先它是增加还是减小?其次是增加或者减小多少?才能让预测的结果和期望的结果更加接近。