在前三篇中,我们已经走完了神经网络的核心理论路径—— 从神经元到前向传播,从损失函数到反向传播,从优化算法到数值稳定。 你现在已经可以手写一个两层网络并跑通梯度下降。
但如果要让一个网络真正「跑得快、收敛稳、效果好」, 光有数学推导远远不够。
深度学习的成熟来自工程化——各种模块、正则化手段、数值技巧和结构设计。 这一篇,我们就来系统地梳理神经网络在实际中最重要的几个「现代模块」与「工程问题」, 从直觉到原理,让你能真正理解它们为什么存在、该在什么地方用。
如果没有激活函数,神经网络每一层都是线性变换。 多个线性层叠加仍然是线性函数。 这意味着无论堆多少层,你都无法逼近非线性关系。
所以,激活函数的核心作用是:引入非线性,使网络能表达复杂映射。
最早使用的激活函数是 sigmoid:
它的输出在 (0, 1) 之间,形状平滑,适合二分类概率建模。
但问题也明显:
Tanh(双曲正切)是 sigmoid 的改进:
输出范围 (-1, 1),均值居中,效果稍好,但依旧有梯度消失问题。
Rectified Linear Unit(ReLU)是目前最主流的激活函数:
优点:
缺点:
为解决 ReLU 的“死亡问题”,出现了 Leaky ReLU:
通常取 α = 0.01。
进一步的改良如 ELU、GELU(Transformer中使用):
其中
是标准正态分布的累积分布函数。
GELU 在数学上近似「输入越大越可能被保留」,更平滑自然。 这也是为什么几乎所有 Transformer 模型都采用 GELU。
场景 | 建议激活函数 |
---|---|
普通全连接层 | ReLU 或 Leaky ReLU |
RNN/LSTM | Tanh / Sigmoid |
Transformer / BERT 类模型 | GELU |
稀疏特征或非负输入 | ReLU |
对梯度平滑性敏感任务 | ELU 或 Swish |
一句话总结:默认用 ReLU,不够平滑用 GELU。
在训练深层网络时,随着层数加深,输入分布不断变化, 导致后续层的学习变得困难。 这种现象叫做 Internal Covariate Shift。
Batch Normalization 的想法非常简单: 在每一层中,把中间激活值标准化成均值 0、方差 1,再引入可学习的缩放与偏移。
对每个 mini-batch:
其中 γ、β 是可学习参数。
神经网络参数众多,训练集很容易被「记住」。 当模型过于依赖少数神经元时,泛化能力就会下降。
在训练时,随机将一部分神经元“丢弃”(置为0):
这样网络在每次训练时都像在「抽样多个子网络」, 从而避免单一神经元过度依赖。
伪代码:
for each layer l:
mask = random_matrix(shape=a[l], keep_prob=p)
a[l] = a[l] * mask / p
推理阶段:
a[l] = a[l] # 不做丢弃
实战经验:
卷积神经网络(CNN)是图像任务的基石。 其核心思想是局部感受野与权值共享。
以二维卷积为例:
这样,卷积核(filter)可以自动学习空间局部模式,如边缘、角点、纹理等。 随着层数加深,卷积层学到的特征也从「低级」变成「高级」。
残差结构核心思想:
允许梯度直接跨层传播,从根本上解决了深层网络训练难的问题。
卷积的局部性是一把双刃剑。 它高效,但只能捕捉邻近区域关系。 对于全局依赖任务(如语言理解),这种结构不够灵活。
注意力机制(Attention) 由此诞生。 核心思想: 让每个位置都能“关注”输入序列中其他位置的重要性。
公式:
其中:
每个输出是所有输入的加权平均,权重由相似度决定。 这让模型具备「全局依赖建模能力」。
Transformer(2017)用纯注意力结构取代了循环与卷积, 实现了并行、高效、强表达的特性。
核心结构:
伪代码概要:
for each layer:
x = x + MultiHeadAttention(LayerNorm(x))
x = x + FeedForward(LayerNorm(x))
回到最初的问题——为什么深度学习能起飞? 不仅因为有数学推导,更因为工程化体系成熟:
从「感知机」到「Transformer」, 深度学习走过了从经验到体系的漫长过程。 每个改进都不是偶然,而是对真实工程问题的回应。
如果你一路读到了这里,请给自己一点肯定。 你已经掌握了神经网络的全流程原理—— 从数学出发,理解算法,再到工程实现。
接下来你可以:
记住一句话:
理论让你理解模型,工程让你驯服模型。