Sigmoid的梯度消失
以下是一个通过简单的神经网络示例来解释 Sigmoid 函数的梯度消失问题。
假设有一个非常简单的三层神经网络,输入层有两个神经元,隐藏层有两个神经元,输出层有一个神经元。我们使用均方误差作为损失函数,并且假设我们正在处理一个二分类问题。
-
前向传播:
- 假设输入为 x = [ x 1 , x 2 ] x=[x_1,x_2] x=[x1,x2],连接输入层和隐藏层的权重矩阵为 W 1 W_1 W1,隐藏层的输出为 h h h,则 h = s i g m o i d ( W 1 x ) h = sigmoid(W_1x) h=sigmoid(W1x)。
- 设连接隐藏层和输出层的权重为 w 2 w_2 w2,输出为 y y y,则 y = s i g m o i d ( w 2 h ) y = sigmoid(w_2h) y=sigmoid(w2h)。
-
反向传播:
-
计算损失函数对输出层权重 w 2 w_2 w2 的梯度。假设真实标签为 t t t,损失函数为 L = ( t − y ) 2 L=(t - y)^2 L=(t−y)2。
-
首先计算 ∂ L ∂ y = − 2 ( t − y ) \frac{\partial L}{\partial y}=-2(t - y) ∂y∂L=−2(t−y)。
-
然后计算 ∂ y ∂ w 2 = y ( 1 − y ) h \frac{\partial y}{\partial w_2}=y(1 - y)h ∂w2∂y=y(1−y)h。
-
所以 ∂ L ∂ w 2 = ∂ L ∂ y ∂ y ∂ w 2 = − 2 ( t − y ) y ( 1 − y ) h \frac{\partial L}{\partial w_2}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial w_2}=-2(t - y)y(1 - y)h ∂w2∂L=∂y∂L∂w2∂y=−2(t−y)y(1−y)h。
-
接着计算损失函数对隐藏层输出 h h h 的梯度,由于 ∂ L ∂ h = ∂ L ∂ y ∂ y ∂ h = − 2 ( t − y ) y ( 1 − y ) w 2 \frac{\partial L}{\partial h}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial h}=-2(t - y)y(1 - y)w_2 ∂h∂L=∂y∂L∂h∂y=−2(t−y)y(1−y)w2。
-
再计算损失函数对隐藏层权重 W 1 W_1 W1 的梯度。这里 ∂ h ∂ W 1 = h ( 1 − h ) x \frac{\partial h}{\partial W_1}=h(1 - h)x ∂W1∂h=h(1−h)x。
-
所以 ∂ L ∂ W 1 = ∂ L ∂ h ∂ h ∂ W 1 = − 2 ( t − y ) y ( 1 − y ) w 2 h ( 1 − h ) x \frac{\partial L}{\partial W_1}=\frac{\partial L}{\partial h}\frac{\partial h}{\partial W_1}=-2(t - y)y(1 - y)w_2h(1 - h)x ∂W1∂L=∂h∂L∂W1∂h=−2(t−y)y(1−y)w2h(1−h)x。
-
-
梯度消失分析:
-
观察上述梯度表达式,其中包含了 y ( 1 − y ) y(1 - y) y(1−y) 和 h ( 1 − h ) h(1 - h) h(1−h),这是 Sigmoid 函数的导数。
-
当 y y y 和 h h h 的值接近 0 或 1 时,Sigmoid 函数的导数非常小,接近于 0。
-
在深度神经网络中,如果经过多次前向传播后,隐藏层的输出值接近 0 或 1,那么在反向传播过程中,梯度会变得非常小,随着层数的增加,梯度会呈指数级减小,导致靠近输入层的权重更新非常缓慢甚至停滞不前,这就是梯度消失问题。
-
例如,假设在训练过程中,隐藏层的输出值 h h h 接近 0 或 1,那么 h ( 1 − h ) h(1 - h) h(1−h) 的值就会非常小。如果这个网络有很多层,那么在反向传播时,从输出层传递到输入层的梯度会越来越小,使得输入层的权重几乎无法更新,从而影响整个网络的训练效果。
-
ReLU的不会梯度消失
对于使用 ReLU(Rectified Linear Unit)激活函数的神经网络,我们来推导为什么它一般不会出现梯度消失问题。
还是考虑上述简单的三层神经网络结构:输入层有两个神经元,隐藏层有两个神经元,输出层有一个神经元,使用均方误差作为损失函数,处理二分类问题。
-
前向传播:
- 假设输入为 x = [ x 1 , x 2 ] x=[x_1,x_2] x=[x1,x2],连接输入层和隐藏层的权重矩阵为 W 1 W_1 W1,隐藏层的输出为 h h h,对于 ReLU 激活函数, h = m a x ( 0 , W 1 x ) h = max(0,W_1x) h=max(0,W1x)。
- 设连接隐藏层和输出层的权重为 w 2 w_2 w2,输出为 y y y,则 y = s i g m o i d ( w 2 h ) y = sigmoid(w_2h) y=sigmoid(w2h)(这里输出层仍使用 Sigmoid 以便于对比,实际中输出层的激活函数会根据任务而定)。
-
反向传播:
-
计算损失函数对输出层权重 w 2 w_2 w2 的梯度。假设真实标签为 t t t,损失函数为 L = ( t − y ) 2 L=(t - y)^2 L=(t−y)2。
-
首先计算 ∂ L ∂ y = − 2 ( t − y ) \frac{\partial L}{\partial y}=-2(t - y) ∂y∂L=−2(t−y)。
-
然后计算 ∂ y ∂ w 2 = y ( 1 − y ) h \frac{\partial y}{\partial w_2}=y(1 - y)h ∂w2∂y=y(1−y)h。
-
所以 ∂ L ∂ w 2 = ∂ L ∂ y ∂ y ∂ w 2 = − 2 ( t − y ) y ( 1 − y ) h \frac{\partial L}{\partial w_2}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial w_2}=-2(t - y)y(1 - y)h ∂w2∂L=∂y∂L∂w2∂y=−2(t−y)y(1−y)h。
-
接着计算损失函数对隐藏层输出 h h h 的梯度,由于 ∂ L ∂ h = ∂ L ∂ y ∂ y ∂ h = − 2 ( t − y ) y ( 1 − y ) w 2 \frac{\partial L}{\partial h}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial h}=-2(t - y)y(1 - y)w_2 ∂h∂L=∂y∂L∂h∂y=−2(t−y)y(1−y)w2。
-
再计算损失函数对隐藏层权重 W 1 W_1 W1 的梯度。对于 ReLU 函数,当输入大于 0 时,导数为 1;当输入小于等于 0 时,导数为 0。
-
假设 h i h_i hi 是隐藏层第 i i i 个神经元的输出,那么如果 h i > 0 h_i>0 hi>0, ∂ h i ∂ W 1 i j = x j \frac{\partial h_i}{\partial W_{1ij}}=x_j ∂W1ij∂hi=xj(其中 W 1 i j W_{1ij} W1ij 是连接输入层第 j j j 个神经元和隐藏层第 i i i 个神经元的权重);如果 h i ≤ 0 h_i\leq0 hi≤0, ∂ h i ∂ W 1 i j = 0 \frac{\partial h_i}{\partial W_{1ij}}=0 ∂W1ij∂hi=0。
-
所以 ∂ L ∂ W 1 = ∂ L ∂ h ∂ h ∂ W 1 \frac{\partial L}{\partial W_1}=\frac{\partial L}{\partial h}\frac{\partial h}{\partial W_1} ∂W1∂L=∂h∂L∂W1∂h,当 h i > 0 h_i>0 hi>0 时,该梯度为 − 2 ( t − y ) y ( 1 − y ) w 2 x j -2(t - y)y(1 - y)w_2x_j −2(t−y)y(1−y)w2xj,不为 0;当 h i ≤ 0 h_i\leq0 hi≤0 时,该梯度为 0,但不会出现像 Sigmoid 那样导数趋近于 0 导致梯度呈指数级减小的情况。
-
-
分析:
- 在使用 ReLU 激活函数时,只要隐藏层神经元的输出大于 0,梯度就可以正常地反向传播,不会出现因为激活函数导数趋近于 0 而导致的梯度消失问题。
- 虽然当隐藏层神经元输出小于等于 0 时,梯度为 0,但这只是部分神经元的情况,而且在实际训练中,随着权重的调整,不同的神经元会在不同的时间被激活,使得网络整体能够有效地进行学习。