高级 #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)
为什么要激活函数? 如果没有激活函数——多层线性还是线性。激活函数引入”非线性”,让网络能学习复杂模式。
| 激活函数 | 公式 | 特点 |
|---|---|---|
| Sigmoid | 1/(1+e⁻ˣ) | 输出 (0,1),但梯度饱和 |
| ReLU | max(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)。