高级 #dl#neural-network#backprop

神经网络与反向传播

神经网络(MLP)是多层感知器的堆叠——每层是线性变换+非线性激活函数。反向传播通过链式法则计算梯度,是训练神经网络的核心算法

🧠 “模拟大脑”——但比大脑简单得多

人脑有约 860 亿个神经元。每个神经元接收信号、处理、传递给下一个。

人工神经网络(Neural Network)的灵感来源于此——但计算模型要简单得多:

一个神经元:
输入₁ → 权重₁
输入₂ → 权重₂  →  Σ(加权和) → 激活函数 → 输出
输入₃ → 权重₃

y = σ(w₁x₁ + w₂x₂ + w₃x₃ + b)

🏗️ 多层感知器(MLP)

把神经元”堆叠”成层:

输入层 → 隐藏层 1 → 隐藏层 2 → ... → 输出层
  ↓        ↓          ↓              ↓
原始数据  学习特征   学习更高层特征    分类/预测
import torch.nn as nn

class MLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.layers = nn.Sequential(
            nn.Linear(784, 256),  # 输入 784 → 隐藏层 256
            nn.ReLU(),            # 激活函数
            nn.Linear(256, 128),  # 256 → 128
            nn.ReLU(),
            nn.Linear(128, 10),   # 128 → 10(10 个类别)
            nn.Softmax(dim=1)     # 输出概率
        )
    
    def forward(self, x):
        return self.layers(x)

为什么要激活函数? 如果没有激活函数——多层线性还是线性。激活函数引入”非线性”,让网络能学习复杂模式。

激活函数公式特点
Sigmoid1/(1+e⁻ˣ)输出 (0,1),但梯度饱和
ReLUmax(0,x)简单、无梯度消失——最常用
Tanh(eˣ-e⁻ˣ)/(eˣ+e⁻ˣ)输出 (-1,1)

🔄 反向传播——神经网络怎么”学会”

前向传播:输入 → 逐层计算 → 输出 → 算损失

反向传播:从输出层往回,用链式法则计算每一层的梯度:

损失函数 L
    ↓  ∂L/∂w₃ = (∂L/∂y)(∂y/∂w₃)
输出层(w₃ 的梯度)
    ↓  ∂L/∂w₂ = (∂L/∂h)(∂h/∂w₂)  
隐藏层(w₂ 的梯度)
    ↓  ...
更深的层

链式法则的直观理解:输出误差”逐层回传”——每层知道”我的权重应该往哪个方向调”。

# PyTorch 中——自动计算梯度!
loss.backward()     # 自动反向传播——求所有参数的梯度
optimizer.step()    # 梯度下降更新参数

📝 小结

概念一句话
神经元Wx + b → 激活函数
MLP(多层感知器)多层神经元堆叠
激活函数引入非线性(ReLU 最常用)
反向传播链式法则求梯度——从输出往输入逐层回传
关键权衡层数越多 → 表达力越强 → 但越容易过拟合、越难训练

为什么先学这个? 基础网络后,看专门处理图像的架构——卷积神经网络(CNN)