Chapter 10

神经网络与深度学习

从感知机到深度网络——理解反向传播与现代神经网络架构

01

核心概念

神经网络(Neural Network)受生物神经系统启发,由大量简单计算单元(神经元)相互连接构成。深度学习(Deep Learning)则是指包含多个隐藏层的神经网络,能够自动学习数据的层次化特征表示。

感知机

感知机(Perceptron)由 Frank Rosenblatt 于 1958 年提出,是最简单的神经网络单元。它接收多个输入,计算加权和并经过激活函数输出二分类结果。

y = f\left(\sum_{i=1}^{n} w_i x_i + b\right) = f(w^T x + b)

其中 w 为权重向量,b 为偏置,f 为阶跃函数(输出 +1 或 -1)。感知机只能学习线性可分问题,这促成了后续多层网络的发展。

多层感知机 MLP

多层感知机(Multi-Layer Perceptron)在输入层与输出层之间加入一个或多个隐藏层,每个隐藏层包含多个神经元。MLP 可以学习非线性映射,是通用的函数逼近器。

前向传播过程
  1. 输入层接收特征向量 x。
  2. 每个隐藏层计算:z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]},然后 a^{[l]} = g(z^{[l]})。
  3. 输出层产生预测值 \hat{y}。
  4. 通过损失函数 L(y, \hat{y}) 衡量预测与真实值的差距。

激活函数

激活函数引入非线性,使网络能够学习复杂模式。常见激活函数包括:

为什么需要非线性激活函数?

如果所有层都使用线性激活(或无激活),无论网络多深,整体仍等价于单层线性变换:W_3(W_2(W_1x)) = W'x。只有引入非线性,网络才能逼近任意复杂函数。

反向传播

反向传播(Backpropagation)是训练神经网络的核心算法。它利用链式法则,从输出层向输入层逐层计算损失函数对各参数的梯度,然后通过梯度下降更新权重。

w \leftarrow w - \eta \frac{\partial L}{\partial w}

其中 \eta 为学习率。现代深度学习框架(PyTorch、TensorFlow)自动完成反向传播的梯度计算。

损失函数

损失函数衡量模型预测与真实标签的差距:

卷积神经网络 CNN

CNN 专为网格结构数据(如图像)设计,核心操作包括:

经典架构包括 LeNet、AlexNet、VGG、ResNet 等。CNN 的权重共享机制大幅减少了模型参数量。

循环神经网络 RNN

RNN 专为序列数据设计(文本、时间序列、语音),通过隐藏状态传递历史信息:

h_t = f(W_{hh} h_{t-1} + W_{xh} x_t + b_h)

传统 RNN 存在长期依赖和梯度消失问题。LSTM(长短期记忆网络)和 GRU 通过门控机制有效缓解这些问题,成为序列建模的主流选择。

PyTorch / TensorFlow 入门

PyTorch 以动态计算图和直观的 Pythonic API 著称,适合研究与快速原型;TensorFlow 以静态图和完善的部署生态见长。对于初学者,PyTorch 的上手曲线更平缓。

02

算法原理与计算方法

前向传播计算示例

考虑一个简化的网络:输入 x = [2, 3],权重 W^{[1]} = [[0.1, 0.2], [0.3, 0.4]],偏置 b^{[1]} = [0.5, -0.5],使用 ReLU 激活。

计算过程

z^{[1]} = W^{[1]}x + b^{[1]} = [0.1*2+0.2*3+0.5, 0.3*2+0.4*3-0.5] = [1.3, 1.3]

a^{[1]} = ReLU(z^{[1]}) = [max(0,1.3), max(0,1.3)] = [1.3, 1.3]

反向传播与参数更新

假设损失函数对输出的梯度 \delta = 0.5,学习率 \eta = 0.1。对于权重 w_{11} = 0.1,其梯度为 \partial L / \partial w_{11} = \delta * x_1 = 0.5 * 2 = 1.0。

更新后:w_{11} = 0.1 - 0.1 * 1.0 = 0.0。所有权重按此方式同步更新。

CNN 卷积操作示意

假设输入为 4x4 图像,使用 2x2 卷积核(权重 [[1,0],[0,-1]]),步幅 1,无填充:

位置覆盖区域卷积结果
(0,0)[[3,1],[2,4]]3*1 + 1*0 + 2*0 + 4*(-1) = -1
(0,1)[[1,5],[4,2]]1*1 + 5*0 + 4*0 + 2*(-1) = -1
(1,0)[[2,4],[1,3]]2*1 + 4*0 + 1*0 + 3*(-1) = -1

输出特征图尺寸为 3x3。卷积操作通过滑动窗口实现局部连接和权重共享。

工程应用场景
  • 图像识别:CNN 在 ImageNet 等基准上将图像分类错误率降至人类水平以下,广泛应用于医学影像诊断。
  • 自然语言处理:Transformer 架构(BERT、GPT)通过自注意力机制革新了文本理解与生成的范式。
  • 语音合成:深度神经网络实现高保真文本转语音(TTS),如 Tacotron、WaveNet。
  • 自动驾驶感知:多传感器融合的深度网络实时检测车辆、行人、车道线。
  • 推荐系统深度模型:DeepFM、Wide & Deep 等模型融合低阶特征交叉与高阶非线性表达。
03

Python 代码实践

使用 sklearn MLPClassifier

Python
from sklearn.neural_network import MLPClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 加载数据 X, y = load_iris(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42) # 特征缩放对神经网络至关重要 scaler = StandardScaler() X_train_s = scaler.fit_transform(X_train) X_test_s = scaler.transform(X_test) # 构建 MLP:2个隐藏层,每层100神经元 mlp = MLPClassifier( hidden_layer_sizes=(100, 100), activation='relu', solver='adam', max_iter=500, random_state=42 ) mlp.fit(X_train_s, y_train) print(f"Train accuracy: {mlp.score(X_train_s, y_train):.3f}") print(f"Test accuracy: {mlp.score(X_test_s, y_test):.3f}")

激活函数可视化

Python
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-5, 5, 200) # 定义激活函数 sigmoid = 1 / (1 + np.exp(-x)) tanh = np.tanh(x) relu = np.maximum(0, x) plt.figure(figsize=(8, 4)) plt.plot(x, sigmoid, label='Sigmoid') plt.plot(x, tanh, label='Tanh') plt.plot(x, relu, label='ReLU') plt.axhline(0, color='gray', linewidth=0.5) plt.axvline(0, color='gray', linewidth=0.5) plt.ylim(-1.2, 1.2) plt.title('Activation Functions') plt.legend() plt.grid(True, alpha=0.3) plt.show()

PyTorch 简单网络定义

Python
import torch import torch.nn as nn import torch.optim as optim class SimpleNet(nn.Module): def __init__(self, input_dim, hidden_dim, num_classes): super(SimpleNet, self).__init__() self.fc1 = nn.Linear(input_dim, hidden_dim) self.relu = nn.ReLU() self.dropout = nn.Dropout(0.2) self.fc2 = nn.Linear(hidden_dim, num_classes) def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.dropout(x) x = self.fc2(x) return x # 实例化模型、损失函数和优化器 model = SimpleNet(input_dim=4, hidden_dim=64, num_classes=3) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) print(model)

PyTorch 训练循环示例

Python
# 转换为张量 X_train_t = torch.tensor(X_train_s, dtype=torch.float32) y_train_t = torch.tensor(y_train, dtype=torch.long) # 简单训练循环 model.train() for epoch in range(100): optimizer.zero_grad() outputs = model(X_train_t) loss = criterion(outputs, y_train_t) loss.backward() optimizer.step() if (epoch + 1) % 20 == 0: print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}") # 评估 model.eval() with torch.no_grad(): preds = model(torch.tensor(X_test_s, dtype=torch.float32)).argmax(dim=1) acc = (preds == torch.tensor(y_test)).float().mean() print(f"Test accuracy: {acc:.3f}")
04

例题与解析

例题 1:感知机计算

一个感知机接收两个输入 x_1=0.5, x_2=-1.0,权重 w_1=2.0, w_2=-1.0,偏置 b=0.5,激活函数为阶跃函数(输入 ≥ 0 输出 1,否则 0)。求输出。

解析

加权和 z = w_1*x_1 + w_2*x_2 + b = 2.0*0.5 + (-1.0)*(-1.0) + 0.5 = 1.0 + 1.0 + 0.5 = 2.5

由于 z = 2.5 ≥ 0,阶跃函数输出 1。

答案:输出为 1。感知机通过学习调整权重和偏置,使分类边界 w^T x + b = 0 正确分割不同类别。
例题 2:前向传播计算

一个神经元接收输入 x=[1, 2],权重 w=[0.5, -0.5],偏置 b=1.0。分别计算使用 Sigmoid 和 ReLU 时的输出。

解析

加权和 z = 0.5*1 + (-0.5)*2 + 1.0 = 0.5 - 1.0 + 1.0 = 0.5

Sigmoid 输出:\sigma(0.5) = 1 / (1 + e^{-0.5}) ≈ 1 / (1 + 0.6065) ≈ 0.622

ReLU 输出:max(0, 0.5) = 0.5

答案:Sigmoid 输出约 0.622,ReLU 输出 0.5。Sigmoid 将输出压缩到 (0,1),适合概率解释;ReLU 保留正值不变,训练更高效。
例题 3:MLP 分类效果分析

某 MLP 在训练集上准确率为 99%,在测试集上准确率为 72%。以下哪种措施最可能改善测试性能?(A)增加隐藏层神经元数 (B)添加 Dropout 正则化 (C)增加训练轮数 (D)提高学习率

解析

训练准确率远高于测试准确率,说明模型过拟合

  • (A) 增加神经元会加剧过拟合。
  • (B) Dropout 在训练时随机丢弃部分神经元,强制网络学习冗余表示,有效抑制过拟合。
  • (C) 增加训练轮数会使过拟合更严重。
  • (D) 提高学习率可能导致训练不稳定,不直接解决过拟合。
答案:(B) 添加 Dropout 正则化。正则化技术是应对过拟合的首选策略之一。
例题 4:激活函数对比

在一个深层网络中,若大部分神经元输出接近 0 或 1 且梯度极小,最可能使用了哪种激活函数?应如何改进?

解析

Sigmoid 在输入绝对值较大时输出饱和于 0 或 1,导数趋近于 0,导致梯度消失(Vanishing Gradient),深层网络难以训练。

改进方案:将隐藏层激活函数替换为 ReLU 或其变体(Leaky ReLU、ELU)。ReLU 在正区间的导数恒为 1,有效缓解梯度消失。也可采用残差连接(ResNet)或批归一化(BatchNorm)。

答案:Sigmoid 导致梯度消失。将隐藏层激活换为 ReLU,并配合批归一化与残差连接可显著改善深层网络训练。
← 上一章:聚类分析 下一章:偏差、方差与模型优化 →