外观
神经网络基础
一句话定义:神经网络是一族由大量可学习参数驱动的"非线性函数拟合器"——它把输入逐层做"线性变换 + 非线性激活",通过调整参数让整体函数逼近我们想要的映射。要回答"什么是深度学习"以及它在整个 AI 版图中的位置,可以从什么是深度学习开始;本文则聚焦"网络本身长什么样"这个最小内核。
一、单个神经元:线性变换 + 激活
一切从最简单的人工神经元说起。它做的事只有两步:
- 线性求和:对输入向量
x的每个分量加权求和,再加一个偏置(bias):
z = w·x + b = Σᵢ wᵢxᵢ + b其中 w 是权重(weight),b 是偏置,两者都是可学习参数。这一步就是高等数学里的一次线性映射,线性代数基础可参考数学基础速查。
- 非线性激活:把
z送入激活函数σ,得到神经元输出:
a = σ(z)为什么必须有第二步?因为如果没有非线性激活,无论叠多少层,整体仍是输入的线性函数——层叠线性变换等价于一次线性变换,网络的表达能力立刻退化。非线性是"深度"有意义的前提。这一点是整个深度学习总体架构解剖中反复出现的核心逻辑。
直觉类比
神经元像一条流水线:第一步是"称重"——给每个输入特征分配一个重要性权重;第二步是"开关"——按权重和决定是否"点火"输出信号。ReLU 一类的激活函数就是那个"大于阈值就放行、否则掐断"的开关。
单个神经元本身就是一个线性分类器(感知机),1958 年 Rosenblatt 提出时只能处理线性可分问题。真正让它爆发的,是把成千上万个神经元组织成层、叠成深度——那是几十万年后我们才需要的规模,而计算基础来自 1986 年的反向传播,详见反向传播与自动微分。
二、激活函数:非线性从哪来
激活函数的选择直接决定网络的梯度流与表达能力。下表是六种最常用激活函数的对比:
| 函数 | 公式 | 特点 | 适用场景 |
|---|---|---|---|
| ReLU | max(0, z) | 计算极快、正区间梯度恒为 1、缓解梯度消失;但负区间梯度为 0,可能"死神经元" | 默认首选,几乎所有现代网络的隐藏层 |
| Leaky ReLU | max(αz, z),α≈0.01 | 负区间给一个小的非零梯度,减少死神经元 | 担心 ReLU 死亡时替代 |
| GELU | z·Φ(z),Φ 为标准正态 CDF | 光滑、概率式"软门控",BERT/GPT 等 Transformer 标配 | Transformer 家族隐藏层 |
| Sigmoid | 1/(1+e⁻ᶻ) | 输出 (0,1)、可解释为概率;但饱和区梯度趋近 0,易梯度消失 | 输出概率的二分类,或门控(如 LSTM 的遗忘门) |
| Tanh | (eᶻ−e⁻ᶻ)/(eᶻ+e⁻ᶻ) | 输出 (−1,1)、零中心、对称;仍会饱和 | RNN 单元内部、需要零中心输出的场景 |
| Softmax | eᶻⁱ/Σⱼ eᶻʲ | 把一组 logits 归一成和为 1 的概率分布 | 多分类输出层,与交叉熵配套 |
选择原则可以总结为三条经验:隐藏层默认 ReLU(大模型倾向 GELU),输出层按任务选(分类用 Softmax,回归通常不激活),激活函数要与初始化、归一化配套——后两者的搭配详见初始化与归一化。
常见坑
Sigmoid/Tanh 在深层网络中极易导致梯度消失,因为其导数最大值分别只有 0.25 和 1,多层连乘后梯度指数级缩小。深层网络请优先 ReLU 系,排查思路见调试章节。
三、MLP:前向传播与 PyTorch 实现
多层感知机(Multi-Layer Perceptron, MLP)就是把神经元组织成层:输入层 → 若干隐藏层 → 输出层,层内全连接、层间单向传播。第 l 层的计算为:
z⁽ˡ⁾ = W⁽ˡ⁾a⁽ˡ⁻¹⁾ + b⁽ˡ⁾
a⁽ˡ⁾ = σ⁽ˡ⁾(z⁽ˡ⁾)其中 W⁽ˡ⁾ 是权重矩阵,a⁽⁰⁾ = x 是输入。所谓"前向传播",就是把这条公式从第 1 层一直算到输出层。
在 PyTorch 中一个三层的 MLP 只差几行代码:
python
import torch
import torch.nn as nn
class MLP(nn.Module):
def __init__(self, in_dim, hidden_dim, out_dim):
super().__init__()
self.fc1 = nn.Linear(in_dim, hidden_dim)
self.fc2 = nn.Linear(hidden_dim, hidden_dim)
self.fc3 = nn.Linear(hidden_dim, out_dim)
self.relu = nn.ReLU()
def forward(self, x):
h = self.relu(self.fc1(x))
h = self.relu(self.fc2(h))
return self.fc3(h) # 输出层一般不接激活,交给损失函数
model = MLP(in_dim=784, hidden_dim=256, out_dim=10)
x = torch.randn(32, 784) # 一个 batch,32 个样本
logits = model(x) # 前向传播
assert logits.shape == (32, 10)注意最后一行:输出层返回的是 logits(未归一化的得分),而不是概率。把 Softmax 和交叉熵一起交给损失函数处理,数值上更稳定,这正是损失函数与输出层要讲的"输出层与损失必须匹配"原则。
从零把这样一个网络连同训练循环写出来、看它一步步学会,是理解深度学习最有效的方式,动手路径见实践栏目的从零构建项目。
四、万能近似定理:为什么"深比宽高效"
万能近似定理(Universal Approximation Theorem)告诉我们:只要隐藏层神经元足够多,一个单隐藏层的前馈网络就能以任意精度逼近任意连续函数。
这句话很震撼,但别高兴太早——它带来两个关键推论:
- 宽度可以逼近,但可能不划算。单隐层网络需要指数级的神经元数量才能逼近某些函数,计算量爆炸。
- 深度是"效率"的来源。把同样的逼近能力拆到多层,每层学一个"表示",深度网络可以用远少的总参数达到同样精度。这就是"深比宽高效":深层网络把复杂函数分解成多级简单函数的复合。
一个经典直觉:用宽度网络模拟 XOR 或锯齿函数需要指数个神经元,而深度网络逐层"累加特征"可以用多项式级的参数完成。更深层地讲,深度学习不是"更宽的查找表",而是层次的表示学习——每一层把上一层的表示抽象成更高级的特征,这正是表征学习与预训练的根基。
值得记住的对照
"万能近似"说的是存在性(理论上能逼近),不承诺可学性(梯度法能找到那个函数)。现实里我们真正依赖的是深度 + 结构先验 + 大规模数据。为什么结构先验如此重要,见常见层类型与 CNN 与计算机视觉章节。
五、常见层类型概览
不同任务的核心区别,很大程度体现在"用什么层"上。下表是深度学习中的常见层及其作用:
| 层类型 | 核心思想 | 典型用途 |
|---|---|---|
| Linear(全连接) | 每个输出与所有输入加权求和 | MLP、Transformer 的 FFN、分类头 |
| Conv(卷积) | 局部感受野 + 权重共享,捕捉平移不变特征 | 图像(见CNN 与计算机视觉) |
| Pool(池化) | 下采样聚合(max/avg),降维 + 增鲁棒 | CNN 中降低分辨率 |
| RNN/LSTM/GRU | 沿时间步共享权重,建模序列依赖 | 序列建模(见 RNN 与序列建模章节) |
| Attention | 按相关性加权聚合信息(QKV 机制) | 现代序列与图像主干(见注意力机制与Transformer 架构) |
| Norm(归一化) | 对激活做标准化,稳定训练 | 每层几乎都配(见初始化与归一化) |
| Dropout | 训练时随机丢弃神经元,正则化 | 抑制过拟合(见过拟合与正则化) |
一个重要观察:这些层不是互相替代,而是组合使用。典型网络 = 若干特征提取层(Conv/Attention)+ 归一化 + 激活 + 末端 Linear 分类头。把"层"当作积木,理解了每块积木的作用,看任何现代架构(CNN、Transformer)都能快速拆解。
六、网络容量与深度的直觉
容量(capacity)指网络能表达的函数族的复杂程度。一个朴素的直觉:参数越多、层越深,容量越大。但它不是越高越好:
- 容量不足 → 欠拟合:训练集上都学不好,损失下不去。
- 容量过剩 → 过拟合:把训练集背下来了,测试集上泛化差。
- 深度 vs 宽度:同等参数量下,深度网络通常比宽度网络学到的表示更抽象、泛化更好,但也更难训练(梯度要传更多层,见反向传播与自动微分中的梯度消失讨论)。
还有一个被反复验证的经验现象:深度网络在测试集上往往比浅层网络更平滑、对输入扰动更鲁棒,即使参数量相近。这就是为什么 ResNet(152 层)能一路赢过 VGG(19 层)——不是参数变多,而是"把非线性分解到更多层"本身带来了更好的解空间结构。
七、权衡与取舍:容量、数据与结构
权衡与取舍
容量 vs 数据:模型容量必须与数据量匹配。一个经验法则——数据翻倍、容量可以跟着放大;数据不足时,加参数只会加速过拟合,正确的动作是加正则化或减容量,见过拟合与正则化。
宽度 vs 深度:深度带来表示效率,但增加训练难度(梯度消失、优化困难);宽度带来冗余和鲁棒性,但效率低。工程上常见的折中是"中等深度 + 足够宽度 + 残差连接"。残差连接让梯度能"抄近道"回传,是现代网络标配,从 ResNet 到 Transformer 无一例外。
结构先验 vs 通用性:为任务定制结构(卷积、注意力)效率高、样本需求小,但牺牲通用性;全 MLP 结构最通用但最难训练。选型时先问:我要处理的是什么数据、有什么已知的不变性?答案参考框架与工具怎么选、DL 设计原则两个章节。
选结构、定容量、配数据——这四者的平衡贯穿所有深度学习项目,最终落回一句话:先在数据规模允许的前提下选一个偏大的网络,再用正则化把它"驯服"到刚好。完整配方见训练配方与调参。
延伸阅读
- 什么是深度学习——深度学习在大图景中的位置
- 深度学习总体架构解剖——数据、模型、损失、优化四大件的全景
- 损失函数与输出层——输出层与损失如何配套
- 优化与梯度下降——有了梯度之后参数如何更新
- 训练配方与调参——容量、数据与正则的工程配方
- 注意力机制——从全连接到按相关性聚合