为什么设计神经网络的架构能让结果表现更好?
总结
本课从影像识别切入,从全连接网络讲起,通过2种观察得出2种简化得到了CNN,一是有些pattern仅出现在图片的一小部分提出了感受野,二是相同的pattern出现在图片的不同区域提出了参数共享
CNN无法解决旋转缩放后的影像,需要先做ST空间变换
注意理解两个版本的对应
本课中提到的一些重要概念:one-hot、dim、softmax、全连接网络、kernel size、stride、共享参数、filter、spatial transformer layer 空间变化、interpolation 插入、convolutional layer 卷积层、feature map特征映射、pooling池化
目录
一、由影像分类切入讲CNN(2个观察对应2种简化:由全连接网络->卷积神经网络)
a、多个同样的pattern出现在图片的不同位置,而每个感受野都会有守备
1、spatial transformer layer解决CNN不能解决的scaling和rotation问题
4、在不断叠加的过程中一直只考虑3×3会不会看不了大范围中的pattern?
如果没有影像特性,就不要用CNN
一、由影像分类切入讲CNN(2个观察对应2种简化:由全连接网络->卷积神经网络)
输入:所有图像rescale成大小一样
目标:分类,所有类别表示为one-hot,dim决定了这个模型能辨识多少个类别
输出:通过softmax得到与one-hot同维度的概率分布,概率值最大的类别决定本图的类别
二、全连接网络过拟合问题解决思路:
1、只看重要pattern就可以判断
a、考虑影像本身的特性
考虑影像本身的特性,其实不需要每一个神经元与input的每一个dimension都有一个weight。
对影像辨识的类神经网络中的神经元而言,侦测图像中非常重要的pattern,综合这些pattern就可以让神经网络判断图像中的内容。
如果让神经元neuron做的事情就是判断有无某种pattern出现,也许就不需要每个neuron都去看完整的图片,也就不需要整张图片作为输入。
b、设定感受野来减少参数
根据以上观察可做简化1:设定感受野receptive field,把感受野中的内容拉直作为神经元的输入会给向量的每个dim一个weight,再加上bias得到输出。此输出再送给下一层的神经元作为输入
c、如何决定感受野
根据对问题的理解可以自由设定
感受野可以重叠:同一个感受野可以由多个神经元守备,可以全部重叠或部分重叠
经典的设定方式:只设定kernel size核心大小,如:三维中只确定长宽,高(channel)是默认全部考虑的。kernel size一般都是3×3
感受野的移动步长stride:
1、一般设的比较小,为了考虑的全面,所以需要感受野重叠。
2、是一个超参数。
3、超出范围的部分就padding补零(有各种补的办法,根据理解自由决定)。
4、按照这个方式扫过整张图片,让每个守备范围都有神经元在侦测有无pattern出现
2、让侦测同样pattern的神经元共享参数
a、多个同样的pattern出现在图片的不同位置,而每个感受野都会有守备
同样的pattern可能出现在图片的不同位置,根据每个感受野都会有神经元去守备,pattern一定会被检测出来,但是这些神经元就检测同样的pattern,也就是不同的神经元做了重复的事情。
b、做同样事情的神经元共享参数,减少参数量
根据观察可做简化2: 让做同样的事情的神经元(守备不同感受野)共享参数(weight是相同的),但因为输入不同即使共享参数输出也不会相同。
c、共享参数的方法 filter
常见的共享参数的方法:每个感受野有一组神经元守备,共用参数的一组神经元的参数被称作filter
三、CNN存在的问题
问题1:因为弹性变小了,所以模型误差变大了,但因为是专为影像设计所以针对影像任务时问题不大
问题2:CNN不能处理图片的放大缩小scaling和旋转rotation,它只有针对其训练过才会有好的效果(spatial transformer layer可以处理这个问题)
1、spatial transformer layer解决CNN不能解决的scaling和rotation问题
解决旋转缩放的问题之后才能被CNN识别出来,spatial transformer layer也是一个神经网络
a、举例:文字识别任务中,加一层ST就可以正确识别
b、举例:图像识别中,先做ST再图像识别正确率大大提高
c、如何做image transformation?
不能直接用梯度下降求解:参数的小小改变会让结果发生变化,但是经过计算(直接选择距离最近的)对应出来的位置是相同的,所以微分是0
需要先做interpolation插入,再梯度下降
下标带入x和y求解出x' y'的位置,可以得到指向关系。把x y移动到x' y'处可以得到变换
例:把所有的像素坐标化,然后
放大:
缩小:
旋转:
四、CNN的第二种解释法
1、filter的作用:
有很多的filter,每个filter都是一个3×3×channel的tensor,filter的作用就是从图片中的指定范围内侦测某一个pattern。
2、filter如何抓取pattern?
filter中的数值其实就是模型参数(未知的,需要通过梯度下降来找到)
- 用filter与每一个感受野(stride=1)的内容做内积inner product
- 对每个filter重复上述操作,每次得到一个矩阵
- 结束所有的filter就得到了filter组数字,组成了:特征映射feature map(可以看做一张新的图片,这张图片的channel不再是RGB三个,而是filter个,每一个channel对应一个filter)
![]()
3、convolutional layer是可以叠加的
下一层的convolutional layer也有一堆filter,filter的高度就是要处理的上一层的channel数目
4、在不断叠加的过程中一直只考虑3×3会不会看不了大范围中的pattern?
在叠加过程中,filter与特征映射内积运算中,特征映射在原图中是>=3×3的范围,随着叠加的越深,内积运算让原图不断变得长宽更小 而高度更大,看到的范围也就越大
五、两个版本的对应
- 共用参数的神经元的参数 = filter = 需要通过梯度下降得到的模型参数
- convolution = 用filter扫过图片 = 不同的感受野,神经元可以共享参数
- 只看图片的一部分 = 一组filter中每个filter只看一个小范围只侦测一个小pattern
- 同样的pattern可能出现在图片不同的位置,所以神经元可以共用参数 = 一个filter要扫过整张图片
六、Pooling池化-缩小图片减少运算量
观察3:把一张图片缩小以减少运算量,随着算力的增强,考虑到pooling对性能的影响,也可以不做这个
pooling是不需要从数据中学得什么的,所有的行为都是固定好的,可以看做一个函数
其中本课讲的是max pooling:
- 每个filter都会产生一堆数字,pooling将这些数字分组(自己定)
- max pooling是选择留下其中最大的(也可以选平均、选最小)
七、经典CNN架构
- 不做池化的话就是,做几次convolution
- 把输出的矩阵拉直成向量
- 把向量作为全连接层的输入
- softmax变为概率
- 得到结果
八、CNN在语音和文字处理的应用
感受野和参数共享的设计不同,要根据不同的特性来设计,不能用影像的设计直接套用