反向传播

文章目录

    • 链式法则
    • 分段反向传播
    • 反向传播的模式
    • 数据预处理与 BP
    • 权重初始化与 BP
    • 激活函数与 BP
    • 数据集与 BP
    • Loss 为 Nan 原因

链式法则

反向传播算法 (Back Propagation,BP) 是利用链式法则递归计算表达式的梯度的方法:

  • 对于乘法函数 f ( x , y ) = x y f(x,y)=xy f(x,y)=xy 求偏导数:

f ( x , y ) = x y → d f d x = y d f d y = x \displaystyle f(x,y)=xy \to \frac {df}{dx}=y \quad \frac {df}{dy}=x f(x,y)=xydxdf=ydydf=x

  • 对于加法函数 f ( x , y ) = x + y f(x,y)=x+y f(x,y)=x+y 求偏导数:

    f ( x , y ) = x + y → d f d x = 1 d f d y = 1 \displaystyle f(x,y)=x+y \to \frac {df}{dx}=1\quad\frac {df}{dy}=1 f(x,y)=x+ydxdf=1dydf=1

  • 对于复合函数,如 f ( x , y , z ) = ( x + y ) z f(x,y,z)=(x+y)z f(x,y,z)=(x+y)z,令 q = x + y q=x+y q=x+y ,即 f = q z f=qz f=qz

    ∂ f ∂ q = z , ∂ f ∂ z = q \displaystyle\frac{\partial f}{\partial q}=z,\frac{\partial f}{\partial z}=q qf=z,zf=q

    又因为 q = x + y q=x+y q=x+y,所以:

    ∂ q ∂ x = 1 , ∂ q ∂ y = 1 \displaystyle\frac{\partial q}{\partial x}=1,\frac{\partial q}{\partial y}=1 xq=1,yq=1

    链式法则求复合函数的梯度:
    ∂ f ∂ x = ∂ f ∂ q ∂ q ∂ x \displaystyle\frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial x} xf=qfxq

    在实际操作中,只需简单地将两个梯度数值相乘:

# 设置输入值
x = -2; y = 5; z = -4

# 进行前向传播
q = x + y # q becomes 3
f = q * z # f becomes -12

# 进行反向传播:
# 首先回传到 f = q * z
dfdz = q # df/dz = q, 所以关于z的梯度是3
dfdq = z # df/dq = z, 所以关于q的梯度是-4
# 现在回传到q = x + y
dfdx = 1.0 * dfdq # dq/dx = 1. 这里的乘法是因为链式法则
dfdy = 1.0 * dfdq # dq/dy = 1

计算线路:

反向传播_第1张图片

前向传播从输入计算到输出(绿色),反向传播从尾部开始,根据链式法则递归地向前计算梯度(显示为红色),一直到网络的输入端。

分段反向传播

  • 在复杂的表达式中,直接对 x x x y y y 进行微分运算时,运算结束后会得到一个巨大而复杂的表达式。

  • 为了使反向传播过程更加简洁,可以把向前传播分成不同的阶段(创建中间变量)。

  • 在反向传播的时,就可以(反向地)逐步计算各个中间变量的梯度得到最终的梯度值。

  • 如果变量 x , y x,y xy 在前向传播的表达式中出现多次,那么进行反向传播的时候就要非常小心,使用 += 来累计这些变量的梯度。这是遵循了在微积分中的多元链式法则,该法则指出如果变量在线路中分支走向不同的部分,那么梯度在回传的时候,就应该进行累加。

反向传播的模式

反向传播中的梯度可以被很直观地解释。神经网络中最常用的加法、乘法和取最大值这三个操作,在反向传播过程中的行为都有非常简单的解释:

反向传播_第2张图片
  • 加法操作:将梯度相等地分发给它的输入,不改变梯度值。

  • 取最大操作:将梯度值完整地传给比较大的输入,比较小的输入梯度值为 0。这是因为在取最大值操作中,最高值的局部梯度是 1.0,其余的是 0。

  • 乘法操作:使用输入的激活数据值,对它们进行交换,然后乘以梯度。

数据预处理与 BP

  • 在神经网络中,权重和输入进行点积 w T x i w^Tx_i wTxi 运算,所以输入数据的数值大小会对权重梯度的大小产生影响。

  • 如果对所有的输入数据样本 x i x_i xi 乘以 1000,那么在计算过程中,权重的梯度将会增大1000倍,这样就必须降低学习率来弥补。

  • 这就是为什么数据预处理关系重大,它即使只是有微小变化,也会产生巨大影响。

  • 数据特征的分布不同,也会导致每一维的梯度下降不同,使用同一个学习速率时,也就很难迭代到代价函数最低点。进行 特征缩放 feature scaling 后,可以使梯度下降法更快地收敛。

权重初始化与 BP

  • 如果网络权重的初始值都设为 0,那么每个神经元都会计算出同样的输出,在反向传播时也会得到相同的梯度,导致所有隐层单元都只学习到一个相同的特征。

  • 可以使用小随机数初始化,参见 权重初始化 。

  • 但并不是数值越小就会表现得越好,如果权重非常小,那么在反向传播时就会计算出很小的梯度 (梯度与权重成正比),在深层网络的链式求导过程中,最后连乘的乘积可能趋于 0,导致梯度消失。

  • 反之,如果权值过大,最后乘积可能趋于无穷大,导致梯度爆炸。

激活函数与 BP

  • 如果选择 Sigmoid 或者 Tanh 函数,由它们的曲线可以看出,当输入数值很大或者很小的时候,梯度会接近 0, 饱和的神经元会带来梯度消失。

  • 一般可以使用 ReLU 作为激活函数,但需要小心地调节学习速率,不然可能会产生 Dead ReLU Problem,ReLU 的神经元再也不能被激活,导致梯度永远都是零。

  • 详见:激活函数 activation function

数据集与 BP

数据集本身可能标注不准确,引入大量噪声:

  • 在目标检测中,如果标注框的面积与实际目标的面积偏差过大,将会引入大量噪声,导致梯度爆炸。

  • 对于数据集质量带来的梯度爆炸问题,一般可以尽量使得标注准确,除非是进行难例挖掘操作,一般尽量使用清晰的图片。

Loss 为 Nan 原因

  • 梯度爆炸:梯度变得非常大,使得学习过程难以继续。

  • 不当的损失函数。

  • 不当的输入。

  • 池化层中步长比卷积核的尺寸大。

你可能感兴趣的:(机器学习,-,深度学习)