Loading

5 神经网络

本文根据西瓜书内容整理而成,并参考了以下资料: Datawhale南瓜书https://www.datawhale.cn/learn/content/2/67

5.1 神经元模型

定义: 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应
M-P神经元模型:神经元兴奋时会导致电位差传给其他神经元,当一个神经元的电位超过了阈值的话就会兴奋,向其他神经元发送化学物质。根据这个想法抽象成了“M-P神经元模型”。
Remark: 为了避免不连续函数带来的问题,我们的激活函数,类似地,也是选择sigmoid函数$$sigmoid(x) = \frac{1}{1+e^{-x}}$$

5.2 感知机与多层网络

感知机:由两层神经元组成,是“阈值逻辑单元”
感知机可以很容易地实现逻辑中的与,或,非运算

  • “与” \((x_1 \land x_2)\):令 \(w_1 = w_2 = 1\)\(\theta = 2\),则 \(y = f\left(1 \cdot x_1 + 1 \cdot x_2 - 2\right)\),仅在 \(x_1 = x_2 = 1\) 时,\(y = 1\)
  • “或” \((x_1 \lor x_2)\):令 \(w_1 = w_2 = 1\)\(\theta = 0.5\),则 \(y = f\left(1 \cdot x_1 + 1 \cdot x_2 - 0.5\right)\),当 \(x_1 = 1\)\(x_2 = 1\) 时,\(y = 1\)
  • “非” \((\neg x_1)\):令 \(w_1 = -0.6\)\(w_2 = 0\)\(\theta = -0.5\),则 \(y = f\left(-0.6 \cdot x_1 + 0 \cdot x_2 + 0.5\right)\),当 \(x_1 = 1\) 时,\(y = 0\);当 \(x_1 = 0\) 时,\(y = 1\)
    从中我们可以明白,其实我们就是在寻找一个最佳的\(w\)\(\theta\),我们的参数选择的目标是:使得误分类样本尽量少

损失函数: 用数学语言来描述误分类程度$$L(w,\theta)=\sum_{x\in M}(\hat{y}-y)(w^T x- \theta)$$
感知机学习算法:$$\min_{w.\theta}L(w,\theta)$$
根据最优化理论,使用随机梯度下降法,得到迭代更新公式:

\[\begin{align*} w_i &\leftarrow w_i + \Delta w_i\\ \Delta w_i &= \eta (y - \hat{y}) x_i \end{align*}\]

上述感知机学习算法只考虑两层神经元,解决的问题只是线性可分问题,对于非线性可分问题,我们使用多层功能神经元,输入层与输出层之间还有一层神经元,这层神经元叫做隐含层。

5.3 误差逆传播算法

多层网络的优化算法变得复杂起来,误差逆传播算法就是解决这一问题的一个优秀算法

对训练例 \((\boldsymbol{x}_k, \boldsymbol{y}_k)\),假定神经网络的输出为 \(\hat{\boldsymbol{y}}_k = (\hat{y}_1^k, \hat{y}_2^k, \dots, \hat{y}_l^k)\),即

\[\hat{y}_j^k = f(\beta_j - \theta_j) \]

网络在 \((\boldsymbol{x}_k, \boldsymbol{y}_k)\) 上的均方误差为

\[E_k = \frac{1}{2} \sum_{j=1}^{l} \left( \hat{y}_j^k - y_j^k \right)^2 \]

参数\(v\)的更新方式$$v \leftarrow v + \Delta v$$
对于误差,根据最优化理论,有$$\Delta w_{hj} = -\eta \frac{\partial E_k}{\partial w_{hj}}$$
注意到 \(w_{hj}\) 先影响到第 \(j\) 个输出层神经元的输入值 \(\beta_j\),再影响到其输出值 \(\hat{y}_j^k\),然后影响到 \(E_k\),类似链式法则,有

\[\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} \cdot \frac{\partial \beta_j}{\partial w_{hj}} \]

因为\(\beta_j=\sum b_hw_{hj}\) , 所以导数就是各个部分的权重 $$\frac{\partial \beta_j}{\partial w_{hj}} = b_h$$ 而我们的Sigmoid 函数有一个很好的性质: $$f'(x) = f(x) \left( 1 - f(x) \right) $$化简剩下的部分,有

\[\begin{align*} g_j &= -\frac{\partial E_k}{\partial \hat{y}_j^k} \cdot \frac{\partial \hat{y}_j^k}{\partial \beta_j} \\ &= - \left( \hat{y}_j^k - y_j^k \right) f'\left( \beta_j - \theta_j \right) \\ &= \hat{y}_j^k \left( 1 - \hat{y}_j^k \right) \left( y_j^k - \hat{y}_j^k \right)\end{align*} \]

全部带回,得到了 BP 算法中关于 \(w_{hj}\) 的更新公式

\[\Delta w_{hj} = \eta \, g_j \, b_h \]

类似可得

\[\Delta \theta_j = -\eta g_j, \]

\[\Delta v_{ih} = \eta e_h x_i, \]

\[\Delta \gamma_h = -\eta e_h, \]

其中

\[\begin{align*} e_h &= -\frac{\partial E_k}{\partial b_h} \cdot \frac{\partial b_h}{\partial \alpha_h} \\ &= -\sum_{j=1}^{l} \frac{\partial E_k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial b_h} f'(\alpha_h - \gamma_h) \\&=b_h(1-b_h)\sum^l_{j=1} w_{hj}g_j\end{align*} \]

算法的整体流程如下:
对训练集里面的一个样本点

  • 根据当前参数计算出当前样本的输出\(\hat{y}_k\)
  • 开始算输出层神经元梯度项\(g_j\)
  • 计算隐层神经元的梯度项\(e_h\)
  • 更新参数\(w\)\(v\)
  • 计算阈值\(\theta\)\(\gamma\)

不断循环直到达到阈值

标准BP算法:上面介绍的是针对一个样本点的训练方法,这种就叫做标准BP算法
累计BP算法:针对训练集D上的累计误差来进行最小化$$E=\frac{1}{m}\sum_{k=1}^mE_k$$
Remark:

  • 标准BP算法容易出现频繁抵消问题
  • 累积算法小到一定程度之后,下降速度会变得十分缓慢

BP神经网络容易出现过拟合现象,训练集误差下降但是测试集误差上升
解决策略:

  • 早停:训练集误差降低但验证机误差升高时就停止训练
  • 正则化:添加一个描述网络复杂度的部分,例如$$E=\lambda\frac{1}{m}\sum_{k=1}^{m}E_k+(1-\lambda)\sum_i w_i^2$$

5.4 全局最小与局部极小

有一些常用的跳出局部最小值以找到全局最小值的方法:

  • 多个不同初始点(多组不同参数值)
  • 模拟退火(以一定概率接受比当前解更差的结果)
  • 随机梯度下降
    Remark:这些技术大多都是启发式,理论上尚缺乏保障
posted @ 2025-08-03 23:01  米加  阅读(14)  评论(0)    收藏  举报