返回介绍

数学基础

统计学习

深度学习

工具

Scala

一、卷积运算

发布于 2023-07-17 23:38:25 字数 15221 浏览 0 评论 0 收藏 0

1.1 数学卷积

1.1.1 卷积定义

  1. 示例:一个激光传感器输出 $ MathJax-Element-43 $ , 表示宇宙飞船在时刻 $ MathJax-Element-252 $ 的位置的观测结果。假设传感器包含噪声,则 $ MathJax-Element-43 $ 与飞船在时刻 $ MathJax-Element-252 $ 的真实位置有偏离。

    可以利用观测结果的均值来估计飞船的位置。假设越近的观测结果越相关,于是对最近的观测结果赋予更高的权重。

    令 $ MathJax-Element-45 $ 为权重函数,其中 $ MathJax-Element-46 $ 表示观测结果距离当前时刻的间隔,则得到时刻 $ MathJax-Element-252 $ 飞船真实位置的估计:

    $ s(t)=\int x(a)w(t-a)da $

    这种运算就称作卷积convolution,用符号星号 $ MathJax-Element-48 $ 表示。

    理论上 $ MathJax-Element-58 $ 可以为任意的实值函数,但是在这个示例中要求:

    • $ MathJax-Element-58 $ 是个有效的概率密度函数,否则 $ MathJax-Element-51 $ 就不是一个加权平均。
    • $ MathJax-Element-58 $ 在自变量为负数时,取值为零。否则涉及到未来函数,因为激光传感器只能输出 $ MathJax-Element-252 $ 时刻之前的观测结果。
  2. 通常当计算机处理数据时,连续的数据会被离散化,因此时间 $ MathJax-Element-252 $ 只能取离散值。

    假设 $ MathJax-Element-55 $ 都是定义在整数时刻 $ MathJax-Element-252 $ 上,则得到离散形式的卷积:

    $ s(t)=(x*w)(t)=\sum_{a=-\infty}^{a=\infty}x(a)w(t-a) $

    实际操作中,因为只能存储有限的数据,所以这些函数的值在有限的点之外均为零。因此无限级数的求和最终是有限级数的求和。

  3. 在卷积神经网络中,函数 $ MathJax-Element-57 $ 称作输入,函数 $ MathJax-Element-58 $ 称作核函数,输出有时被称作特征图 feature map

  4. 可以对多个维度进行卷积运算。

    如果二维图像 $ MathJax-Element-64 $ 作为输入,则需要使用二维核函数 $ MathJax-Element-368 $ ,卷积运算的输出为:

    $ \mathbf S(i,j)=(\mathbf I*\mathbf K)(i,j)=\sum_m\sum_n\mathbf I(m,n)\mathbf K(i-m,j-n) $

    其中 $ MathJax-Element-61 $ 表示二维图像 $ MathJax-Element-64 $ 的像素点的坐标, $ MathJax-Element-63 $ 表示该坐标处的像素值。

    • 通常 $ MathJax-Element-64 $ 的尺寸较大,如 $ MathJax-Element-65 $ ;而 $ MathJax-Element-368 $ 的尺寸较小,如 $ MathJax-Element-67 $

    • 因为卷积是可交换的,所以可以等价写作:

      $ \mathbf S(i,j)=(\mathbf I*\mathbf K)(i,j)=\sum_m\sum_n\mathbf I(i-m,j-n)\mathbf K(m,n) $

      这称作翻转flip了核。

      卷积的可交换性在数学证明中有用,但是在神经网络中很少使用。

1.1.2 数学卷积与矩阵乘法

  1. 离散卷积可以视作输入矩阵与一个特殊的核矩阵的乘法。

    • 对于一维的离散卷积,核矩阵的每一行必须和上一行移动一个元素后相等。

      这种类型的矩阵叫做Toeplitz矩阵。

    • 对于二维的离散卷积,核矩阵对应着一个双重块循环矩阵。

      该矩阵大部分元素相等,且非常稀疏(几乎所有元素都为零)。

  2. 卷积运算可以转换成矩阵乘法,所以不需要对神经网络库的实现作出大的修改。

1.1.2.1 一维卷积和矩阵乘法

  1. 循环矩阵的定义:

    $ \mathbf C=\begin{bmatrix}c_0&c_{n-1}&\cdots&c_2&c_1\\c_1&c_0&\cdots&c_3&c_2\\ \vdots&\vdots&\ddots&\vdots&\vdots\\ c_{n-1}&c_{n-2}&\cdots&c_1&c_0\end{bmatrix} $

    可以利用循环矩阵求一维卷积。

  2. 假设有两个长度分别为 $ MathJax-Element-88 $ 和 $ MathJax-Element-297 $ 的序列 $ MathJax-Element-70 $ 和 $ MathJax-Element-71 $ , 则一维卷积为:

    $ s(i)=x(i)*w(i)=\sum_{j}x(j)w(i-j) $

    卷积的长度为 $ MathJax-Element-72 $ 。

    • 首先用 0 扩充序列 $ MathJax-Element-73 $ :
    $ x_p(i)=\begin{cases}x(i)&,0\le i\le M-1\\ 0&, M-1\lt i\le L-1\end{cases} $ $ w_p(i)=\begin{cases}w(i)&,0\le i\le N-1\\ 0&, N-1\lt i\le L-1\end{cases} $
    • 由于用 $ MathJax-Element-76 $ 取卷积 $ MathJax-Element-75 $ ,因此构造 $ MathJax-Element-76 $ 的循环矩阵:

      $ \mathbf W=\begin{bmatrix}w_p(0)&w_p(L-1)&w_p(L-2)&\cdots&w_p(1)\\ w_p(1)&w_p(0)&w_p(L-1)&\cdots&w_p(2)\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ w_p(L-1)&w_p(L-2)&w_p(L-3)&\cdots&w_p(0) \end{bmatrix} $

      这里列优先,因此第一列是完全顺序的。

    • 一维卷积为:

      $ \mathbf{\vec s}=\mathbf W\cdot x_p= \begin{bmatrix}w_p(0)&w_p(L-1)&w_p(L-2)&\cdots&w_p(1)\\ w_p(1)&w_p(0)&w_p(L-1)&\cdots&w_p(2)\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ w_p(L-1)&w_p(L-2)&w_p(L-3)&\cdots&w_p(0) \end{bmatrix}\cdot \begin{bmatrix}x_p(0)\\ x_p(1)\\ \vdots\\ x_p(L-1)\end{bmatrix} $

      其中 $ MathJax-Element-77 $ 。

1.1.2.2 二维卷积和矩阵乘法

  1. 二维卷积:

    $ \mathbf S(i,j)=(\mathbf I*\mathbf K)(i,j)=\sum_m\sum_n\mathbf I(m,n)\mathbf K(i-m,j-n) $

    假设 $ MathJax-Element-78 $ :

    $ \mathbf I=\begin{bmatrix}I_{1,1}&I_{1,2}&\cdots&I_{1,N_I}\\ I_{2,1}&I_{2,2}&\cdots&I_{2,N_I}\\ \vdots&\vdots&\ddots&\vdots\\ I_{M_I,1}&I_{M_I,2}&\cdots&I_{M_I,N_I} \end{bmatrix},\quad \mathbf K=\begin{bmatrix}K_{1,1}&K_{1,2}&\cdots&K_{1,N_K}\\ K_{2,1}&K_{2,2}&\cdots&K_{2,N_K}\\ \vdots&\vdots&\ddots&\vdots\\ K_{M_K,1}&K_{M_K,2}&\cdots&K_{M_K,N_K} \end{bmatrix} $
    • 先将 $ MathJax-Element-79 $ 扩充到 $ MathJax-Element-80 $ 维: $ MathJax-Element-81 $ 。扩充之后的新矩阵为 $ MathJax-Element-82 $ 。其中:

      $ \mathbf I_p=\begin{bmatrix}I_{1,1}&I_{1,2}&\cdots&I_{1,N_I}&0&\cdots&0\\ I_{2,1}&I_{2,2}&\cdots&I_{2,N_I}&0&\cdots&0\\ \vdots&\vdots&\ddots&\vdots&0&\cdots&0\\ I_{M_I,1}&I_{M_I,2}&\cdots&I_{M_I,N_I}&0&\cdots&0\\ 0&0&\cdots&0&0&\cdots&0\\ \vdots&\vdots&\ddots&\vdots&\vdots&\ddots&\vdots\\ 0&0&\cdots&0&0&\cdots&0\\ \end{bmatrix}\\ \mathbf K_p=\begin{bmatrix}K_{1,1}&K_{1,2}&\cdots&K_{1,N_K}&0&\cdots&0\\ K_{2,1}&K_{2,2}&\cdots&K_{2,N_K}&0&\cdots&0\\ \vdots&\vdots&\ddots&\vdots&0&\cdots&0\\ K_{M_K,1}&K_{M_K,2}&\cdots&K_{M_K,N_K}&0&\cdots&0\\ 0&0&\cdots&0&0&\cdots&0\\ \vdots&\vdots&\ddots&\vdots&\vdots&\ddots&\vdots\\ 0&0&\cdots&0&0&\cdots&0\\ \end{bmatrix} $
    • 用 $ MathJax-Element-85 $ 构造一个列向量 $ MathJax-Element-95 $ :将 $ MathJax-Element-85 $ 的第一行转置之后将其成为 $ MathJax-Element-95 $ 的前 $ MathJax-Element-297 $ 个元素;接下来是第二行的转置....第 $ MathJax-Element-88 $ 行的转置。

      $ f_p=(I_{1,1},I_{1,2},\cdots,I_{1,N_I},0,\cdots,I_{M_I,1},I_{M_I,2},\cdots,I_{M_I,N_I},0,\cdots)^T $
    • 将 $ MathJax-Element-89 $ 中的每一行,都按照一维卷积中介绍的循环矩阵生成的方法构成一个 $ MathJax-Element-90 $ 的循环矩阵。这些矩阵记做: $ MathJax-Element-91 $ 。

      $ \mathbf G_m= \begin{bmatrix} K_{m,1}&0&\cdots&K_{m,2}\\ K_{m,2}&K_{m,1}&\cdots&K_{m,3}\\ \vdots&\vdots&\ddots&\vdots\\ K_{m,N_K}&K_{m,N_K-1}&\cdots&0\\ 0&K_{m,N_K}&\cdots&0\\ \vdots&\vdots&\ddots&\vdots\\ 0&0&\cdots&K_{m,1} \end{bmatrix},\quad m=1,2,\cdots,M $
    • 用这些循环矩阵构造一个大的块循环矩阵:

      $ \mathbf G_b=\begin{bmatrix}[\mathbf G_1]&[\mathbf G_M]&\cdots& [\mathbf G_2] \\ [\mathbf G_2]&[\mathbf G_1]&\cdots &[\mathbf G_3]\\ \vdots&\vdots&\ddots&\vdots\\ [\mathbf G_M]&[\mathbf G_{M-1}]&\cdots&[\mathbf G_1]\end{bmatrix} $
    • 计算: $ MathJax-Element-92 $ 。将 $ MathJax-Element-93 $ 的结果分配到 $ MathJax-Element-342 $ 的各行(与构造 $ MathJax-Element-95 $ 相反的过程),即得到二维卷积。

1.2 神经网络卷积

1.2.1 卷积定义

  1. 许多神经网络库会实现一个与卷积有关的函数,称作互相关函数cross-correlation。它类似于卷积:

    $ \mathbf S(i,j)=(\mathbf I*\mathbf K)(i,j)=\sum_m\sum_n\mathbf I(i+m,j+n)\mathbf K(m,n) $

    有些机器学习库将它称作卷积。事实上在神经网络中,卷积指的就是这个函数(而不是数学意义上的卷积函数)。

  2. 神经网络的2维卷积的示例:

    这里采用的是神经网络中卷积的定义: $ MathJax-Element-96 $ 。其中, $ MathJax-Element-117 $ 和 $ MathJax-Element-266 $ 由核函数决定。因为 $ MathJax-Element-99 $ ,所以他们的取值范围是 $ MathJax-Element-100 $ 。

  3. 单个卷积核只能提取一种类型的特征。

    如果希望卷积层能够提取多个特征,则可以并行使用多个卷积核,每个卷积核提取一种特征。我们称输出的feature map 具有多个通道channel

    feature map 特征图是卷积层的输出的别名,它由多个通道组成,每个通道代表通过卷积提取的某种特征。

    事实上,当输入为图片或者feature map 时,池化层、非线性激活层、Batch Normalization 等层的输出也可以称作feature map 。卷积神经网络中,非全连接层、输出层以外的几乎所有层的输出都可以称作feature map

  4. 神经网络中,卷积运算的作用就类似于滤波,因此也称卷积核为filter 滤波器。

    • 滤波器可以从原始的像素特征中抽取某些特征,如:边缘、角度、形状等。

      如:sobel 算子:

      $ \mathbf K_x = \begin{bmatrix} -1&0&+1\\ -2&0&+2\\ -1&0&+1 \end{bmatrix}\quad \mathbf K_y = \begin{bmatrix} +1&+2&+1\\ 0&0&0\\ -1&-2&-1 \end{bmatrix} $

      其中 $ MathJax-Element-103 $ 表示检测垂直边缘的滤波器,它沿着水平方向做卷积; $ MathJax-Element-104 $ 表示检测水平边缘的滤波器,它沿着垂直的方向做卷积。

      下图所示为一张原始的灰度图:

      经过 $ MathJax-Element-103 $ 卷积之后:

      经过 $ MathJax-Element-104 $ 卷积之后:

    • 实际上,在卷积神经网络中我们并不会手工设计卷积核,而是通过学习算法自动学得卷积核中每个位置的值。

1.2.2 输入填充

  1. 在卷积神经网络中,可以隐式地对输入填充零,使其得到加宽。

    如果未填充零,则网络每一层的宽度会逐层递减。根据卷积的性质,网络每一层宽度减少的数量等于卷积核的宽度减1。

    • 如果卷积核尺寸较大,则网络的宽度迅速缩减,这限制了卷积神经网络的网络深度。
    • 如果卷积核尺寸较小,则可用的卷积核的数量大幅度降低,这限制了卷积神经网络的表达能力。
  2. 对输入 $ MathJax-Element-359 $ 有三种填充零的方式:valid 填充、same 填充、full 填充。

  3. valid 填充:不使用零来填充输入,卷积核只允许访问那些图像中能完全包含整个核的位置。

    valid 填充模式中,输出的大小在每一层都缩减。假设核的宽度是 $ MathJax-Element-269 $ ,则每经过一层,输出的宽度减少了 $ MathJax-Element-265 $ 。

    如果输入图像的宽度是 $ MathJax-Element-117 $ ,则网络经过了 $ MathJax-Element-374 $ 层之后,输出的宽度变成 $ MathJax-Element-110 $ 。如果核的宽度 $ MathJax-Element-269 $ 非常大时,缩减非常明显。最终网络会缩减到 1 。

  4. same 填充:使用足够的零来填充,使得输出和输入保持相同的大小。这是最常见的填充方式。

    • same填充模式中,网络可以包含任意多的卷积层,因为它不存在网络输出宽度缩减的问题。

    • same 填充模式的一个问题是:输入的边缘单元可能存在一定程度上的欠表达。

      因为输入的中间区域的单元的影响域为全部的输出单元,这意味着这些输入单元的信息会被很多输出单元所编码。而输入的边缘区域的单元的影响域只是输出单元的一部分,这意味着这些输入单元的信息仅仅被少量输出单元所编码。

  5. full 填充:在输入的两端各填充 $ MathJax-Element-265 $ 个零,使得每个输入单元都恰好被卷积核访问 $ MathJax-Element-269 $ 次。其中 $ MathJax-Element-269 $ 为卷积核的宽度。

    • 它将从卷积核和输入开始相交的时候开始做卷积。

    • 假设核的宽度是 $ MathJax-Element-269 $ ,则每经过一层,输出的宽度增加了 $ MathJax-Element-265 $ 。

      如果输入图像的宽度是 $ MathJax-Element-117 $ ,则网络经过了 $ MathJax-Element-374 $ 层之后,输出的宽度变成 $ MathJax-Element-119 $ 。

    • 它使得输入的边缘单元也能够得到充分表达。

    • full 填充的一个问题是:输出的边界单元依赖于更少的输入单元。

      这使得学习到的结果在输出的中间部分表现较好,边缘部分的表现较差。

1.2.3 三维卷积

  1. 卷积神经网络的输入图片可以是二维(黑白图片),也可以是三维的(彩色图片)。

    对于三维彩色图片,一个维度来表示不同的颜色通道(如红绿蓝),另外两个维度表示在每个通道上的空间坐标。

  2. 对于三维卷积:

    • 假设输入为张量 $ MathJax-Element-359 $ ,每个元素是 $ MathJax-Element-121 $ 。其中: $ MathJax-Element-345 $ 表示输入单元位于 $ MathJax-Element-345 $ 通道, $ MathJax-Element-247 $ 表示通道中的坐标。

    • 假设输出为张量 $ MathJax-Element-153 $ ,每个元素为 $ MathJax-Element-126 $ 。其中: $ MathJax-Element-345 $ 表示输出单元位于 $ MathJax-Element-345 $ 通道, $ MathJax-Element-247 $ 表示通道中的坐标。

      注意:输出的通道数量通常与输入的通道数量不等。

      输出有多个通道的原因是:使用了多个卷积核,每个卷积核会输出一个通道。

    • 假设核张量为4维的张量 $ MathJax-Element-368 $ ,每个元素是 $ MathJax-Element-131 $ 。其中: $ MathJax-Element-345 $ 表示输出单元位于 $ MathJax-Element-345 $ 通道, $ MathJax-Element-248 $ 表示输入单元位于 $ MathJax-Element-248 $ 通道, $ MathJax-Element-247 $ 表示通道中的坐标。

      则三维卷积可以表示为:

      $ Z_{i,j,k}=\sum_l\sum_{m}\sum_{n}V_{l,j+m,k+n}K_{i,l,m,n} $

      其中:

      • $ MathJax-Element-137 $ 遍历了图像平面上的所有坐标。
      • $ MathJax-Element-138 $ 遍历了输入的所有通道。
      • $ MathJax-Element-139 $ 是单个三维卷积的核,多个并行的核的卷积结果组成了输出的多个通道。
  3. 上述表述中,张量 $ MathJax-Element-359 $ 、 $ MathJax-Element-153 $ 的通道索引位于坐标索引之前,这称作通道优先channel-first

    还有另一种模式:通道索引位于坐标索引之后,这称作channel-last

    如:tensorflow 框架采用channel-last 的模式,theano 框架采用channel-first 的模式。这里默认采用channel-last 的方式来描述。

1.2.4 降采样

  1. 如果对卷积层的输出进行降采样,则表示跳过图片中的一些位置。

    • 优点:可以降低计算开销。因为它降低了卷积层的输出单元数量,也就降低了高层网络的输入单元数量。
    • 缺点:提取的特征可能没有那么好,因为跳过的位置可能包含一些关键信息。
  2. 假设希望对输出的每个方向上,每隔 $ MathJax-Element-148 $ 个像素进行采样,则:

    $ Z_{i,j,k}=\sum_l\sum_{m}\sum_{n}V_{l,j\times s+m,k\times s+n}K_{i,l,m,n} $

    这里 $ MathJax-Element-148 $ 称作降采样卷积的步幅。

  3. 可以对不同的方向定义不同的步幅。

    假设 $ MathJax-Element-233 $ 方向的步幅为 $ MathJax-Element-145 $ , $ MathJax-Element-269 $ 方向的步幅为 $ MathJax-Element-147 $ , 则有:

    $ Z_{i,j,k}=\sum_l\sum_{m}\sum_{n}V_{l,j\times s_1+m,k\times s_2+n}K_{i,l,m,n} $
  4. 降采样卷积有两种实现形式:

    • 通过直接实现步幅为 s 的卷积。
    • 先进行完整的卷积,再降采样。这种做法会造成计算上的大量浪费,不建议采用。

1.2.5 梯度计算

  1. 实现卷积神经网络时,为了能够学习模型,必须能够计算核的梯度。

    在某些简单情况下,核的梯度可以通过卷积来实现;大多数情况下(如:步幅大于1时),核的梯度无法通过卷积来实现。

  2. 卷积是一种线性运算,所以可以表示成矩阵乘法形式,涉及的矩阵是卷积核的函数。

    该矩阵有两个特性:该矩阵是稀疏的;卷积核的每个元素都复制到该矩阵的很多个位置。

  3. 假设要训练一个卷积神经网络,它包含步幅为 $ MathJax-Element-148 $ 的步幅卷积,卷积核为 $ MathJax-Element-368 $ ,作用于多通道的图像 $ MathJax-Element-359 $ 。则卷积输出为:

    $ Z_{i,j,k}=\sum_l\sum_{m}\sum_{n}V_{l,j\times s+m,k\times s+n}K_{i,l,m,n} $

    假设需要最小化某个损失函数 $ MathJax-Element-151 $ ,则:

    • 前向传播过程:计算 $ MathJax-Element-153 $ ,然后将 $ MathJax-Element-153 $ 传递到网络的其余部分来计算 $ MathJax-Element-154 $ 。

    • 反向传播过程:假设得到一个张量 $ MathJax-Element-155 $ : $ MathJax-Element-156 $ 。为了训练网络,需要对过滤器的权重求导。

      令 $ MathJax-Element-157 $ ,则有:

      $ g(\mathbf G,\mathbf V,s)_{i,l,m,n}=\frac{\partial J}{\partial K_{i,l,m,n}} =\sum_{i^\prime}\sum_{j}\sum_{k}\frac{\partial J}{\partial Z_{i^\prime,j,k}}\frac{\partial Z_{i^\prime,j,k}}{\partial K_{i,l,m,n}} $

      根据 $ MathJax-Element-158 $ 的定义,有:

      $ \frac{\partial Z_{i^\prime,j,k}}{\partial K_{i,l,m,n}}=\begin{cases} V_{l,j\times s+m,k\times s+n} ,& i^\prime=i\\ 0,& i^\prime\ne i \end{cases} $

      则有:

      $ g(\mathbf G,\mathbf V,s)_{i,l,m,n}=\frac{\partial J}{\partial K_{i,l,m,n}}=\sum_j\sum_kG_{i,j,k}V_{l,j\times s+m,k\times s+n} $
    • 如果该层不是网络的输入层,则需要对 $ MathJax-Element-359 $ 求梯度来使得误差进一步反向传播。

      令 $ MathJax-Element-160 $ , 则有:

      $ h(\mathbf K,\mathbf G,s)_{l,j,k}=\frac{\partial J}{\partial V_{l,j,k}}=\sum_i\sum_{j^\prime}\sum_{k^\prime}\frac{\partial J}{\partial Z_{i,j^\prime,k^\prime}} \frac{\partial Z_{i,j^\prime,k^\prime}}{\partial V_{l,j,k}} $

      根据 $ MathJax-Element-161 $ 的定义,有:

      $ \frac{\partial Z_{i,j^\prime,k^\prime}}{\partial V_{l,j,k}}= \sum_{\substack{m^\prime\\s.t. \; j^\prime\times s+m^\prime=j}}\sum_{\substack{n^\prime\\s.t.\; k^\prime\times s+n^\prime =k}} K_{i,l,m^\prime,n^\prime} $

      则有:

      $ h(\mathbf K,\mathbf G,s)_{l,j,k}=\frac{\partial J}{\partial V_{l,j,k}} =\sum_i\sum_{j^\prime}\sum_{k^\prime}G_{i,j^\prime,k^\prime}\sum_{\substack{m^\prime\\s.t. \; j^\prime\times s+m^\prime=j}}\sum_{\substack{n^\prime\\s.t.\; k^\prime\times s+n^\prime =k}} K_{i,l,m^\prime,n^\prime} $

      .

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文