深度前馈网络(Deep Feedforward Network, DFN),也称为前馈神经网络或多层感知机(MLP),是深度学习的基础模型。它通过多层非线性变换对输入数据进行高层次抽象,广泛应用于分类、回归等任务。以下从核心概念、结构、训练挑战及解决方案等方面详细解析:


1.1核心概念与结构

  1. 基本定义

    • 前馈性:信息单向流动(输入层 → 隐藏层 → 输出层),无循环或反馈连接。
    • 深度:包含多个隐藏层(通常≥2层),通过逐层特征变换提升模型表达能力。
  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(l1)+b(l)),其中σ\sigmaσ为激活函数。
    • 输出层:生成最终预测(如分类概率、回归值)。
  3. 激活函数的作用

    • 引入非线性(如ReLU、Sigmoid、Tanh),使网络可拟合复杂函数。
    • 解决线性不可分问题(例如异或问题)。
      激活函数

1.2前向传播与反向传播

  1. 前向传播(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(L1)σ(W(1)x+b(1))+b(L1))+b(L)

  2. 反向传播(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.50.20.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.10.50.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.51+(0.3)2+0.1(0.2)1+0.42+0.2]=[0.50.6+0.10.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.10.0+(0.4)0.8+0.3(0.5)0.0+0.20.8+(0.1)]=[0.00.32+0.30.0+0.160.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))=[e0.02+e0.06e0.02e0.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=iyilog(ai(2))=(0log(0.475)+1log(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} W1L=a2Lz2a2a1z2z1a1
∂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} W2L=a2Lz2a2a1z2

步骤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.47500.5251]=[0.4750.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)La(1)z(2)=z(2)La(1)=[0.4750.475][0.00.8]=[000.380.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.4750.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)Tz(2)L=[0.10.40.50.2][0.4750.475]=[0.10.475+(0.5)(0.475)0.40.475+0.2(0.475)]=[0.2850.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)LReLU(z(1))=[0.2850.285][01]=[00.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)LxT=[00.285][12]=[00.28500.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=[00.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.10.50.40.2]0.1[000.380.38]=[0.10.50.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.30.1]0.1[0.4750.475]=[0.25250.0525]


1.3深度带来的优势与挑战

  1. 优势

    • 表示能力增强:理论证明,深层网络能以指数级减少神经元数量表达复杂函数(相比浅层网络)。
    • 自动特征学习:深层结构逐层提取高阶特征(如从边缘→纹理→物体部件)。
  2. 挑战与解决方案

    • 梯度消失/爆炸
      • 解决方案:使用ReLU及其变体(Leaky ReLU)、批量归一化(BatchNorm)、残差连接(ResNet)。
    • 过拟合
      • 解决方案:Dropout、L2正则化、数据增强。
    • 参数初始化
      • 方案:Xavier初始化(适应Sigmoid/Tanh)、He初始化(适应ReLU)。

1.4与其他网络结构的区别

  1. 与卷积神经网络(CNN)对比

    • DFN:全连接,参数多,适合结构化数据(如表格数据)。
    • CNN:局部连接+权重共享,适合图像等网格化数据。
  2. 与循环神经网络(RNN)对比

    • DFN:无记忆,处理独立数据样本。
    • RNN:含循环结构,处理序列数据(如时间序列、文本)。

1.5应用场景与实例

  1. 典型应用

    • 图像分类(需结合CNN提升性能)。
    • 结构化数据预测(如房价、用户评分)。
    • 作为复杂模型的组件(如Transformer中的前馈子层)。
  2. 代码示例(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、注意力机制),深度前馈思想仍是现代模型的核心组成部分。

Logo

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

更多推荐