初识卷积神经网络(cnn)
卷积神经网络——基本概念
卷积神经网络(Convolutional Neural Network,CNN)的主要应用领域是图像分析处理,如人脸识别、物体识别等
神经网络
整体理解
- 构建一个神经网络模型,包括很多权重和偏置参数
- 使用数据训练模型,反向传播优化参数使得损失函数最小
- 选取表现最好的模型参数
其中,构建一个神经网络模型是由人决定的,有几个隐藏层,每一个隐藏层包括多少个神经元节点,这些都不固定,靠人的经验和试错得出,找到一个合适的模型比较困难。也有机器自主建立模型的技术,但不流行。
神经元模型
示意图如下:
其中f为激活函数(activation function)
多层网络
多层前馈神经网络(multi-layer feedforward neural network)
Fully Connected 的含义:
全连接,前一层的每一个神经元都和后一层的每一个神经元相连接
feedforward 的含义:
前馈神经网络,从输入的特征向量向前,经过隐藏层获得输出
-
输入层
接受外界输入,特征向量
-
隐藏层
对信号进行处理加工,可以有多层,后面一层在前面一层加工的基础上再进行进一步处理(前一层的输出作为后一层的输入)
-
输出层
输出最终结果
隐藏层和输出层都是拥有激活函数的功能神经元
梯度下降
gradient descent
相关概念的理解
-
损失函数
是衡量预测结果和真实值之间偏差的函数,训练的目的是通过修正参数θ最小化损失函数
-
梯度
梯度是一个向量,它的几何意义是,多元函数在某点处函数值变化最快的方向,梯度的模是方向导数的最大值,因此梯度下降,可以理解为沿着使得损失函数减小最快的方向更新参数θ的过程。
ps:如果不好理解可以先试着从损失函数为一元函数出发,某一点处导数(切线),具体看一下损失函数和参数是如何变化的
梯度下降算法如下
其中θt 为第t次迭代时的参数值, α为学习速率(learning rate),偏导符号的部分是梯度。
注意:
通过公式可以发现,梯度下降算法首先要计算所有训练样本的损失函数,求出损失函数对参数的梯度,然后取均值,最后更新梯度。算法中对所有训练样本损失函数的计算,以及梯度的求解可以是并行的,可以充分利用处理器并行计算的优势。
stochastic gradient descent
随机梯度下降算法如下
阅读算法可以发现,随机梯度下降算法每次只选取一个训练样本,计算损失函数,求出梯度,然后更新参数。由于每次只选取一个训练样本就更新一次参数,因此不能发挥处理器并行计算的优势。随机梯度下降算法相比于梯度下降算法的优势在于
- 收敛速度较快
- 实现简单
- 引入随机噪声,逃离局部最优解
我们想要一种方法,既能提升权重参数的性能又能发挥并行计算的优势,减少时间开销。
mini-batch gradient descent
把训练样本若干个分为一组
- 避免了梯度下降计算全部样本才能更新一次权重参数的情况
- 各组之间无关,可以组间并行计算
梯度下降和和随机梯度下降的折中,兼顾随机梯度下降的有点,也可以提高训练效率
mini-batch 随机梯度下降算法,其中K即为batch size,为了提高计算效率,一般设置为2n
反向传播(西瓜书搬运)
误差逆传播(error BackPropagation,BP),BP算法基于梯度下降策略
示例网络结构如下图所示,这里仅以隐藏层到输出层一个权重参数whj为例
对于反向传播的理解
- 所谓反向相对于正向,正向也就是从输入特征值到预测结果的方向,通过隐藏层各层权重以及激活函数得到最终的预测结果
- 计算代价函数关于参数的梯度,是一个从后向前的过程(
复合函数求导)(应该是多元微分求偏导数的链式法则)
过拟合
神经网络的拟合能力太过强大,可能会很严格的拟合训练集上的每一条数据,但在测试集上的表现不尽人意
解决方法:早停(early stopping)、正则化(regularization)
早停:一边训练一边检测模型在训练数据集和测试数据集上的表现,若在训练集上的表现很好,但在测试集上的表现效果出现下降,则可能出现了过拟合,找到临界点停止训练即可
正则化:在代价函数中增加用于描述网络复杂程度的部分
卷积神经网络(CNN)
为什么提出CNN
对于图像的处理,若使用传统的全连接神经网络模型,会面临的问题有
-
要将图片展开成一个向量,需要规模非常大的权重矩阵(参数)
如:64 * 64 * 3的图像,作为输入展开为一个12288维的向量,假设隐藏层有100个神经元,则全连接需要的权重矩阵为1228800,而64 * 64 *3仅是一个比较小的图像,而且仅考虑了一层隐藏层。试想图像为1000 * 1000 * 3,隐藏层神经元为1000,有多个隐藏层......在这样的情况下,传统神经网络模型需要的参数是非常非常大的。很难获得足够多的数据避免神经网络过拟合。
-
对计算量和内存要求提出了挑战
总之,对于计算机视觉方面,使用传统神经网络由于参数过多而不可行。为了解决传统神经网络在计算机视觉方面的不好表现,提出了卷积神经网络。
什么是CNN
简单理解:
直接将图片作为一个输入矩阵,确定一个卷积核(过滤器),在图片上做卷积运算,得出来一个矩阵,这个矩阵能够帮助我们提取出图片的一些特征,进而从图片中获取我们需要的信息。卷积运算是以卷积核作为窗口,以特定步长进行矩阵内积的运算。显然,确定卷积核是提取图像特征的关键,卷积神经网络将卷积核作为参数,通过大量数据对卷积核进行训练,在提取出图片中需要的特征信息的基础上,实现某个计算机视觉的目标。
卷积的过程
输入图像为7 * 7 * 3,3通道RGB图像
对每一个通道指定一个卷积核,卷积核大小为3*3,对整个图像来说,卷积核为3 * 3 * 3,即为一个过滤器(filter),一个过滤器在一个图像上应用卷积再加上偏置得出一个特征图
注意此处的计算细节,x0 * w0 + x1 * w1 + x2 * w2 + b0 = o0
相关概念
-
卷积核
可以理解为权重,也就是滑动窗口
每张图片不同位置对于识别这张图片的权重贡献是不同的,图片中有的地方对于识别图片很关键,那么这一点处的权重就大,反之则小。
卷积核是k阶矩阵,而k通常是奇数,原因是
- 奇数阶矩阵存在一个中心点,中心像素点
- 在边缘填充时,计算padding可能会用到k,如果k为奇数,则刚好是对称填充,否则填充不对称
-
滑动窗口步长
卷积核一次移动几个单位
-
边缘填充
- 原因1:在计算特征图的过程中,处于边缘位置的像素点参与计算的次数要比处于中间位置的像素点次数少,为了减少这种差异,为原始数据图像增加一层边界,填充为0。
- 原因2:原始图片经过一层卷积就会变小一点,如果不想让图片经过多层卷积之后变得很小,加padding是一种解决方法,图片经过一次卷积之后大小变成(n-f+1)*(n-f+1),n为原始图片大小,f为卷积核大小
-
特征图
一个原始图片在一个卷积核的作用下生成一个特征图,卷积核可以有多个
-
卷积结果计算公式
池化
池化是为了在保留图像特征的前提下,压缩特征值,减小数据规模
最大池化,在卷积之后,对特征图在某个区域中选择最大值
全连接
相当于一个传统神经网络层,先将卷积池化得到的结果展成一个1*n的向量,在对应到要分类的一个向量