不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络

文章转载自订阅号「夕小瑶的卖萌屋」中的文章《不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络》。

Hello~你们的小夕终于吐泡泡了~前几天小夕又加班赶project啦,拖了好几天,都快患上拖稿焦虑症了_(:з」∠)_

关于卷积神经网,小夕就不从卷积讲啦。以前不止一个粉丝问我卷积神经网络中卷积的意义,甚至在知乎上被邀请回答一个“卷积神经网络为什么不叫互相关神经网络”的类似的奇怪问题,终于忍不住,还是赶紧把CNN写了吧(说的自己要去拯救世界了一样\(//∇//)\

我们还是从前面更简单的机器学习model开始。回顾一下前面已经讲过N*N*N次的全连接前馈神经网络前面文章中小夕讲过,对于一个有一个隐含层的全连接前馈网络:

这里就可以看作是两层简单的分类器的前后级联,前一层分类器的输出就是后一层分类器的输入,那么显然前一层分类器的每个输出(即每个隐单元)代表什么含义我们是不清楚的,也就是前一层分类器学到的是分类未知意义的类别!而后一层分类器则直接利用前一个分类器得到的未知类别来学习输出最终我们定义的类别!举个栗子。

比如输入是一副图像:

这个图像假设是100*100的,也就是有10000个像素点。每个像素点取值0-255。

试想一下,如果我们不想人为定义特征,想要直接将原始图像丢进去,去分类图像是否包含狗这个类别。那么这时就相当于输入层有10000维,也就是有10000个特征,每个特征就是一个像素点的值。

如果我们的机器学习模型不加隐含层的话:

这时的模型显然是将每个像素点直接连接到了“是不是狗”这两个最终类别上。然而我们稍微想一下也知道,其实每个像素点的值跟是不是狗并没有什么联系(你不能说这个像素点是黑的(值为0),就说这个像素点是狗身上的,同样,像素点是白的(值为255)也不能说明这个像素点是不是狗身上的。)所以显然直接用每个像素点的值做特征去决策是不是狗这件事是非常不靠谱的!(每个特征都跟类别关系不大啊姐姐)

但是,如果我们加一个隐含层呢?这样情况会不会好一些呢?

设想一下,如前所述,加一个隐含层后,模型可以学习出一层未知类别,而这些类别完全可以做到跟像素点强相关!比如一个隐含类别是“以图像中心为圆心,半径为50的地方是否有一个圆形”

学习出这个分类器很简单,model只需要让这个圆圈所在的像素点对应的权重很大(比如2),让其他特征的权重接近0。这样这个地方出现的圆越明显(像素值越接近0),就会导致该子分类器的输出接近0,而这个地方没有出现圆的时候(像素值接近255)就会导致分类器的输出很大,看,很轻松的就学会了这个简单的分类任务吧(当然,为了学到这个地方有没有圆,还需要考虑圆周围的像素点(要有足够对比度才能说明这里真有圆哦),不过忽略这些细节啦,懂了小夕瑶表达的意思就好)。

好啦,这个子分类器训练好啦,也就是一个隐节点弄好了,那么同样的道理,其他的子分类器(隐节点)也可以学习到一些奇怪而简单的隐含类别,这一系列的类别组合起来完全有可能是这样子的

看,基于这些类别(也就是对下一级分类器而言的特征),下一级分类器就很容易分类这个图片是不是狗啦~比如上面这个图片中,就大约有7个隐节点,分别负责7个线条存在与否的分类决策。那么下一级分类器只需要让这7个特征的权重都大一些,这样当这些特征全部存在的时候,显然这就是一条狗啊!那么后一级分类器就能很自信的决策说:“这图片是一条狗!”看~这比直接让单个像素点与狗挂钩的做法科学多了,自信多了吧~

这就是用深度全连接前馈神经网络做分类的基本原理。

但是!你一定能发现问题!这样显然有很大的局限性!比如狗一旦换个姿势呢?狗一旦换个大小呢?图像中的狗蜷缩在一个角落呢?

显然!这时全连接前馈网络的隐含层的任务量要爆炸了!要有非常多非常多的隐节点来学到非常多隐含类别/隐含特征才可能足够应付这么多复杂局面!

隐含层节点大量增多后将会导致神经网络参数迅速增加!比如上面这个例子,增加一个隐节点就要增加10000+2个参数,显然代价是非常大的。那么有没有更好的解决方案呢?

很显然啊!既然我们的简单分类器要学的是一个简单的圆,一个简单的直线,一个简单的决策任务,那么所有的学习圆的隐节点完全可以合并为一个节点啊!这时我们可以用一个远小于整幅图像的“窗”来表示。比如就用一个20*20的窗(这样就只有400个参数,而之前全连接的时候要100*100=10000个参数),而且这个窗就负责找出图片中各处的小圆!这个“窗”就叫“卷积核”,(显然本质上就是一个缩小版的输入到一个隐节点的连接权重)为了寻找图像中各个角落的小圆,我们就可以让这个卷积核依次滑过图像的各个角落,只要在某处发现了小圆,就在该处激活,即标记好这里有个小圆。

因此,就跟前面全连接的时候一样,为了学到多个特征,我们肯定要设置多个卷积核呀~每个卷机核负责一种简单的分类任务(说到这个份上了,大家也能猜到,这依然是跟全连接的时候一样,这里的简单分类任务其实就是为下一层的子分类器抛弃旧特征,创造新特征啦)。

显然,依然跟全连接时一样,比如同样是20*20的卷积核,不同的参数就代表提取出了不同的特征,有的负责提取20*20块里的小圆,有的负责提取三角,有的提取直线等等~同一组大小的多个卷积核,就统称为一个20*20的滤波器(filter)(即一个某size的滤波器下可以设置学习多个卷积核)

而我们既然需要从20*20的块里去分类小圆,因此当然也可能需要从50*50的块里寻找大圆啦~因此在一个卷积层,我们还可以设置多个size的滤波器~当然每个size的滤波器下可以设置多个卷积核来提取不同特征。

我们再来考虑更复杂的情况!

我们知道,很多时候的输入并不是只有一个表示层!比如彩色图像就会包含红色、蓝色、绿色这三个图层,而不像前面的灰度图一样仅仅包含一个图层。

有时候彩色图像的一个圆圈仅仅出现在蓝色图层里,而没有出现在其他两个图层,因此显然如果我们的负责提取圆圈的卷积核仅在一个图层里滑动的话,可能会在很多位置遗漏很多信息,因此当输入的数据可以表示成很多层(即有很多不同角度的数据表示)的时候,卷积核要在每个位置处把所有的图层都映射/"卷积"一下,并且求和,才是真正确定图像在这个位置处到底有没有该卷积核要找的特征的做法。这里输入的多个层被称为多个输入通道(channel-in)所以一个卷积层,不仅可以设置多个size的滤波器,还可以在每个size的滤波器下设置多个卷积核,还可以让同一个卷积核每次同时考虑输入数据的多个通道!

我们再来考虑更更复杂的情况!

假如我们现在的分类任务变了!变得更难了!现在我们直接想识别出一个图片中是不是正在发生猫狗大战

这样的话!我们要有好多好多分类器啊!我们要识别猫,要识别狗,要识别头上的包,要识别创可贴等等,这么多子分类任务怎么办呢?能不能直接纳入一个卷积层呢?

当然可以啦!既然都可以有多个输入通道,当然也可以设置多个输出通道(channel-out)啊!一个输出通道就代表着一个子分类任务~(当然啦,每个子分类任务都会有它的一套filter及其一堆卷积核)。(当然啦,这些子分类任务也是人类不清楚的,神经网络自己知道)

至此,完整的卷积层就定义完成啦。我们再总结一下,一个卷积核在每个位置处要同时考虑所有的channel-in;然后一个size的filter下可以设置多个卷积核用于提取不同特征;然后可以设置不同size的多个filter来控制特征提取的粒度;然后可以设置多个输出通道channel-out表示多个分类任务。而且跟全连接前馈网络一样,被卷积核映射完(即线性映射结束后)别忘了丢激活函数哦~

所以在图像中,一个卷积层就分成多个size的filter,每个size的filter就对应着一个channel-in*width*height*channel-out的4D参数Tensor,其中的width和height就是卷积核这个窗口的宽和高啦~这种二维窗口的卷积核也称为2D卷积,同理三维卷积窗口就是3D卷积,参数Tensor就是5D的啦。

想一想,还有没有什么需要解决的问题呢?

刚才我们讨论的对象仅仅是针对卷机核在一个位置上的操作!显然一个卷积核滑过整个输入数据后,会在各种产生很多输出,那么这么多输出怎么取舍呢?

试想一下,其实我们要找出来猫的话,不管猫的位置是在图片左上角的角落,还是右下角,还是铺满整个图片,其实我们都说这个图片中包含了猫!大部分时候我们对它的位置不感兴趣,仅仅是关心这个图片中到底有没有这个东西,因此我们只需要判断该卷积核在所有的位置点产生的最强输出有多强就够啦~而其他位置点的输出直接抛弃就好咯~这个操作就叫最大池化(max-pooling)!这也是为什么大部分情况下最大池化是最有效的池化方式。

显然,处理一个卷积核的所有位置点,除了取最大值的方式,肯定还有一些场景需要其他更合理的方式。这些方式都叫池化

除了最大池化,还有时会用均值池化(average-pooling)、取前n个最大值池化(max-n pooling)等,从名字就能猜到池化方式啦,就不一一啰嗦了~当然,对所有位置点进行一次池化的话叫全局池化,相当于提取了全局的一个特征或者说一个类别。如果我们对池化操作也定义一个范围(即一个窗/一个池化核)的话,就是局部池化啦~得到的就是局部特征/类别。

哦对了,都已经讲解到这里啦,很显然池化是肯定跟在卷积层后面的(当然,由于卷积后务必跟一个激活函数保证模型的非线性,所以如果激活函数也算一层的话,池化层是跟在激活层后面的)。

好啦~卷积神经网络讲完了,卷积-激活-池化,就这么简单。当然,正如之前所说,如果池化的结果仍然是作为一个隐含类别的话(即池化的输出不接我们最终的分类任务的话),那么这依然跟前面一样,可以作为下一层的特征去使用。因此池化层后面当然又可以接新一轮的卷积-激活-池化,也就是形成真正意义上的深度神经网络

同步自微信订阅号“夕小瑶的卖萌屋”和知乎专栏“夕小瑶的科技屋”(作者知乎ID:夕小瑶)

入门全连接前馈网络卷积神经网络
2
相关数据
激活函数技术
Activation function

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

神经网络技术
Neural Network

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

深度神经网络技术
Deep neural network

深度神经网络(DNN)是深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似,深度神经网络也能够为复杂非线性系统提供建模,但多出的层次为模型提供了更高的抽象层次,因而提高了模型的能力。

前馈神经网络技术
Feed-forward neural network

前馈神经网络(FNN)是人工智能领域中最早发明的简单人工神经网络类型。在它内部,参数从输入层经过隐含层向输出层单向传播。与递归神经网络不同,在它内部不会构成有向环。FNN由一个输入层、一个(浅层网络)或多个(深层网络,因此叫作深度学习)隐藏层,和一个输出层构成。每个层(除输出层以外)与下一层连接。这种连接是 FNN 架构的关键,具有两个主要特征:加权平均值和激活函数。

卷积神经网络技术
Convolutional neural network

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

机器学习技术
Machine Learning

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

映射技术
Mapping

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

池化技术
Pooling

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

参数技术
parameter

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

权重技术
Weight

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

张量技术
Tensor

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

推荐文章