人工神经网络(Artificial Neural Network, ANN)的灵感来源于生物神经系统。人脑由约860亿个神经元(Neuron)组成,每个神经元通过突触(Synapse)与其他神经元相连,形成极其复杂的网络结构。当神经元接收到足够的信号刺激时,会产生电脉冲并传递给下游神经元。
感知机由 Frank Rosenblatt 于1957年提出,是历史上最早的神经网络模型。它是一个二分类线性模型:接收多个输入信号,经过加权求和后与阈值比较,输出0或1。其数学表达式为:
设输入向量为 x = [x₁, x₂, ..., xₙ]ᵀ,权重向量为 w = [w₁, w₂, ..., wₙ]ᵀ,偏置为 b,则输出为:
output = sign(w·x + b) = sign(∑ᵢ wᵢxᵢ + b)
其中 sign(z) = 1 如果 z ≥ 0,否则为 0。
感知机的核心局限在于它只能处理线性可分问题——著名的"异或(XOR)问题"证明了单层感知机无法解决非线性分类。这一发现导致了神经网络研究的第一次寒冬。
1943年,Warren McCulloch 和 Walter Pitts 提出了 M-P 神经元模型,这是人工神经元的理论基础。M-P 模型将神经元抽象为一个"多输入、单输出"的信息处理单元:
激活函数是神经网络中至关重要的组成部分。如果没有激活函数(即线性激活),无论网络有多少层,其表达能力都等价于单层线性模型。激活函数引入非线性,使神经网络能够学习复杂的模式和决策边界。激活函数需要满足以下性质:
神经元的本质是一个"非线性函数逼近器"。每个神经元接收多个输入,通过权重调节输入的"重要性",再经过激活函数决定是否"激活"以及激活的程度。多个神经元组合起来就能逼近任意复杂的函数。
激活函数的选择直接影响网络的训练速度、收敛性以及最终性能。以下是几种最常用的激活函数及其特点:
Sigmoid 函数是最早使用的激活函数之一,其数学形式为:
σ(x) = 1 / (1 + e⁻ˣ)
导数:σ'(x) = σ(x)(1 - σ(x))
Sigmoid 将输入映射到 (0,1) 区间,适合表示概率。然而它有两个严重缺陷:
Tanh 可以看作是 Sigmoid 的改进版本:
tanh(x) = (eˣ - e⁻ˣ) / (eˣ + e⁻ˣ)
导数:tanh'(x) = 1 - tanh²(x)
Tanh 将输出映射到 (-1,1) 区间,解决了 Sigmoid 的非零中心问题,但在饱和区仍然存在梯度消失。
ReLU(Rectified Linear Unit)是当前最广泛使用的激活函数:
ReLU(x) = max(0, x)
导数:x > 0 时为 1,x ≤ 0 时为 0
ReLU 的优势:计算简单(只需比较大小)、在正区间梯度恒为1(缓解梯度消失)、稀疏激活(负值直接置0)。但 ReLU 也有"神经元死亡"问题——如果学习率过大或参数初始化不当,某些神经元可能永远不再激活。
为解决 ReLU 的神经元死亡问题,研究人员提出了多种变体:
Softmax 用于多分类问题的输出层,将网络输出转换为概率分布:
Softmax(zᵢ) = e^{zᵢ} / Σⱼ e^{zⱼ}
所有输出值在 (0,1) 区间内,且总和为 1。
| 函数 | 公式 | 输出范围 | 优点 | 缺点 |
|---|---|---|---|---|
| Sigmoid | 1/(1+e⁻ˣ) | (0, 1) | 平滑、概率解释 | 梯度消失、非零中心 |
| Tanh | (eˣ-e⁻ˣ)/(eˣ+e⁻ˣ) | (-1, 1) | 零中心、比Sigmoid强 | 仍有梯度消失 |
| ReLU | max(0, x) | [0, ∞) | 计算快、缓解梯度消失 | 神经元死亡 |
| Leaky ReLU | max(αx, x) | (-∞, ∞) | 解决神经元死亡 | α 值敏感 |
| ELU | x(x>0); α(eˣ-1)(x≤0) | (-α, ∞) | 输出均值近零 | 计算稍复杂 |
| Softmax | e^{zᵢ}/Σe^{zⱼ} | (0, 1) | 概率输出 | 仅用于输出层 |
多层感知机(Multi-Layer Perceptron, MLP)是最基本的深度神经网络结构,由输入层、若干个隐藏层和输出层组成,每层的神经元与下一层的所有神经元全连接。
前向传播是信息从输入层逐层传递到输出层的过程。假设第 l 层的输出为 a^{[l]},则该层的计算过程为:
z^{[l]} = W^{[l]} · a^{[l-1]} + b^{[l]}
a^{[l]} = g^{[l]}(z^{[l]})
其中 W^{[l]} 是权重矩阵,b^{[l]} 是偏置向量,g^{[l]} 是激活函数。
经过 L 层的逐层计算,最终得到网络输出 ŷ = a^{[L]}。前向传播本质上是在做一系列线性变换套非线性变换的复合函数。
万能逼近定理是神经网络的理论基石之一。该定理表明:一个具有足够多神经元的单隐藏层前馈神经网络,在合适的激活函数下,可以以任意精度逼近任意连续函数。关键要点:
"深度"指网络的层数,"宽度"指每层神经元的数量。两者之间存在权衡:
实践中,一般选择3-5层隐藏层作为"深度"网络的起点,每层神经元数量从256到1024不等,具体根据任务复杂度和数据量调节。
反向传播(Backpropagation, BP)是训练神经网络的核心算法。它通过链式法则高效计算损失函数关于每个参数的梯度,为梯度下降提供方向。
链式法则是微积分中求复合函数导数的规则,也是反向传播的数学基础。假设有复合函数 y = f(g(x)),则:
dy/dx = dy/dg · dg/dx
对于多元函数:∂z/∂x = (∂z/∂y) · (∂y/∂x)
在神经网络中,损失函数是关于网络输出的复合函数,输出又是关于每一层权重和输入的复合函数,因此我们可以从输出层开始,逐层向后传播梯度。
计算图是将复杂计算过程可视化为有向图的方法。每个节点代表一个变量或运算,边代表数据流动方向。计算图使得我们可以直观地理解前向传播和反向传播的过程:
现代深度学习框架(TensorFlow、PyTorch等)都基于计算图实现自动求导(Autograd)。
对于 L 层网络,定义损失函数为 C,激活函数为 σ,第 l 层的加权输入为 z^{[l]},激活输出为 a^{[l]}。定义误差 δ^{[l]}_j = ∂C/∂z^{[l]}_j。反向传播的四个基本方程为:
δ^{[L]} = ∇_a C ⊙ σ'(z^{[L]})
其中 ⊙ 表示逐元素相乘,∇_a C 是损失函数对输出层激活值的梯度。
δ^{[l]} = (W^{[l+1]}ᵀ · δ^{[l+1]}) ⊙ σ'(z^{[l]})
当前层的误差由下一层的误差通过权重矩阵回传计算得到。
∂C/∂W^{[l]}_{jk} = δ^{[l]}_j · a^{[l-1]}_k
权重梯度等于"传入的误差"乘以"上一层对应神经元的激活值"。
∂C/∂b^{[l]}_j = δ^{[l]}_j
偏置梯度直接等于对应神经元的误差。
W^{[l]} := W^{[l]} - η · ∂C/∂W^{[l]}
b^{[l]} := b^{[l]} - η · ∂C/∂b^{[l]}
其中 η 是学习率(Learning Rate),控制参数更新的步长。
反向传播的直观含义是:计算输出误差后,将误差"分配"给每个神经元。一个神经元的误差由两部分决定:
可以把反向传播想象成一个"问责链条"——从输出层开始,逐层追问:"你们的权重和偏置对这个误差负多少责任?"然后每个参数根据自身责任大小进行调整。
以下是一个单隐藏层神经网络的简易反向传播 Python 实现:
损失函数(Loss Function)衡量模型预测值与真实值之间的差距,是网络优化的目标函数。
L = (1/m) · Σᵢ (yᵢ - ŷᵢ)²
其中 m 是样本数,yᵢ 是真实值,ŷᵢ 是预测值。
MSE 适合回归任务(房价预测、温度预测等),对大误差惩罚较重,但对异常值敏感。
L = -(1/m) · Σᵢ [yᵢ·log(ŷᵢ) + (1-yᵢ)·log(1-ŷᵢ)]
L = -(1/m) · Σᵢ Σⱼ yᵢⱼ·log(ŷᵢⱼ)
交叉熵配合 Softmax 是分类任务的标准配置。其优点是当预测严重错误时产生较大梯度,加速学习。
| 任务类型 | 输出层激活 | 推荐损失函数 |
|---|---|---|
| 回归 | 无/线性 | MSE、MAE、Huber Loss |
| 二分类 | Sigmoid | 二元交叉熵(BCE) |
| 多分类 | Softmax | 分类交叉熵(CCE) |
| 多标签分类 | Sigmoid | 二元交叉熵(BCE) |
损失函数的选择与输出层激活函数紧密关联。例如,MSE + Sigmoid 组合会导致学习缓慢(梯度饱和),而交叉熵 + Sigmoid 组合能有效避免这一问题,因为两种函数的导数效应相互抵消。
深度学习训练是一门"手艺",以下技巧在实践中被证明非常有效:
良好的权重初始化方法对训练深度网络至关重要:
批量归一化通过对每层输入进行标准化(减均值、除以标准差),稳定训练过程:
BN 通常放在线性变换之后、激活函数之前:BN(Wx + b) → Activation。
学习率是神经网络训练中最重要的超参数之一:
正则化是防止过拟合的核心技术:
| 优化器 | 特点 | 适用场景 |
|---|---|---|
| SGD(随机梯度下降) | 基础优化器,每次用单个样本更新 | 小数据集、需要精细调参 |
| Momentum | 积累历史梯度动量,加速收敛 | 大多数场景,比SGD更快更稳 |
| AdaGrad | 自适应学习率,对稀疏特征友好 | 稀疏数据、NLP任务 |
| RMSProp | 改进AdaGrad,避免学习率单调递减 | 非平稳目标、RNN训练 |
| Adam | 结合Momentum和RMSProp,自适应学习率+动量 | 通用首选、快速收敛 |
| Nadam | Adam + Nesterov动量 | 需要更快收敛的场景 |
随着网络深度增加,梯度在反向传播过程中可能出现指数级衰减(消失)或指数级增长(爆炸)。主要原因和对策:
当模型参数过多而训练数据不足时,网络可能"记住"训练数据而非学到泛化规律:
深度网络的训练通常需要数小时到数周:
神经网络涉及大量超参数,调参是重要的实践技能:
掌握神经网络基础是进入深度学习领域的第一步,但更重要的是理解"为什么"而非仅仅"怎么做":