卷积神经网络

介绍卷积神经网络的基本概念,包括卷积层、池化层、局部响应归一化、批归一化、正则化方法及 TextCNN 等内容

基本概念

  • 传统神经网络的缺点

    • 不同层神经元连接方式为 “全连接”,对于大维度输入数据,权重和偏置参数量大,导致训练收敛缓慢
    • 特别是图像数据(数以百万像素),以单张黑白 28 × 28 的手写数字图片为例,输入层神经元就有 784 个
  • 卷积神经网络(Convolutional Neural Network, CNN)

    • 利用生物学上感受野的概念
    • 局部连接:卷积层的神经元只与前一层的部分神经元节点相连,即神经元之间的连接是非全连接的
    • 权重共享:同一层中某些神经元之间的连接的权重 𝑤𝑤 和偏置 𝑏𝑏 是相同的,大大减少了训练参数量
    • 降采样(池化):更进一步信息抽象和特征提取,减少数据处理量

卷积层

  • 卷积是一种线性的、平移不变的运算,其由在输入信号上执行局部加权的组合构成

    • 根据所选择的权重集合不同,揭示输入信号的不同性值
  • 卷积核(滤波器):在 CNN 中,与权重集合相关的是卷积核(kernel);

    • ci=f(∑ω⋅x+b)c_i=f (\sum\omega\cdot x+b),其中 ω\omega 即为卷积核
    • 在全连接神经网络中,隐藏层中的神经元的感受野足够大乃至可以看到上一层的所有特征
    • 而在卷积神经网络中,隐藏层中的神经元的感受野比较小,只能看到上一层的部分特征,其所能看到的大小即为卷积核大小
    • 卷积核中的每一项即为其权重值,选择合适的核,能从输入信号中提取最显著和最重要的特征
    • 通过一个带有卷积核的感受视野扫描生成的下一层神经元矩阵被称为一个 Feature Map(特征图)
  • 特征图大小的计算

    • 输入图像大小为 Hin×WinH_{\text{in}} \times W_{\text{in}}(高度 × 宽度)

    • 卷积核大小为 Kh×KwK_h \times K_w(高度 × 宽度)

    • 步幅(stride)为 ShS_h 和 SwS_w(纵向步幅 × 横向步幅)

    • 填充(padding)为 PhP_h 和 PwP_w(高度方向填充 × 宽度方向填充)

    • 则输出图像大小 Hout×WoutH_{\text{out}} \times W_{\text{out}} 可以计算为:

    Hout=⌊Hin+2Ph−KhSh⌋+1Wout=⌊Win+2Pw−KwSw⌋+1H_{\text{out}} = \left\lfloor \frac {H_{\text{in}} + 2P_h - K_h}{S_h} \right\rfloor + 1 \\ W_{\text{out}} = \left\lfloor \frac {W_{\text{in}} + 2P_w - K_w}{S_w} \right\rfloor + 1
    • 很多深度学习框架会采取向下取整的方式,放弃输入特征图的一部分边界数据
    • Caffe 和 PyTorch 会放弃输入特征图的左侧和上侧的一部分数据, 使得卷积核滑动窗恰好能到达最右下角的点
  • 如何增加输出单元的感受野

    • 增加卷积核大小
    • 增加卷积层数
    • 在卷积前进行汇聚操作
  • 卷积的变种

    • 分组卷积
    • 转置卷积
    • 空洞卷积:通过给卷积核插入 “空洞” 来变相地增加感受野的大小
    • 可变形卷积
  • 卷积核的深度

    • 卷积核(Kernel)的形状可以表示为 Kh×Kw×CinK_h \times K_w \times C_{\text{in}}:

      • KhK_h:卷积核的高度
      • KwK_w:卷积核的宽度
      • CinC_{\text{in}}:输入特征图的通道数(深度)
    • 特点

      • 卷积核的深度 CinC_{\text{in}} 必须与输入特征图的通道数相等,因为每个卷积核需要对输入的每一通道进行逐元素卷积
      • 如果输入特征图是 RGB 图像(3 个通道),卷积核的深度 CinC_{\text{in}} 就为 3
    • 卷积过程

      • 输入特征图的形状:Hin×Win×CinH_{\text{in}} \times W_{\text{in}} \times C_{\text{in}}(高度 × 宽度 × 通道数)
      1. 卷积核的形状:Kh×Kw×CinK_h \times K_w \times C_{\text{in}}
      2. 每个卷积核的作用:
        • 对输入特征图的每一通道进行单独卷积
        • 将所有通道的卷积结果按元素相加(求和),生成一个二维特征图
      • 输出特征图:如果有 CoutC_{\text{out}} 个卷积核,则输出特征图的形状为 Hout×Wout×CoutH_{\text{out}} \times W_{\text{out}} \times C_{\text{out}}

池化(Pooling)

  • 对图像进行 “有损压缩”
  • 最大值池化、最小值池化、平均池化、全局平均池化(Global Average Pooling)
  • 作用
    • 不变性,更关注是否存在某些关键特征而不是特征具体的位置;
    • 减少计算量和参数量;
    • 获得定长输出,例如:文本分类的时候输入是不定长的,可以通过池化获得定长输出;
    • 防止过拟合,但也有可能会带来欠拟合

局部响应归一化(Local Response Normalization, LRN)

  • 局部响应归一化是一种归一化技术,主要用于提高模型的泛化能力

  • 它最早出现在 AlexNet 中,用于对中间特征图进行归一化,灵感来自生物神经网络的 “侧抑制” 机制

  • 核心思想是对特定像素位置的值,使用其相邻通道的响应来进行归一化:

    • 计算当前像素位置在 通道维度 上的局部响应平方和
    • 根据平方和对当前通道的值进行归一化,抑制大的激活值,提升其他通道的响应
  • 对于给定的输入特征图,假设输入在某一位置的特征值为 ai,x,ya_{i,x,y},表示第 ii 个通道在位置 (x,y)(x, y) 的值。LRN 的归一化计算如下:

    bi,x,y=ai,x,y(k+α∑j=max⁡(0,i−n/2)min⁡(N−1,i+n/2)(aj,x,y)2)βb_{i,x,y} = \frac {a_{i,x,y}}{\left ( k + \alpha \sum_{j=\max (0, i-n/2)}^{\min (N-1, i+n/2)} (a_{j,x,y})^2 \right)^\beta}
    • bi,x,yb_{i,x,y}:归一化后的值
    • ai,x,ya_{i,x,y}:原始输入值
    • kk:一个常数,避免归一化分母为零(通常 k=2k = 2)
    • α\alpha:缩放因子,控制归一化的强度(常见值为 10−410^{-4})
    • β\beta:指数项,控制归一化的抑制程度(通常取 0.750.75)
    • NN:输入特征图的通道数
    • nn:归一化时考虑的通道范围(常见值为 5)

批归一化(Batch Normalization,BN,BatchNorm)

  • 对于一个神经网络层的输入 xx,BN 的核心步骤如下:

    • 计算均值和方差:

      μB=1m∑i=1mxi,σB2=1m∑i=1m(xi−μB)2\mu_B = \frac {1}{m} \sum_{i=1}^{m} x_i, \quad \sigma_B^2 = \frac {1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2
    • 标准化:

      x^i=xi−μBσB2+ϵ\hat {x}_i = \frac {x_i - \mu_B}{\sqrt {\sigma_B^2 + \epsilon}}
    • 缩放和平移:

      yi=γx^i+βy_i = \gamma \hat {x}_i + \beta
      • mm:当前批次的样本数
      • ϵ\epsilon:一个小常数,防止分母为零
      • γ\gamma 和 β\beta:可学习的参数,用于调整标准化后的分布
    • yi=γ⋅xi−μBσB2+ϵ+βy_i = \gamma \cdot \frac {x_i - \mu_B}{\sqrt {\sigma_B^2 + \epsilon}} + \beta

  • 通常用于非线性激活函数之前或之后,最常见的是放在激活函数之前:

    Input→Linear/Conv→BatchNorm→Activation (e.g., ReLU)\text{Input} \to \text{Linear/Conv} \to \text{BatchNorm} \to \text{Activation (e.g., ReLU)}
  • 瓶颈结构

  • 沙漏结构

正则化方法(Dropout)

  • Dropout 是一种常用的正则化方法,可以缓解网络的过拟合问题
  • Dropout 操作是指在网络的训练阶段,每次迭代时会从基础网络中随机丢弃一定比例的神经元,然后在修改后的网络上进行前向传播和反向传播
  • 注意:模型在测试阶段会恢复全部的神经元

TextCNN

  • 将卷积神经网络 CNN 应用到文本分类任务,利用多个不同 size 的卷积核(kernel)提取句子中关键信息(类似多窗口大小的 n-gram),从而能够更好地捕捉局部相关性

  • 输入层

    • 给定长度为 ll 的句子 S=[w1,w2,…,wl]S = [w_1, w_2, \dots, w_l],每个单词 wiw_i 使用词嵌入(如 Word2Vec 或 GloVe)转换为固定长度的向量
    • 输入矩阵 X∈Rl×dX \in \mathbb {R}^{l \times d}:X=[v(w1),v(w2),…,v(wl)]TX = [v (w_1), v (w_2), \dots, v (w_l)]^T,其中 ll 表示句子长度,dd 表示词向量的维度
  • 卷积层

    • 卷积核:

      • 使用多个不同大小的卷积核(如 h=2,3,4h = 2, 3, 4)来捕捉不同长度的 n-gram 特征
      • 卷积核的大小为 h×dh \times d,跨越词嵌入的整个维度
    • 卷积操作:对输入矩阵 XX 应用卷积,生成特征映射 cc:ci=f(w⋅X[i:i+h−1]+b)c_i = f (w \cdot X [i:i+h-1] + b)

  • 池化层:使用 1-max pooling

    • 从每个特征映射中选择最大的值,表示该卷积核在整个输入中最显著的特征
    • 池化后的结果是一个固定长度的向量,每个值对应一个卷积核的输出
    • 特征的位置信息在池化层完全丢失
    • 最大池化会丢失同一特征的强度信息:强特征会出现多次,出现次数越多说明这个特征越强,但 Max Pooling 只保留一个最大值
    • 采用 Average Pooling、K-Max Pooling、Chunk-Max Pooling
  • 全连接层

    • 将池化层的输出拼接后传入全连接层
    • 最后通过 softmax(或 sigmoid)激活函数完成分类
这篇文档有帮助吗?

On this page

页面信息