深度学习基础——深度前馈网络
深度前馈网络(DFN)是深度学习的基础模型,通过多层非线性变换对输入数据进行高层次抽象,广泛应用于分类、回归等任务。其核心结构包括输入层、隐藏层和输出层,信息单向流动,无循环或反馈连接。激活函数引入非线性,解决线性不可分问题。前向传播通过逐层计算得到预测结果,反向传播则通过链式求导更新权重和偏置。以3层神经网络为例,结合交叉熵损失函数和Softmax激活函数,详细演示了前向传播和反向传播的计算过程
深度前馈网络(Deep Feedforward Network, DFN),也称为前馈神经网络或多层感知机(MLP),是深度学习的基础模型。它通过多层非线性变换对输入数据进行高层次抽象,广泛应用于分类、回归等任务。以下从核心概念、结构、训练挑战及解决方案等方面详细解析:
1.1核心概念与结构
-
基本定义
- 前馈性:信息单向流动(输入层 → 隐藏层 → 输出层),无循环或反馈连接。
- 深度:包含多个隐藏层(通常≥2层),通过逐层特征变换提升模型表达能力。
-
网络结构
- 输入层:接收原始数据(如图像像素、文本向量)。
- 隐藏层:多个非线性变换层,每层包含多个神经元。
- 第lll层的输出: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,经过LLL层后输出为:
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=[x1,x2]=[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.20.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.50.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.00.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.00.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.30.0+0.16−0.1]=[−0.020.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.02e−0.02+e0.06e0.06e−0.02+e0.06]≈[0.4750.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=−∑iyilog(ai(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∂W1=∂L∂a2∂a2∂z2∂z2∂a1∂a1∂z1 \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∂W2=∂L∂a2∂a2∂z2∂z2∂a1 \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−00.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.00.8]=[00.380−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.40.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]⊙[01]=[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)⋅xT=[0−0.285]⋅[12]=[00−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.50.2]−0.1⋅[00.380−0.38]=[0.1−0.438−0.50.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、注意力机制),深度前馈思想仍是现代模型的核心组成部分。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)