1.深度前馈网络
深度前馈网络(Deep Feedforward Network, DFN),也称为前馈神经网络或多层感知机(MLP),是深度学习的基础模型。它通过多层非线性变换对输入数据进行高层次抽象,广泛应用于分类、回归等任务。以下从核心概念、结构、训练挑战及解决方案等方面详细解析:
1.1核心概念与结构
基本定义
- 前馈性:信息单向流动(输入层 → 隐藏层 → 输出层),无循环或反馈连接。
- 深度:包含多个隐藏层(通常≥2层),通过逐层特征变换提升模型表达能力。
网络结构
- 输入层:接收原始数据(如图像像素、文本向量)。
- 隐藏层:多个非线性变换层,每层包含多个神经元。
- 第 l l l层的输出: h ( l ) = σ ( W ( l ) h ( l − 1 ) + b ( l ) ) \mathbf{h}^{(l)} = \sigma(\mathbf{W}^{(l)}\mathbf{h}^{(l-1)} + \mathbf{b}^{(l)}) h(l)=σ(W(l)h(l−1)+b(l)),其中 σ \sigma σ为激活函数。
- 输出层:生成最终预测(如分类概率、回归值)。
激活函数的作用
- 引入非线性(如ReLU、Sigmoid、Tanh),使网络可拟合复杂函数。
- 解决线性不可分问题(例如异或问题)。
1.2前向传播与反向传播
前向传播(Forward Propagation)
输入数据逐层计算,直至输出层得到预测结果。例如,对输入 x \mathbf{x} x,经过 L L L层后输出为:
y = f ( x ; θ ) = W ( L ) σ ( W ( L − 1 ) … σ ( W ( 1 ) x + b ( 1 ) ) ⋯ + b ( L − 1 ) ) + b ( L ) \mathbf{y} = f(\mathbf{x}; \theta) = \mathbf{W}^{(L)}\sigma(\mathbf{W}^{(L-1)}\dots \sigma(\mathbf{W}^{(1)}\mathbf{x} + \mathbf{b}^{(1)}) \dots +\mathbf{b}^{(L-1)}) + \mathbf{b}^{(L)} y=f(x;θ)=W(L)σ(W(L−1)…σ(W(1)x+b(1))⋯+b(L−1))+b(L)反向传播(Backpropagation)
- 损失函数计算:如交叉熵(分类)、均方误差(回归)。
- 链式求导:利用梯度下降法,从输出层反向逐层计算参数梯度,更新权重 W \mathbf{W} W和偏置 b \mathbf{b} b。
我们以一个简单的 3层神经网络(输入层 → 隐藏层 → 输出层)为例,结合 交叉熵损失函数 和 Softmax激活函数,逐步演示反向传播的过程。
1. 网络结构
- 输入层:2个神经元(输入数据 x = [ x 1 , x 2 ] = [ 1 , 2 ] \mathbf{x} = [x_1, x_2] = [1, 2] x=[x1,x2]=[1,2])
- 隐藏层:2个神经元,激活函数为 ReLU
- 输出层:2个神经元,激活函数为 Softmax
- 真实标签: y = [ 0 , 1 ] \mathbf{y} = [0, 1] y=[0,1](二分类问题)
参数初始化
- 隐藏层权重矩阵 W ( 1 ) = [ 0.5 − 0.3 − 0.2 0.4 ] \mathbf{W}^{(1)} = \begin{bmatrix} 0.5 & -0.3 \\ -0.2 & 0.4 \end{bmatrix} W(1)=[0.5−0.2−0.30.4],偏置 b ( 1 ) = [ 0.1 , 0.2 ] \mathbf{b}^{(1)} = [0.1, 0.2] b(1)=[0.1,0.2]
- 输出层权重矩阵 W ( 2 ) = [ 0.1 − 0.4 − 0.5 0.2 ] \mathbf{W}^{(2)} = \begin{bmatrix} 0.1 & -0.4 \\ -0.5 & 0.2 \end{bmatrix} W(2)=[0.1−0.5−0.40.2],偏置 b ( 2 ) = [ 0.3 , − 0.1 ] \mathbf{b}^{(2)} = [0.3, -0.1] b(2)=[0.3,−0.1]
2. 前向传播
步骤1:输入层 → 隐藏层
- 计算隐藏层的加权输入 z ( 1 ) \mathbf{z}^{(1)} z(1) 和激活输出 a ( 1 ) \mathbf{a}^{(1)} a(1):
z ( 1 ) = W ( 1 ) x + b ( 1 ) = [ 0.5 ⋅ 1 + ( − 0.3 ) ⋅ 2 + 0.1 ( − 0.2 ) ⋅ 1 + 0.4 ⋅ 2 + 0.2 ] = [ 0.5 − 0.6 + 0.1 − 0.2 + 0.8 + 0.2 ] = [ 0.0 0.8 ] \mathbf{z}^{(1)} = \mathbf{W}^{(1)} \mathbf{x} + \mathbf{b}^{(1)} = \begin{bmatrix} 0.5 \cdot 1 + (-0.3) \cdot 2 + 0.1 \\ (-0.2) \cdot 1 + 0.4 \cdot 2 + 0.2 \end{bmatrix} = \begin{bmatrix} 0.5 - 0.6 + 0.1 \\ -0.2 + 0.8 + 0.2 \end{bmatrix} = \begin{bmatrix} 0.0 \\ 0.8 \end{bmatrix} z(1)=W(1)x+b(1)=[0.5⋅1+(−0.3)⋅2+0.1(−0.2)⋅1+0.4⋅2+0.2]=[0.5−0.6+0.1−0.2+0.8+0.2]=[0.00.8]
a ( 1 ) = ReLU ( z ( 1 ) ) = [ max ( 0 , 0.0 ) max ( 0 , 0.8 ) ] = [ 0.0 0.8 ] \mathbf{a}^{(1)} = \text{ReLU}(\mathbf{z}^{(1)}) = \begin{bmatrix} \max(0, 0.0) \\ \max(0, 0.8) \end{bmatrix} = \begin{bmatrix} 0.0 \\ 0.8 \end{bmatrix} a(1)=ReLU(z(1))=[max(0,0.0)max(0,0.8)]=[0.00.8]
步骤2:隐藏层 → 输出层
- 计算输出层的加权输入 z ( 2 ) \mathbf{z}^{(2)} z(2) 和 Softmax 输出 a ( 2 ) \mathbf{a}^{(2)} a(2):
z ( 2 ) = W ( 2 ) a ( 1 ) + b ( 2 ) = [ 0.1 ⋅ 0.0 + ( − 0.4 ) ⋅ 0.8 + 0.3 ( − 0.5 ) ⋅ 0.0 + 0.2 ⋅ 0.8 + ( − 0.1 ) ] = [ 0.0 − 0.32 + 0.3 0.0 + 0.16 − 0.1 ] = [ − 0.02 0.06 ] \mathbf{z}^{(2)} = \mathbf{W}^{(2)} \mathbf{a}^{(1)} + \mathbf{b}^{(2)} = \begin{bmatrix} 0.1 \cdot 0.0 + (-0.4) \cdot 0.8 + 0.3 \\ (-0.5) \cdot 0.0 + 0.2 \cdot 0.8 + (-0.1) \end{bmatrix} = \begin{bmatrix} 0.0 - 0.32 + 0.3 \\ 0.0 + 0.16 - 0.1 \end{bmatrix} = \begin{bmatrix} -0.02 \\ 0.06 \end{bmatrix} z(2)=W(2)a(1)+b(2)=[0.1⋅0.0+(−0.4)⋅0.8+0.3(−0.5)⋅0.0+0.2⋅0.8+(−0.1)]=[0.0−0.32+0.30.0+0.16−0.1]=[−0.020.06]
a ( 2 ) = Softmax ( z ( 2 ) ) = [ e − 0.02 e − 0.02 + e 0.06 e 0.06 e − 0.02 + e 0.06 ] ≈ [ 0.475 0.525 ] \mathbf{a}^{(2)} = \text{Softmax}(\mathbf{z}^{(2)}) = \begin{bmatrix} \frac{e^{-0.02}}{e^{-0.02} + e^{0.06}} \\ \frac{e^{0.06}}{e^{-0.02} + e^{0.06}} \end{bmatrix} \approx \begin{bmatrix} 0.475 \\ 0.525 \end{bmatrix} a(2)=Softmax(z(2))=[e−0.02+e0.06e−0.02e−0.02+e0.06e0.06]≈[0.4750.525]
步骤3:计算交叉熵损失
- 交叉熵损失公式:
L = − ∑ i y i log ( a i ( 2 ) ) = − ( 0 ⋅ log ( 0.475 ) + 1 ⋅ log ( 0.525 ) ) ≈ − ( − 0.644 ) = 0.644 L = -\sum_{i} y_i \log(a^{(2)}_i) = -(0 \cdot \log(0.475) + 1 \cdot \log(0.525)) \approx -(-0.644) = 0.644 L=−i∑yilog(ai(2))=−(0⋅log(0.475)+1⋅log(0.525))≈−(−0.644)=0.644
3. 反向传播
目标是计算损失对权重 W ( 1 ) , W ( 2 ) \mathbf{W}^{(1)}, \mathbf{W}^{(2)} W(1),W(2) 和偏置 b ( 1 ) , b ( 2 ) \mathbf{b}^{(1)}, \mathbf{b}^{(2)} b(1),b(2)的梯度。
根据链式法则:
∂ L ∂ W 1 = ∂ L ∂ a 2 ∂ a 2 ∂ z 2 ∂ z 2 ∂ a 1 ∂ a 1 ∂ z 1 \frac{\partial L}{\partial W_1}=\frac{\partial L}{\partial a_2}\frac{\partial a_2}{\partial z_2}\frac{\partial z_2}{\partial a_1}\frac{\partial a_1}{\partial z_1} ∂W1∂L=∂a2∂L∂z2∂a2∂a1∂z2∂z1∂a1
∂ L ∂ W 2 = ∂ L ∂ a 2 ∂ a 2 ∂ z 2 ∂ z 2 ∂ a 1 \frac{\partial L}{\partial W_2}=\frac{\partial L}{\partial a_2}\frac{\partial a_2}{\partial z_2}\frac{\partial z_2}{\partial a_1} ∂W2∂L=∂a2∂L∂z2∂a2∂a1∂z2
步骤1:计算输出层的梯度
交叉熵损失 + Softmax 的梯度有一个 简化公式:
∂ L ∂ z ( 2 ) = a ( 2 ) − y = [ 0.475 − 0 0.525 − 1 ] = [ 0.475 − 0.475 ] \frac{\partial L}{\partial \mathbf{z}^{(2)}} = \mathbf{a}^{(2)} - \mathbf{y} = \begin{bmatrix} 0.475 - 0 \\ 0.525 - 1 \end{bmatrix} = \begin{bmatrix} 0.475 \\ -0.475 \end{bmatrix} ∂z(2)∂L=a(2)−y=[0.475−00.525−1]=[0.475−0.475]计算 ∂ L ∂ W ( 2 ) \frac{\partial L}{\partial \mathbf{W}^{(2)}} ∂W(2)∂L和 ∂ L ∂ b ( 2 ) \frac{\partial L}{\partial \mathbf{b}^{(2)}} ∂b(2)∂L:
z ( 2 ) = W ( 2 ) a ( 1 ) + b ( 2 ) \mathbf{z}^{(2)} = \mathbf{W}^{(2)} \mathbf{a}^{(1)} + \mathbf{b}^{(2)} z(2)=W(2)a(1)+b(2)
∂ L ∂ W ( 2 ) = ∂ L ∂ z ( 2 ) ⋅ ∂ z ( 2 ) ∂ a ( 1 ) = ∂ L ∂ z ( 2 ) ⋅ a ( 1 ) ⊤ = [ 0.475 − 0.475 ] ⋅ [ 0.0 0.8 ] = [ 0 0.38 0 − 0.38 ] \frac{\partial L}{\partial \mathbf{W}^{(2)}} = \frac{\partial L}{\partial \mathbf{z}^{(2)}} \cdot \frac{\partial \mathbf{z}^{(2)}}{\partial a^{(1)}}=\frac{\partial L}{\partial \mathbf{z}^{(2)}} \cdot \mathbf{a}^{(1) \top} = \begin{bmatrix} 0.475 \\ -0.475 \end{bmatrix} \cdot \begin{bmatrix} 0.0 & 0.8 \end{bmatrix} = \begin{bmatrix} 0 & 0.38 \\ 0 & -0.38 \end{bmatrix} ∂W(2)∂L=∂z(2)∂L⋅∂a(1)∂z(2)=∂z(2)∂L⋅a(1)⊤=[0.475−0.475]⋅[0.00.8]=[000.38−0.38]
∂ L ∂ b ( 2 ) = ∂ L ∂ z ( 2 ) = [ 0.475 − 0.475 ] \frac{\partial L}{\partial \mathbf{b}^{(2)}} = \frac{\partial L}{\partial \mathbf{z}^{(2)}} = \begin{bmatrix} 0.475 \\ -0.475 \end{bmatrix} ∂b(2)∂L=∂z(2)∂L=[0.475−0.475]
步骤2:计算隐藏层的梯度
计算 ∂ L ∂ a ( 1 ) \frac{\partial L}{\partial \mathbf{a}^{(1)}} ∂a(1)∂L :
∂ L ∂ a ( 1 ) = W ( 2 ) T ⋅ ∂ L ∂ z ( 2 ) = [ 0.1 − 0.5 − 0.4 0.2 ] ⋅ [ 0.475 − 0.475 ] = [ 0.1 ⋅ 0.475 + ( − 0.5 ) ⋅ ( − 0.475 ) − 0.4 ⋅ 0.475 + 0.2 ⋅ ( − 0.475 ) ] = [ 0.285 − 0.285 ] \frac{\partial L}{\partial \mathbf{a}^{(1)}} = \mathbf{W}^{(2)T} \cdot \frac{\partial L}{\partial \mathbf{z}^{(2)}} = \begin{bmatrix} 0.1 & -0.5 \\ -0.4 & 0.2 \end{bmatrix} \cdot \begin{bmatrix} 0.475 \\ -0.475 \end{bmatrix} = \begin{bmatrix} 0.1 \cdot 0.475 + (-0.5) \cdot (-0.475) \\ -0.4 \cdot 0.475 + 0.2 \cdot (-0.475) \end{bmatrix} = \begin{bmatrix} 0.285 \\ -0.285 \end{bmatrix} ∂a(1)∂L=W(2)T⋅∂z(2)∂L=[0.1−0.4−0.50.2]⋅[0.475−0.475]=[0.1⋅0.475+(−0.5)⋅(−0.475)−0.4⋅0.475+0.2⋅(−0.475)]=[0.285−0.285]计算 ∂ L ∂ z ( 1 ) \frac{\partial L}{\partial \mathbf{z}^{(1)}} ∂z(1)∂L(ReLU的导数为0或1):
∂ L ∂ z ( 1 ) = ∂ L ∂ a ( 1 ) ⊙ ReLU ′ ( z ( 1 ) ) = [ 0.285 − 0.285 ] ⊙ [ 0 1 ] = [ 0 − 0.285 ] \frac{\partial L}{\partial \mathbf{z}^{(1)}} = \frac{\partial L}{\partial \mathbf{a}^{(1)}} \odot \text{ReLU}'(\mathbf{z}^{(1)}) = \begin{bmatrix} 0.285 \\ -0.285 \end{bmatrix} \odot \begin{bmatrix} 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 0 \\ -0.285 \end{bmatrix} ∂z(1)∂L=∂a(1)∂L⊙ReLU′(z(1))=[0.285−0.285]⊙[01]=[0−0.285]计算 ∂ L ∂ W ( 1 ) \frac{\partial L}{\partial \mathbf{W}^{(1)}} ∂W(1)∂L 和 ∂ L ∂ b ( 1 ) \frac{\partial L}{\partial \mathbf{b}^{(1)}} ∂b(1)∂L :
∂ L ∂ W ( 1 ) = ∂ L ∂ z ( 1 ) ⋅ x T = [ 0 − 0.285 ] ⋅ [ 1 2 ] = [ 0 0 − 0.285 − 0.57 ] \frac{\partial L}{\partial \mathbf{W}^{(1)}} = \frac{\partial L}{\partial \mathbf{z}^{(1)}} \cdot \mathbf{x}^T = \begin{bmatrix} 0 \\ -0.285 \end{bmatrix} \cdot \begin{bmatrix} 1 & 2 \end{bmatrix} = \begin{bmatrix} 0 & 0 \\ -0.285 & -0.57 \end{bmatrix} ∂W(1)∂L=∂z(1)∂L⋅xT=[0−0.285]⋅[12]=[0−0.2850−0.57]
∂ L ∂ b ( 1 ) = ∂ L ∂ z ( 1 ) = [ 0 − 0.285 ] \frac{\partial L}{\partial \mathbf{b}^{(1)}} = \frac{\partial L}{\partial \mathbf{z}^{(1)}} = \begin{bmatrix} 0 \\ -0.285 \end{bmatrix} ∂b(1)∂L=∂z(1)∂L=[0−0.285]
4. 更新参数
假设学习率 η = 0.1 \eta = 0.1 η=0.1:
更新 W ( 2 ) \mathbf{W}^{(2)} W(2):
W ( 2 ) ← W ( 2 ) − η ⋅ ∂ L ∂ W ( 2 ) = [ 0.1 − 0.4 − 0.5 0.2 ] − 0.1 ⋅ [ 0 0.38 0 − 0.38 ] = [ 0.1 − 0.438 − 0.5 0.238 ] \mathbf{W}^{(2)} \leftarrow \mathbf{W}^{(2)} - \eta \cdot \frac{\partial L}{\partial \mathbf{W}^{(2)}} = \begin{bmatrix} 0.1 & -0.4 \\ -0.5 & 0.2 \end{bmatrix} - 0.1 \cdot \begin{bmatrix} 0 & 0.38 \\ 0 & -0.38 \end{bmatrix} = \begin{bmatrix} 0.1 & -0.438 \\ -0.5 & 0.238 \end{bmatrix} W(2)←W(2)−η⋅∂W(2)∂L=[0.1−0.5−0.40.2]−0.1⋅[000.38−0.38]=[0.1−0.5−0.4380.238]更新 b ( 2 ) \mathbf{b}^{(2)} b(2):
b ( 2 ) ← b ( 2 ) − η ⋅ ∂ L ∂ b ( 2 ) = [ 0.3 − 0.1 ] − 0.1 ⋅ [ 0.475 − 0.475 ] = [ 0.2525 − 0.0525 ] \mathbf{b}^{(2)} \leftarrow \mathbf{b}^{(2)} - \eta \cdot \frac{\partial L}{\partial \mathbf{b}^{(2)}} = \begin{bmatrix} 0.3 \\ -0.1 \end{bmatrix} - 0.1 \cdot \begin{bmatrix} 0.475 \\ -0.475 \end{bmatrix} = \begin{bmatrix} 0.2525 \\ -0.0525 \end{bmatrix} b(2)←b(2)−η⋅∂b(2)∂L=[0.3−0.1]−0.1⋅[0.475−0.475]=[0.2525−0.0525]
1.3深度带来的优势与挑战
优势
- 表示能力增强:理论证明,深层网络能以指数级减少神经元数量表达复杂函数(相比浅层网络)。
- 自动特征学习:深层结构逐层提取高阶特征(如从边缘→纹理→物体部件)。
挑战与解决方案
- 梯度消失/爆炸
- 解决方案:使用ReLU及其变体(Leaky ReLU)、批量归一化(BatchNorm)、残差连接(ResNet)。
- 过拟合
- 解决方案:Dropout、L2正则化、数据增强。
- 参数初始化
- 方案:Xavier初始化(适应Sigmoid/Tanh)、He初始化(适应ReLU)。
- 梯度消失/爆炸
1.4与其他网络结构的区别
与卷积神经网络(CNN)对比
- DFN:全连接,参数多,适合结构化数据(如表格数据)。
- CNN:局部连接+权重共享,适合图像等网格化数据。
与循环神经网络(RNN)对比
- DFN:无记忆,处理独立数据样本。
- RNN:含循环结构,处理序列数据(如时间序列、文本)。
1.5应用场景与实例
典型应用
- 图像分类(需结合CNN提升性能)。
- 结构化数据预测(如房价、用户评分)。
- 作为复杂模型的组件(如Transformer中的前馈子层)。
代码示例(PyTorch)
import torch.nn as nn class DeepFFN(nn.Module): def __init__(self, input_dim, hidden_dims, output_dim): super().__init__() layers = [] prev_dim = input_dim for dim in hidden_dims: layers.append(nn.Linear(prev_dim, dim)) layers.append(nn.ReLU()) layers.append(nn.Dropout(0.2)) # 防止过拟合 prev_dim = dim layers.append(nn.Linear(prev_dim, output_dim)) self.net = nn.Sequential(*layers) def forward(self, x): return self.net(x)
1.6总结与延伸
- 优点:结构简单、通用性强,是理解深度学习的基础。
- 局限性:全连接导致参数多,对图像/序列等数据效率低。
- 研究方向:神经架构搜索(NAS)、动态深度网络等。
通过结合特定结构(如CNN、注意力机制),深度前馈思想仍是现代模型的核心组成部分。