从以上两图可以看出,反向微分保留了所有变量(包括中间变量)对结果z的影响。若z为误差函数,则对图进行一次计算,可以得到所有节点对z的影响,即梯度值,下一步就可以利用这些梯度值来更新w和b的权重。
w的变化和b的变化,哪一个对z的变化贡献大?从图中还可以注意到:
\[\frac{\partial{z}}{\partial{b}}=15\]
\[\frac{\partial{z}}{\partial{w}}=10\]
所以每次w和b的变化值是不相同的,b的变化会比w大一些,也就是每一步的跨度大一些,这个是与z = xy = (w2+b)*(b+1)这个算式相关的,并不代表神经网络中实际情况。
反向传播的实际计算过程(单变量)还是用上面的例子,目前:
\(w = 3\)
\(b=4\)
\(x = w*2+b = 10\)
\(y = b+1 = 5\)
\(z = x*y=50\)
假设我们最终的目的想让z = 60,只改变b的值,如何实现?
答案就是偏导数:
\[\frac{\partial{z}}{\partial{b}}=\frac{\Delta{z}}{\Delta{b}}=15\]
目前z=50, 距离60相差10,所以我们令\(\Delta{z}=60-50=10\),则:
\[ \frac{\Delta{z}}{\Delta{b}}=15=\frac{10}{\Delta{b}} \\ \]
所以:
\[\Delta{b} = 0.66667\]
再带入式子中(顺便说一句,下面这个计算过程就叫做前向计算)
\(w = 3\)
\(b=4+0.66667=4.66667\)
\(x = w*2+b = 10.66667\)
\(y = b+1 = 5.66667\)
\(z = x*y=10.66667*5.66667=60.4445\)
一下子超过60了,咋办?再来一次(下面的过程就叫做反向传播):
我们令\(\Delta{z}=60-60.4445=-0.4445\),则:
\[ \frac{\Delta{z}}{\Delta{b}}=15=\frac{-0.4445}{\Delta{b}} \\ \]
所以:
\[\Delta{b} = -0.02963\]
再带入式子中:
\(w = 3\)
\(b=4.666667-0.02963=4.63704\)
\(x = w*2+b = 10.63704\)
\(y = b+1 = 5.63704\)
\(z = x*y =10.63704*5.63704=59.96\)
咦哈!十分接近59.96了!再迭代几次,应该可以近似等于60了,直到误差不大于0.00001时,我们就可以结束迭代了,对于计算机来说,这些运算的执行速度很快。
有的同学会说了:这个问题不是用数学公式倒推求解一个二次方程,就能直接得到准确的b值吗?是的!但是我们是要说明机器学习的方法,机器并不会解二次方程,而且很多时候不是用二次方程就能解决实际问题的。而上例所示,是用机器所擅长的迭代计算的方法来不断逼近真实解,这就是机器学习的真谛!而且这种方法是普遍适用的。
用二维平面函数说明梯度下降原理很多资料中会用下面这个图来说明梯度下降,但是都没有说清楚以下几个问题:
1) 为啥用这个看上去像\(y = x^2\)族的函数来说明梯度下降?
2) 在最低点的左侧,梯度值是负数;在最低点的右侧,梯度值是正数。为什么说是“下降”?
3) 为什么1—>2,2—>3等等的连线不是这条曲线的切线呢,而好像是弦线?
这是因为有一种损失函数的形式就是均方差,亦即:
\[loss = \sum_{i}(a_i - y_i) ^ 2\]
其中a是本次迭代的预测结果,y是样本中的真实结果。我们的目的就是在这个函数上求最小值,使loss最小,这样样本值和预测值就会非常非常接近,以便于我们以后预测不在样本中的真实数据。
为什么说是“梯度下降”?