共计 2581 个字符,预计需要花费 7 分钟才能阅读完成。
背景介绍
神经网络的发展可以追溯到 1943 年 McCulloch 和 Pitts 提出的 MP 模型。随着计算能力的提升和算法的改进,神经网络在近年来得到了广泛应用。BP 神经网络、卷积神经网络(CNN)和循环神经网络(RNN)是三种最基础的神经网络结构,各自适用于不同的场景:

- BP 神经网络 :全连接结构,适合处理结构化数据,如房价预测、信用评分等
- CNN:擅长处理网格状数据(如图像),广泛应用于计算机视觉领域
- RNN:具有记忆功能,适合处理序列数据(如文本、语音、时间序列)
核心原理
1. BP 神经网络
BP(Back Propagation)神经网络是最基础的前馈神经网络,其核心是通过反向传播算法来调整网络权重。
前向传播 :
$$
a^{(l)} = f(z^{(l)}) = f(W^{(l)}a^{(l-1)} + b^{(l)})
$$
反向传播 (以均方误差损失为例):
- 输出层误差:
$$
\delta^{(L)} = \nabla_a J \odot f'(z^{(L)})
$$
- 隐藏层误差:
$$
\delta^{(l)} = ((W^{(l+1)})^T \delta^{(l+1)}) \odot f'(z^{(l)})
$$
- 参数梯度:
$$
\frac{\partial J}{\partial W^{(l)}} = \delta^{(l)}(a^{(l-1)})^T
$$
$$
\frac{\partial J}{\partial b^{(l)}} = \delta^{(l)}
$$
2. 卷积神经网络(CNN)
CNN 通过三大核心思想解决了图像处理中的维度灾难问题:
- 局部连接 :每个神经元只连接输入区域的局部感受野
- 权值共享 :同一个卷积核在不同位置共享参数
- 池化(Pooling):降低空间维度,增强平移不变性
典型的 CNN 层包括:
- 卷积层(Convolutional Layer)
- 激活层(常用 ReLU)
- 池化层(Max/Average Pooling)
- 全连接层(Fully Connected Layer)
3. 循环神经网络(RNN)
RNN 通过引入循环连接处理序列数据,其基本结构为:
$$
h_t = f(W_{xh}x_t + W_{hh}h_{t-1} + b_h)
$$
$$
o_t = g(W_{ho}h_t + b_o)
$$
为解决长程依赖问题,LSTM 引入了三个门控机制:
- 遗忘门(Forget Gate)
- 输入门(Input Gate)
- 输出门(Output Gate)
代码实战
1. BP 神经网络实现(Python+numpy)
import numpy as np
class NeuralNetwork:
def __init__(self, layers):
self.weights = [np.random.randn(y, x) * 0.1
for x, y in zip(layers[:-1], layers[1:])]
self.biases = [np.zeros((y, 1)) for y in layers[1:]]
def forward(self, x):
a = x
for w, b in zip(self.weights, self.biases):
z = np.dot(w, a) + b
a = 1 / (1 + np.exp(-z)) # Sigmoid 激活
return a
def train(self, X, y, epochs, lr):
for _ in range(epochs):
# 前向传播
# ... 省略反向传播实现...
2. CNN 处理 MNIST(PyTorch)
import torch
import torch.nn as nn
class CNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 32, 3, 1)
self.conv2 = nn.Conv2d(32, 64, 3, 1)
self.fc1 = nn.Linear(9216, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = F.relu(self.conv1(x))
x = F.max_pool2d(x, 2)
x = F.relu(self.conv2(x))
x = torch.flatten(x, 1)
x = F.relu(self.fc1(x))
return self.fc2(x)
3. RNN 文本生成(TensorFlow)
import tensorflow as tf
model = tf.keras.Sequential([tf.keras.layers.Embedding(vocab_size, 256),
tf.keras.layers.LSTM(1024, return_sequences=True),
tf.keras.layers.Dense(vocab_size)
])
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True))
对比分析
| 网络类型 | 计算复杂度 | 适用场景 | 参数量 |
|---|---|---|---|
| BP | O(n²) | 结构化数据 | 大 |
| CNN | O(k²·c·n) | 图像数据 | 中等 |
| RNN | O(n·d²) | 序列数据 | 较小 |
选型建议 :
- 图像处理:CNN(如 ResNet)
- 自然语言处理:RNN/LSTM 或 Transformer
- 结构化数据预测:BP 神经网络或简单 MLP
避坑指南
- 梯度消失 / 爆炸 :
- 使用 ReLU 等改良激活函数
- 应用 Batch Normalization
- LSTM/GRU 结构
-
梯度裁剪(Gradient Clipping)
-
过拟合预防 :
- Dropout(丢弃法)
- L1/L2 正则化
- 早停法(Early Stopping)
-
数据增强
-
超参数调优 :
- 学习率:0.001-0.1
- Batch Size:32-256
- 隐藏层神经元数:输入层的 1 - 3 倍
- 网络层数:从浅到深逐步增加
延伸思考
- 与 Transformer 的关系:
- Self-Attention 机制克服了 RNN 的长程依赖问题
-
CNN 的局部感知 vs Transformer 的全局感知
-
挑战任务:
- 尝试在 CNN 中加入残差连接(Residual Connection)
- 实现双向 LSTM(BiLSTM)
- 用 BP 网络解决 XOR 问题
实践链接
希望这篇指南能帮助你快速入门三大经典神经网络结构!在实际项目中,建议从简单模型开始,逐步增加复杂度,并通过可视化工具(如 TensorBoard)监控训练过程。
