从感知机到深度网络——理解反向传播与现代神经网络架构
神经网络(Neural Network)受生物神经系统启发,由大量简单计算单元(神经元)相互连接构成。深度学习(Deep Learning)则是指包含多个隐藏层的神经网络,能够自动学习数据的层次化特征表示。
感知机(Perceptron)由 Frank Rosenblatt 于 1958 年提出,是最简单的神经网络单元。它接收多个输入,计算加权和并经过激活函数输出二分类结果。
其中 w 为权重向量,b 为偏置,f 为阶跃函数(输出 +1 或 -1)。感知机只能学习线性可分问题,这促成了后续多层网络的发展。
多层感知机(Multi-Layer Perceptron)在输入层与输出层之间加入一个或多个隐藏层,每个隐藏层包含多个神经元。MLP 可以学习非线性映射,是通用的函数逼近器。
激活函数引入非线性,使网络能够学习复杂模式。常见激活函数包括:
如果所有层都使用线性激活(或无激活),无论网络多深,整体仍等价于单层线性变换:W_3(W_2(W_1x)) = W'x。只有引入非线性,网络才能逼近任意复杂函数。
反向传播(Backpropagation)是训练神经网络的核心算法。它利用链式法则,从输出层向输入层逐层计算损失函数对各参数的梯度,然后通过梯度下降更新权重。
其中 \eta 为学习率。现代深度学习框架(PyTorch、TensorFlow)自动完成反向传播的梯度计算。
损失函数衡量模型预测与真实标签的差距:
CNN 专为网格结构数据(如图像)设计,核心操作包括:
经典架构包括 LeNet、AlexNet、VGG、ResNet 等。CNN 的权重共享机制大幅减少了模型参数量。
RNN 专为序列数据设计(文本、时间序列、语音),通过隐藏状态传递历史信息:
传统 RNN 存在长期依赖和梯度消失问题。LSTM(长短期记忆网络)和 GRU 通过门控机制有效缓解这些问题,成为序列建模的主流选择。
PyTorch 以动态计算图和直观的 Pythonic API 著称,适合研究与快速原型;TensorFlow 以静态图和完善的部署生态见长。对于初学者,PyTorch 的上手曲线更平缓。
考虑一个简化的网络:输入 x = [2, 3],权重 W^{[1]} = [[0.1, 0.2], [0.3, 0.4]],偏置 b^{[1]} = [0.5, -0.5],使用 ReLU 激活。
z^{[1]} = W^{[1]}x + b^{[1]} = [0.1*2+0.2*3+0.5, 0.3*2+0.4*3-0.5] = [1.3, 1.3]
a^{[1]} = ReLU(z^{[1]}) = [max(0,1.3), max(0,1.3)] = [1.3, 1.3]
假设损失函数对输出的梯度 \delta = 0.5,学习率 \eta = 0.1。对于权重 w_{11} = 0.1,其梯度为 \partial L / \partial w_{11} = \delta * x_1 = 0.5 * 2 = 1.0。
更新后:w_{11} = 0.1 - 0.1 * 1.0 = 0.0。所有权重按此方式同步更新。
假设输入为 4x4 图像,使用 2x2 卷积核(权重 [[1,0],[0,-1]]),步幅 1,无填充:
| 位置 | 覆盖区域 | 卷积结果 |
|---|---|---|
| (0,0) | [[3,1],[2,4]] | 3*1 + 1*0 + 2*0 + 4*(-1) = -1 |
| (0,1) | [[1,5],[4,2]] | 1*1 + 5*0 + 4*0 + 2*(-1) = -1 |
| (1,0) | [[2,4],[1,3]] | 2*1 + 4*0 + 1*0 + 3*(-1) = -1 |
输出特征图尺寸为 3x3。卷积操作通过滑动窗口实现局部连接和权重共享。
一个感知机接收两个输入 x_1=0.5, x_2=-1.0,权重 w_1=2.0, w_2=-1.0,偏置 b=0.5,激活函数为阶跃函数(输入 ≥ 0 输出 1,否则 0)。求输出。
加权和 z = w_1*x_1 + w_2*x_2 + b = 2.0*0.5 + (-1.0)*(-1.0) + 0.5 = 1.0 + 1.0 + 0.5 = 2.5
由于 z = 2.5 ≥ 0,阶跃函数输出 1。
一个神经元接收输入 x=[1, 2],权重 w=[0.5, -0.5],偏置 b=1.0。分别计算使用 Sigmoid 和 ReLU 时的输出。
加权和 z = 0.5*1 + (-0.5)*2 + 1.0 = 0.5 - 1.0 + 1.0 = 0.5
Sigmoid 输出:\sigma(0.5) = 1 / (1 + e^{-0.5}) ≈ 1 / (1 + 0.6065) ≈ 0.622
ReLU 输出:max(0, 0.5) = 0.5
某 MLP 在训练集上准确率为 99%,在测试集上准确率为 72%。以下哪种措施最可能改善测试性能?(A)增加隐藏层神经元数 (B)添加 Dropout 正则化 (C)增加训练轮数 (D)提高学习率
训练准确率远高于测试准确率,说明模型过拟合。
在一个深层网络中,若大部分神经元输出接近 0 或 1 且梯度极小,最可能使用了哪种激活函数?应如何改进?
Sigmoid 在输入绝对值较大时输出饱和于 0 或 1,导数趋近于 0,导致梯度消失(Vanishing Gradient),深层网络难以训练。
改进方案:将隐藏层激活函数替换为 ReLU 或其变体(Leaky ReLU、ELU)。ReLU 在正区间的导数恒为 1,有效缓解梯度消失。也可采用残差连接(ResNet)或批归一化(BatchNorm)。