手推BP算法-面试前抢救一下

写在最前

网上关于BP算法的解释浩如烟海,我没必要多写一篇充数,不过面试之前总想快速的复习一下,奈何没有成文的资料。本文旨在提取出纯净的推导过程,不过多解释,为了有基础的朋友们面试前快速过一下。

抽象出问题

给定训练集D = \lbrace (x_1,y_1), (x_2,y_2),...,(x_m,y_m) \rbrace  , x_m \in R^d, y_m \in R^l 以单隐层前馈网络为例,如上图所示:

介绍一下出现的参数:

  • d 输入层神经元的数
  • l 输出层神经元的个数
  • q 隐层神经元个数
  • \theta_j 输出层第j个神经元的阈值
  • \gamma_h 隐层第h个神经元的阈值
  • v_{ih}输入层第i个神经元和隐层第h个神经元的连接权值
  • w_{hj} 隐层第h个神经元和输出层第j个神经元的连接权值
  • b_h 隐层第h个神经元的输出
  • \alpha_h = \sum_{i=1}^d v_{ih}x_i 隐层第h个神经元的输入
  • \beta_j = \sum_{h=1}^q w_{hj}b_h 输出层第j个神经元的输入

介绍一下主要优化的内容

单个神经元的最简单神经网络模型如上图所示,也称作“M-P神经元模型”。该模型可以视为神经网络的最小单位。我们着重注意这个阈值\theta, 神经元输出y=f(\sum_{i=1}^n w_i x_i- \theta),模型输出的是分类结果,所以这个\theta也直接影响分类结果。神经网络的训练就是连接权值的更新,所以这个连接权值的训练不用多解释。阈值本身也可以被作为一个值为-1的哑结点的权值。所以我们BP算法种训练的主要内容便是神经元的连接权值和神经元的阈值。

BP算法训练过程

  1. 明确损失函数和参数调整策略

对样本(x_k, y_k),假定神经网络的输出为\hat y_k = (\hat y_1^k,\hat y_2^k,...,\hat y_l^k),即

\hat y_j^k = f(\beta_j - \theta_j)

网络在样本(x_k,y_k) 上的均方误差

E_k = \frac{1}{2} \sum_{j=1}^l (\hat y_j^k - y_j^k)^2

调整策略为梯度下降:

v = v+\Delta v  \qquad \qquad  \Delta v = -\eta \frac{dE_k}{d v}
  1. 计算输出层阈值\theta_j的梯度\frac{dE_k}{d \theta_j}

\hat y_j^k直接影响E_k, \theta_j直接影响\hat y_j^k, 利用链式法则:

\frac{dE_k}{d \theta_j} = \frac{dE_k}{d\hat y_j^k} \centerdot \frac{d\hat y_j^k}{d \theta_j}

由之前公式可接着计算得出:

\frac{dE_k}{d\hat y_j^k} = \hat y_j^k - y_j^k

由于激活函数为sigmoid函数,导数可以用乘积来表示,有:

\frac{d\hat y_j^k}{d \theta_j} = -\hat y_j^k(1-\hat y_j^k)

所以有

\frac{dE_k}{d \theta_j} = \frac{dE_k}{d\hat y_j^k} \cdot \frac{d\hat y_j^k}{d \theta_j} = \hat y_j^k(1-\hat y_j^k)(\hat y_j^k - y_j^k)=g_j
  1. 计算隐层到输出层连接权值w_{hj}的梯度\frac{dE_k}{dw_{hj}}

\hat y_j^k直接影响E_k,\beta_j 直接影响\hat y_j^kw_{hj}直接影响\beta_j,利用链式法则,所以有:

\frac{dE_k}{dw_{hj}}=\frac{dE_k}{d\hat y_j^k} \cdot \frac{d\hat y_j^k}{d\beta_j} \cdot \frac{d\beta_j}{dw_{hj}}

由于激活函数为sigmoid函数

\frac{dE_k}{d \hat y_j^k} = \hat y_j^k(1-\hat y_j^k)

\beta_j定义可知:

\frac{d\beta_j}{dw_{hj}}=b_h

综合求出:

\frac{dE_k}{dw_{hj}}=-g_jb_h
  1. 计算隐层阈值\gamma_h的梯度\frac{dE_k}{\gamma_h}

b_h影响到E_k, \gamma_h直接影响 b_h,则有:

\frac{dE_k}{d\gamma_h}=\frac{dE_k}{db_h} \cdot \frac{db_h}{d \gamma_h}
\frac{dE_k}{db_h}=\sum_{j=1}^l \frac{dE_k}{d \hat y_j^k} \cdot \frac{d\hat y_j^k}{d\beta_j} \cdot \frac{d\beta_j}{db_h} = -\sum_{j=1}^l g_j w_{hj}
\frac{db_h}{d\gamma_h} = \frac{df(\alpha_h-\gamma_h)}{d\gamma_h} = -f(\alpha_h-\gamma_h)=-b_h(1-b_h)
\frac{dE_k}{d\gamma_h}=b_h(1-b_h)\sum_{j=1}^lg_jw_{hj}
  1. 总结最终结果

引申一下,在多层前向网络中,将隐层阈值梯度表述为m层的阈值梯度g_h^{(m)},隐层神经元输出表述为m层神经元的输出b_h^{(m)},隐层与输出层的连接权值表述为m+1层的权值w_{hj}^{(m+1)},将输出层阈值梯度表述为m+1层的阈值梯度g_j^{(m+1)}。则隐层阈值梯度可以表示为:

g_h^{(m)}=b_h^{(m)}(1-b_h^{(m)})\sum_{j=1}^l w_{hj}^{(m+1)}g_j^{(m+1)}

可知,在阈值调整过程中,当前层的阈值梯度取决于下一层的阈值梯度,这就是BP算法的精髓,同理:

\frac{dE_k}{dw_{hj}}^{(m)} = -g_j^{(m)}b_h^{(m+1)}

可知,当前层的连接权值梯度,取决于当前层神经元阈值梯度和上层神经元输出

BP算法的优缺点

优点

  1. 能够自适应、自主学习。这是BP算法的根本以及其优势所在,BP算法根据预设的参数更新规则,不断地调整神经网络中的参数,以达到最符合期望的输出。
  2. 拥有较强的非线性映射能力。
  3. 严谨的推导过程。误差的反向传播过程,采用的是已经非常成熟的链式法测,其推导过程严谨且科学。
  4. 较强的泛化能力,即在BP算法训练结束之后,BP算法可以利用从原来知识中学到的知识解决新的问题。

缺点:

  1. 由于BP神经网络中的参数众多,每次都需要更新数量较多的阈值和权值,故会导致收敛速度过慢。
  2. 网络中隐含层节点个数尚无明确的公式,传统方法需要不断地设置隐含层节点数进行试凑,根据网络误差结果确定最终隐含层节点个数。
  3. 从数学角度看,BP算法是一种速度较快的梯度下降算法,很容易陷入局部最小值的问题。当出现局部极小时,从表面上看,误差符合要求,但这时所得到的解并不一定是问题的真正解。所以BP算法是不完备的。

猜你喜欢

转载自juejin.im/post/5c13b00d518825314143675c