笔记:ML-LHY-10: Convolutional Neural Network

这节课开始讲深度学习中重要的网络:卷积神经网络(Convolutional Neural Network)CNN。理解卷积操作在神经网络中的作用,理解CNN在做什么,以及CNN的可视化。

首先回顾一下及深度学习(CNN)中的卷积

为什么要用CNN?

局部检测

笔记:ML-LHY-10: Convolutional Neural Network
卷积核有大小之分,对应感受视野,而一个卷积核一般远远小于整张图片,所以卷积后的到视野也是比较小的。而检测一个物体的特征,比如鸟有鸟嘴,其实只用局部检测就行。注意卷积是滑动窗口操作,所以会遍历整张图(只是每次的窗口比较小),上图就会识别到鸟嘴、鸟爪、翅膀等多个局部特征。那识别局部特征往往还不够,要从全局的视野来看是什么东西,就是下面要说的下采样。

下采样(池化)

笔记:ML-LHY-10: Convolutional Neural Network

我们知道SIFT特征有个很关键的步骤解决尺度不变性,那就是高斯金字塔。其实就是在不同分辨率下模拟人类由进到远,有细到粗看物体。下采样(池化)的意义也就是这样,比如上图,下采样后我们依然能够分辨是鸟,因为我们可以根据轮廓看出。轮廓就是一种粗特征。还有关键一点,下采样减低分辨率,后面全连接参数也就相应减少。

模式共享

笔记:ML-LHY-10: Convolutional Neural Network
这个理解可能没那么直观,卷积核就是一个对应一个滤波器,不同的滤波器可以提取不同类型的特征,比如aplacian、soble算子。前面也提到,卷积是滑动窗口操作,就意味着一个卷积核会在多个区域应用,那么一个模式可以应用在多个区域,也就减少了总模式的参数。换句话说,把卷积核看做一组参数,既然可以共用,那当然减少了总的需要的参数

小结

笔记:ML-LHY-10: Convolutional Neural Network

  • 卷积的窗口提现视野局部性(细特征)
  • 卷积的滑动操作提现参数共享性
  • **下采样(池化)**提现视野全局性(粗特征)

上图是CNN的总框架

输入 -> 卷积 -> 池化 -> 卷积 -> 池化 … 全连接… -> softmax -> 输出

tip: 输出层神经元个数和类别数一样

卷积池化操作

卷积

卷积就是图像处理中的卷积,这里就不重复了,关键是滤波器(就是卷积核一个意思,卷积对应滤波)的通道数和输入的通道数一样,而输出的通道数取决于滤波器的数目。

例如:输入时RGB图像3通道 滤波器也是3通道 那么输出就是1通道
而我们想用多个滤波器提取多种特征,比如用2个滤波器每个滤波器都是3通道,那么输出就是2通道。卷积还涉及步长、padding大小,具体看这个笔记

笔记:ML-LHY-10: Convolutional Neural Network

池化

一般指最大池化 max pooling
就是在给定窗口内取最大的值
笔记:ML-LHY-10: Convolutional Neural Network
上图池化完就是:
3 0
3 1
更重要的是,分辨率简报,原来4个值,池化只保留了一个值。其实可以把池化看做特殊的卷积操作,步长是和卷积核大小一样,padding为0。

CNN学习到了什么?

现在训练完一个model后,里面的参数都是固定的,在卷积层的最后一层,如果输入时1 8 28 * 28 经过2层卷积层和池化后就是 50 *11 * 11:
笔记:ML-LHY-10: Convolutional Neural Network
最后一层是有50个滤波器,我们取第k个滤波器的输出结果为aka^k
笔记:ML-LHY-10: Convolutional Neural Network

ak=i=111j=111aijk a^{k}=\sum_{i=1}^{11} \sum_{j=1}^{11} a_{i j}^{k}

现在要找是怎么样的输入,使得这个滤波器activation。其实就是找一个输入x使得aka^k最大。步骤和知道输入求参数一样,这里知道参数当然可以用梯度下降方法求输入使得aka^k最大。

选其中12个滤波器,对应的最大化aka^k的输入:
笔记:ML-LHY-10: Convolutional Neural Network
可以看到每个filter对应特征同,比如水平,催着、斜条纹,可以**对应的filter参数。而在一张图中,可以看到条纹是布满整张图的,提现CNN的参数共享性。

那在全连接层会怎么样呢?由于flatten后,全连接层的神经元是和输入整张图是相关的:
笔记:ML-LHY-10: Convolutional Neural Network
取得神经元输出结果为aja_j,同样求一个输入图片,使得aja_j最大:
笔记:ML-LHY-10: Convolutional Neural Network
上图每一张图对应一个神经元输出aja_j,可以看到每个神经元想要**的图片,这不是一个完整的数字,只是这个神经元想要**的pattern。

继续往后,到输出层yiy_i
笔记:ML-LHY-10: Convolutional Neural Network
是不是使得yiy_i最大的就对应的数字呢?
结果却是这样:笔记:ML-LHY-10: Convolutional Neural Network
这明显就不是人类手写的数字,右边是加了L1正则化约束的结果(避免整张图都是笔画),可以看到部分关联。

Deep Dream

现在不是无中生有,而是在原图基础上更新图像,这样就会在保留原图的基础上,朝网络想识别的方向变换(因为要最大化上面提到的目标函数)。如果想让效果更明显,还可以强化参数,大的变得更大,小的变得更小。

风格迁移 Deep Style

精神就是找一张图,同时像content图p\vec{p}和style图a\vec{a},求Lcontent(p,x)L_{\text {content}}(\vec{p}, \vec{x})Lstyle(a,x)L_{\text {style}}(\vec{a}, \vec{x})

如下:
Ltotal(p,a,x)=αLcontent(p,x)+βLstyle(a,x) L_{\text {total}}(\vec{p}, \vec{a}, \vec{x})=\alpha L_{\text {content}}(\vec{p}, \vec{x})+\beta L_{\text {style}}(\vec{a}, \vec{x})

而怎么找在上面说过了,用梯度下降法。

内容损失Lcontent(p,x,l)L_{\text {content}}(\vec{p}, \vec{x}, l)的定义是:
Lcontent(p,x,l)=12i,j(FijlPijl)2 L_{\text {content}}(\vec{p}, \vec{x}, l)=\frac{1}{2} \sum_{i, j}\left(F_{i j}^{l}-P_{i j}^{l}\right)^{2}

还原图像的方法是梯度下降法。设原始图像为????⃗ ,期望还原的图像为????⃗ (即自动生成的图像)。使用的卷积是第????层,原始图像????⃗ 在第????层的卷积特征为PijlP_{ij}^{l}。????表示卷积的第????个通道,????表示卷积的第????个位置。通常卷积的特征是三维的,三维坐标分别对应(高、宽、通道)。此处不考虑具体的高和宽,只考虑位置????,相当于把卷积“压扁”了。比如一个10x10x32的卷积特征,对应1⩽????⩽32,1⩽????⩽100。对于生成图像????⃗ ,同样定义它在????层的卷积特征为FijlF_{ij}^{l}

风格损失Lstyle(p,x,l)L_{s t y l e}(\vec{p}, \vec{x}, l)的定义应用了Gram矩阵,这里不在展开。参考这篇博客:图像风格迁移原理

Lstyle(p,x,l)=14Nl2Ml2i,j(AijlGijl)2 L_{s t y l e}(\vec{p}, \vec{x}, l)=\frac{1}{4 N_{l}^{2} M_{l}^{2}} \sum_{i, j}\left(A_{i j}^{l}-G_{i j}^{l}\right)^{2}

应用例子

Alpha Go

笔记:ML-LHY-10: Convolutional Neural Network
也是使用了CNN,为什么?

  • 在 5 * 5的范围内就知道要怎么下,不需要看整个棋盘
  • 位置可以不同
  • 需要注意的是,Alpha Go用的CNN没有max pooling,因为围棋的特性不需要下采样

Speech

笔记:ML-LHY-10: Convolutional Neural Network
滤波器移动是在frequency维度上,因为不同频率的组合就可以表示不同的词,所以在频率上检测是有效的。在时间上检测词就不是那么好,有可能存在同一个词在用部分频率是一样的。

Text

笔记:ML-LHY-10: Convolutional Neural Network
文本语义识别任务滤波器就需要在时间纬度上移动,因为不同的word embedding就可以表示不同的语义,所以在时间纬度上检测是有效的。在embedding维上检测就可能完全检测不出语义。

以上参考李宏毅老师视频和ppt,仅作为学习笔记交流使用