你所不能不知道的CNN
说起CNN,最初人们想到的都是某电视台,但等过几年,人们想起的多半是深度学习了。
应该说, CNN是这两年深度学习风暴的罪魁祸首, 自2012年, 正是它让打入冷宫的神经网络重见天日并且建立起自己在人工智能王国的霸主地位。
如过你认为深度学习是只能用来理解图像的,你就大错特错了, 因为它的用途太广了,上至文字,中有图像, 下至音频, 从手写数字识别到大名鼎鼎的GAN对抗学习, 都离不开它。
不过要了解CNN,还是拿图像做例子比较恰当。一句话来说CNN图像处理的本质,就是信息抽取, 巨大的网络可以抽取一步步得到最关键的图像特征, 我们有时也叫自动的特征工程。
CNN的建造灵感来自于人类对视觉信息的识别过程。 人脑对物体的识别的第一个问题是: 对应某一类对象的图像千千万, 比如一个苹果, 就有各种状态的成千上万状态, 我们识别物体的类别,事实上是给这成千上万不同的图片都打上同一个标签。
CNN的灵感来自人大脑
物理里管这种一个事物的结果与一些列的变化都没有关的特性,叫不变性, 比如如果你转动一个苹果任何一个角度它都是苹果, 这就是苹果有旋转不变性,但是数字6就不行, 如果你给它旋转特定角度它就变成9了, 它就没有旋转不变性。
我们人通常可以无视这些变化认出事物来,也就是把和这种变化有关的信息忽略。如果我们对图像进行识别, 事实上我们的算法就要有人的这种本领, 首先让它学会什么东西与真实的物体信息是无关的。
就拿数字识别举个例子吧, 一个数字是什么,虽然与旋转的角度有关系, 但与它在图片中的上下左右没关系, 我们管这种不变性叫平移不变性。
解决这个问题,最粗暴的一个方法是制造很多的样本,比如把“1” 放在很多不同的位置,然后让机器在错误中学习。 然后穷尽所有的位置, 不过我相信没有人是这么完成对物体的识别的。
那怎么办?CNN中的卷积正是这一问题的答案,因为卷积操作本身具有平移不变性(我知道听起来不明觉厉 ,请看下文)。
卷积,顾名思义, “卷”有席卷的意思,“积“ 有乘积的意思。 卷积实质上是用一个叫kernel的矩阵,从图像的小块上一一贴过去,一次和图像块的每一个像素乘积得到一个output值, 扫过之后就得到了一个新的图像。我们用一个3*3的卷积卷过一个4*4的图像, 看看取得的效果。
卷积的数学过程
一个卷积核就像一个小小的探测器, 它的DNA是被刻录在卷积核的数字里的, 告诉我们它要干什么, 而卷积核扫过图片,只要它的DNA是不变的,那么它在图片上下左右的哪个位置看到的结果都相同, 这变是卷积本身具有平移不变性的原理。 由于这种不变性, 一个能够识别1的卷积在图片的哪个位置都可以识别1,一次训练成本,即可以对任何图片进行操作。
图像处理领域,卷积早已有另一个名字 , 叫做滤镜,滤波器, 我们把图像放进去,它就出来一个新图像,可以是图像的边缘,可以是锐化过的图像,也可以是模糊过的图像。
如果大家玩过photoshop, 大家都会发现里面有一些滤镜,比如说锐化,模糊, 高反差识别这一类,都是用着类似的技术,这样的技术所作的事情是图像的每个小片用一个矩阵进行处理,得到一个画面的转换 。 我们有时候会说低通和高通滤镜 ,低通滤镜通常可以用来降噪, 而高通则可以得到图像的细微纹理。 你玩photoshop,玩的就是卷积,卷积核里面的数字定了, 它的功能也就定了。
为什么这样做有效果了?因为图像的特征往往存在于相邻像素之间, kernel就是通过计算小区域内像素的关系来提取局部特征,可以理解为一个局部信息的传感器, 或物理里的算子。
比如提到的边缘提取滤镜, 它所做的物理操作又称为拉普拉斯, 只有像素在由明亮到变暗的过程里它才得1, 其他均得0,因此它所提取的图像特征就是边缘。 事实上我们知道图像中的信息往往包含在其边缘,你给以一个人画素描, 一定能够完全识别这个人 。 我们通过寻找到信息的关键载体-边缘, 而把其他多余的信息过滤掉,得到了比第一层更好处理的图像, 大大减少了需要搜索图像的可能性。
卷积的边缘抽取过程
常用于卷积的Kernel本质是两个: 第一, kernel具有局域性, 即只对图像中的局部区域敏感, 第二, 权重共享。 也就是说我们是用一个kernel来扫描整个图像, 其中过程kernel的值是不变的。这点就可以保证刚刚说的平移不变形。 比如说你识别一个物体, 显然你的识别不应该依赖物体的位置。 和位置无关, 及平移不变。
那卷积如何帮你从不同的图形中识别数字1了?数字的尖锐的线条会让卷积的值很高(响起警报)。无论你1出现在图像中的哪一个位置, 我的局部扫描+统一权重算法都给你搞出来, 你用同一个识别1的卷积核来扫过图片,voila,任何一个位置我都给你找出来。
那卷积和神经网络有什么关系了?答案是卷积扫过图像,每一个卷积核与图像块相乘的过程,都可以看作是一个独立的神经元用它的神经突触去探测图像的一个小局部,然后再做一个决策,就是我看到了什么或没看到什么。整个卷积过程, 不就对应一层神经网络吗?啊哈, 整个卷积过程相当于一层神经网络!
一个个小探测器一般的神经元
刚刚说了卷积是一个能够对图片中任何位置的同一类信息进行抽取的工具, 那么我们还讲到我们除了抽取, 还要做的一个工作是,取出重要信息,扔掉不重要的,实现这一个的操作,叫做pooling
但是大家注意,这个时候如果原图像是28*28, 那么从kernel里出来的图形依然是28*28, 而事实上, 事实是上, 大部分时候一个图像的局部特征的变化都不会是像素级。我们可以把局部特征不变形看做一个假设, 把这个假设作为一个数学公式加入到卷积层里帮我们过滤冗余信息, 这就是pooling所做的事情 -也就是扔掉你周边得和你长得差不多得那些像素。
Max Pooling的数学过程
Pooling的本质即降采样,以提升统计效率,用一个比较冠冕的话说是利用局部特征不变性降维 ,pooling的方法很多,常见的叫做max pooling,就是找到相邻几个像素里值最大的那个作为代表其它扔掉。
这样经过从卷积到pooling的过程, 在识别1的任务里,我们可以验明在每个小区域里有没有存在边缘, 从而找到可能存在1的区域。 在pooling的终结点, 我们得到的是一个降低维度了的图像,这个图像的含义是告诉你在原有的图像的每个区域里是含有1还是不含有1, 又叫做特征图。
好了,我们可以从一堆图片中识别出1了, 那么我们怎么搞定2呢? 我们把2写成一个Z型, 你有没有思路我们如何做到这点? 我们不能只识别竖着的线条,还需要识别横向的线条,记住,一个卷积层只搞定一个特征,如果你既要找竖线也要找横线, 我们需要两个不同的卷积层,并且把他们并联在一起,
手写数字识别
然后呢? 横线对应一张特征图, 竖线对应另一个张特征图, 如果要识别2, 你无非需要比较这两张特征图,看是否有哪个位置两个特征图同时发生了警报(既有横线又有竖线)。
这个比较的过程,我们还是可以用一个卷积搞定(理由依然是平移不变性)!
这个时候, 新的卷积层对之前并连的两个卷积的结果做了一个综合, 或者说形成了一个特征之特征, 即横向和竖线交叉的特征。
这里把我们的理论可以更上一层路。 深度意味着什么? 我们想一下, 要正确的识别一个图像,你不可能只看变,也不可能只看边角, 你要对图像的整体有认识才知道张三李四。 也就是说我们要从局部关联进化到全局关联, 真实的图像一定是有一个全局的,比如手我的脸, 只有我的眼镜,鼻子耳朵都被一起观察时候才称得上我的脸,一个只要局部,就什么都不是了。如何提取全局特征?
从一个层次到另一个层次的递进, 通常是对上一层次做横向以及纵向的整合(图层间的组合或图层之内的组合或两者),我们的特征组合是基于之前已经通过pooling降低维度的图层,因此事实上每一个神经元决策的信息相对上一层都更多,我们用一个学术名词 – 感受野来表述一个神经元决策所涵盖的像素多少, 上一层次看到更多的输入神经元, 因此感受野看更多了 。 越靠近顶层的神经元, 所要做的事情就越接近全局关联。
越深,感受野越大, 表示越抽象
这和物理学的一个基本方法--尺度变换有着异曲同工之妙(我们后面讲), 也是提取全局信息的一个非常核心的办法,我管它叫级级递进法。 你一级一级的进行对画面进行降采样, 把图像里的四个小格子合成一个, 再把新的图像里四个小格子合成一个, 直到一个很大的图像被缩小成一个小样。每一层的卷积,都不是一个卷积,而是一组执行不同特征提取的卷积网络,比如我刚刚说的 不同方向的边缘沟成的一组卷积, 你可以想象后面有不同大小的角度组成的一组网络, 他体现了在一个空间尺度上我们所能够达到的特征工程。
如此级级互联, 越靠上层感受野就越大。 整个CNN网络如同一封建等级社会,最上层的,就是君王,它是整个集团唯一具有全局视野的人,下一级别, 是各大领主,然后是领主上的风尘,骑士,知道农民(底层神经元)。
我们把刚刚的全局换一个词叫抽象。深度卷积赋予了神经网络以抽象能力。 这样的一级级向上卷积做基变换的过程,有人说叫搞基(深度学习就是搞基),深一点想叫表征, 和人的思维做个比喻就是抽象。 抽象是我在很深的层次把不同的东西联系起来,CNN教会了我们事先抽象的一种物理方法。
到目前为止, 我所描述的是都是一些人工的特征工程,即使网络在深,顶多说的上是深度网络,而与学习无关。我们说这样一个系统(mxnxpxz), 我们要人工设计,几乎穷经皓首也可能做的都是错的。我们说, 这样的一个结构, 只能靠机器自己学,这就是深度学习的本质了, 我们通过几条basic假设(正则)和一个优化函数,让优化(进化)来寻找这样一个结构。 Basic假设无非图像的几个基本结构, 体现在几个不变形上,物理真是好伟大啊。
深度学习的训练,就是计算机帮助人完成了机器学习最难的一步特征工程(特征工程本质就是基变换啊)。以前人类穷尽脑汁思考如何做图像识别, 是寻找人是如何识别图像的, 希望把人能用来识别物体的特征输入给计算机, 但是现在通过深度卷积,计算机自己完成了这个过程。
卷积网络在2012 年的发展趋势, 大家可以关注几个方向:
1, 更深的模型 : 从AlexNet到VCG19 ,High way network 再到残差网络, 一个主要的发展趋势是更深的模型。 当你采用更深的模型,经常你会发现一些神奇的事情发生了。 当然网络的宽度(通道数量)也在增加。
这只是最初级的CNN
这也只是小菜一碟
2, 更通畅的信息交换 : 深,带来的第一个问题是训练困难, 反向传播难以传递。 从残差网络, 到目前开始流行的Dense Network, 一个主要的发展趋势是不同层级间的信息的交换越来越通畅。 我们逐步在不同层之间加入信息的直连通道。
Dense Network
3, 与监督学习之外的学习方法的结合, 如迁移学习, 半监督学习, 对抗学习, 和强化学习。 后两者的有趣程度远超监督学习。
4, 轻量化, CNN网络越来越深, 使得网络的文件动辄装不下, 这点使得CNN网络的轻量化部署成为重点, 我们希望在性能和能耗中取中。 一个很好的办法是对网络权重进行减枝,去掉不重要的权重, 另外一个是把每个权重的数据位数本身缩减,甚至是使用0和1表示, 虽然看上去我们丢失了很多信息, 但是由于巨大网络中的信息是统计表达的,我们到底损失多大还真不一定。
酷似生物过程的剪枝处理
以上是CNN的小结, 不要以为图像处理与你无关,我刚刚说的其实一篇文章如果你把它转化为一个矩阵无非一个图像, 一段音频你给它转换成一个矩阵无非一个图像, 你看, 都可以和CNN挂钩。