深度学习 – 反向传播

梯度

一个深度神经网络的权重参数有可能会达到百万级,权重的梯度计算非常耗时,反向传播是一种非常高效的梯度算法。

一个神经网络中的所有权重参数可以表示为:

w = [w_0, w_1, w_2, …]

J(w)是代价函数,权重的梯度可以表示为:
\nabla J(w) = \left[ \begin{matrix} \frac {\partial{J(w)}}{\partial{w_0}} \\ \\ \frac {\partial{J(w)}}{\partial{w_2}} \\ \\ \frac {\partial{J(w)}}{\partial{w_3}} \\ \\ … \end{matrix} \right]

训练时,权重值的调整可以表示为:

w_i = w_i -η \nabla \frac {\partial{J(w)}}{\partial{w_i}}

链式法则

反向传播算法充分利用数学中的链式求导法则。

法则1:假设有2个函数,y = f(x)a = g(y),要计算ax的导数,计算过程如下:

\frac {\partial{a}}{\partial{x}} = \frac {\partial{a}}{\partial{y}} \frac {\partial{y}}{\partial{x}}

法则2:假设有3个函数,y = f(x)z = g(x)a = h(y, z),要计算ax的导数,计算过程如下:

\frac {\partial{a}}{\partial{x}} = \frac {\partial{a}}{\partial{y}} \frac {\partial{y}}{\partial{x}} + \frac {\partial{a}}{\partial{z}} \frac {\partial{z}}{\partial{x}}

利用链式求导法则,计算代价函数相对于某个权重的偏导数(梯度),可以转化为这个权重之后所有层次的偏导数的表达式。

反向传播计算过程

反向传播由输出端往输入端逐层计算权重的梯度。

我们假设有下面这样3层神经网络:

反向传播1

神经元o1如下图所示:

神经元o1

设神经网络的代价函数为J(w), w表示所有权重参数,根据链式法则,w5的梯度(偏导数)可以表示为:

\frac {\partial{J(w)}}{\partial{w5}} = \frac {\partial{J(w)}}{\partial{a_{o1}}} \times \frac {\partial{a_{o1}}}{\partial{z_{o1}}} \times \frac {\partial{z_{o1}}}{\partial{w_5}}

在具体的神经网络中,代价函数、激活函数都是确定的,所以\frac {\partial{J(w)}}{\partial{a_{o1}}}\frac {\partial{a_{o1}}}{\partial{z_{o1}}}都是可以简单计算的,同样\frac {\partial{z_{o1}}}{\partial{w_5}}也是可以计算的,这样我们就计算出了w5的梯度值。

类似w5的情况,b2的梯度计算:

\frac {\partial{J(w)}}{\partial{b2}} = \frac {\partial{J(w)}}{\partial{a_{o1}}} \times \frac {\partial{a_{o1}}}{\partial{z_{o1}}} \times \frac {\partial{z_{o1}}}{\partial{b_2}}

往前一层,计算w1的梯度,w1J(w)有2条路径:

w1 -> h1 -> o1 -> J(w)
w1 -> h2 -> o2 -> J(w)

w1通过2种方式影响J(w),从数学角度来说,就是2个函数关系,所以应用链式法则2:

\frac {\partial{J(w)}}{\partial{w1}} = \frac {\partial{J(w)}}{\partial{a_{o1}}} \frac {\partial{a_{o1}}}{\partial{z_{o1}}} \frac {\partial{z_{o1}}}{\partial{a_{h1}}} \frac {\partial{a_{h1}}}{\partial{z_{h1}}} \frac {\partial{z_{h1}}}{\partial{w_{1}}} + \frac {\partial{J(w)}}{\partial{a_{o2}}} \frac {\partial{a_{o2}}}{\partial{z_{o2}}} \frac {\partial{z_{o2}}}{\partial{a_{h1}}} \frac {\partial{a_{h1}}}{\partial{z_{h1}}} \frac {\partial{z_{h1}}}{\partial{w_{1}}}

可以看到,\frac {\partial{J(w)}}{\partial{a_{o1}}}\frac {\partial{a_{o1}}}{\partial{z_{o1}}}都是在计算w5梯度时计算过的,无需重复计算。

从后往前,逐层计算权重的梯度,这就是反向传播算法。

理解反向传播算法

对于反向传播算法的理解,可以打个比方,一个公司一年的利润与目标差距比较大,公司开始找原因,看看谁的责任比较大。从管理层开始逐层往下找,确定每个人的责任(梯度)。反向传播算法,就是分黑锅,梯度是对偏差的贡献,就是黑锅。



浙ICP备17015664号联系我们网站地图  
@2019 qikegu.com 版权所有,禁止转载