深度学习入门:从零解析BP神经网络、卷积神经网络与循环神经网络

1次阅读
没有评论

共计 2581 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景介绍

神经网络的发展可以追溯到 1943 年 McCulloch 和 Pitts 提出的 MP 模型。随着计算能力的提升和算法的改进,神经网络在近年来得到了广泛应用。BP 神经网络、卷积神经网络(CNN)和循环神经网络(RNN)是三种最基础的神经网络结构,各自适用于不同的场景:

深度学习入门:从零解析 BP 神经网络、卷积神经网络与循环神经网络

  • BP 神经网络 :全连接结构,适合处理结构化数据,如房价预测、信用评分等
  • CNN:擅长处理网格状数据(如图像),广泛应用于计算机视觉领域
  • RNN:具有记忆功能,适合处理序列数据(如文本、语音、时间序列)

核心原理

1. BP 神经网络

BP(Back Propagation)神经网络是最基础的前馈神经网络,其核心是通过反向传播算法来调整网络权重。

前向传播

$$
a^{(l)} = f(z^{(l)}) = f(W^{(l)}a^{(l-1)} + b^{(l)})
$$

反向传播 (以均方误差损失为例):

  1. 输出层误差:

$$
\delta^{(L)} = \nabla_a J \odot f'(z^{(L)})
$$

  1. 隐藏层误差:

$$
\delta^{(l)} = ((W^{(l+1)})^T \delta^{(l+1)}) \odot f'(z^{(l)})
$$

  1. 参数梯度:

$$
\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 层包括:

  1. 卷积层(Convolutional Layer)
  2. 激活层(常用 ReLU)
  3. 池化层(Max/Average Pooling)
  4. 全连接层(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

避坑指南

  1. 梯度消失 / 爆炸
  2. 使用 ReLU 等改良激活函数
  3. 应用 Batch Normalization
  4. LSTM/GRU 结构
  5. 梯度裁剪(Gradient Clipping)

  6. 过拟合预防

  7. Dropout(丢弃法)
  8. L1/L2 正则化
  9. 早停法(Early Stopping)
  10. 数据增强

  11. 超参数调优

  12. 学习率:0.001-0.1
  13. Batch Size:32-256
  14. 隐藏层神经元数:输入层的 1 - 3 倍
  15. 网络层数:从浅到深逐步增加

延伸思考

  1. 与 Transformer 的关系:
  2. Self-Attention 机制克服了 RNN 的长程依赖问题
  3. CNN 的局部感知 vs Transformer 的全局感知

  4. 挑战任务:

  5. 尝试在 CNN 中加入残差连接(Residual Connection)
  6. 实现双向 LSTM(BiLSTM)
  7. 用 BP 网络解决 XOR 问题

实践链接

Google Colab 实践 Notebook

希望这篇指南能帮助你快速入门三大经典神经网络结构!在实际项目中,建议从简单模型开始,逐步增加复杂度,并通过可视化工具(如 TensorBoard)监控训练过程。

正文完
 0
评论(没有评论)