前言
在下面的文字里我将试着从代数学的角度给出CNN一些解析,希望能为读者带来一些启发。
多层感知器
在正式开始讲解之前,我认为有必要先说一说多层感知器,多层感知器(MLP)是一类前馈人工神经网络,MLP至少由三层节点组成:输入层、隐藏层和输出层。除输入节点外,每个节点都是一个神经元,使用非线性激活函数。一种称为反向传播的监督学习技术首先出现于MLP。它的多层结构和非线性激活将MLP与线性感知器区分开来。
激活函数在人工神经网络尤其是多层感知器中是非常重要的,没有它,多层感知器不可能有这么强的表达能力,依据Cover 定理,给定一组不可线性分离的训练数据,我们可以用高概率将其转换成一个线性可分离的训练集,方法是通过激活函数将其投影到高维空间中。一般来说,激活函数越是平滑,逼近效果就越好,可除了要考虑平滑度,还要考虑训练的难易程度,这样折中的方案就是目前比较流行的ReLU、Maxout等函数。
如果把人工神经网络看成是一类函数,那其全体可看成是张量的可积函数空间,其中多层感知器的自变量是一阶张量;卷积神经网络的自变量是二阶张量。神经元是人工神经网络的基本结构,下图是多层感知器的结构:
因为每一层的前向传播实际上是:
oi=σi(ω1x1+⋯+ωnxn)o_{i}=\sigma_{i} \left ( \omega _{1}x_{1}+\cdots +\omega _{n}x_{n}\right )oi=σi(ω1x1+⋯+ωnxn)这样写成矩阵的格式:[o1o2⋮om]=℧([ω11ω12⋯ω1nω21ω22⋯ω2n⋮⋮⋱⋮ωm1ωm2⋯ωmn][x1x2⋮xn])\begin{bmatrix}
o_{1}\\
o_{2}\\
\vdots \\
o_{m}
\end{bmatrix}=\mho \left (\begin{bmatrix}
\omega _{11} & \omega _{12} &\cdots &\omega _{1n} \\
\omega _{21}& \omega _{22} & \cdots & \omega _{2n}\\
\vdots & \vdots & \ddots &\vdots \\
\omega _{m1}& \omega _{m2} & \cdots & \omega _{mn}
\end{bmatrix}\begin{bmatrix}
x_{1}\\
x_{2}\\
\vdots \\
x_{n}
\end{bmatrix} \right )⎣⎢⎢⎢⎡o1o2⋮om⎦⎥⎥⎥⎤=℧⎝⎜⎜⎜⎛⎣⎢⎢⎢⎡ω11ω21⋮ωm1ω12ω22⋮ωm2⋯⋯⋱⋯ω1nω2n⋮ωmn⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤⎠⎟⎟⎟⎞其中℧(x1,⋯ ,xn)=(σ(x1),⋯ ,σ(xn))\mho \left ( x_{1},\cdots ,x_{n} \right )=\left ( \sigma(x_{1}),\cdots ,\sigma(x_{n})\right )℧(x1,⋯,xn)=(σ(x1),⋯,σ(xn))σ\sigmaσ是激活函数,所以多层感知器的每一层实际上是一阶张量,它出自线性空间里,另外由于训练收敛需要梯度下降,它必须具备微分结构,即支持微分算子,所以需要支持元素之间的乘法运算——因为纤维丛是积流形的推广,微分结构又是基于丛结构的,下面用一个简单的例子简略的说明一下。f′(x)=lim▽x→0(f(x+▽x)−f(x)▽x){f}'(x)=\lim_{\bigtriangledown x\rightarrow 0}\left ( \frac{f(x+\bigtriangledown x)-f(x)}{\bigtriangledown x} \right )f′(x)=▽x→0lim(▽xf(x+▽x)−f(x))看上式可知,神经元如果要支持微分算子,至少首先要支持加法和每个非零元都必须可逆,所以神经元集合至少应该是一个代数。学过交换代数的同学应该知道,交换环可以保证所有的理想组合成一个域,这样就保证了最终神经元都可以收敛到一个极小理想(这里暂假设极小理想的存在),而且乘法交换律可以保证度量函数极易构造,微积分学的绝大部分理论都是基于这个度量函数,这就为技术的拓展创造了极其便利的条件。从工程的角度,这大大增加了网络效能的稳定性和可回溯性,由于构成域,所以支持的算子更加丰富,在其上可任意的设计算法,使其成为一门独立学科分支。
我们经常接触的多层感知器的神经元是实数,构成域,域是更高级的代数结构,其本身就是个代数。
所以作者在设计一个新型的神经网络结构时,首先是构思,其次是验证,验证其结构是不是一个好的结构,也就是说它是不是具备完备的“表达能力”,更具体的说,它的神经元集合是不是构成交换环上的代数。
卷积神经网络
回到卷积神经网络,它主要是用来处理阶数大于一的张量,通常是二阶张量,即图像。做图像处理时我们最常用的工具——加权平均,有一个更加学术的词:互相关(cross-correlation),大部分的图像处理算法其实都是互相关运算,但是互相关运算有一点不那么自洽的成分:它不支持交换律,正如上面所述,这会给深度学习这门“学科”带来很多问题,不夸张的讲,如果没有这个交换环,深度学习也就不可能是一门独立学科的独立分支了。互相关操作(cross-correlation)可抽象成下面的公式:C(i,j)=(I∗K)(i,j)=∑0m∑0nI(i+m,j+n)K(m,n)\mathbb{C}\left ( i,j \right )=\left (I\ast K \right )\left ( i,j \right )=\sum_{0}^{m}\sum_{0}^{n}I\left ( i+m,j+n \right )K(m,n)C(i,j)=(I∗K)(i,j)=0∑m0∑nI(i+m,j+n)K(m,n)互相关运算的一个最大的优点就是易操作
通过kernel在原图上遍历的方式,即完成了互相关操作,绝大部分的图像处理算法都是基于此,比如数学形态学操作、边缘提取、细化、角点、时频变换……,基于丰富的数学内涵,它不但可以准确的表达各种复杂的算法,而且实现简单易于理解,但它却有一个严重的结构上的缺陷,这里的情况和四元数极其相似,即是不支持乘法交换律,就好像函数拟合过程为什么容易过拟合?很大程度上是因为一般来说函数集合构成环,不满足乘法交换律。所以看起来互相关运算这样一个“小小”的缺陷确为理论的推广带来了很大的障碍,所以说四元数的出现仅仅是刚体变换方向的锦上添花,而远远不像复数域那样为整个学科带来了革命性的升华。但较之四元数,CNN在这里显得比较幸运,因为互相关算子的伴随算子是满足交换律的,而且只需一个简单操作(翻转,rot180)即可相互转化,在这里共轭函数即是我们常说的卷积函数,在分析学中,卷积是一个古老的概念,第一个卷积函数是在Dirichlet关于傅里叶序列的原始回忆录里:(φ∗τ)(x)=1π∫−ππφ(α)sin(n+12)(α−x)2sin12(α−x)dα\left ( \varphi \ast \tau \right )(x)=\frac{1}{\pi}\int_{-\pi}^{\pi}\varphi (\alpha )\frac{sin(n+\frac{1}{2})(\alpha -x)}{2sin\frac{1}{2}(\alpha -x)}d\alpha(φ∗τ)(x)=π1∫−ππφ(α)2sin21(α−x)sin(n+21)(α−x)dα 其中,τ(x)=sin(n+12)(x)2sin12(x)\tau\left ( x \right )=\frac{sin(n+\frac{1}{2})\left (x \right )}{2sin\frac{1}{2}\left ( x \right )}τ(x)=2sin21(x)sin(n+21)(x)随后卷积运算作为频域的乘法在傅里叶分析中得到了广泛的应用,继而扩展到其他领域,更一般的,卷积定义了可积函数线性空间的乘积。它满足于如下性质:
交换律f∗g=g∗ff\ast g=g\ast ff∗g=g∗f
结合律f∗(g∗h)=(f∗g)∗hf\ast\left ( g\ast h \right )=\left ( f\ast g \right )\ast hf∗(g∗h)=(f∗g)∗h
分配律f∗(g+h)=(f∗g)+(f∗h)f\ast\left ( g+ h \right )=\left ( f\ast g \right )+ \left ( f\ast h \right )f∗(g+h)=(f∗g)+(f∗h)
与标量乘法的结合律a(f∗g)=(af)∗ga\left ( f\ast g \right )=\left ( af \right )\ast ga(f∗g)=(af)∗g
其单位元是狄拉克函数。这样,二阶张量连同卷积运算和加法运算、数乘运算构成一个交换环代数,也就是说,对二阶张量(图像)做处理时,表面上是在做互相关运算,实际上冥冥之中,在更为广阔的运行法则中它是在做着卷积运算。
这里做的互相关,上图的kernel并不是真的卷积核,真的卷积核是其旋转180度,也可理解为水平和垂直各翻转一次。所以最后的卷积核是下面这个样子:
卷积代数的出现为CNN的稳定的反向传播算法奠定了基础,为人工神经网络向高阶张量推广提供了强大的理论支撑。反向传播算法看似是个简单的梯度下降,但是由于是在流形中定义的(函数空间的浸入流形),所以无论是推导还是收敛过程,都没有那么的简单。
反向传播算法浅谈
无论是多层感知器还是卷积神经网络,反向传播算法都可分解成以下四个步骤:
1.把实例xix_{i}xi输入网络,并计算网络中每个单元uuu的输出ouo_{u}ou
2.对于网络的每个输出单元kkk,计算它的误差项δk\delta _{k}δk,其中σ\sigmaσ是激活函数、tkt_{k}tk是目标输出δk←σ′(ok)(tk−ok)\delta _{k}\leftarrow {\sigma}'\left ( o_{k} \right )\left ( t_{k}-o_{k} \right )δk←σ′(ok)(tk−ok)3.对于网络的每个隐藏层单元(i,h)\left ( i,h \right )(i,h)(第hhh层第iii个元素),计算它的误差项δih\delta _{i}^{h}δihδil−1=σ′(xil−1)∑j=1mδjl∗rot180(ωijl−1)\delta _{i}^{l-1}= {\sigma}'\left ( x_{i}^{l-1} \right )\sum_{j=1}^{m}\delta _{j}^{l}\ast rot_{180}\left (\omega_{ij}^{l-1} \right )δil−1=σ′(xil−1)j=1∑mδjl∗rot180(ωijl−1)4.更新每个网络权值ωijl=ωijl+▽ωijl\omega _{ij}^{l}=\omega _{ij}^{l}+\bigtriangledown \omega _{ij}^{l}ωijl=ωijl+▽ωijl其中▽ωijl=η⋅δjl∗xil\bigtriangledown \omega _{ij}^{l}=\eta \cdot \delta _{j}^{l} \ast x_{i}^{l}▽ωijl=η⋅δjl∗xilωijl\omega _{ij}^{l}ωijl是指第lll层从第iii个元素指向第jjj个元素的卷积核,η\etaη是学习速率,’∗\ast∗'是互相关运算,函数rot180rot_{180}rot180实际上是把反向传播得到的卷积核梯度翻转得到互相关核来进行互相关运算。所以说这里的卷积算子是通过互相关算子起作用的,涉及到的转换就是反转180∘180^{\circ}180∘。
至于池化,对应的是张量代数中的一种缩并运算,缩并算子和卷积算子在某种意义上是协调的,而且其有着明显的物理意义——降维,作用是逐步减小表示的空间大小,逐步减少网络中的参数和计算量,从高维空间平滑映射到低维空间,从而控制过拟合。
人工神经网络fff,前向求值可表示为:y⃗=f(x⃗)\vec{y}=f\left ( \vec{x} \right )y=f(x),其对偶函数可表示为:y⃗=x⃗(f)\vec{y}=\vec{x}\left ( f \right )y=x(f),可以看出,训练的过程相当于通过对y⃗\vec{y}y的梯度下降过程,来间接的控制fff进行梯度收敛。这样神经网络的训练也与变分联系起来了。
参考资料
[1] https://www.jefkine.com/general/2016/09/05/backpropagation-in-convolutional-neural-networks/