Skip to content

Commit

Permalink
update: 前馈网络与反向传播 (#67)
Browse files Browse the repository at this point in the history
  • Loading branch information
YJJ-228 authored Mar 9, 2025
1 parent 8128957 commit 7210d95
Showing 1 changed file with 150 additions and 4 deletions.
154 changes: 150 additions & 4 deletions 神经网络与深度学习/2.机器学习概述.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,157 @@ $$

# 前馈神经网络

> [!NOTE]
> TODO
神经网络最早是作为一种主要的连接主义模型,引入误差反向传播来改进其学习能力之后,神经网络也越来越多地应用在各种机器学习任务上,神经网络有三个主要特性:

- 信息表示是分布式的(非局部的)
- 记忆和知识是存储在单元之间的连接上
- 通过逐渐改变单元之间的连接强度来学习新的知识

## 激活函数性质

- 连续并可导(允许少数点上不可导)的非线性函数
- 激活函数及其导函数要尽可能的简单
- 激活函数的导函数的值域要在一个合适的区间内
- 单调递增

## 常见激活函数及对应导数

| 激活函数 | 函数 | 导数 |
|-----------------|----------------------------------------------------|------------------------------------------------------|
| $Logistic$ 函数 | $f(x) = \frac{1}{1 + exp(-x)}$ | $f'(x) = f(x)(1 - f(x))$ |
| $Tanh$ 函数 | $f(x) = \frac{exp(x) - exp(-x)}{exp(x) + exp(-x)}$ | $f'(x) = 1 - f(x)^2$ |
| $ReLU$ 函数 | $f(x) = max(0, x)$ | $f'(x) = I(x > 0)$ |
| $ELU$ 函数 | $f(x) = max(0, x) + min(0, \gamma(exp(x) – 1))$ | $f'(x) = I(x > 0) + I(x \leq 0) \cdot \gamma exp(x)$ |
| $SoftPlus$ 函数 | $f(x) = log (1 + exp(x))$ | $f'(x) = \frac{1}{1 + exp(-x)}$ |

[详情信息](https://www.jiqizhixin.com/articles/2021-02-24-7)

## 前馈网络细节(全连接神经网络、多层感知器)

- 各神经元分别属于不同的层,层内无连接
- 相邻两层之间的神经元全部两两连接
- 整个网络中无反馈,信号从输入层向输出层单向传播,可用一个有向无环图表示

## 前馈计算

![前馈网络](https://i-blog.csdnimg.cn/blog_migrate/5264fc3b3bd415b25d73c40146f549a1.png)

| 记号 | 含义 |
|--------------------------------------------------------|------------------------------------|
| $L$ | 神经网络的层数 |
| $M_l$ | 第 $l$ 层神经元的个数 |
| $f_l(\cdot)$ | 第 $l$ 层神经元的激活函数 |
| $\mathbf{W}^{(l)} \in \mathbb{R}^{M_l \times M_{l-1}}$ | 第 $l-1$ 层到第 $l$ 层的权重矩阵 |
| $\mathbf{b}^{(l)} \in \mathbb{R}^{M_l}$ | 第 $l-1$ 层到第 $l$ 层的偏置 |
| $\mathbf{z}^{(l)} \in \mathbb{R}^{M_l}$ | 第 $l$ 层神经元的净输入 (净活化值) |
| $\mathbf{a}^{(l)} \in \mathbb{R}^{M_l}$ | 第 $l$ 层神经元的输出 (活化值) |

前馈传播公式:

$$
\begin{cases}
& z^{(l)}=W^{(l)}\cdot a^{(l-1)} + b^{(l)} \\
& a^{(l)}=f_ {l}(z^{(l)}) \\
\end{cases}
$$

计算过程:

$$
x=a^{(0)} \rightarrow z^{(1)} \rightarrow a^{(1)} \rightarrow z^{(2)} \rightarrow a^{(2)} \rightarrow \cdots \rightarrow z^{(L)} \rightarrow a^{(L)} = \phi(x;(W,b))
$$

## 通用近似定理

根据通用近似定理,对于具有线性输出层和至少一个使用“挤压”性质的激活函数的隐藏层组成的前馈神经网络,只要其隐藏层神经元的
数量足够,它可以以任意的精度来近似任何从一个定义在实数空间中的有界闭集函数

## 对于机器学习的应用

- 特征转换,或是逼近某一种分布
- 最后一层加 $Logistic$ 可作为分类器
- 最后一层加 $Softmax$ 可输出每个类的条件概率
- 对于样本 $(x,y)$ , 常使用交叉熵损失函数 $\mathcal{L}(y,\hat{y}) = -y^{T}logy$

## 参数学习

$$
R(W,b) = \frac{1}{N}\sum_ {n=1}^{N}\mathcal{L}(y^{(n)},\hat{y}^{(n)})+\frac{1}{2}\lambda\parallel W \parallel^2_ F
$$

$$
W^{(l)} \leftarrow W^{(l)} - \alpha \frac{\partial R(W,b)}{\partial W^{(l)}}
$$

$$
b^{(l)} \leftarrow b^{(l)} - \alpha \frac{\partial R(W,b)}{\partial b^{(l)}}
$$

# 反向传播算法

## 链式法则

直接用损失函数对权值求导太复杂,因此先对净活化值 $z$ 求导,分布进行

$$
\begin{aligned}
\frac{\partial \mathbf{z}^{(l)}}{\partial w_ {ij}^{(l)}} &= \left[ \frac{\partial z_ 1^{(l)}}{\partial w_ {ij}^{(l)}}, \dots, \frac{\partial z_ i^{(l)}}{\partial w_ {ij}^{(l)}}, \dots, \frac{\partial z_ {m^{(l)}}^{(l)}}{\partial w_ {ij}^{(l)}} \right] \\
&= \left[ 0, \dots, \frac{\partial (\mathbf{w}_ {i:}^{(l)} \mathbf{a}^{(l-1)} + b_ i^{(l)})}{\partial w_ {ij}^{(l)}}, \dots, 0 \right] \\
&= \left[ 0, \dots, a_ j^{(l-1)}, \dots, 0 \right] \\
&\triangleq \mathbb{I}_ i (a_ j^{(l-1)}) \in \mathbb{R}^{m^{(l)}}, \\\\
\frac{\partial \mathbf{z}^{(l)}}{\partial \mathbf{b}^{(l)}} &= \mathbf{I}_ {m^{(l)}} \in \mathbb{R}^{m^{(l)} \times m^{(l)}}
\end{aligned}
$$

然后使用链式法则

$$
\begin{aligned}
\frac{\partial \mathcal{L}(y, \hat{y})}{\partial w_{ij}^{(l)}} = \frac{\partial z^{(l)}}{\partial w_{ij}^{(l)}} \frac{\partial \mathcal{L}(y, \hat{y})}{\partial z^{(l)}} \\
\frac{\partial \mathcal{L}(y, \hat{y})}{\partial b^{(l)}} = \frac{\partial z^{(l)}}{\partial b^{(l)}} \frac{\partial \mathcal{L}(y, \hat{y})}{\partial z^{(l)}}
\end{aligned}
$$

$$
误差项: \delta^{(l)}=\frac{\partial\mathcal{L}(y,\hat{{y}})}{\partial z^{(l)}} \in \mathbb{R}^{m^{(l)}}
$$

通过链式法则得到损失函数对 $l$ 层权重 $W^{(l)}$ 的梯度:

$$
\frac{\partial\mathcal{L}(y,\hat{y})}{\partial w_ {ij}^{(l)}} = \delta^{(l)}(a^{(l-1)})^T
$$

同理, $\mathcal{L}(y,\hat{y})$ 关于第 $l$ 层偏置 $b^{(l)}$ 的梯度为:

$$
\frac{\partial\mathcal{L}(y,\hat{y})}{\partial b^{(l)}} = \delta^{(l)}
$$

## 算法流程

1. 输入: 训练集 $D = \{(x^{(n)}, y^{(n)})\}_{n=1}^{N}$, 验证集 $V$, 学习率 $\alpha$, 正则化系数 $\lambda$, 网络层数 $L$, 神经元数量 $M_l(1 \leq l \leq L)$
2. 随机初始化 $W, b$
3. repeat
1. 对训练集 $D$ 中的样本随机重排序
2. for $n = 1$ to $N$ do
- 从训练集 $D$ 中选取样本 $(x^{(n)}, y^{(n)})$
- 前馈计算每一层的净输入 $z^{(l)}$ 和激活值 $a^{(l)}$, 直到最后一层
- 反向传播计算每一层的误差 $\delta^{(l)}$
- 计算每一层参数的导数
- $\forall l, \frac{\partial \mathcal{L}(y^{(n)}, \hat{y}^{(n)})}{\partial W^{(l)}} = \delta^{(l)} (a^{(l-1)})^T$
- $\forall l, \frac{\partial \mathcal{L}(y^{(n)}, \hat{y}^{(n)})}{\partial b^{(l)}} = \delta^{(l)}$
- 更新参数
- $W^{(l)} \leftarrow W^{(l)} - \alpha (\delta^{(l)} (a^{(l-1)})^T + \lambda W^{(l)})$
- $b^{(l)} \leftarrow b^{(l)} - \alpha \delta^{(l)}$
3. end for
4. **until** 神经网络模型在验证集 $V$ 上的错误率不再下降
5. 输出: $W, b$

## 自动微分

通过将数值计算分解为一系列基本运算,然后利用链式法则自动地计算这些基本运算的导数,从而得到整个函数的导数

## 优化问题

- 参数过多, 影响训练
Expand Down Expand Up @@ -130,8 +276,8 @@ $f(\cdot)$ 为激活函数
作用: 降低特征维数,避免过拟合

常用的汇聚函数
- 最大汇聚(Maximun Pooling): 取一个区域内所有神经元的最大值
- 平均汇聚(Mean Pooling): 一般是取区域内所有神经元的平均值
- 最大汇聚 (Maximun Pooling): 取一个区域内所有神经元的最大值
- 平均汇聚 (Mean Pooling): 一般是取区域内所有神经元的平均值

## 反向传播算法

Expand Down

0 comments on commit 7210d95

Please sign in to comment.