Perenial youth.

一天一个机器学习概念(一)——卷积神经网络(CNN)

一天一个机器学习概念(一)——卷积神经网络(CNN)

本专题为ECNU NLP Seminar的延伸,即一些出现在所选MOOC中却没有在Seminar中讨论的部分(大部分或者说前部分还是来自于台大李宏毅老师的ML/DL课程),以及一些我从其它渠道(包括但不限于其它MOOC, 书籍,BLOG)整理,总结出的重要机器学习概念(大部分还是模型)。最近可支配时间较多,因此希望自己能保持一天一更的速度,也希望读者监督(如果有的话)。

CNN,顾名思义,必须先了解卷积的概念。

一篇说得很好的知乎回答:
如何通俗易懂地解释卷积? – 马同学的回答 – 知乎 https://www.zhihu.com/question/22298352/answer/228543288

什么是卷积呢? 从数学上来说,卷积就是一种运算,和加减乘除类似。

对应着上述的定义,卷积在离散和连续情况下都有应用,如离散下可以求得两个骰子的和为某个值的概率,以及连续条件下求得馒头腐败了的数量(具体例子见知乎链接)

与我们今天关系说得比较近的例子可能是图像处理。卷积可以用于平滑高频的噪点,平滑的方法就是把周围的高度平均一下。如我们可以把一张有噪点的图片表示成一个矩阵:

然后用平均矩阵(实际上平均很不合理,应该用正态分布,这里为了简单起见)来平滑图像:

表示成数学公式就是这样

注意两者下标并不一样。正如上面卷积的概念。我们应让g和f中元素下标等于一个定值。但实际应用中,为了看起来直观,我们就把矩阵g翻转了180°,这样就是简单的一一对应了。

至此,卷积的概念说明完毕,回到卷积神经网络上来。
CNN一开始被用于影像上,它的第一个重大意义在于,告诉人们network的structure是可以设计的。CNN其实是全连接神经网络的简化版。为什么是简化版接下来会说。

为什么要设计CNN呢?CNN有哪些性质?

  1. 在图像识别中,有时不需要看整张图片,例如判断图中是否有鸟嘴这个pattern,只需要看图像的一小部分就可以。
  2. CNN可以在不同的位置侦测相同的pattern。比如不同图片上的鸟嘴可能出现在不同的位置,但是大致形状相同。
  3. CNN subsampling不太会影响图像识别的结果。比如一张25X25的图片卷积后变成20X20,实际上对信息的损失不是太大。

以上三点均是为了减少参数。

CNN结构
对应上述说的三个理由,Convolution对应前两个,Max Pooling层对应第三个

接下来再来看Convolution层。

filter的参数是训练出来的。每一个filter都可以侦测一种pattern。
卷积的过程。

这个filter实际上是在找正对角上全是1的存在,会return一个比较大的值,例如左上角和左下,return 的都是3. 可以理解为这个filter找到了这种pattern。由此可以看出前面说的property2.

上述说的channel是1维的情况。如果对channel为多维,如彩色的图像的情况下怎么办呢?将filter也改成立体的即可:

接下来回到之前的问题:为什么说卷积和全连接很像呢?因为如果把一张图片拉成一维的向量,我们就可以发现两者实际上是一回事。卷积在这里有点类似dropout。

这里每一个neural只会连接到9个pixel上。 全连接则会连接到所有的pixel。因此,减少了许多参数;同时,每一个neural的参数也是共享的,这就减少了更多的参数。

接下来再来说Max Pooling层。

顾名思义,取每一个group最大的那个就好。

类似的方法还有average pooling。不用纠结于这两种方法哪种好,这只是一种pooling的方法。

每一次Convolution+Pooling我们就可以得到一张新的image。之后,当这个image足够小的情况下,我们就可以将其拉直,然后丢到full connected neural network中。

如何用Keras实做:

25是filter数,3X3是filter的大小;28X28是image size,1是channel数

这里一个非常重要的问题是每一次convolution里filter的参数是多少。这个问题涉及到我们是否真的懂了。第一个convolution很好懂,就是3X3=9;第二个convolution里filter的参数是225,不是9!因为此时的image是25X13X13大小的,也就是height是25,因此我们的filter也要是3维的。而读者可能会有疑惑:这个convolution不是2D的吗,怎么还会有第三维?实际上,这个2D表示的是我们的filter可以控制2维上的参数,而第三维是不需要我们控制的;也就是默认会和这一层的input层数相同。说到这里就要说道convolution1D这个interface,常常用在NLP任务中。这个1D的interface的filter参数就只有一个1,代表卷积的宽度,如包含几个句子等;而长度这一维度已经被默认设置成包含整个句子的词了。关于CNN在NLP中的应用,接下来再说。

再丢到一个全连接就OK了。一个hidden layer+output layer。

其实神经网络不是完全不可解释的。我们可以通过一些结果的反馈去了解神经网络究竟在做什么。比如说,我们可以拿出filter的参数看一下这个CNN到底在干嘛:


有人将图片丢给neural,根据什么时候neural activate的最厉害(output最大)来判断这个neural在做什么:

这些filter好像在侦测笔画一样。

接下来再分析fully connected的部分。可否找到一张image使得hidden layer的output最大?看下图:

可以看到hidden layer的neural在侦测更复杂的图案

那么如果把最后一层的layer拿出来,会得到什么结果呢?

最后一层维数与分类的类别数一样,分别丢这九张图给九个neural,confidence最大。但是人一看就知道这些都只是噪声图而已,也就是说模型实际上会被这些图所欺骗。也就是说机器实际上以我们没办法理解的方式来理解这些图像。从另一个角度来看network是很容易欺骗的。这可能是因为模型观察图片的方式跟我们不一样(类似过拟合)。

那么我们可以给image加一些contrain来帮助machine训练。如何做呢?加正则项:

可以看到,结果变好了

分析模型看的是哪一部分:

分析每一个pixel,看哪一个pixel对这个类别最重要(这个pixel对这个类别和其它类别的值不一样)

上面这个方法有点复杂,但是可以采取遮盖某些pixel的方式,来判断machine去掉哪些信息没办法正确识别:

颜色越蓝越重要

判断哪些pixel真正有用是判别训练出来的究竟是人工智能还是人工智障的好办法

xinyu

目前为止有一条评论

风追司马 发布于7:44 下午 - 5月 20, 2019

受益匪浅!!赞