反向传播与梯度下降的基本概念 (2)

从以上两图可以看出,反向微分保留了所有变量(包括中间变量)对结果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等等的连线不是这条曲线的切线呢,而好像是弦线?

反向传播与梯度下降的基本概念

为何用\(y = x^2\)函数?

这是因为有一种损失函数的形式就是均方差,亦即:

\[loss = \sum_{i}(a_i - y_i) ^ 2\]

其中a是本次迭代的预测结果,y是样本中的真实结果。我们的目的就是在这个函数上求最小值,使loss最小,这样样本值和预测值就会非常非常接近,以便于我们以后预测不在样本中的真实数据。

为什么说是“梯度下降”?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdsxx.html