神经网络

神经元模型

神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实外界物体所作出的交互反应。

在机器学习中谈论到的神经网络一般指神经网络学习

模拟生物神经网络中神经元的最基本模型被称为“M-P神经元模型”,在这个模型中:

  1. 神经元接收到来自 n 个其他神经元传递过来的输入信号 x_1,x_2,\cdots, x_n
  2. 输入信号通过带权重 w_1, w_2, \cdots, w_n 的连接进行传递;
  3. 神经元接收到总输入值并与神经元的阈值 \theta 进行比较;
  4. 通过激活函数 f 处理以产生输出 y

以上的步骤可形式化为 y = f(\sum_{i=1}^nw_ix_i - \theta)

理想的激活函数是阶跃函数:

sgn(x) = \left\{ \begin{aligned} 1, & x\geq 0 \\ 0, & x< 0 \end{aligned}\right.

sgn(x) 将任意值映射为1或0,分别对应于神经元的激活或抑制。然而阶跃函数具有不连续、不光滑等不好的性质,因此实际中常用Sigmoid函数作为激活函数。

\begin{aligned} sigmoid(x) = \frac{1}{1 + e^{-x}} \end{aligned}

感知机与多层网络

感知机由两层神经元组成,

  • 输入层接收外界信号传递给输出层
  • 输出层是M-P神经元

令样本 \vec{x}=[x_1,\cdots,x_n,-1]^T,权重 \vec{w}=[w_1,\cdots,w_n,w_{n+1}]^T,其中 w_{n+1}=\theta

f(\sum_{i=1}^nw_ix_i - \theta) 可改写为 f(\vec{w}^T\vec{x})

感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元,其学习能力非常有限。

要解决非线性可分问题,需要使用多层功能神经元。输入层和输出层之间的神经元被称为隐含层。隐含层和输出层神经元都是有激活函数的功能神经元。

神经网络的学习过程就是通过训练数据来调整神经元之间的“连接权”以及每个功能神经元的阈值,即 \vec{w}

误差逆传播算法

现实任务中,大多是神经网络是通过误差逆传播(BP)算法进行训练的。

误差逆传播算法基于梯度下降策略,以目标的负梯度方向对参数进行调整。对任意参数 v,BP算法在每一轮迭代的更新为

v \leftarrow v - \eta \bigtriangleup v

其中,\eta\in(0,1) 为学习率,\bigtriangleup vv对目标误差的偏导数。

给定训练集 D=\{(\vec{x}_1, \vec{y}_1), (\vec{x}_2, \vec{y}_2), \cdots, (\vec{x}_m, \vec{y}_m)\},其中 \vec{x}_k=[x_1^{(k)}, x_2^{(k)}, \cdots, x_d^{(k)}]^T\in \mathbb{R}^d\vec{y}_k=[y_1^{(k)}, y_2^{(k)}, \cdots, y_l^{(k)}]^T\in \mathbb{R}^l

简单起见,这里讨论一个拥有 d 个输入神经元、l 个输出神经元、q 个隐层神经元的多层前馈神经网络:

  • 输入层第 i 个神经元与隐层第 h 个神经元之间的连接权为 v_{ih}
  • 隐层第 h 个神经元与输出层第 j 个神经元之间的连接权为 w_{hj}
  • 隐层第 h 个神经元的阈值用 \gamma_h表示
  • 输出第 j 个神经元的阈值用 \theta_j表示
  • 隐层和输出层的激活函数为Sigmoid函数

对训练例 (\vec{x}_k,\vec{y}_k)

隐层中第 h 个神经元接收到的输入为

\alpha_h^{(k)} = \sum_{i=1}^{d}v_{ih}x_{i}^{(k)}

隐层中第 h 个神经元的输出为

\begin{aligned} b_h^{(k)} = f(\alpha_h^{(k)} - \gamma_h) = \frac{1}{1+e^{\alpha_h^{(k)} - \gamma_h}} \end{aligned}

输出层第 j 个神经元接收到的输入为

\beta_j^{(k)} = \sum_{h=1}^{q}w_{hj}b_h^{(k)}

输出层第 j 个神经元的输出为

\begin{aligned} \hat{y}_j^{(k)} = f(\beta_j^{(k)} - \theta_j) = \frac{1}{1+e^{\beta_j^{(k)} - \theta_j}} \end{aligned}

假设以上网络的输出为 \hat{\vec{y}}_k = [\hat{y}_1^{(k)}, \hat{y}_2^{(k)}, \cdots, \hat{y}_l^{(k)}]^T,整个网络在 (\vec{x}_k,\vec{y}_k) 上的均方误差为

\begin{aligned} E_k = \frac{1}{2}\sum_{j=1}^{l}(y_{j}^{(k)} - \hat{y}_j^{(k)})^2 \end{aligned}

下面,我们根据BP算法来计算神经网络中的参数更新。

对隐层第 h 个神经元与输出层第 j 个神经元之间的连接权w_{hj}

\begin{aligned} \bigtriangleup w_{hj} = \frac{\partial E_k}{\partial w_{hj}} = \frac{\partial E_k}{\partial w_{hj}} \end{aligned}

注意到,w_{hj} 先影响到输出层第 j 个神经元的输入 \beta_j^{(k)},在影响到其输出值 \hat{y}_j^{(k)}。根据求导的脸时法则,有

\begin{aligned} \frac{\partial E_k}{\partial w_{hj}} = \frac{\partial E_k}{\partial \hat{y}_j^{(k)}}\cdot \frac{\partial \hat{y}_j^{(k)}}{\partial \beta_j^{(k)}}\cdot \frac{\partial \beta_j^{(k)}}{\partial w_{hj}} \end{aligned}

其中

\begin{aligned} \frac{\partial \beta_j^{(k)}}{\partial w_{hj}} = \frac{\partial \sum_{h=1}^{q}w_{hj}b_h^{(k)}}{\partial w_{hj}} = b_h^{(k)} \end{aligned}

\begin{aligned} \frac{\partial \hat{y}_j^{(k)}}{\partial \beta_j^{(k)}} = \frac{f(\beta_j^{(k)} - \theta_j)}{\partial \beta_j^{(k)}} = -\hat{y}_j^{(k)}(1 - \hat{y}_j^{(k)}) \end{aligned}

\begin{aligned} \frac{\partial E_k}{\partial \hat{y}_j^{(k)}} = \frac{\frac{1}{2}\sum_{j=1}^{l}(\hat{y}_j^{(k)} - y_{j}^{(k)})^2}{\partial \hat{y}_j^{(k)}} = (y_{j}^{(k)} - \hat{y}_j^{(k)}) \end{aligned}

\begin{aligned} g_j = \frac{\partial E_k}{\partial \hat{y}_j^{(k)}}\cdot \frac{\partial \hat{y}_j^{(k)}}{\partial \beta_j^{(k)}} = -\hat{y}_j^{(k)}(1 - \hat{y}_j^{(k)})(y_{j}^{(k)} - \hat{y}_j^{(k)}) \end{aligned}

因此

\begin{aligned} \bigtriangleup w_{hj} = g_i b_h^{(k)} \end{aligned}

对输出第 j 个神经元的阈值\theta_j

\begin{aligned} \bigtriangleup \theta_j = \frac{\partial E_k}{\partial \theta_j} = \frac{\partial E_k}{\partial \hat{y}_j^{(k)}}\cdot \frac{\partial \hat{y}_j^{(k)}}{\partial \theta_j} \end{aligned}

其中,

\begin{aligned} \frac{\partial \hat{y}_j^{(k)}}{\partial \theta_j} = \frac{f(\beta_j^{(k)} - \theta_j)}{\partial \theta_j} = \hat{y}_j^{(k)}(1 - \hat{y}_j^{(k)}) \end{aligned}

因此,

\begin{aligned} \bigtriangleup \theta_j = -g_j \end{aligned}

对输入层第 i 个神经元与隐层第 h 个神经元之间的连接权 v_{ih}

\begin{aligned} \bigtriangleup v_{ih} = \frac{\partial E_k}{\partial v_{ih}} \end{aligned}

注意到,v_{ih} 先影响到隐层层第 h 个神经元的输入 \alpha_h^{(k)},并影响到其输出值 b_h^{(k)},随后影响到输出层所有的神经元的输入 \beta_1^{(k)}, \cdots, \beta_l^{(k)},最后影响到其所有输出值 \hat{y}_1^{(k)},\cdots, \hat{y}_l^{(k)}。因此,

\begin{aligned} \frac{\partial E_k}{\partial v_{ih}} = \sum_{j=1}^{l}\frac{\partial E_k}{\partial \hat{y}_j^{(k)}}\cdot\frac{\partial \hat{y}_j^{(k)}}{\partial \beta_j^{(k)}}\cdot \frac{\partial \beta_j^{(k)}}{\partial b_{h}^{(k)}}\cdot\frac{\partial b_{h}^{(k)}}{\partial \alpha_h^{(k)}}\cdot\frac{\partial \alpha_h^{(k)}}{\partial v_{ih}} \end{aligned}

其中,

\begin{aligned} \frac{\partial \beta_j^{(k)}}{\partial b_{h}^{(k)}} = \frac{ \sum_{h=1}^{q}w_{hj}b_h^{(k)}}{\partial b_{h}^{(k)}} = w_{hj} \end{aligned}

\begin{aligned} \frac{\partial b_{h}^{(k)}}{\partial \alpha_h^{(k)}} = \frac{f(b_{h}^{(k)} - \alpha_h^{(k)})}{\partial \alpha_h^{(k)}} = -b_{h}^{(k)}(1-b_{h}^{(k)}) \end{aligned}

\begin{aligned} \frac{\partial \alpha_h^{(k)}}{\partial v_{ih}} = \frac{\sum_{i=1}^{d}v_{ih}x_{i}^{(k)}}{\partial v_{ih}} = x_{i}^{(k)} \end{aligned}

\begin{aligned} e_h = \sum_{j=1}^{l}\frac{\partial E_k}{\partial \hat{y}_j^{(k)}}\cdot\frac{\partial \hat{y}_j^{(k)}}{\partial \beta_j^{(k)}}\cdot \frac{\partial \beta_j^{(k)}}{\partial b_{h}^{(k)}}\cdot\frac{\partial b_{h}^{(k)}}{\partial \alpha_h^{(k)}}= -b_{h}^{(k)}(1-b_{h}^{(k)})\sum_{j=1}^{l}g_j w_{hj} \end{aligned}

因此,

\begin{aligned} \bigtriangleup v_{ih} = e_h x_{i}^{(k)} \end{aligned}

同理,可推导出

\bigtriangleup \gamma_h = -e_h

对每个训练样例,BP算法执行以下操作:

  • 先将输入示例提供给输入层神经元;
  • 逐层将信号向前传播,直到产生输出层结果;
  • 计算输出层误差;
  • 将误差逆向传播到隐层神经元;
  • 根据隐层神经元的误差来对连接权和阈值进行调整

完整的BP算法如下图所示。

输入:训练集 D = \{(\vec{x}_k, \vec{y}_k)\}_{k=1}^{m};学习率 \eta
过程
1:在 (0,1) 范围内随机初始化网络中的所有连接权和阈值
2:repeat
3:~~~~ for all (\vec{x}_k, \vec{y}_k)\in D do
4:~~~~~~~~ 根据当前参数计算样本的输出 \hat{\vec{y}}_k
5:~~~~~~~~ 根据链式求导法则计算输出层神经元的梯度项 g_j
6:~~~~~~~~ 根据链式求导法则计算隐层神经元的梯度项 e_h
7:~~~~~~~~ 根据参数更新公式更新连接权 w_{hj}v_{ih} 以及阈值 \theta_j\gamma_h
8:~~~~ end for
9:until 达到停止条件
输出:连接权和阈值确定的神经网络

BP算法的目标是最小化训练集D上的累积误差 E
\begin{aligned} E = \frac{1}{m}\sum_{k=1}^{m}E_k \end{aligned}

然而,标准BP算法仅针对一个样例更新连接权和阈值。利用累积误差更新参数的算法被称为累积误差逆传播。

理论上,若前馈神经网络有一个包含足够多神经元的隐层,该网络能够以任意精度逼近任意复杂的连续函数。

BP神经网络经常遭遇过拟合,解决BP网络过拟合的通用方法为:

  • 早停:若训练集误差下降,而验证集误差上升,则停止
  • 正则化:在误差目标函数中增加一个用于描述网络复杂程度的部分,如E = \lambda \frac{1}{m}\sum_{k=1}^{m}E_k + (1-\lambda)\sum_i w_i^2,其中 w_i 表示网络中的所有连接权和阈值,\lambda \in (0,1) 用于对经验误差和网络复杂度进行折中。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容