卷积神经网络(CNN)

深度学习

Posted by 月月鸟 on February 1, 2022

卷积神经网络(Convolutional Neural Networks, CNNs)

卷积神经网络(CNN)是深度学习中的一种专门用于处理数据具有网格拓扑结构的神经网络,尤其在图像和视频处理领域具有显著效果。CNN能够自动地从数据中提取重要的特征,并保留空间信息,同时减少计算量,使其非常适合处理图像等数据。

1. CNN的组成部分

1.1. 卷积层

卷积层是卷积神经网络(CNN)中最核心的组件之一,负责从输入数据中提取特征。卷积层通过卷积操作从局部区域中提取空间信息,并通过层叠的方式从低级特征逐渐提取高级特征。它的主要优势在于能够捕捉输入数据的局部结构,同时避免参数过多的问题。下面详细解析卷积层的原理、计算过程、参数以及常见的改进。

1. 卷积操作的基本原理

在卷积层中,卷积核(filter)滤波器(kernel)是一个小的权重矩阵,用于扫描输入数据的局部区域,并执行点积运算。该操作类似于传统信号处理中的卷积运算,因此称为卷积层。

  • 输入:通常为三维张量(例如一张RGB图像,具有宽度、高度和深度),深度对应输入的通道数(如图像的3个通道:R、G、B)。
  • 卷积核:一个较小的二维或三维矩阵,称为滤波器。对于彩色图像,卷积核通常也是三维的,其中第三维度与输入图像的深度相同。
  • 输出:输出称为特征图(feature map),表示卷积核在不同区域所提取的特征。

2. 卷积层的计算过程

卷积操作的核心是通过卷积核在输入数据上滑动,并对其进行局部处理。以下是卷积层的具体计算步骤:

  1. 局部感知(Local Receptive Field): 卷积核通过在输入数据上滑动,只在局部区域进行计算。比如,对于大小为 (5 \times 5) 的输入图像,使用大小为 (3 \times 3) 的卷积核,每次只处理 (3 \times 3) 区域。

  2. 点积运算(Dot Product): 对应位置的输入像素值与卷积核的权重相乘,然后将结果相加得到一个数值。这个过程会重复整个输入空间。

  3. 特征图的生成: 每当卷积核滑动到一个新的位置时,会产生一个新的数值,这些数值组成了输出的特征图。特征图的维度取决于输入尺寸、卷积核尺寸、步幅(stride)和填充(padding)。

3. 卷积层的参数

卷积层的几个关键参数决定了输出的特征图大小和网络的计算复杂度:

  1. 卷积核大小(Filter Size)
    • 卷积核通常是一个较小的矩阵,比如 (3 \times 3), (5 \times 5),或 (7 \times 7)。卷积核越大,感知的局部区域越大,但计算量也越大。
    • 在图像处理中,卷积核通常设计为奇数大小(如 (3 \times 3)),以方便对称操作并保留图像中心信息。
  2. 步幅(Stride)
    • 步幅决定了卷积核在输入图像上滑动的步长。如果步幅为1,卷积核每次滑动一个像素。如果步幅为2,则每次滑动两个像素。
    • 步幅越大,输出特征图的尺寸越小,反之步幅越小,输出特征图的尺寸越大。
  3. 填充(Padding)
    • 为了控制输出特征图的尺寸,可以在输入的边界处进行填充。常见的填充方式有:
      • Valid Padding:不进行任何填充,卷积核仅应用于输入数据的内部区域,输出的尺寸会变小。
      • Same Padding:通过在输入边缘添加零,使得输出特征图的尺寸与输入相同。
  4. 深度(Depth)
    • 卷积层的深度是由滤波器的数量决定的。每个滤波器提取一种特定的特征,因此更多的滤波器可以提取出更多不同类型的特征。比如,一个卷积层可能有32个不同的滤波器,这样会生成32个不同的特征图。

4. 卷积层的计算公式

假设输入张量的大小为 ( W_{\text{in}} \times H_{\text{in}} \times D_{\text{in}} ),卷积核的大小为 ( K \times K \times D_{\text{in}} ),步幅为 (S),填充为 (P),则输出张量的大小 (W_{\text{out}} \times H_{\text{out}} \times D_{\text{out}}) 可以通过以下公式计算:

  • 输出宽度 (W_{\text{out}} = \frac{W_{\text{in}} - K + 2P}{S} + 1)
  • 输出高度 (H_{\text{out}} = \frac{H_{\text{in}} - K + 2P}{S} + 1)
  • 输出深度 (D_{\text{out}}) 为滤波器的数量。

5. 多通道卷积

在处理多通道输入(如RGB图像)时,每个卷积核不仅在空间维度上应用,还需要在通道维度上展开。对于每个通道,卷积核会生成一个二维特征图,所有通道上的结果会相加,最终生成一个二维输出特征图。

  • 输入深度:对于彩色图像,输入的深度通常为3(对应R、G、B通道)。
  • 卷积核的深度:卷积核的深度与输入数据的深度相同。例如,对于RGB图像,卷积核的大小可能是 (3 \times 3 \times 3)。

6. 卷积层的特点

  • 局部感知:每个卷积核只关注输入数据的局部区域,能够高效地提取局部特征。这种局部感知的特点使得卷积层非常适合处理具有空间结构的数据,如图像。

  • 参数共享:卷积核的权重在整个输入空间内共享,因此参数量大大减少。这种共享参数的方式不仅减小了模型的复杂度,还帮助CNN具备了对输入的平移不变性。

  • 稀疏连接:与全连接层不同,卷积层的每个神经元只与局部区域的输入相连,而不是与整个输入相连。稀疏连接减少了计算负担,并且帮助网络捕捉到局部的重要特征。

7. 计算过程

让我们通过一个简单的例子,来说明如何在CNN中进行卷积操作,并计算输出特征图的大小。这里包括填充的操作。

例子说明

我们有以下参数:

  • 输入图像大小:5x5(高度 × 宽度)
  • 卷积核大小:3x3
  • 步幅(Stride):1
  • 填充(Padding):1(在每一边补一个像素的零值)
输入图像

假设输入图像是一个大小为 (5 \times 5) 的矩阵(单通道图像),如下:

[ \begin{bmatrix} 1 & 1 & 1 & 0 & 0
0 & 1 & 1 & 1 & 0
0 & 0 & 1 & 1 & 1
0 & 0 & 1 & 1 & 0
1 & 1 & 1 & 0 & 0 \end{bmatrix} ]

填充

我们给图像添加填充(padding),每一边增加一列和一行的0值,得到一个 (7 \times 7) 的矩阵:

[ \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0
0 & 1 & 1 & 1 & 0 & 0 & 0
0 & 0 & 1 & 1 & 1 & 0 & 0
0 & 0 & 0 & 1 & 1 & 1 & 0
0 & 0 & 0 & 1 & 1 & 0 & 0
0 & 1 & 1 & 1 & 0 & 0 & 0
0 & 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix} ]

卷积核

假设我们有一个 (3 \times 3) 的卷积核(滤波器)如下:

[ \begin{bmatrix} 1 & 0 & -1
1 & 0 & -1
1 & 0 & -1 \end{bmatrix} ]

卷积操作

使用步幅为1的卷积核,在填充后的图像上滑动,计算每个位置的结果。卷积操作计算的是输入矩阵和卷积核对应元素的乘积之和。

举个例子,在滑动到填充后的图像左上角时,子矩阵为:

[ \begin{bmatrix} 0 & 0 & 0
0 & 1 & 1
0 & 0 & 1 \end{bmatrix} ]

将这个子矩阵与卷积核逐元素相乘并求和:

[ (0 \times 1) + (0 \times 0) + (0 \times -1) + (0 \times 1) + (1 \times 0) + (1 \times -1) + (0 \times 1) + (0 \times 0) + (1 \times -1) = -1 ]

因此,卷积操作在这个位置的结果为 -1

输出特征图的大小

卷积操作后的输出特征图大小可以用以下公式计算:

[ \text{输出尺寸} = \frac{(输入尺寸 + 2 \times \text{填充} - \text{卷积核尺寸})}{\text{步幅}} + 1 ]

代入我们的参数:

  • 输入尺寸:(5)
  • 填充:(1)
  • 卷积核尺寸:(3)
  • 步幅:(1)

[ \text{输出尺寸} = \frac{(5 + 2 \times 1 - 3)}{1} + 1 = 5 ]

因此,输出的特征图大小为 (5 \times 5)。

输出特征图

按照上述操作对整个图像进行卷积,我们最终得到一个大小为 (5 \times 5) 的输出特征图。

这个特征图的结果矩阵可能如下(具体数值取决于输入矩阵和卷积核的具体值):

[ \begin{bmatrix} -1 & 0 & 1 & 2 & -1
1 & 1 & 0 & 0 & -1
2 & 1 & -1 & -2 & -1
1 & 0 & -1 & 1 & 2
-1 & -1 & 1 & 0 & 1 \end{bmatrix} ]


1.2. 激活函数(Activation Function)

在卷积神经网络(CNN)中,激活函数(Activation Function)是一个关键组件,通常应用在每个卷积层或全连接层的输出之后。它的主要作用是引入非线性,使得网络可以学习和表示复杂的非线性关系。没有激活函数的网络仅能表示线性映射,而激活函数使得神经网络能够处理复杂的任务,如图像分类、目标检测等。

下面是CNN中常用的激活函数及其特点:

1. ReLU(Rectified Linear Unit)

ReLU 是最常用的激活函数之一,定义为: [ f(x) = \max(0, x) ]

特点:

  • 简单且高效:ReLU 函数非常简单,只是把负值置为0,保留正值。因此,它的计算效率很高,适合大规模神经网络的训练。
  • 稀疏激活:因为输出为0的节点在网络中不会参与后续的计算,这会使得网络更轻量。
  • 梯度消失问题较小:相比于 Sigmoid 或 Tanh 激活函数,ReLU 在正区间的导数为1,因此不容易出现梯度消失问题。

问题:

  • ReLU 的”死亡”问题:对于一些神经元,如果输入总是负值,那么这些神经元的输出将始终为0,并且它们的梯度也将为0,导致这些神经元可能永远不会被激活。这种现象称为”死亡 ReLU”问题。

2. Leaky ReLU

为了缓解 ReLU 的”死亡”问题,提出了 Leaky ReLU,它允许负输入通过一个很小的斜率。定义为: [ f(x) = \begin{cases} x & \text{if } x > 0
\alpha x & \text{if } x \leq 0 \end{cases} ] 其中 ( \alpha ) 是一个小的正数(如 0.01)。

特点:

  • 解决 ReLU 的死亡问题:通过在负数区域保持一个小的负斜率,Leaky ReLU 允许一些负值信息通过,从而减少神经元”死亡”的可能性。

常见变体:

  • Parametric ReLU(PReLU):Leaky ReLU 的一种变体,允许网络自己学习负斜率的参数 ( \alpha ),而不是使用固定的值。

3. Sigmoid

Sigmoid 激活函数曾经在早期的神经网络中广泛使用,定义为: [ f(x) = \frac{1}{1 + e^{-x}} ]

特点:

  • 值域为(0, 1):Sigmoid 函数将输入压缩到 (0, 1) 之间,非常适合二分类问题中的概率输出。

问题:

  • 梯度消失问题:在输入值非常大或非常小时,Sigmoid 的梯度会接近于0,导致梯度更新非常缓慢,从而影响网络的训练。
  • 非零中心输出:Sigmoid 的输出总是正的,导致在训练时容易出现偏置现象,影响收敛速度。

4. Tanh(双曲正切函数)

Tanh 函数是 Sigmoid 的扩展版,定义为: [ f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} ]

特点:

  • 值域为(-1, 1):Tanh 函数的输出是零中心的,这对加速梯度下降优化很有帮助。
  • 更适合用于有负值的输入:相比 Sigmoid,Tanh 在负值输入时表现更好。

问题:

  • 梯度消失问题:虽然 Tanh 的梯度在零附近较大,但在输入值非常大或非常小时,它仍然容易出现梯度消失问题。

5. Softmax

Softmax 通常用于 CNN 的输出层,尤其是在多分类问题中。Softmax 会将一组实数转换为概率分布,定义为: [ f(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} ] 其中 ( x_i ) 是第 ( i ) 类的输出。

特点:

  • 多分类问题的标准激活函数:Softmax 确保输出的每个元素都在 (0, 1) 之间,且所有元素的总和为1,代表分类的概率。

6. Swish

Swish 是由 Google 提出的一个新型激活函数,定义为: [ f(x) = x \cdot \text{sigmoid}(x) = \frac{x}{1 + e^{-x}} ]

特点:

  • 平滑曲线:相比 ReLU,Swish 的输出更平滑,能在一些任务上表现更好。
  • 自适应性:Swish 的输出值范围不限于正值,这使其在某些情况下比 ReLU 更灵活。

7. GELU(Gaussian Error Linear Unit)

GELU 是近年来引入的一种激活函数,特别是在 BERT 等自然语言处理模型中广泛应用。定义为: [ f(x) = x \cdot \Phi(x) ] 其中 ( \Phi(x) ) 是标准正态分布的累积分布函数。

特点:

  • 近似 ReLU:GELU 可以看作是 ReLU 的平滑版本。
  • 概率解释:GELU 在正值区间以高概率保留输入,而在负值区间则以概率折减输入,从而保留了一定的随机性。

8. ELU(Exponential Linear Unit)

ELU 也是 ReLU 的一种改进版本,定义为: [ f(x) = \begin{cases} x & \text{if } x > 0
\alpha (e^x - 1) & \text{if } x \leq 0 \end{cases} ] 其中 ( \alpha ) 通常取值为 1。

特点:

  • 负值区间的平滑输出:ELU 在负值区间不像 ReLU 那样简单地将其设为0,而是生成负的指数输出,这使得它能够更好地处理负值输入。

让我们通过一个具体的例子,展示 ReLU 激活函数在卷积神经网络(CNN)中的计算过程。

计算例子

场景设置

假设我们有以下步骤:

  1. 输入图像矩阵经过一个卷积核操作,得到一个输出特征图。
  2. 然后我们将 ReLU 激活函数应用到这个特征图。

1. 输入图像

假设输入图像大小为 (3 \times 3),如下所示:

[ \text{Input} = \begin{bmatrix} 1 & 0 & -1
2 & -3 & 4
-2 & 5 & -1 \end{bmatrix} ]

2. 卷积核

假设我们有一个 (2 \times 2) 的卷积核:

[ \text{Kernel} = \begin{bmatrix} 1 & 0
-1 & 1 \end{bmatrix} ]

3. 卷积操作

使用步幅(stride)为1,对输入图像执行卷积操作,结果如下:

  • 第一个位置卷积运算:取输入的左上角 (2 \times 2) 子矩阵: [ \text{Submatrix}_1 = \begin{bmatrix} 1 & 0
    2 & -3 \end{bmatrix} ] 进行卷积: [ (1 \times 1) + (0 \times 0) + (-1 \times 2) + (1 \times -3) = 1 + 0 - 2 - 3 = -4 ]

  • 第二个位置卷积运算:取输入的中间左部 (2 \times 2) 子矩阵: [ \text{Submatrix}_2 = \begin{bmatrix} 0 & -1
    -3 & 4 \end{bmatrix} ] 进行卷积: [ (1 \times 0) + (0 \times -1) + (-1 \times -3) + (1 \times 4) = 0 + 0 + 3 + 4 = 7 ]

  • 第三个位置卷积运算:取输入的右上角 (2 \times 2) 子矩阵: [ \text{Submatrix}_3 = \begin{bmatrix} 2 & -3
    -2 & 5 \end{bmatrix} ] 进行卷积: [ (1 \times 2) + (0 \times -3) + (-1 \times -2) + (1 \times 5) = 2 + 0 + 2 + 5 = 9 ]

  • 第四个位置卷积运算:取输入的右下角 (2 \times 2) 子矩阵: [ \text{Submatrix}_4 = \begin{bmatrix} -3 & 4
    5 & -1 \end{bmatrix} ] 进行卷积: [ (1 \times -3) + (0 \times 4) + (-1 \times 5) + (1 \times -1) = -3 + 0 - 5 - 1 = -9 ]

得到的卷积结果特征图如下:

[ \text{Convolution Output} = \begin{bmatrix} -4 & 7
9 & -9 \end{bmatrix} ]

4. ReLU 激活函数应用

现在,将 ReLU 激活函数应用于卷积输出。ReLU 的公式是:

[ f(x) = \max(0, x) ]

逐元素应用 ReLU 函数:

  • ( \max(0, -4) = 0 )
  • ( \max(0, 7) = 7 )
  • ( \max(0, 9) = 9 )
  • ( \max(0, -9) = 0 )

因此,经过 ReLU 激活后的输出为:

[ \text{ReLU Output} = \begin{bmatrix} 0 & 7
9 & 0 \end{bmatrix} ]

总结

在这个例子中,我们对输入图像进行了卷积操作,然后应用了 ReLU 激活函数。ReLU 激活函数将所有负值置为0,而保留正值不变。最终的输出特征图只保留了卷积结果中的非负部分。ReLU 的这种操作引入了非线性,使得神经网络能够更好地学习复杂的特征。


1.3. 池化层(Pooling Layer)

池化层(Pooling Layer)是卷积神经网络(CNN)中的另一重要组成部分,通常位于卷积层之后,用于减小特征图的尺寸,同时保留重要的空间信息。它通过对特征图进行下采样(subsampling),减少了参数数量和计算负担,降低了模型的过拟合风险。池化操作本质上是一种降维手段,使网络能够更加高效地处理数据。

1. 池化层的作用

池化层的主要作用包括:

  1. 降维:通过缩小特征图的尺寸,减少了后续网络层的计算量和内存占用。
  2. 防止过拟合:池化层减少了特征图中的冗余信息,有助于缓解模型的过拟合。
  3. 提取主要特征:通过池化操作,网络可以保留输入中最重要的特征,同时忽略不重要的细节。
  4. 提高平移不变性:池化操作增强了CNN对输入图像平移、缩放等变化的鲁棒性,使模型对这些变换不太敏感。

2. 池化层的工作原理

池化层通过在输入特征图上应用一个固定大小的窗口,并在该窗口内进行某种聚合操作来产生输出。池化操作是一种无参数的操作,即没有可学习的参数,它仅对特征图的局部区域进行下采样。

3. 常见的池化类型

  1. 最大池化(Max Pooling)
    • 工作原理:从池化窗口内选择最大值作为输出。最大池化常用于提取图像中最突出的特征,忽略细节部分。
    • 优点:保留了特征图中的强响应位置,特别适合边缘或其他高强度特征的提取。
    • 应用场景:由于它可以忽略无关的细节,最大池化常用于图像分类、目标检测等任务中。
  2. 平均池化(Average Pooling)
    • 工作原理:对池化窗口内的所有值取平均值作为输出。平均池化保留了区域的总体信息,但会弱化极值。
    • 优点:保留了局部区域的平滑信息,适合场景中不需要关注极端特征的任务。
    • 应用场景:在一些需要平滑输入的应用中(如某些信号处理任务),平均池化有时比最大池化表现更好。
  3. 全局池化(Global Pooling)
    • 工作原理:全局池化是对整个特征图进行池化操作,通常是对特征图中的所有值取最大值(全局最大池化,Global Max Pooling)或平均值(全局平均池化,Global Average Pooling)。
    • 应用:全局池化常用于网络的最后一层,用于将特征图压缩为一个固定大小的向量,用于全连接层或分类层。

4. 池化层的参数

池化层的主要参数有:

  1. 池化窗口大小(Filter Size or Pooling Size)
    • 通常为 (2 \times 2) 或 (3 \times 3)。窗口大小决定了在输入特征图上池化操作的区域大小。
  2. 步幅(Stride)
    • 步幅决定了池化窗口在输入特征图上移动的距离。常见的步幅为2,这意味着每次移动2个单位。
    • 如果步幅和池化窗口大小相等,池化窗口之间没有重叠。步幅越大,输出特征图越小。
  3. 填充(Padding)
    • 填充决定了是否在输入特征图的边缘添加额外的值(通常是零),以确保池化操作能够覆盖整个输入。常用的填充策略是“valid”,即不进行填充。

5. 池化层的计算公式

假设输入特征图的大小为 (W_{\text{in}} \times H_{\text{in}} \times D_{\text{in}}),池化窗口大小为 (K \times K),步幅为 (S),输出特征图大小 (W_{\text{out}} \times H_{\text{out}} \times D_{\text{out}}) 可以通过以下公式计算:

  • 输出宽度 (W_{\text{out}} = \frac{W_{\text{in}} - K}{S} + 1)
  • 输出高度 (H_{\text{out}} = \frac{H_{\text{in}} - K}{S} + 1)
  • 输出深度 (D_{\text{out}} = D_{\text{in}})(池化层不改变特征图的深度)

6. 池化层的特点

  • 无学习参数:池化层不像卷积层那样需要学习权重,它只是根据池化规则对输入数据进行处理。
  • 平移不变性:由于池化层关注的是局部区域内的最大值或平均值,即使输入图像发生小幅度平移,池化操作仍能提取相似的特征,这增强了模型的鲁棒性。
  • 降维作用:通过池化操作,特征图的尺寸显著减小,但模型仍能保留关键特征信息。减小特征图尺寸的同时减少了模型参数量,提高了计算效率。

7. 池化层的改进

  1. 带有重叠的池化(Overlapping Pooling)
    • 在标准的池化操作中,池化窗口通常不重叠,即步幅等于池化窗口的大小。然而,重叠池化允许池化窗口部分重叠,这种操作可能提取更多的细节信息。
  2. 混合池化(Mixed Pooling)
    • 结合最大池化和平均池化的特点,在每次池化操作时随机选择使用最大池化或平均池化。这种方法可以在保持特征图主要信息的同时,保留更多的细节。
  3. 自适应池化(Adaptive Pooling)
    • 自适应池化允许网络自动决定池化窗口的大小和步幅,以适应不同输入特征图的大小。这种方法通常用于需要对不同大小输入进行处理的任务,如目标检测或语义分割。

8. 池化层的应用场景

  • 图像分类:池化层通过下采样减少了图像特征的冗余信息,有助于提高模型的泛化能力,并降低过拟合风险。
  • 目标检测与分割:池化层通过缩小特征图尺寸,减少计算量,使得模型可以更加高效地处理高分辨率图像。
  • 卷积神经网络中的任何任务:池化层几乎用于所有的卷积神经网络架构中,如LeNet、AlexNet、VGG等,它们都是池化层的重要应用。

9. 池化层的简单计算示例

我们可以通过一个简单的示例来演示池化操作的计算过程。假设我们有一个 (4 \times 4) 的输入特征图,进行 (2 \times 2) 的最大池化(Max Pooling),步幅(stride)为2,不使用填充(padding)。

1. 输入特征图

[ \begin{bmatrix} 1 & 3 & 2 & 4
5 & 6 & 1 & 2
7 & 8 & 9 & 10
4 & 5 & 3 & 1
\end{bmatrix} ]

2. 进行 (2 \times 2) 最大池化,步幅为2

池化窗口大小为 (2 \times 2),步幅为2,意味着每次池化窗口会在输入特征图上移动2个单位,覆盖局部区域并计算最大值。

第一步:对左上角 (2 \times 2) 窗口执行池化

[ \begin{bmatrix} 1 & 3
5 & 6
\end{bmatrix} ] 最大值是6,因此输出的第一个元素是6。

第二步:对右上角 (2 \times 2) 窗口执行池化

[ \begin{bmatrix} 2 & 4
1 & 2
\end{bmatrix} ] 最大值是4,因此输出的第二个元素是4。

第三步:对左下角 (2 \times 2) 窗口执行池化

[ \begin{bmatrix} 7 & 8
4 & 5
\end{bmatrix} ] 最大值是8,因此输出的第三个元素是8。

第四步:对右下角 (2 \times 2) 窗口执行池化

[ \begin{bmatrix} 9 & 10
3 & 1
\end{bmatrix} ] 最大值是10,因此输出的第四个元素是10。

3. 输出特征图

经过 (2 \times 2) 最大池化后,输出的特征图是:

[ \begin{bmatrix} 6 & 4
8 & 10
\end{bmatrix} ]


1.4. 全连接层(Fully Connected Layer)

全连接层(Fully Connected Layer,简称 FC 层)是神经网络中的基本组成部分之一,常见于传统的神经网络(如多层感知器,MLP)以及卷积神经网络(CNN)中的后端部分。全连接层的主要特点是每个神经元与上一层的所有神经元完全相连,形成了一个密集的连接网络。

1. 全连接层的工作原理

在全连接层中,每个神经元与上一层的所有输入都有连接,并具有对应的权重。通过将输入数据与权重相乘并加上偏置项,然后经过激活函数处理,得到当前层的输出。这个过程可以视为线性变换后的非线性激活。

具体来说:

  • 对于输入向量 ( \mathbf{x} ),全连接层对其进行线性变换: [ \mathbf{z} = \mathbf{W} \cdot \mathbf{x} + \mathbf{b} ] 其中,( \mathbf{W} ) 是权重矩阵,( \mathbf{b} ) 是偏置向量,( \mathbf{z} ) 是线性变换后的结果。

  • 然后,结果通过一个非线性激活函数 ( f )(如 ReLU、sigmoid、tanh): [ \mathbf{y} = f(\mathbf{z}) ] 其中,( \mathbf{y} ) 是当前层的输出。

2. 全连接层的参数

全连接层的参数包括权重矩阵 ( \mathbf{W} ) 和偏置向量 ( \mathbf{b} )。权重矩阵的尺寸由输入的维度和输出的维度决定。

  • 权重矩阵(Weights Matrix, ( \mathbf{W} ))
    • 假设输入向量的大小为 ( n ),输出向量的大小为 ( m ),那么权重矩阵的尺寸为 ( m \times n )。每个元素 ( w_{ij} ) 表示输入第 ( i ) 个神经元与输出第 ( j ) 个神经元之间的连接权重。
  • 偏置项(Biases, ( \mathbf{b} ))
    • 偏置项是一个长度为 ( m ) 的向量,应用于每个输出神经元。

3. 全连接层的特点

  1. 密集连接:全连接层中的每个神经元都与上一层的所有神经元相连,形成了密集的网络结构。

  2. 高参数量:由于全连接层中的每个输入都与每个输出相连,因此参数量很大,尤其当输入和输出的维度较大时,容易导致过拟合。

  3. 非空间敏感:全连接层忽略了输入的空间结构,例如图像的像素布局,因此不适合直接用于处理高维空间数据(如图像、视频)。

  4. 适用于特征整合与分类:全连接层主要用于网络的后端部分,将卷积层提取的特征进行整合,并最终用于分类、回归等任务。

4. 全连接层的激活函数

全连接层通常使用激活函数对线性变换后的结果进行非线性变换,从而增强模型的表达能力。常见的激活函数包括:

  1. ReLU(Rectified Linear Unit):最常用的激活函数之一,计算简单,且可以有效缓解梯度消失问题。 [ f(x) = \max(0, x) ]

  2. Sigmoid:常用于二分类任务,将输出值映射到 [0, 1] 之间,但容易引发梯度消失问题。 [ f(x) = \frac{1}{1 + e^{-x}} ]

  3. Tanh:将输出值映射到 [-1, 1] 之间,与 sigmoid 类似,但通常表现得稍好些。 [ f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} ]

  4. Softmax:常用于多分类任务,用于将网络的输出转换为概率分布,确保输出总和为 1。 [ f(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} ]

5. 全连接层的计算示例

假设我们有一个简单的全连接层,输入向量包含 3 个元素,输出向量包含 2 个元素。权重矩阵为 (2 \times 3),每个神经元有一个对应的偏置项。我们将通过这个例子展示全连接层的计算过程。

假设的参数
  • 输入向量 ( \mathbf{x} = [x_1, x_2, x_3] = [1, 2, 3] )
  • 权重矩阵 ( \mathbf{W} ): [ \mathbf{W} = \begin{bmatrix} 0.2 & 0.8 & -0.5 \ 0.5 & -0.1 & 0.3 \end{bmatrix} ]
    • 第一行对应第一个输出神经元的权重,第二行对应第二个输出神经元的权重。
  • 偏置向量 ( \mathbf{b} = [b_1, b_2] = [0.5, -0.5] )
全连接层的计算步骤
  1. 计算第一个输出神经元的线性组合: [ z_1 = w_{11} x_1 + w_{12} x_2 + w_{13} x_3 + b_1 ] 代入具体的数值: [ z_1 = (0.2 \times 1) + (0.8 \times 2) + (-0.5 \times 3) + 0.5 ] [ z_1 = 0.2 + 1.6 - 1.5 + 0.5 = 0.8 ]

  2. 计算第二个输出神经元的线性组合: [ z_2 = w_{21} x_1 + w_{22} x_2 + w_{23} x_3 + b_2 ] 代入具体的数值: [ z_2 = (0.5 \times 1) + (-0.1 \times 2) + (0.3 \times 3) + (-0.5) ] [ z_2 = 0.5 - 0.2 + 0.9 - 0.5 = 0.7 ]

  3. 应用激活函数: 让我们假设我们使用 ReLU 激活函数,ReLU 的定义是 ( f(x) = \max(0, x) ),即输出为输入与 0 的较大值。

    • 对 ( z_1 ) 应用 ReLU: [ f(z_1) = \max(0, 0.8) = 0.8 ]
    • 对 ( z_2 ) 应用 ReLU: [ f(z_2) = \max(0, 0.7) = 0.7 ]
最终输出

经过全连接层的线性变换和 ReLU 激活函数后的输出向量为:

[ \mathbf{y} = [0.8, 0.7] ]

总结

  1. 输入向量:[1, 2, 3]
  2. 权重矩阵:[ \mathbf{W} = \begin{bmatrix} 0.2 & 0.8 & -0.5 \ 0.5 & -0.1 & 0.3 \end{bmatrix} ]
  3. 偏置向量:[0.5, -0.5]
  4. 经过全连接层和 ReLU 激活后的输出向量:[0.8, 0.7]

通过这个例子,我们可以看到,全连接层是如何通过加权求和和偏置来对输入进行线性变换,然后通过激活函数引入非线性,从而生成输出。

6. 全连接层的应用

全连接层主要用于以下场景:

  1. 分类任务:全连接层通常放在卷积神经网络的末端,将提取的特征映射到类别空间,例如在图像分类任务中,将卷积层输出的特征向量映射为类别标签。

  2. 回归任务:全连接层也可以用于回归任务,通过全连接层输出连续值。

  3. 特征整合:在深度学习模型中,全连接层常用于对前面提取的特征进行整合,将局部特征转化为全局信息。

7. 全连接层的优缺点

  • 优点
    • 简单、通用,适用于各种任务,尤其是分类和回归问题。
    • 能够很好地将提取到的特征进行整合和处理。
  • 缺点
    • 参数量大,尤其在处理高维输入时容易引发过拟合。
    • 忽略了输入的空间结构,无法捕捉如图像中的局部信息。

8. 全连接层与卷积层的区别

  • 全连接层:每个神经元与前一层的所有神经元相连,因此参数量较大,适合特征整合与分类任务。
  • 卷积层:每个神经元仅与局部区域的输入相连,参数共享,因此参数量较少,适合处理具有空间结构的数据(如图像)。

总结

全连接层是神经网络中用于特征整合和分类的重要组成部分。它通过与前一层所有神经元的密集连接,对输入数据进行线性变换和非线性激活,最终输出结果。虽然全连接层参数量大、容易过拟合,但在特征整合、分类、回归等任务中依然发挥着关键作用。

1.5. 输出层(Output Layer)

输出层(Output Layer)介绍

输出层是神经网络的最后一层,负责生成最终的预测结果。它的主要功能是将网络的前一层输出映射到所需的结果空间,并将该结果用于分类、回归或其他任务。输出层的具体实现通常取决于所解决问题的类型:分类问题、回归问题或生成任务等。

1. 输出层的作用

  • 分类问题:输出层将前一层的输出转换为类别的概率分布或具体的类别标签。
  • 回归问题:输出层生成一个或多个连续值,用于预测问题中的目标变量。
  • 生成任务:在生成任务中,输出层可能生成图像、文本等数据。

2. 输出层的形式

根据任务的不同,输出层的结构和激活函数有所不同。常见的输出层形式包括以下几种:

(1)分类问题的输出层
  1. 二分类问题
    • 输出神经元个数:1 个神经元,表示该样本属于某一类的概率。
    • 激活函数:常用 Sigmoid 激活函数,将输出映射到 [0, 1] 范围内,表示该样本属于目标类别的概率。

    Sigmoid 函数公式: [ f(x) = \frac{1}{1 + e^{-x}} ]

    • 输出值:输出一个在 0 和 1 之间的数值,表示预测为正类的概率。大于 0.5 通常表示正类,小于 0.5 表示负类。
  2. 多分类问题
    • 输出神经元个数:与类别数量相同的神经元(例如,10 个类别的任务有 10 个神经元)。
    • 激活函数:常用 Softmax 激活函数,将每个类别的输出值转化为概率分布,所有类别的概率总和为 1。

    Softmax 函数公式: [ f(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} ]

    • 输出值:每个神经元的输出表示该样本属于该类别的概率,最大概率对应的神经元通常被选为预测的类别。
(2)回归问题的输出层
  1. 输出神经元个数:取决于目标变量的数量(例如,预测一个连续值时,输出层有 1 个神经元;预测多个连续值时,输出层有多个神经元)。
  2. 激活函数:通常不使用激活函数,或者使用 线性激活函数。输出直接作为预测的连续值。

    线性激活函数公式: [ f(x) = x ]

    • 输出值:输出一个或多个连续值,这些值是回归任务的预测结果。

3. 输出层的示例

示例 1:二分类任务的输出层
  • 输入来自前一层的输出向量 ([z]) 。
  • 输出层有 1 个神经元,激活函数为 Sigmoid
  • 输出为: [ y = \frac{1}{1 + e^{-z}} ] 如果 (y > 0.5),则样本被分类为正类;否则被分类为负类。
示例 2:多分类任务的输出层
  • 输入来自前一层的输出向量 ([z_1, z_2, z_3]),假设有 3 个类别。
  • 输出层有 3 个神经元,激活函数为 Softmax
  • 输出为: [ y_1 = \frac{e^{z_1}}{e^{z_1} + e^{z_2} + e^{z_3}} ] [ y_2 = \frac{e^{z_2}}{e^{z_1} + e^{z_2} + e^{z_3}} ] [ y_3 = \frac{e^{z_3}}{e^{z_1} + e^{z_2} + e^{z_3}} ] 输出 ( y_1, y_2, y_3 ) 表示样本属于 3 个类别的概率。
示例 3:回归任务的输出层
  • 输入来自前一层的输出向量 ([z])。
  • 输出层有 1 个神经元,激活函数为线性(即无激活函数)。
  • 输出为: [ y = z ] 该值 (y) 就是预测的连续值。

4. 输出层的常见激活函数

  1. Sigmoid 激活函数
    • 适用于二分类任务。
    • 将输出值映射到 [0, 1] 区间。
  2. Softmax 激活函数
    • 适用于多分类任务。
    • 将输出值转换为概率分布,概率之和为 1。
  3. 线性激活函数
    • 适用于回归任务。
    • 输出值不受限制,可以是任意的实数。

5. 输出层的常见应用

  1. 图像分类:在图像分类任务中,CNN 的输出层通常使用 Softmax 来生成对每个类别的概率预测。
  2. 情感分析:在自然语言处理任务(如情感分析)中,输出层可能会使用 Sigmoid 来判断情感是正面还是负面。
  3. 房价预测:在回归任务中,输出层生成预测的连续值,如房价预测任务的输出为房价的具体数值。

6. 损失函数与输出层的关系

不同的输出层对应不同的损失函数:

  • 二分类问题:输出层通常使用 Sigmoid 激活函数,损失函数为 二元交叉熵损失(Binary Cross-Entropy Loss)
  • 多分类问题:输出层通常使用 Softmax 激活函数,损失函数为 多元交叉熵损失(Categorical Cross-Entropy Loss)
  • 回归问题:输出层通常使用线性激活函数,损失函数为 均方误差(Mean Squared Error, MSE)

7. 总结

  • 分类问题的输出层:通常使用 Sigmoid(用于二分类)或 Softmax(用于多分类)激活函数,将网络的输出映射为类别的概率。
  • 回归问题的输出层:通常不使用激活函数或使用线性激活函数,输出连续的数值。
  • 激活函数和损失函数的选择:输出层的激活函数和任务的损失函数密切相关。Sigmoid 常用于二分类问题,Softmax 常用于多分类问题,而线性函数用于回归任务。

2. 卷积神经网络的工作原理

  1. 输入层:输入层通常是原始数据,例如一张RGB图像会有三个通道(红色、绿色、蓝色)组成,每个通道都是二维像素矩阵。

  2. 卷积操作:第一个卷积层会从输入图像的局部区域提取特征,如边缘、角点等。随着层数的加深,卷积核能够提取出越来越复杂的特征,如纹理、形状、物体的轮廓等。

  3. 特征提取:通过多层的卷积和池化操作,CNN能够逐步提取出不同层次的特征,并减小特征图的尺寸。

  4. 分类:经过卷积和池化层之后,图像的空间结构信息被压缩为一维的特征向量,这时通过全连接层进行处理,最终通过Softmax等分类器完成分类任务。

3. 卷积神经网络的优势

  • 空间局部性:卷积核在图像上滑动时,卷积层能够捕捉局部的空间特征,因此CNN在处理图像等二维数据时表现出色。
  • 参数共享:同一个卷积核在不同位置重复使用,减少了模型中的参数量,避免了过拟合并提升了计算效率。
  • 平移不变性:卷积操作对图像的平移具有鲁棒性,即即使目标在图像中的位置发生变化,CNN也能够识别出目标。

4. CNN的训练过程

  1. 前向传播(Forward Propagation):输入数据通过卷积层、激活函数、池化层等逐层传播,最终输出预测结果。

  2. 损失函数(Loss Function):损失函数用于计算预测结果与真实标签之间的误差,常用的分类损失函数是交叉熵(Cross-Entropy)。

  3. 反向传播(Backpropagation):通过梯度下降法(如SGD、Adam等),计算损失相对于网络中各层参数的梯度,并更新参数以最小化损失。

  4. 迭代更新:通过多次迭代和更新网络参数,模型不断优化,直到损失函数收敛或达到预设的精度。

5. 常见的CNN架构

  • LeNet:最早的CNN模型之一,专门用于手写数字识别。
  • AlexNet:首次在ImageNet竞赛中取得显著成绩,推动了深度学习的发展。
  • VGGNet:通过增加网络的深度(如VGG16、VGG19),提高了图像分类的准确性。
  • ResNet:提出了残差网络(Residual Network)的概念,通过引入跳跃连接解决了深层网络的梯度消失问题。

6. CNN的应用领域

  • 图像分类:如人脸识别、物体检测等。
  • 目标检测:如自动驾驶中的车辆识别。
  • 图像分割:如医学图像中的器官分割。
  • 自然语言处理:CNN也被用于文本分类等任务。

7. CNN的挑战与改进

  • 计算量大:随着网络的加深,计算量也随之增加,需要更高性能的硬件支持。
  • 对旋转和缩放敏感:标准的CNN对旋转、缩放的图像不敏感,需要数据增强或其他技术来改进。

综上,卷积神经网络是目前图像处理和计算机视觉领域的核心技术,凭借其优越的特征提取能力和高效的计算性能,已被广泛应用于各种任务中。未来的研究方向包括更轻量化的网络结构和更智能的特征提取方法。