我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。
已经有人记了笔记(很用心,强烈推荐):
https://github.com/Sakura-gh/ML-notes
本节对应笔记:
- https://sakura-gh.github.io/ML-notes/ML-notes-html/11_Convolutional-Neural-Network-part1.html
- https://sakura-gh.github.io/ML-notes/ML-notes-html/12_Convolutional-Neural-Network-part2.html
本节内容综述
- 引出 CNN ,为什么不用正常的全连接网络?因为如果输入图片后,紧跟全连接层,那么
参数过多
。引出,一开始要做一些“简化”,这就是CNN的引出。 - Why CNN for Image?
Some pattern are much smaller than the whole image
,举了一个例子,见[小细节](#A Neuron see small region with less parameters)。 - 接着介绍了CNN的架构:
Convolution
,Max Pooling
,Convolution
,Max Pooling
,…,Flatten
, 全连接层; - 开始介绍了
Convolution
,见小细节; - Convolution v.s. Fully Connected,实际上卷积层就是全连接层的简化,见[小细节](#Convolution v.s. Fully Connected);
- Max Pooling,见[小细节](#Max Pooling)
- CNN in Keras,讲解如何用
Keras
声明一个CNN,涉及到参数的意义,以及前后卷积层的对接,了解了原理后,工程内容不予记录; - 接着老师讨论了
What does CNN learn?
- 接下来的内容在“小细节”最后一个部分详细讨论(包括:用DeepDream举例卷积神经网络“看到”了什么;卷积神经网络的其他应用如围棋等)。
小细节
A Neuron see small region with less parameters
相比全连接层,CNN中每个神经元只连接了图片中的一小部分,减少了参数,但是具有实际意义。
此外,对于不同的区域,可能要做相同的判断(如鸟嘴出现在了不同区域);不需要训练两个神经元,只需要共享参数即可。
CNN-Convolution
在卷积中有一个比整张图片小的Filter
,其参数也是学习得到的;接着按照滑窗stride
,进行“卷积”,得到新矩阵。
对于彩色的图片,那么我们的Filter
也是对应的多通道的。
Convolution v.s. Fully Connected
如上图,对于一次“卷积运算”,其只相当于用了输入层的9个输入,并没有全连接。
滑窗进行一次移动,可以看出输入进行了“滑动”。
注意到权重间存在共享,参数更加少了
!
Max Pooling
假设如上,根据Filter
得到一个4块乘4块的矩阵,那么对于每个“块”,只保留其中最大值 / 平均值。
那么这里会有疑问:如何微分?后面章节会讲Maxout network
。
可见,经过多次 Convolution + Max Pooling 后,实际上是将数据浓缩了。
What does CNN learn?
将思路反过来:把输入的图片
x
x
x当初参数,对于任何一个Filter
,其就是在寻找让数据这个“参数”最大的过程。
可以看出,如上,不同的Filter
其提取的数据特征是不同的。
之后查看全连接的输出,可以看到其最终输出为下图。
可以看出,CNN学到的东西与人类的认知是不同的。
有没有可能更好地观察机器输出了什么吗?比较简单的方法是 x ∗ = a r g max x ( y i − ∑ i , j ∣ x i , j ∣ ) x^* = arg \max_x (y^i - \sum_{i,j}|x_{i,j}|) x∗=argmaxx(yi−∑i,j∣xi,j∣),意义为找一个图片,其另y最大,但是让大部分的像素和最小,以突出“有墨水”的地方。(下图中公式有笔误,一个是减号而非加号)
Deep Dream
Given a photo, machine adds what it sees…
输入一张李老师的正常图片,通过调整某一个hidden层的几个参数,CNN夸大化其所看到的东西——生成如下的图片。
Deep Style
Given a photo, make its style like famous paintings.
如图,进行了风格迁移。
其大概原理如下图。
More Application: Playing Go
如上图,将棋盘视为一个矩阵输入,但是可以通过CNN处理棋盘,让参数减少,信息浓缩。
这是因为,围棋有些特性与图片相似:
- Some patterns are much smaller than the whole image(Alpha Go uses 5 × 5 for first layer)
- The same patterns appear in different regions
- Subsampling the pixels will not change the object(但是这一点让李老师一开始想不通,不符合常理,下面展开讨论)
Why CNN for playing Go?
实际上,Alpha Go
的文章附录中讲明了…没有使用Max Pooling
。
More Application: Speech
如上,有经验的人可以大概识别这个Spectrogram
图片的内容;对于CNN,则将一段时间视为一个“图片”,并且通常来讲,CNN只做竖向移动。
More Application: Text
对于由’word embeddiing’连成的句子,同样可以使用 CNN 进行处理。