李宏毅《深度学习》笔记:Convolution Neural Network 卷积神经网络
Why Deep?
在介绍CNN卷积神经网络之前,思考一个问题,为什么要做Deep Learning,而不做Fat Learning呢?既然都是让网络中的参数去拟合一个函数,那为什么要加深模型的深度,而不是增加宽度呢?
因为有人做过实验,Deep Learning表现比Shallow Leaning更好,在同等参数条件下,性能更好,Why?
- Modularization:模块化思想,在Deep Neural Network中,低层神经元输出的信息可以被深层不同的神经元重复使用,而并不需要像Shallow Network一样,每次都要重新检测。因此Deep Network降低了程序的复杂度,并且需要的training data反而是比较少的。
- More Efficient:随着深度增加,hidden layer增多能够提取深层次的特征,这可以解决某些情况下难以分类的问题,充分利用data。
CNN
在视觉领域,因为fully-connection网络参数量大、效率低,并且无法提取自然图像中的物体存在局部不变性的特征(缩放、旋转、平移等操作不影响其语义信息)。因此出现了卷积神经网络(CNN),其简化了网络结构、减少了网络参数量。
Why CNN for Image?
那么为什么CNN减少了参数,在计算机视觉领域反而效果更好呢?
-
Some patterns are much smaller than the whole image:某些特征pattern比整幅图的尺寸要小很多,比如要检测鸟嘴,只需对小区域内检测即可。所以CNN中每一个神经元只连接到一个小块区域,而不是连接到整张完整的图,所需参数也就更少。
-
The same patterns appear in different regions:同样的pattern可能出现在图像的不同部分,但是它们代表同样的含义(局部不变性)。因此只需要一个detector就可以检测同样的pattern,不需要再设置额外的detector,因此所需参数更少。
-
Subsampling the pixels will not change the object:
上面三个property也是判断CNN是否适用于某任务的要素,当然在设计网络时,可以根据任务做调整,比如:不需要Maxpool(例如Alpha Go)。
应用之道,存乎一心。
The whole CNN
CNN普遍的架构由Convolution、Maxpool和Fully-Connection Layer交替组成。
之前所提到的property1、property2由Convolution来实现,而property3由Max Pooling来实现。
Convolution
-
CNN的卷积层由卷积核(kernel / filters)组成,对input进行小区域检测:
-
卷积核能够提取不同区域的相同pattern,提取的特征具有平移不变性:例如下图,Filter1检测的pattern为对角线元素为1的区域特征。
-
将不同卷积核得到的结果进行连接(concat),就组成了feature map:
-
如果输入的channel不为1(例如RGB彩色图像具有3个channel),卷积核不再为matrix,而是一个立方体,其在depth方向具有与input相同的channel深度(3x3x3)。
-
卷积是特殊的全连接操作:卷积抛弃了全连接的部分weight,局部连接、提取区域特征,并且权值共享。
例如下图中的output为3和-1的这两个神经元,其分别检测image两个不同位置上是否存在某pattern,在Fully connected layer中它们做的是两件不同的事情,每一个神经元应该有独立的weight;但进行卷积时,首先每一个神经元前面连接的weight减少了,然后某些神经元(比如上图中output为3和-1的两个神经元),它们共享weight,即使两个神经元连接到的pixel不同,但weight一样,这就是weight share权值共享。
Deep Dream
Deep Dream:将图像送入CNN,然后把某一个卷积层filter或是全连接层的某个output拿出来(vector),把本来为+的维度值调大,为-的维度值调小(也就是让正的更正,负的更负,这里就是把3.9、2.3的值调大,-1.5的值调小,也就是使它们的绝对值变大)。将其作为input image的目标,用gradient descent的方法找一张image x,让它通过这个hidden layer后的output调整后的target,这么做的目的就是,让CNN夸大化它看到的东西——make CNN exaggerates what is sees。
也就是说,如果某个filter有被activate,那就让它被activate更剧烈,CNN可能本来看到了某一样东西,那现在就让它看起来更像其看到的,这就是所谓的夸大化。
Deep Style
将image送入CNN,得到CNN filter的output,这代表image content;然后把‘呐喊’这张图也送入CNN里,得到filter的output;我们并不在意一个filter output的value到底是什么,而是filter的output之间的correlation,这个correlation代表了一张image的style。
接下来你就再用一个CNN去找一张image,它的content像左边的图片,同时style像右边的图片,所谓的**‘像’**指的是output的filter之间的correlation比较高。