第二章 神经网络基础
2.1 神经网络的基本结构
2.1.1 神经元与网络层
神经网络是由大量相互连接的神经元组成的计算模型。每个神经元接收来自其他神经元或外部输入的信号,进行加权求和并通过激活函数产生输出。大量神经元按照层次结构组织,形成强大的信息处理能力。
神经元的基本组成
一个典型的神经元包含三个核心部分:
1. 加权求和(Weighted Sum):神经元接收来自前一层所有神经元的输入$x_1, x_2, ..., x_n$,每个输入对应一个权重$w_1, w_2, ..., w_n$。神经元计算加权和:
$$z = \sum_{i=1}^{n} w_i x_i + b$$
其中$b$是偏置项,用于调整激活阈值。
2. 激活函数(Activation Function):激活函数$f$对加权和进行非线性变换,产生神经元的最终输出:
$$a = f(z)$$
常用的激活函数包括Sigmoid、Tanh、ReLU及其变体。
3. 输出传递:神经元的输出$a$传递给下一层的所有神经元(在全连接网络中)或特定的后续神经元。
网络层的类型
神经网络通常由三种类型的层组成:
输入层(Input Layer):接收外部数据输入,神经元数量等于输入特征的维度。输入层通常不进行计算,仅传递数据。
隐藏层(Hidden Layer):位于输入层和输出层之间,进行特征提取和变换。深度学习模型包含多个隐藏层,层数越深,能够学习的特征越抽象。
输出层(Output Layer):产生网络的最终输出。输出层的结构和激活函数取决于任务类型:
- 回归任务:单个神经元,线性激活或无激活
- 二分类:单个神经元,Sigmoid激活
- 多分类:多个神经元(等于类别数),Softmax激活
2.1.2 前馈神经网络
前馈神经网络(Feedforward Neural Network)是最基本的神经网络结构,信息单向流动,从输入层经过隐藏层到达输出层,不存在循环连接。
全连接层(Fully Connected Layer)
在全连接层中,每个神经元与前一层的所有神经元相连。对于第$l$层,其输出可以表示为:
$$\mathbf{a}^{(l)} = f(\mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)})$$
其中:
- $\mathbf{a}^{(l)}$ 是第$l$层的输出向量(激活值)
- $\mathbf{W}^{(l)}$ 是权重矩阵,维度为$[n_l \times n_{l-1}]$
- $\mathbf{b}^{(l)}$ 是偏置向量
- $f$ 是激活函数(通常逐元素应用)
前向传播算法
前向传播(Forward Propagation)是神经网络计算输出的过程:
- 将输入数据$\mathbf{x}$赋给输入层:$\mathbf{a}^{(0)} = \mathbf{x}$
- 对于每一层$l = 1, 2, ..., L$:
- 计算线性变换:$\mathbf{z}^{(l)} = \mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}$
- 应用激活函数:$\mathbf{a}^{(l)} = f(\mathbf{z}^{(l)})$
3. 输出层的激活值$\mathbf{a}^{(L)}$即为网络的预测输出$\hat{\mathbf{y}}$
网络深度与宽度
网络的深度(层数)和宽度(每层神经元数)是重要的架构超参数:
- 深度:更多的隐藏层允许网络学习更复杂的特征层次。深度网络能够组合低层特征形成高层抽象。
- 宽度:更多的神经元意味着更强的表达能力,但也增加了过拟合的风险和计算成本。
2.1.3 网络的表达能力
万能近似定理
万能近似定理(Universal Approximation Theorem)为神经网络的表达能力提供了理论保证。该定理指出:
一个具有至少一个隐藏层的前馈神经网络,只要隐藏层包含足够多的神经元,并使用非线性激活函数,就可以以任意精度近似任何连续函数(在有界定义域上)。
这一定理说明,即使是浅层网络也具有强大的表达能力。然而,实践中深层网络往往比浅层网络更高效,能够以更少的参数达到相同的近似能力。
深度与效率
虽然浅层网络在理论上可以近似任何函数,但深层网络在实际中往往更有效:
- 深层网络可以通过组合简单函数来表示复杂函数
- 某些函数类需要指数级数量的浅层网络神经元,但只需多项式数量的深层网络神经元
- 深层网络更好地捕获数据的层次结构
2.2 激活函数详解
激活函数为神经网络引入非线性,使其能够学习复杂的非线性映射。选择合适的激活函数对网络性能至关重要。
2.2.1 Sigmoid与Tanh
Sigmoid函数
Sigmoid函数定义为: $$\sigma(x) = \frac{1}{1 + e^{-x}}$$
特性:
- 输出范围:(0, 1)
- 平滑可导,导数为$\sigma'(x) = \sigma(x)(1 - \sigma(x))$
- 中心在0.5,非零中心化
优点:
- 输出可解释为概率
- 平滑的梯度有利于优化
缺点:
- 梯度消失:当$|x|$较大时,梯度趋近于0,导致深层网络训练困难
- 非零中心化:输出恒为正,导致权重更新总是同向,收敛较慢
- 计算涉及指数运算,成本较高
应用场景:
- 二分类问题的输出层
- 门控机制(如LSTM中的门控)
Tanh函数
Tanh(双曲正切)函数定义为:
$$\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} = 2\sigma(2x) - 1$$
特性:
- 输出范围:(-1, 1)
- 零中心化
- 导数:$\tanh'(x) = 1 - \tanh^2(x)$
优点:
- 零中心化输出,有利于梯度下降收敛
- 相比Sigmoid,梯度更强(最大值为1而非0.25)
缺点:
- 仍存在梯度消失问题
应用场景:
- 循环神经网络(RNN)的隐藏层
- 某些需要零中心化输出的场景
2.2.2 ReLU及其变体
ReLU(Rectified Linear Unit)
ReLU函数定义为:
$$\text{ReLU}(x) = \max(0, x)$$
特性:
- 输出范围:$[0, +\infty)$
- 导数:当$x > 0$时为1,当$x < 0$时为0
- 在$x = 0$处不可导(实践中通常设为0或1)
优点:
- 计算简单高效,只需比较操作
- 缓解梯度消失问题(正区间梯度恒为1)
- 具有稀疏激活性,有助于特征选择
缺点:
- 神经元死亡:负区间梯度为0,可能导致神经元永久失活
- 非零中心化
Leaky ReLU
为解决神经元死亡问题,Leaky ReLU在负区间引入小的斜率:
$$\text{LeakyReLU}(x) = \max(\alpha x, x)$$
其中$\alpha$通常取0.01。这样即使输入为负,仍有小的梯度流过。
PReLU(Parametric ReLU)
PReLU将Leaky ReLU中的$\alpha$设为可学习参数:
$$\text{PReLU}(x) = \max(\alpha x, x)$$
网络可以自适应地学习最优的负斜率。
ELU(Exponential Linear Unit)
ELU函数定义为:
$$\text{ELU}(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha(e^x - 1) & \text{if } x \leq 0 \end{cases}$$
优点:
- 负区间平滑,均值更接近零
- 缓解了神经元死亡问题
缺点:
- 计算成本高于ReLU
GELU(Gaussian Error Linear Unit)
GELU是Transformer架构中常用的激活函数:
$$\text{GELU}(x) = x \cdot P(X \leq x) = x \cdot \Phi(x) \approx 0.5x(1 + \tanh[\sqrt{2/\pi}(x + 0.044715x^3)])$$
其中$\Phi(x)$是标准正态分布的累积分布函数。
2.2.3 Softmax函数
Softmax函数常用于多分类问题的输出层,将网络输出转换为概率分布:
$$\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{K} e^{x_j}}$$
其中$K$是类别数。
特性:
- 输出范围:(0, 1)
- 所有输出之和为1
- 放大差异:较大的输入值获得更大的概率份额
数值稳定性:
Softmax计算中存在数值溢出问题。为解决这个问题,通常使用以下技巧:
$$\text{softmax}(x_i) = \frac{e^{x_i - C}}{\sum_{j=1}^{K} e^{x_j - C}}$$
其中$C = \max(x_1, x_2, ..., x_K)$,这确保了指数的最大值为0,避免了溢出。
2.3 损失函数
损失函数(Loss Function)衡量模型预测与真实值之间的差距,是神经网络优化的目标。
2.3.1 回归损失函数
均方误差(Mean Squared Error, MSE)
MSE是最常用的回归损失函数: $$\mathcal{L}_{\text{MSE}} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2$$
特性:
- 对大的误差给予更大的惩罚
- 处处可导
- 假设误差服从高斯分布
平均绝对误差(Mean Absolute Error, MAE)
MAE使用L1范数:
$$\mathcal{L}_{\text{MAE}} = \frac{1}{N} \sum_{i=1}^{N} |y_i - \hat{y}_i|$$
特性:
- 对异常值更鲁棒
- 在零点不可导
- 误差服从拉普拉斯分布时的最大似然估计
Huber损失
Huber损失结合了MSE和MAE的优点:
$$\mathcal{L}_{\text{Huber}} = \begin{cases} \frac{1}{2}(y - \hat{y})^2 & \text{if } |y - \hat{y}| \leq \delta \\ \delta(|y - \hat{y}| - \frac{1}{2}\delta) & \text{otherwise} \end{cases}$$
在误差较小时使用平方损失,误差较大时使用线性损失,兼顾了平滑性和鲁棒性。
2.3.2 分类损失函数
交叉熵损失(Cross-Entropy Loss)
交叉熵损失是分类任务的标准选择。对于二分类: $$\mathcal{L}_{\text{BCE}} = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(\hat{y}_i) + (1-y_i)\log(1-\hat{y}_i)]$$
对于多分类: $$\mathcal{L}_{\text{CE}} = -\frac{1}{N} \sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c})$$
其中$y_{i,c}$是one-hot编码的真实标签,$\hat{y}_{i,c}$是预测概率。
交叉熵损失与Softmax输出结合使用,形成Softmax交叉熵损失。
Focal Loss
Focal Loss解决类别不平衡问题: $$\mathcal{L}_{\text{FL}} = -\alpha_t (1 - \hat{y}_t)^\gamma \log(\hat{y}_t)$$
其中$\gamma$是聚焦参数,降低易分类样本的权重,使模型更关注难分类样本。
2.3.3 其他损失函数
对比损失(Contrastive Loss)
用于学习嵌入表示,使相似样本距离近,不相似样本距离远: $$\mathcal{L} = y \cdot d^2 + (1-y) \cdot \max(0, m - d)^2$$
其中$d$是样本对的距离,$y$表示是否相似,$m$是边际参数。
Triplet Loss
使用三元组(锚点、正样本、负样本)学习嵌入: $$\mathcal{L} = \max(0, d(a, p) - d(a, n) + m)$$
目标使锚点与正样本距离小于锚点与负样本距离至少$m$。
2.4 参数初始化
良好的参数初始化对神经网络训练至关重要。不恰当的初始化可能导致梯度消失、梯度爆炸或收敛缓慢。
2.4.1 零初始化的陷阱
将所有权值初始化为零看似合理,但会导致严重问题:
- 所有神经元计算相同的输出
- 反向传播时所有神经元获得相同的梯度
- 网络无法打破对称性,相当于单个神经元
2.4.2 随机初始化方法
Xavier/Glorot初始化
Xavier初始化根据输入和输出维度调整权重规模: $$W \sim \mathcal{U}(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}})$$
或正态分布版本: $$W \sim \mathcal{N}(0, \frac{2}{n_{in} + n_{out}})$$
适用于:Sigmoid、Tanh激活函数
原理:保持前向和反向传播时激活值的方差一致。
He初始化
He初始化专为ReLU激活函数设计: $$W \sim \mathcal{N}(0, \frac{2}{n_{in}})$$
由于ReLU将负值置零,需要更大的初始权重来补偿。
正交初始化
使用随机正交矩阵作为初始权重: $$W = QR$$
其中$Q$是正交矩阵,$R$是上三角矩阵。正交初始化有助于保持梯度流。
2.4.3 偏置初始化
偏置通常初始化为零或小常数:
- 对于ReLU,偏置初始化为小正值(如0.01)可确保初期有梯度流动
- 对于层归一化后的网络,偏置可初始化为零
2.5 例题分析
例题2.1 前向传播计算
题目:考虑一个具有以下结构的神经网络:
- 输入层:2个神经元(输入$x_1=0.5$, $x_2=0.3$)
- 隐藏层:2个神经元,使用ReLU激活
- 输出层:1个神经元,使用Sigmoid激活
权重矩阵:
- $W^{(1)} = \begin{bmatrix} 0.1 & 0.2 \\ 0.3 & 0.4 \end{bmatrix}$(输入→隐藏)
- $W^{(2)} = \begin{bmatrix} 0.5 & 0.6 \end{bmatrix}$(隐藏→输出)
偏置:$b^{(1)} = \begin{bmatrix} 0.1 \\ 0.2 \end{bmatrix}$,$b^{(2)} = 0.1$
计算网络输出。
解答:
隐藏层计算:
$$\mathbf{z}^{(1)} = W^{(1)} \mathbf{x} + \mathbf{b}^{(1)} = \begin{bmatrix} 0.1 & 0.2 \\ 0.3 & 0.4 \end{bmatrix} \begin{bmatrix} 0.5 \\ 0.3 \end{bmatrix} + \begin{bmatrix} 0.1 \\ 0.2 \end{bmatrix}$$
$$= \begin{bmatrix} 0.1 \times 0.5 + 0.2 \times 0.3 + 0.1 \\ 0.3 \times 0.5 + 0.4 \times 0.3 + 0.2 \end{bmatrix} = \begin{bmatrix} 0.05 + 0.06 + 0.1 \\ 0.15 + 0.12 + 0.2 \end{bmatrix} = \begin{bmatrix} 0.21 \\ 0.47 \end{bmatrix}$$
应用ReLU:
$$\mathbf{a}^{(1)} = \text{ReLU}(\mathbf{z}^{(1)}) = \begin{bmatrix} 0.21 \\ 0.47 \end{bmatrix}$$
输出层计算: $$z^{(2)} = W^{(2)} \mathbf{a}^{(1)} + b^{(2)} = \begin{bmatrix} 0.5 & 0.6 \end{bmatrix} \begin{bmatrix} 0.21 \\ 0.47 \end{bmatrix} + 0.1$$
$$= 0.5 \times 0.21 + 0.6 \times 0.47 + 0.1 = 0.105 + 0.282 + 0.1 = 0.487$$
应用Sigmoid: $$\hat{y} = \sigma(0.487) = \frac{1}{1 + e^{-0.487}} = \frac{1}{1 + 0.615} \approx 0.619$$
例题2.2 损失函数计算
题目:在一个三分类问题中,某样本的真实标签为第2类(one-hot编码$\mathbf{y} = [0, 1, 0]$),网络输出(Softmax前)为$\mathbf{z} = [1.0, 2.0, 0.5]$。请计算: (1) Softmax输出概率 (2) 交叉熵损失
解答:
(1) Softmax概率:
首先计算指数(使用数值稳定技巧,减去最大值2.0): $$\mathbf{z}' = [1.0-2.0, 2.0-2.0, 0.5-2.0] = [-1.0, 0, -1.5]$$
$$e^{\mathbf{z}'} = [e^{-1.0}, e^{0}, e^{-1.5}] \approx [0.368, 1.0, 0.223]$$
分母和:$0.368 + 1.0 + 0.223 = 1.591$
$$\hat{\mathbf{y}} = \left[\frac{0.368}{1.591}, \frac{1.0}{1.591}, \frac{0.223}{1.591}\right] \approx [0.231, 0.629, 0.140]$$
(2) 交叉熵损失: $$\mathcal{L} = -\sum_{c=1}^{3} y_c \log(\hat{y}_c) = -[0 \times \log(0.231) + 1 \times \log(0.629) + 0 \times \log(0.140)]$$ $$= -\log(0.629) \approx 0.464$$
例题2.3 激活函数比较
题目:分析使用Sigmoid和ReLU作为隐藏层激活函数的优缺点,说明为什么在深层网络中ReLU更常用。
解答:
Sigmoid激活函数:
优点:
- 输出范围(0,1),可解释为神经元的激活程度
- 平滑可导,数学性质良好
- 可用于门控机制
缺点:
- 梯度消失:当输入远离0时,导数趋近于0。在深层网络中,多次连乘导致梯度迅速衰减,使深层参数难以更新
- 非零中心化:输出恒为正,导致权重更新总是同向,收敛速度较慢
- 指数计算成本高
ReLU激活函数:
优点:
- 缓解梯度消失:正区间梯度恒为1,梯度可以直接反向传播到浅层
- 计算高效:只需简单的阈值比较,无复杂运算
- 稀疏激活:约一半的神经元输出为零,提高计算效率和特征选择性
缺点:
- 神经元死亡:负区间梯度为0,如果神经元始终接收负输入,将无法更新(永久性失活)
- 非零中心化
深层网络中使用ReLU的原因:
1. 梯度流:深层网络的主要挑战是梯度消失。ReLU在正区间保持梯度为1,使深层参数能够有效更新。
2. 计算效率:深层网络参数量大,ReLU的简单计算显著降低训练时间。
3. 实践验证:大量实验表明,使用ReLU的深层网络(如ResNet、VGG)在图像识别等任务上表现优异。
4. 稀疏性:稀疏激活有助于防止过拟合,提高模型的泛化能力。
2.6 训练题
选择题
1. 以下关于神经网络层数的说法,正确的是:
A. 输入层和输出层不计入网络深度 B. 隐藏层的数量决定了网络的深度 C. 只有包含三个以上隐藏层的网络才能称为深度网络 D. 网络深度与模型性能呈线性正相关
2. 关于万能近似定理,以下说法错误的是:
A. 需要至少一个隐藏层 B. 需要足够多的神经元 C. 必须使用非线性激活函数 D. 可以精确表示任何函数
3. 以下哪种激活函数输出是零中心化的?
A. Sigmoid B. ReLU C. Tanh D. Softmax
4. 在训练深层神经网络时,He初始化最适合配合哪种激活函数使用?
A. Sigmoid B. Tanh C. ReLU D. 线性激活
5. 以下哪种损失函数对异常值最鲁棒?
A. MSE B. MAE C. 交叉熵 D. Huber损失(小$\delta$)
填空题
6. 前馈神经网络中,信息从输入层流向输出层,这种计算过程称为______传播。 7. Softmax函数的作用是______,常用于多分类问题的______层。 8. ReLU激活函数的负区间梯度为______,这可能导致______问题。 9. Xavier初始化适用于______和______激活函数。 10. 在多分类问题中,交叉熵损失通常与______激活函数配合使用。
计算题
11. 给定一个单层神经网络(无隐藏层),输入$\mathbf{x} = [2, -1, 3]$,权重$\mathbf{w} = [0.5, 0.3, -0.2]$,偏置$b = 0.1$。请计算:
(1) 使用Sigmoid激活的输出
(2) 若真实标签$y=1$,计算二分类交叉熵损失
12. 一个两层神经网络,结构如下:
- 输入层:3个神经元
- 隐藏层:2个神经元,ReLU激活
- 输出层:1个神经元,Sigmoid激活
给定输入$\mathbf{x} = [1, 0, -1]$,权重:
$$W^{(1)} = \begin{bmatrix} 0.2 & 0.1 & 0.3 \\ -0.1 & 0.2 & 0.1 \end{bmatrix}, \mathbf{b}^{(1)} = \begin{bmatrix} 0.1 \\ 0.2 \end{bmatrix}$$
$$W^{(2)} = \begin{bmatrix} 0.3 & 0.4 \end{bmatrix}, b^{(2)} = 0.1$$
请计算网络输出$\hat{y}$。
2.7 答案与解析
选择题答案
1. 答案:B
解析:网络深度通常指隐藏层的数量。输入层和输出层也是网络的一部分;深度网络没有严格的层数定义;过深的网络可能导致优化困难。
2. 答案:D
解析:万能近似定理说的是"近似"而非"精确表示"。精确表示任何函数需要无限多个神经元。
3. 答案:C
解析:Tanh的输出范围是(-1,1),是零中心化的。Sigmoid输出(0,1),ReLU输出[0,∞),都不是零中心化。
4. 答案:C
解析:He初始化专为ReLU设计,考虑了ReLU将负值置零的特点。Xavier初始化更适合Sigmoid和Tanh。
5. 答案:B
解析:MAE(L1损失)对异常值的惩罚是线性的,而MSE是平方的,因此MAE更鲁棒。
填空题答案
6. 答案:前向
7. 答案:将输出转换为概率分布;输出
8. 答案:0(或零);神经元死亡(或dead ReLU)
9. 答案:Sigmoid;Tanh
10. 答案:Softmax
计算题答案
11. 解答:
(1) 线性变换:
$$z = \mathbf{w}^T \mathbf{x} + b = 0.5 \times 2 + 0.3 \times (-1) + (-0.2) \times 3 + 0.1$$
$$= 1.0 - 0.3 - 0.6 + 0.1 = 0.2$$
Sigmoid输出:
$$\hat{y} = \sigma(0.2) = \frac{1}{1 + e^{-0.2}} = \frac{1}{1 + 0.819} \approx 0.550$$
(2) 二分类交叉熵损失:
$$\mathcal{L} = -[y \log(\hat{y}) + (1-y)\log(1-\hat{y})]$$
$$= -[1 \times \log(0.550) + 0 \times \log(0.450)]$$
$$= -\log(0.550) \approx 0.598$$
12. 解答:
隐藏层:
$$\mathbf{z}^{(1)} = W^{(1)} \mathbf{x} + \mathbf{b}^{(1)}$$
$$= \begin{bmatrix} 0.2 \times 1 + 0.1 \times 0 + 0.3 \times (-1) + 0.1 \\ -0.1 \times 1 + 0.2 \times 0 + 0.1 \times (-1) + 0.2 \end{bmatrix}$$
$$= \begin{bmatrix} 0.2 - 0.3 + 0.1 \\ -0.1 - 0.1 + 0.2 \end{bmatrix} = \begin{bmatrix} 0.0 \\ 0.0 \end{bmatrix}$$
应用ReLU:
$$\mathbf{a}^{(1)} = \text{ReLU}([0.0, 0.0]) = [0.0, 0.0]$$
输出层:
$$z^{(2)} = W^{(2)} \mathbf{a}^{(1)} + b^{(2)} = 0.3 \times 0 + 0.4 \times 0 + 0.1 = 0.1$$
应用Sigmoid:
$$\hat{y} = \sigma(0.1) = \frac{1}{1 + e^{-0.1}} \approx \frac{1}{1 + 0.905} \approx 0.525$$