CNN原理
局部连接+权值共享
同一物体,在不同图片中,大小、位置、角度改变,对于物体检测和识别而言应该给出相同的映射
预处理
在图片输入到神经网络之前,常常先进行图形处理,有三种常见的图像的处理方式:
均值化
归一化
PCA/白化
卷积层:其核心利用的是图片的局部关联性质,
激励层:作用可以理解为把卷积层的结果做非线性映射。
常用的激励函数有以下几种:Sigmoid, Tanh, ReLU, Leaky ReLU, ELU, Maxout
池化层:池化层夹在连续的卷积层中间,压缩数据和参数的量,减小过拟合,池化层并没有参数,它只不过是把上层给它的结果做了一个下采样(数据压缩)。下采样有两种常用的方式:Max pooling, Average pooling.
全连接层:在全连接层中,所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。当前面卷积层抓取到足以用来识别图片的特征后,接下来就是如何进行分类。通常卷积网络的最后会将末端得到的长方体平摊成一个长长的向量,并送入全连接层配合输出进行分类。
稀疏性:通过对大脑的研究发现,大脑在工作的时候只有大约5%的神经元是激活的,因此采用激励层。(可以避免噪声)
全连接网络 VS 卷积网络
全连接网络不太适合图形识别任务,主要有以下几个方面的问题:
- 参数数量太多
考虑一个输入10001000像素的图片(一百万像素,现在已经不能算大图了),输入层有10001000=100万节点。假设第一个隐藏层有100个节点(这个数量并不多),那么仅这一层就有(10001000+1)100=1亿参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此它的扩展性很差。
- 没有利用像素之间的位置信息
对于图像识别任务来说,每个像素和其周围像素的联系是比较紧密的,和离得很远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,把图像的所有像素都等同看待,这不符合前面的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习必将是非常低效的。
- 网络层数限制
我们知道网络层数越多其表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。
那么,卷积神经网络又是怎样解决这个问题的呢?主要有三个思路
局部连接:这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
权值共享:一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。
下采样:可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。
对于图像识别任务来说,卷积神经网络通过尽可能保留重要的参数,去掉大量不重要的参数,来达到更好的学习效果。
一个典型的 CNN 结构看起来是这样的:
输入→卷积→ReLU→卷积→ReLU→池化→ReLU→卷积→ReLU→池化→全连接
卷积神经网络的层结构和全连接神经网络的层结构有很大不同。全连接神经网络每层的神经元是按照一维排列的,也就是排成一条线的样子;而卷积神经网络每层的神经元是按照三维排列的,也就是排成一个长方体的样子,有宽度、高度和深度。
超参数
image、filter、feature map
每层神经元只和上一层部分神经元相连,且filter的权值对于上一层所有神经元都是一样的。其参数数量和上一层神经元个数无关。
每个卷积层可以有多个filter
Pooling层主要的作用是下采样,通过去掉Feature Map中不重要的样本,进一步减少参数数量。
对于深度为D的Feature Map,各层独立做Pooling,因此Pooling后的深度仍然为D。
链接:https://www.zhihu.com/question/52668301/answer/131573702
问题空间:
输入和输出:
生物学连接
CNN 的确是从视觉皮层的生物学上获得启发的。视觉皮层有小部分细胞对特定部分的视觉区域敏感。Hubel 和 Wiesel 于 1962 年进行的一项有趣的试验详细说明了这一观点,他们验证出大脑中的一些个体神经细胞只有在特定方向的边缘存在时才能做出反应(即放电)。例如,一些神经元只对垂直边缘兴奋,另一些对水平或对角边缘兴奋。Hubel 和 Wisesl 发现所有这些神经元都以柱状结构的形式进行排列,而且一起工作才能产生视觉感知。这种一个系统中的特定组件有特定任务的观点(视觉皮层的神经元细胞寻找特定特征)在机器中同样适用,这就是 CNN 的基础。
感受(视)野 receptive field.
有趣的是,越深入网络,过滤器的感受野越大,意味着它们能够处理更大范围的原始输入内容(或者说它们可以对更大区域的像素空间产生反应)。
训练:
前向传导、损失函数、后向传导、权重更新
提供给网络的训练数据越多,你能进行的训练迭代也越多,紧接着权重更新也多,那么当用于产品时调整出的网络自然就好。
步幅(stride)和填充(padding)
选择超参数: 对于你的数据集,想出如何选择超参数的一个方法是找到能创造出图像在合适尺度上抽象的正确组合。
在每个卷积层之后,通常会立即应用一个非线性层(或激活层)。其目的是给一个在卷积层中刚经过线性计算操作(只是数组元素依次(element wise)相乘与求和)的系统引入非线性特征。过去,人们用的是像双曲正切和 S 型函数这样的非线性方程,但研究者发现 ReLU 层效果好得多,因为神经网络能够在准确度不发生明显改变的情况下把训练速度提高很多(由于计算效率增加)。它同样能帮助减轻梯度消失的问题——由于梯度以指数方式在层中消失,导致网络较底层的训练速度非常慢。ReLU 层对输入内容的所有值都应用了函数 f(x) = max(0, x)。用基本术语来说,这一层把所有的负激活(negative activation)都变为零。这一层会增加模型乃至整个神经网络的非线性特征,而且不会影响卷积层的感受野。
参见 Geoffrey Hinton(即深度学习之父)的论文:Rectified Linear Units Improve Restricted Boltzmann Machines
Dropout 层
如今,Dropout 层在神经网络有了非常明确的功能。上一节,我们讨论了经过训练后的过拟合问题:训练之后,神经网络的权重与训练样本太过匹配以至于在处理新样本的时候表现平平。Dropout 的概念在本质上非常简单。Dropout 层将「丢弃(drop out)」该层中一个随机的激活参数集,即在前向通过(forward pass)中将这些激活参数集设置为 0。简单如斯。既然如此,这些简单而且似乎不必要且有些反常的过程的好处是什么?在某种程度上,这种机制强制网络变得更加冗余。这里的意思是:该网络将能够为特定的样本提供合适的分类或输出,即使一些激活参数被丢弃。此机制将保证神经网络不会对训练样本「过于匹配」,这将帮助缓解过拟合问题。另外,Dropout 层只能在训练中使用,而不能用于测试过程,这是很重要的一点。
参考 Geoffrey Hinton 的论文:Dropout: A Simple Way to Prevent Neural Networks from Overfitting
网络层中的网络
网络层中的网络指的是一个使用了 1 x 1 尺寸的过滤器的卷积层。现在,匆匆一瞥,你或许会好奇为何这种感受野大于它们所映射空间的网络层竟然会有帮助。然而,我们必须谨记 1x1 的卷积层跨越了特定深度,所以我们可以设想一个1 x 1 x N 的卷积层,此处 N 代表该层应用的过滤器数量。该层有效地使用 N 维数组元素依次相乘的乘法,此时 N 代表的是该层的输入的深度。
- 参阅 Min Lin 的论文:Network In Network
分类、定位、检测、分割
本系列第一部分使用的案例中,我们观察了图像分类任务。这个过程是:获取输入图片,输出一套分类的类数(class number)。然而当我们执行类似目标定位的任务时,我们要做的不只是生成一个类标签,而是生成一个描述图片中物体suo所在位置的边界框。
我们也有目标检测的任务,这需要图片上所有目标的定位任务都已完成。
因此,你将获得多个边界框和多个类标签。
最终,我们将执行目标分割的任务:我们需要输出类标签的同时输出图片中每个目标的轮廓。
作者:机器之心
链接:https://www.zhihu.com/question/52668301/answer/131573702
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
迁移学习
如今,深度学习领域一个常见的误解在于没有谷歌那样的巨量数据,你将没有希望创建一个有效的深度学习模型。尽管数据是创建网络中至关重要的部分,迁移学习的思路将帮助我们降低数据需求。迁移学习指的是利用预训练模型(神经网络的权重和参数都已经被其他人利用更大规模的数据集训练好了)并用自己的数据集将模型「微调」的过程。这种思路中预训练模型扮演着特征提取器的角色。你将移除网络的最后一层并用你自有的分类器置换(取决于你的问题空间)。然后冻结其他所有层的权重并正常训练该网络(冻结这些层意味着在梯度下降/最优化过程中保持权值不变)。
让我们探讨一下为什么做这项工作。比如说我们正在讨论的这个预训练模型是在 ImageNet (一个包含一千多个分类,一千四百万张图像的数据集)上训练的 。当我们思考神经网络的较低层时,我们知道它们将检测类似曲线和边缘这样的特征。现在,除非你有一个极为独特的问题空间和数据集,你的神经网络也会检测曲线和边缘这些特征。相比通过随机初始化权重训练整个网络,我们可以利用预训练模型的权重(并冻结)聚焦于更重要的层(更高层)进行训练。如果你的数据集不同于 ImageNet 这样的数据集,你必须训练更多的层级而只冻结一些低层的网络。
Yoshua Bengio (另外一个深度学习先驱 )论文:How transferable are features in deep neural networks?
Ali Sharif Razavian 论文:CNN Features off-the-shelf: an Astounding Baseline for Recognition
Jeff Donahue 论文:DeCAF: A Deep Convolutional Activation Feature for Generic Visual Recognition
数据增强技术
现在我们对卷积网络中数据的重要性可能已经感到有些麻木了,所以我们来谈下如何利用一些简单的转换方法将你现有的数据集变得更大。正如我们之前所提及的,当计算机将图片当作输入时,它将用一个包含一列像素值的数组描述(这幅图)。若是图片左移一个像素。对你和我来说,这种变化是微不可察的。然而对计算机而已,这种变化非常显著:这幅图的类别和标签保持不变,数组却变化了。这种改变训练数据的数组表征而保持标签不变的方法被称作数据增强技术。这是一种人工扩展数据集的方法。人们经常使用的增强方法包括灰度变化、水平翻转、垂直翻转、随机编组、色值跳变、翻译、旋转等其他多种方法。通过利用这些训练数据的转换方法,你将获得两倍甚至三倍于原数据的训练样本。
生物所看到的景象并非世界的原貌,而是长期进化出来的适合自己生存环境的一种感知方式。
任何视觉系统都是将图像反光与脑中所看到的概念进行关联。
画面识别实际上是寻找(学习)人类的视觉关联方式 ,并再次应用。
不变性( invariance):Translation、Rotation、Viewpoint、Size、illumination
卷积神经网络就是让权重在不同位置共享的神经网络。
空间共享也就是卷积神经网络所引入的先验知识。
不同位置用相同的权重,可以解决不变性?
卷积的每个filter可以探测特定的形状。又由于Feature Map保持了抓取后的空间结构。弱将探测到的细小图形的Feature Map作为新的输入再次卷积后,则可以由此探测到“更大”的形状概念。
卷积神经网络会尽可能寻找最能解释训练数据的抓取方式。
结构发展
以下是几个比较有名的卷积神经网络结构。
LeNet
AlexNet:
ZF Net
GoogleNet
VGGNet
ResNet
DenseNet
总结一下,这些结构的发展趋势有:
使用smalle filter size的卷积层和pooling
去掉parameters过多的全连接层
Inception
跳层连接
CNN是一个可以自动提取特征,而且待训练参数相对不那么多的神经网络,这就是CNN在图像分类任务中的决定性优势。
Batch Normalization提出于2015年,通过逐层尺度归一(零均值方差归一,scale和shift),BN避免了梯度消失和梯度溢出。BN可以加速收敛5x~20x, 作为一种正则化技术也提高了泛化能力。
下面我们介绍损失函数:用于单标签分类问题的Softmax损失函数,用于实值回归问题的欧式损失函数,用于多标签分类的Sigmoid交叉熵损失和用于深度测度学习的Contrastive损失。