深度学习基础

发布于:2025-05-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

1.深度前馈网络

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


1.1核心概念与结构

  1. 基本定义

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

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

1.2前向传播与反向传播

  1. 前向传播(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(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 = [ 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.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.5 0.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.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.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.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.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.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))=[e0.02+e0.06e0.02e0.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=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 ∂ 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} W1L=a2Lz2a2a1z2z1a1
∂ 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} W2L=a2Lz2a2a1z2

步骤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.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.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)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.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)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 ] ⊙ [ 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)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 ) ⋅ 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)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.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.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、注意力机制),深度前馈思想仍是现代模型的核心组成部分。


网站公告

今日签到

点亮在社区的每一天
去签到