反向传播
上一篇博客介绍了从输入 X 样本开始,通过一组 w w w 参数,得到了一个得分值,然后又将得分值经过 y = e x y = e^x y=ex 函数的变换和归一化操作得到一个概率,然后又通过 y = − l o g x y = -logx y=−logx 函数求出了 Loss 值。有了 Loss 值之后,就可以进行最优化的操作。
我们通常把从开始到得到 Loss 的过程称为前向传播。 通常神经网络是由 BP 算法求解的,那什么是 BP 算法呢?BP 算法就是说通过前向传播求出 Loss 值,然后经过一次反向传播再次优化这些权重参数(
W
W
W)。
其实神经网络可以由两部分组成,一部分为前向传播,另一部分就是反向传播。那么这个反向传播应该怎样更新这些权重参数呢?
下面就举个例子说明反向传播。假设现在有三个样本点 x = − 2 x = -2 x=−2, y = 5 y = 5 y=5, z = − 4 z = -4 z=−4,然后通过 f ( x , y , z ) = ( x + y ) z f(x, y, z) = (x + y)z f(x,y,z)=(x+y)z 得到值 -12。
假设现在 -12 是我们求出的一个损失值,有了这个损失值之后,我想知道
x
x
x,
y
y
y,
z
z
z 分别对
f
f
f 做了多大贡献?我们可以想象一下,我们之前是要优化
w
w
w,我们要算
w
w
w 和
L
o
s
s
Loss
Loss 之间的关系, 有些
w
w
w 可能会使得
L
o
s
s
Loss
Loss 值变大。比如说,现在有一个
w
w
w 增大之后,
L
o
s
s
Loss
Loss 值也增大,那么此时我们就需要将
w
w
w 值减小才能使得
L
o
s
s
Loss
Loss 尽可能小。但是如果另外一个
w
w
w 增大之后,
L
o
s
s
Loss
Loss 减小了,那么此时我们需要将
w
w
w 增大。那么我们现在就计算一下
x
x
x,
y
y
y,
z
z
z 这些权重参数对
f
f
f 函数产生了多大影响。
首先我们分析 f ( x , y , z ) = ( x + y ) z f(x, y, z) = (x + y)z f(x,y,z)=(x+y)z,第一步计算 x + y x + y x+y,在这里我们将指定一个额外的元素 q q q,使得 q = x + y q = x + y q=x+y,那么 f = q ∗ z f = q*z f=q∗z。那么现在就可以计算 z z z 对 f f f 做了多大贡献,那么只需要计算 z z z 对 f f f 的偏导:
偏导数等于 3 意味着如果说
z
z
z 增大一倍,那么
f
f
f 就会增大 3 倍。但是现在我是想
f
f
f 减小,所以
z
z
z 应该往减小的方向去发展。那么接下来就计算
x
x
x 和
y
y
y 对
f
f
f 做了多大贡献。首先
x
x
x 和
y
y
y 经过了
q
=
x
+
y
q = x + y
q=x+y 这样的组合,所以要想求出
x
x
x 和
y
y
y,必须先求出
q
q
q 对
f
f
f 产生了多大影响。
f
=
q
∗
z
f = q*z
f=q∗z 那么
f
f
f 对
q
q
q 的偏导数就是:
偏导数等于 -4 意味着如果说 q q q 增大一倍,那么 f f f 就会减小 4 倍,所以 q q q 应该朝着增大的方向发展。而 q = x + y q = x + y q=x+y,那么要想算出 x x x 和 y y y 对 f f f 的影响,就要先算出 x x x 和 y y y 对 q q q 的影响,那么就要分别算出 x x x 和 y y y 分别对 q q q 的偏导数。
那么就可以理解为当 x x x 增大一倍, q q q 就增大一倍; y y y 增大一倍, q q q 也增大一倍。那么现在我算 x x x 对 f f f 产生多大影响,这个时候在反向传播当中有一个链式法则,链式法则的意思就是假设要算 x x x 对最终结果做了多大贡献,那最终结果中间肯定有很多步,我们需要一步一步将梯度传下来。比如在这个例子中, q q q 对 f f f 做的贡献是 -4, x x x 对 q q q 做的贡献为 1,那么 x x x 对 f f f 做的贡献就是 -4 * 1 = -4,遵循链式法则。也就是说 x x x 增大一倍, f f f 就相应减小 4 倍,所以 x x x 应该向增大的方向发展。要求 y y y 对 f f f 的贡献同理, q q q 对 f f f 做的贡献是 -4, y y y 对 q q q 做的贡献为 1,那么 y y y 对 f f f 做的贡献就是 -4 * 1 = -4,也就是说 y y y 增大一倍, f f f 就相应减小 4 倍,所以 y y y 也应该向增大的方向发展。
下面这张图就很明显说明了反向传播的过程。我们要想算出
x
x
x 和
y
y
y 对
L
L
L 的梯度,首先得先算出
z
z
z 对
L
L
L 的梯度,再算出
x
x
x 和
y
y
y 分别对
z
z
z 的梯度。不能用一步直接求出
x
x
x 和
y
y
y 对
z
z
z 的导数,首先第一步肯定是通过
L
L
L 传到
z
z
z,再由
z
z
z 传到
x
x
x 和
y
y
y,这就是反向传播的过程。