一、初识卷积

卷积之所以叫“卷”积,可以参见知乎上的回答。个人认为,卷积的通俗理解就是“长江后浪推前浪,前浪死在沙滩上”。“后浪”推“前浪”的本质就是“后浪”和“前浪”叠加,然而随着时间推移,“前浪”并不会因为“后浪们”的叠加的“推”而越来越大,因为“浪”的势头会随着时间推移慢慢消解,最终导致“前浪死在沙滩上”而不是造成大“江”啸。卷积函数就是所有位置的“浪”的高低。

关于卷积,我主要参考了几篇相关文章:

“卷积为什么如此强大?理解深度学习中的卷积”

“如何通俗易懂地解释卷积?”

“别怕,"卷积"其实很简单”

二、卷积的基本定义及应用

卷积的定义:

设函数f(\cdot)g(\cdot )是定义在\mathbb{R}上的两个可积函数,那么如下反常积分成为fg的卷积,记做h(x)=(f*g)(x)

h(x) = \int_{-\infty}^{+\infty} f(\tau) g(x-\tau) d\tau

其离散形式为:

h(x) = \sum_{\tau=-\infty}^{+\infty} f(\tau) g(x-\tau)

在信号学里,卷积的物理意义可以解释为在x时间点接收到的信息总量,其中函数f(\tau)是信号发射函数,和g(x-\tau )是信号随时间衰减的函数,而变量\tau则是发射信号的时间点。如果信号是连续发射的,则适用连续形式,如果信号是间断的(脉冲信号),则适用离散形式。

在统计学里,卷积可以表现为关于时间x移动加权平均函数,其中函数f(\tau)是时间点\tau上的统计对象的值,和g(x-\tau )是统计对象历史值的权重。

一维卷积可以拓展为二维卷积:

设函数f(\cdot)g(\cdot )是定义在\mathbb{R}^2上的两个可积函数,那么fg的卷积如下所示:

h(x_1, x_2) = \int_{-\infty}^{+\infty} \int_{-\infty}^{+\infty} f(\tau_1, \tau_2) g(x_1-\tau_1, x_2-\tau_2) d\tau_1 d\tau_2

其离散形式为:

h(x_1, x_2) = \sum_{\tau_1=-\infty}^{+\infty} \sum_{\tau_2=-\infty}^{+\infty} f(\tau_1, \tau_2) g(x_1-\tau_1, x_2-\tau_2)

二维卷积经常应用在图像处理中,其中函数f(i,j)g(i,j)分别是用来读取两个矩阵(目前设为\textbf{\emph F}\textbf{\emph G})中ij列的值,f(i,j)|_{i \in [-\infty , + \infty], j \in [-\infty , + \infty]}其实就是矩阵\textbf{\emph F}中的所有点。那么二维卷积的离散形式可以理解为分别吧矩阵\textbf{\emph F}中的所有点和矩阵\textbf{\emph G}中对应的点相乘(这是元素级的运算)并求和(矩阵所有元素求和)。这种操作可以用来对图像中的每一个点进行相关处理(就是二维的加权移动平均)。

举个具体例子,假设有图像(矩阵)\textbf{\emph G}_{6 \times 6},平滑算子矩阵\textbf{\emph F}_{3 \times 3},其中:

\textbf{\emph G}_{6 \times 6}= \begin{bmatrix} 0, &1, &2, &3, &4, &5 \\ 0, &1, &2, &3, &4, &5 \\ 0, &1, &2, &3, &4, &5 \\ 0, &1, &2, &3, &4, &5 \\ 0, &1, &2, &3, &4, &5 \\ 0, &1, &2, &3, &4, &5 \\ \end{bmatrix}

\textbf{\emph F}_{3 \times 3} = \begin{bmatrix} \frac{1}{9} , &\frac{1}{9}, &\frac{1}{9}\\ \frac{1}{9} , &\frac{1}{9}, &\frac{1}{9}\\ \frac{1}{9} , &\frac{1}{9}, &\frac{1}{9}\\ \end{bmatrix}

设函数g(i_g,j_g)为读取矩阵\textbf{\emph G}ij列的值,比如g(3,4)=3f(i_f,j_f)为读取矩阵\textbf{\emph G}2+i_f2+j_f列的值,比如f(-1,-1)=\textbf{\emph G}_{11}(这里这么设置一个平移量是为了方便在卷积公式中计算)。

那么卷积h(3,4)可以表示为:

\begin{align*} h(3,4) = &\textbf{\emph F}_{11} \textbf{\emph G}_{45} + \textbf{\emph F}_{12} \textbf{\emph G}_{44} + \textbf{\emph F}_{13} \textbf{\emph G}_{43} +\\ & \textbf{\emph F}_{21} \textbf{\emph G}_{35} + \textbf{\emph F}_{22} \textbf{\emph G}_{34} + \textbf{\emph F}_{23} \textbf{\emph G}_{33} +\\ & \textbf{\emph F}_{31} \textbf{\emph G}_{25} + \textbf{\emph F}_{32} \textbf{\emph G}_{24} + \textbf{\emph F}_{33} \textbf{\emph G}_{23} \\ = &3 \end{align*}

就是像素点\textbf{\emph G}_{34}及它周围一圈像素点的算术平均数。这里特别注意,在用矩阵\textbf{\emph F}_{3 \times 3}平滑像素点\textbf{\emph G}_{34}时,从原矩阵\textbf{\emph G}中抽取与矩阵\textbf{\emph F}相同形状的子矩阵(红色区域)\textbf{\emph G}'

\begin{bmatrix} 0, &1, &2, &3, &4, &5 \\ 0, &1, &{\color{Red} \textbf{2}}, &{\color{Red} \textbf{3}}, &{\color{Red} \textbf{4}}, &5 \\ 0, &1, &{\color{Red} \textbf{2}}, &{\color{Red} \textbf{3}}, &{\color{Red} \textbf{4}}, &5 \\ 0, &1, &{\color{Red} \textbf{2}}, &{\color{Red} \textbf{3}}, &{\color{Red} \textbf{4}}, &5 \\ 0, &1, &2, &3, &4, &5 \\ 0, &1, &2, &3, &4, &5 \\ \end{bmatrix}

然后通过对矩阵\textbf{\emph F}进行翻转(水平翻转+垂直翻转)得到矩阵\textbf{\emph F}',再和子矩阵\textbf{\emph G}'计算哈达玛积(hadamard product)\textbf{\emph F}' \circ \textbf{\emph G}',然后元素求和。

当使用二维卷积对整个图片进行处理的动态示意图如下(事实上超出原图矩阵\textbf{\emph G}范围的部分可用0补齐):

卷积在机器学习中,一个重要的作用就是处理特征工程,就像上面提到的图像处理(图像本身就是一个特征数据矩阵),卷积可以对数据矩阵进行“移动加权平均处理”,来“抹平”或者“突出”一些特征,其中用来进行“移动加权平均处理”的函数可以称为卷积核(本质就是核函数)。在数据可视化中,核密度图(KDE)本质也是对散点进行卷积计算,通过使用不同的卷积核函数来实现不同的核密度图。

 

三、卷积是如何“卷”的

卷积本身就是“低维度的”,因为各个维度之间被\tau_1+\tau_2=x约束着,只是通过高纬度的被积函数去理解和计算。下面通过一个具体的例子来直观的看一下卷积的降维过程:

首先设两个函数f(\tau_1)=\frac{\sin{\tau_1}+1}{2}g(\tau_2 )=e^{-\tau_2},其中\tau_1+\tau_2=x,其中x是当前时间点,函数f(\tau_1)是一个连续信号函数(这个信号每时每刻都在周期性地改变),\tau_1是信号发射时间点。函数g(\tau_2 )是一个信号衰减函数,\tau_2是距离信号发出时间点的时间间隔。

信号函数f(\tau_1)和衰减函数g(\tau_2 )函数图如下:

卷积h(x)如下所示:

h(x) = \int_{0}^{x} f(\tau_1) g(\tau_2) d\tau_1 \quad |_{\tau_1+\tau_2=x}

其中被积函数就是两个函数值向量的f(\tau_1) g(\tau_2)张量积。之所以积分的上下限分别设置为x0是因为:信号函数f(\tau_1)\tau_1<0时无意义(时间原点之前不发信号),衰减g(\tau_2 )\tau_2<0时也无意义(当前时间之后收到的信号权重为0)。

卷积函数h(x)和被积函数f(\tau_1) g(\tau_2) \quad |_{\tau_1+\tau_2=10}的函数图如下:

其中被积函数是在x=10的条件下得到的一个关于\tau_1的一元函数(\tau_2被约束\tau_1+\tau_2=10所固定),h(10)就等于橙色面积。

将以上4张图合并到一个三维空间中,各函数图颜色保持不变,蓝色曲线是函数f(\tau_1),绿色曲线是函数g(\tau_2 ),红色曲线是卷积函数h(x),橙色曲线是函数f(\tau_1) g(\tau_2) \quad |_{\tau_1+\tau_2=10},网格就是整个完整的被积函数f(\tau_1) g(\tau_2)曲面,橙色面就是经过直线\tau_1+\tau_2=10的垂直面截面,如下所示:

从上图可以看出卷积曲线就是由无数个垂直于直线\tau_1+\tau_2=x \quad , x \in \mathbb{R}的面去和被积函数曲面相交,并计算截面面积后所得到的。也就是说,整个三维空间沿着平面y=-x的轨迹向原点方向压缩成了一个二维空间,整个过程中,除了\tau_1\tau_2外的第三维度不变,维度\tau_1\tau_2压缩成了x,就是上图的灰色直线(注意x轴的刻度和\tau_1\tau_2轴刻度的关系),这就是三维空间中卷积的降维过程。

将上述过程拓展到大于三维的空间:将n维空间中的被积函数沿着超平面\boldsymbol{\tau}_1 - \boldsymbol{\tau}_2 = 0的方向,将无数个垂直经过\boldsymbol{\tau}_1+\boldsymbol{\tau}_2=\textbf{\emph x}\textbf{\emph x} \in \mathbb{R}^{n-2})的n-1维超平面和被积函数相交所得到的“超截面”的“超体积”“卷”成一个n-2维超曲面,之所以用卷而不是压,是因为整个过程连减两维(就像在三维空间中把一张布卷成一根绳子)。

卷积是一种“选择性”的降维,因为它没有用到被积函数f(\tau_1) g(\tau_2)的所有信息,只选择了平面\tau_1+\tau_2=c方向上的信息,整个被积函数沿着这个方向进行压缩。

 

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐