|
17 | 17 |
|
18 | 18 | ### 工作原理
|
19 | 19 |
|
20 |
| -我们先设计一个最简单的神经网络模型,它只有一层输入和一层输出,该模型会根据输入($\small{X}$)去预测输出($\small{y}$),而输出又满足下面的公式: |
| 20 | +我们先设计一个最简单的神经网络模型,它只有一层输入和一层输出,该模型会根据输入( $\small{X}$ )去预测输出( $\small{y}$ ),而输出又满足下面的公式: |
| 21 | + |
21 | 22 | $$
|
22 | 23 | y = aX_{1} + bX_{2} + cX_{3} + d
|
23 | 24 | $$
|
24 |
| -其中,$\small{a, b, c, d}$ 都是模型的参数(权重和偏置),那么我们的神经网络模型应该是如下图所示的结构。 |
| 25 | + |
| 26 | +其中, $\small{a, b, c, d}$ 都是模型的参数(权重和偏置),那么我们的神经网络模型应该是如下图所示的结构。 |
25 | 27 |
|
26 | 28 | <img src="res/08_one_layer_nn.png" style="zoom:55%;">
|
27 | 29 |
|
|
30 | 32 | <img src="res/08_multi_layer_nn.png" style="zoom:58%;">
|
31 | 33 |
|
32 | 34 | 接下来,我们看看神经网络的工作原理。每个神经元的计算过程可以表示为:
|
| 35 | + |
33 | 36 | $$
|
34 | 37 | y = f \left( \sum_{i=1}^{n}w_{i}x_{i} + b \right)
|
35 | 38 | $$
|
36 |
| -其中,$\small{x_{1}, x_{2}, \dots, x_{n}}$ 是输入特征,$\small{w_1, w_2, \dots, w_n}$ 是与输入对应的权重;$\small{b}$ 是偏置项;$\small{f}$ 是激活函数,通常是非线性函数,如 Sigmoid、ReLU、Tanh 等。激活函数一个方面是引入非线性变换,增加了神经网络的表达能力,使得它可以模拟任意复杂的函数关系;另一方面,在训练神经网络时会使用反向传播来更新权重,激活函数的非线性属性使得梯度传递更有效,让神经网络收敛得更快,提高训练效率。下面我们对常用的激活函数做一个简要的介绍。 |
37 | 39 |
|
38 |
| -1. Sigmoid 函数 |
| 40 | +其中, $\small{x_{1}, x_{2}, \dots, x_{n}}$ 是输入特征, $\small{w_1, w_2, \dots, w_n}$ 是与输入对应的权重; $\small{b}$ 是偏置项; $\small{f}$ 是激活函数,通常是非线性函数,如 Sigmoid、ReLU、Tanh 等。激活函数一个方面是引入非线性变换,增加了神经网络的表达能力,使得它可以模拟任意复杂的函数关系;另一方面,在训练神经网络时会使用反向传播来更新权重,激活函数的非线性属性使得梯度传递更有效,让神经网络收敛得更快,提高训练效率。下面我们对常用的激活函数做一个简要的介绍。 |
39 | 41 |
|
| 42 | +1. Sigmoid 函数 |
40 | 43 |
|
41 |
| - $$ |
42 |
| - f(x) = \frac{1}{1 + e^{-x}} |
43 |
| - $$ |
44 |
| - <img src="res/08_sigmoid_function.png" style="zoom:62%;"> |
| 44 | +$$ |
| 45 | +f(x) = \frac{1}{1 + e^{-x}} |
| 46 | +$$ |
45 | 47 |
|
46 |
| - - **特点**:Sigmoid 函数将输入值映射到$\small{(0, 1)}$的范围内,呈现出平滑的 S 型曲线。 |
47 |
| - - **优点**:特别适用于概率预测,因为输出在$\small{(0, 1)}$之间,可以理解为概率值。 |
48 |
| - - **缺点**:对于较大的正值或负值,梯度会变得很小,导致梯度消失问题,从而影响深层网络的训练。除此以外,由于输出非零中心,这会导致梯度更新不对称,可能使得收敛变慢。 |
| 48 | +<img src="res/08_sigmoid_function.png" style="zoom:62%;"> |
| 49 | + |
| 50 | +- **特点**:Sigmoid 函数将输入值映射到$\small{(0, 1)}$的范围内,呈现出平滑的 S 型曲线。 |
| 51 | +- **优点**:特别适用于概率预测,因为输出在$\small{(0, 1)}$之间,可以理解为概率值。 |
| 52 | +- **缺点**:对于较大的正值或负值,梯度会变得很小,导致梯度消失问题,从而影响深层网络的训练。除此以外,由于输出非零中心,这会导致梯度更新不对称,可能使得收敛变慢。 |
49 | 53 |
|
50 | 54 | 2. Tanh 函数(双曲正切函数)
|
51 |
| - $$ |
52 |
| - f(x) = tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} |
53 |
| - $$ |
54 |
| - <img src="res/08_tanh_function.png" style="zoom:62%;" /> |
55 | 55 |
|
56 |
| - - **特点**:Tanh 函数将输入映射到$\small{(-1, 1)}$的范围内,也是 S 型曲线,但中心对称。 |
57 |
| - - **优点**:与 Sigmoid 类似,但输出在$\small{(-1, 1)}$之间,这样的零中心输出使得梯度更新更对称,更适合用于深层网络。 |
58 |
| - - **缺点**:在极值附近,梯度仍会趋向于零,导致梯度消失问题。 |
| 56 | +$$ |
| 57 | +f(x) = tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} |
| 58 | +$$ |
| 59 | + |
| 60 | +<img src="res/08_tanh_function.png" style="zoom:62%;" /> |
| 61 | + |
| 62 | +- **特点**:Tanh 函数将输入映射到$\small{(-1, 1)}$的范围内,也是 S 型曲线,但中心对称。 |
| 63 | +- **优点**:与 Sigmoid 类似,但输出在$\small{(-1, 1)}$之间,这样的零中心输出使得梯度更新更对称,更适合用于深层网络。 |
| 64 | +- **缺点**:在极值附近,梯度仍会趋向于零,导致梯度消失问题。 |
59 | 65 |
|
60 | 66 | 3. ReLU 函数(Rectified Linear Unit)
|
61 |
| - $$ |
62 |
| - f(x) = max(0, x) |
63 |
| - $$ |
64 | 67 |
|
65 |
| - - **特点**:ReLU 将输入小于零的部分设为零,而大于零的部分保持不变,因此其输出范围是$\small{[0, +\infty]}$。 |
66 |
| - - **优点**:计算简单,有效避免了梯度消失问题,因此被广泛应用于深层网络。能够保持稀疏性,许多神经元的输出为零,有利于网络简化计算。 |
67 |
| - - **缺点**:当输入为负数时,ReLU 的梯度为零。若输入长期为负数,神经元可能“死亡”并停止更新。 |
| 68 | +$$ |
| 69 | +f(x) = max(0, x) |
| 70 | +$$ |
| 71 | + |
| 72 | +- **特点**:ReLU 将输入小于零的部分设为零,而大于零的部分保持不变,因此其输出范围是$\small{[0, +\infty]}$。 |
| 73 | +- **优点**:计算简单,有效避免了梯度消失问题,因此被广泛应用于深层网络。能够保持稀疏性,许多神经元的输出为零,有利于网络简化计算。 |
| 74 | +- **缺点**:当输入为负数时,ReLU 的梯度为零。若输入长期为负数,神经元可能“死亡”并停止更新。 |
68 | 75 |
|
69 | 76 | 4. Leaky ReLU 函数
|
70 |
| - $$ |
71 |
| - f(x) = \begin{cases} x & (x \gt 0) \\ {\alpha}x & (x \le 0)\end{cases} |
72 |
| - $$ |
73 | 77 |
|
74 |
| - - **特点**:Leaky ReLU 是对 ReLU 的改进,它为输入小于零的部分引入了一个小的负斜率(通常取值$\small{\alpha = 0.01}$),使得梯度不为零。 |
75 |
| - - **优点**:通过允许负值的输出,避免了死神经元问题,使得网络更健壮。 |
| 78 | +$$ |
| 79 | +f(x) = \begin{cases} x & (x \gt 0) \\ {\alpha}x & (x \le 0)\end{cases} |
| 80 | +$$ |
| 81 | + |
| 82 | +- **特点**:Leaky ReLU 是对 ReLU 的改进,它为输入小于零的部分引入了一个小的负斜率(通常取值$\small{\alpha = 0.01}$),使得梯度不为零。 |
| 83 | +- **优点**:通过允许负值的输出,避免了死神经元问题,使得网络更健壮。 |
| 84 | +- **缺点**:虽然 Leaky ReLU 能缓解死神经元问题,但其负值斜率的选择对网络性能会有一些影响,且对模型的非线性表示能力没有显著提升。 |
76 | 85 |
|
77 |
| - - **缺点**:虽然 Leaky ReLU 能缓解死神经元问题,但其负值斜率的选择对网络性能会有一些影响,且对模型的非线性表示能力没有显著提升。 |
| 86 | +在一个包含多个层的神经网络中,信息会一层一层的进行传递。假设第 $\small{l}$ 层的输出是 $\small{\mathbf{a}^{[l]}}$ ,按照上面神经元计算公式,有: |
78 | 87 |
|
79 |
| -在一个包含多个层的神经网络中,信息会一层一层的进行传递。假设第 $\small{l}$ 层的输出是 $\small{\mathbf{a}^{[l]}}$,按照上面神经元计算公式,有: |
80 | 88 | $$
|
81 | 89 | \mathbf{a}^{[l]} = f \left( \mathbf{W}^{[l]} \mathbf{a}^{[l-1]} + \mathbf{b}^{[l]} \right)
|
82 | 90 | $$
|
83 |
| -其中,$\small{\mathbf{W}^{[l]}}$ 是第 $\small{l}$ 层的权重矩阵,$\small{\mathbf{a}^{[l-1]}}$ 是是第 $\small{l - 1}$ 层的输出,$\small{\mathbf{b}^{[l]}}$ 是第 $\small{l}$ 层的偏置项,$\small{f}$ 是激活函数。神经网络最终的输出是通过最后一层的激活函数得到的,这个过程叫做前向传播(forward-propagation)。 |
| 91 | + |
| 92 | +其中, $\small{\mathbf{W}^{[l]}}$ 是第 $\small{l}$ 层的权重矩阵, $\small{\mathbf{a}^{[l-1]}}$ 是是第 $\small{l - 1}$ 层的输出, $\small{\mathbf{b}^{[l]}}$ 是第 $\small{l}$ 层的偏置项, $\small{f}$ 是激活函数。神经网络最终的输出是通过最后一层的激活函数得到的,这个过程叫做前向传播(forward-propagation)。 |
84 | 93 |
|
85 | 94 | 对于神经网络模型来说,还有一个极其重要的操作就是通过计算损失函数相对于每个权重和偏置的梯度来更新神经网络的参数(权重和偏置),这一过程通常称为反向传播(back-propagation)。反向传播有两个要点,一个是损失函数,一个是梯度下降法,前者用于衡量预测值与真实值之间的差距,常用的损失函数有均方误差(回归任务)和交叉熵损失函数(分类任务),后者通过更新参数 $\small{\theta}$(权重和偏置),使得损失函数最小化,即:
|
| 95 | + |
86 | 96 | $$
|
87 | 97 | \theta^{\prime} = \theta - \eta \nabla L(\theta) \\
|
88 | 98 | \theta = \theta^{\prime}
|
89 | 99 | $$
|
90 | 100 |
|
91 |
| -其中,$\small{\eta}$ 是学习率,$\small{\nabla L(\theta)}$ 是损失函数相对于参数的梯度,跟我们讲解回归模型时使用的方法是一致的。 |
| 101 | +其中, $\small{\eta}$ 是学习率, $\small{\nabla L(\theta)}$ 是损失函数相对于参数的梯度,跟我们讲解回归模型时使用的方法是一致的。 |
92 | 102 |
|
93 | 103 | ### 代码实现
|
94 | 104 |
|
|
0 commit comments