PyTorch深度学习教程:人工神经网络(ANNs)基础与应用
引言
人工神经网络(Artificial Neural Networks, ANNs)是深度学习的核心组成部分。本文将以螺旋分类问题为例,深入讲解ANN的基本原理、结构设计和训练方法,帮助读者掌握使用PyTorch构建和训练神经网络的关键技术。
分类问题与线性不可分性
考虑一个二维空间中的三分类问题,数据点呈螺旋状分布(如图1所示)。每个颜色代表一个类别标签,总共有K=3个类别。这类数据的特点是线性不可分,即无法用直线将不同类别的数据完全分开。
数学表示:
- 干净数据:$X_{k}(t)=t\left(\begin{array}{c}{\sin \left[\frac{2 \pi}{K}(2 t+k-1)\right]} \ {\cos \left[\frac{2 \pi}{K}(2 t+k-1)\right]}\end{array}\right)$
- 带噪声数据:在角度上添加高斯噪声$\mathcal{N}(0, \sigma^{2})$
传统逻辑回归在这种问题上表现不佳,因为它只能产生线性决策边界。而神经网络的优势在于能够学习非线性变换,将输入空间映射到新的特征空间,使数据变得线性可分。
神经网络基础结构
全连接网络(Fully Connected Network)
一个典型的三层全连接网络(输入层、隐藏层、输出层)可以表示为:
$$ \begin{aligned} &\boldsymbol h=f\left(\boldsymbol{W}{h} \boldsymbol x+ \boldsymbol b{h}\right)\ &\boldsymbol{\hat{y}}=g\left(\boldsymbol{W}{y} \boldsymbol h+ \boldsymbol b{y}\right) \end{aligned} $$
其中:
- $f$和$g$是非线性激活函数
- $\boldsymbol{W}_h$, $\boldsymbol{b}_h$是隐藏层的权重和偏置
- $\boldsymbol{W}_y$, $\boldsymbol{b}_y$是输出层的权重和偏置
激活函数选择
常用的激活函数包括:
- ReLU:$f(x) = \max(0, x)$
- Sigmoid:$f(x) = \frac{1}{1+e^{-x}}$
- Tanh:$f(x) = \tanh(x)$
- Softmax(多分类输出层):$\text{softmax}(\boldsymbol{l})[c] = \frac{ \exp(\boldsymbol{l}[c])} {\sum^K_{k=1} \exp(\boldsymbol{l}[k])}$
数据表示与预处理
输入数据
- $\boldsymbol{X} \in \mathbb{R}^{m \times n}$:m个样本,每个样本n维特征
- 对于螺旋数据,n=2(二维坐标)
标签编码
直接使用数字标签(如1,2,3)可能导致网络误认为类别间存在顺序关系。更好的方法是使用独热编码(one-hot encoding):
- 对于类别$c_i$,创建一个K维零向量
- 将第$c_i$位置设为1
- 最终标签矩阵$\boldsymbol{Y} \in \mathbb{R}^{m \times K}$
网络训练原理
损失函数
对于多分类问题,常用负对数似然损失(Negative Log-Likelihood Loss):
$$ \mathcal{L}(\boldsymbol{\hat{Y}}, \boldsymbol{c}) = \frac{1}{m} \sum_{i=1}^m \ell(\boldsymbol{\hat{y}_i}, c_i), \quad \ell(\boldsymbol{\hat{y}}, c) = -\log(\boldsymbol{\hat{y}}[c]) $$
其中$\boldsymbol{\hat{y}}[c]$是模型对正确类别的预测概率。
梯度下降
训练过程是优化网络参数$\mathbf{\Theta} = \lbrace\boldsymbol{W_h, b_h, W_y, b_y} \rbrace$以最小化损失$J(\mathbf{\Theta})$的过程。基本步骤:
- 前向传播计算输出
- 计算损失
- 反向传播计算梯度
- 参数更新:$\vartheta \gets \vartheta - \eta, \nabla_\vartheta J$
实践案例:螺旋分类
线性模型 vs 非线性模型
- 仅线性层:准确率约50%,决策边界为直线,无法很好分离螺旋数据
- 线性层+ReLU+线性层:准确率提升至95%,能够学习非线性决策边界
PyTorch训练关键步骤
# 1. 前向传播
output = model(input)
# 2. 计算损失
loss = criterion(output, target)
# 3. 清零梯度
model.zero_grad()
# 4. 反向传播
loss.backward()
# 5. 参数更新
optimizer.step()
扩展应用:回归问题
同样的网络结构也可用于回归任务。不同激活函数产生不同特性:
- ReLU:分段线性预测
- Tanh:平滑连续预测
当预测超出训练范围时,网络预测会趋向于±∞,此时可以通过集成多个网络的预测来估计不确定性。
总结
本文通过螺旋分类问题,系统讲解了人工神经网络的核心概念:
- 全连接网络的结构与数学表示
- 激活函数的作用与选择
- 分类问题的数据表示方法
- 训练过程的原理与实现
- 线性与非线性模型的对比
理解这些基础知识是掌握更复杂深度学习模型的关键。在实际应用中,还需要考虑网络深度、宽度、正则化等更多因素来优化模型性能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考