我们学习的图像分类许多都是基于CNN(卷积神经网络)衍生的,CNN在计算机视觉的重要性不言而喻。接下来我们将把卷积神经网络拆开理解:神经元——神经网络——卷积神经网络。了解神经网络的原理,为卷积神经网络的学习做铺垫。
本章主要学习BP神经网络,主要理解推理过程,知道模型的运行原理,虽然BP神经网络跟图像分类的关系不算太大,但是要学会看模型、读懂模型,后续的cnn模型只会比BP神经网络更复杂。
一、神经元
1.概念
神经网络中最基本的模型就是神经元。
2.类比
在生物学知识中,无数的神经元组成了我们的神经网络。当神经元被刺激时,产生一定的电位差,电位差达到一个阈值时,神经元就会被激活,同时可能会激活相邻的神经元,无数神经元的电位差达到阈值被激活后,神经网络就会通过释放化学物质执行下一步。而计算机中的相关算法都是模仿了生物学中的神经网络产生的。
举例:我们看到美食的时候,无数的神经元被激活,促使我们激活了‘想吃饭’这个行为。
4.发展
1943年,McCulloch基于上述的情景提出了M-P神经元模型,就是一个神经元与n个神经元相连,n个神经元输入信号,输入信号提供带权重的连接进行传递,该神经元收到信号后与阈值进行比较,最后通过激活函数处理并输出。(多个条件共同作用产生一个反应)
举例:我们高考填志愿选择大学,比如学校是否是名校、专业是否是热门专业、师资力量行不行、宿舍环境好不好,都是我们考量的。
5.激活函数
激活函数最简单的理解就是0-1,0代表未被激活,1代表激活(相当于与或计算)。但是实际中不大可能是非0即1的算法,所以需要连续光滑等性质,因此,激活函数选择Sigmoid函数,也称为挤压函数。
之后深入学习CNN和相关模型后,我们会发现Sigmoid函数也有它的弊端,比如 Sigmoid函数饱和使梯度消失 (X越接近无穷,返回值的变化越小)。
二、神经网络
1.感知机
由两层神经元组成,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,也称为 阈值逻辑单元。(普通的两层神经元连接)
但是感知机只有一层功能神经元,学习能力非常有限,只能解决一些线性可分问题。因此实际应用中几乎很少用。(神经元作为神经网络的基本单元很重要,但大量的神经元连接才能产生复杂的作用)
2.多层网络
要解决非线性可分问题,就要用到多层功能神经元。
因此在解决实际模型中,最常见的是多层网络,也称为 多层前馈神经网络 。前馈网络的意思是,神经元之间不存在同层链接也不存在跨层链接。(同级互不干扰,不跨层干扰)
同时在多层网络中,输出层和输入层之间的神经层称为隐层或隐含层。(中间层)
如上图,最下面是输入层,四个节点代表四维输入向量;最上面是输出层,四个节点代表四个输出值;中间的一层即是隐层。可以理解前馈网络和隐层的意思。
神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权”(connection weight)以及每个功能神经元的阈值;换言之,神经网络“学”到的东西,蕴涵在连接权与阈值中,
3.误差逆传播算法(BP神经网络)
误差逆传播算法,BackPropagate,又称为BP网络、BP算法。是P.Werbo博士于1974年提出的,该算法是当前最优异的神经网络算法,是数学建模和许多科研研究必不可少的算法。注意,这节公式推理很多,一遍可能不好理解,要仔细多看几遍。后续研读论文许多都是公式推导,要会看懂公式推导。
给定训练集D={(x1,y1),(x2,y2),......,(xm,ym)},xi∈R,yi∈R,注意是训练集,我们要训练模型。
输入是 d 维特征向量;输出是 l 个输出值。 隐层是 q 个隐层神经元组成的。 假定功能单元均用Sigmoid激活函数f(x)
β是输出层神经元接收到的输入信号,θ是输出层神经元的阈值。(右下角的角标j代表第j个输出神经元,这里是简化了好理解)
我们设定的激活函数为Sigmoid,用f(x)表示;输入信号减去阈值,就是净输入;套入激活函数,得到输出结果 y=f(β-θ)
因此,详细来说,对于(第k个样例)训练例,假定网络的实际输出为
其中:
则网络在上的均方误差为:
可以看到是由
和
决定的。
需通过学习确定的参数数目为:,可以思考下怎么确定的。
BP算法是一个迭代学习算法,在迭代的每一轮中采用广义感知机(知道这个名就行)学习
看式子很好理解,主要就是要知道的变化,
是源自 误差
BP算法是基于梯度下降策略,以目标的负梯度方向对参数进行调整
梯度下降算法:一种优化算法,通过迭代调整模型参数,沿着损失函数梯度的方向逐步降低损失,以找到使模型最优的参数值。(简单理解就是越小越好,不断执行找到极小点)
梯度下降算法:一种优化算法,通过迭代调整模型参数,沿着损失函数梯度的方向逐步降低损失,以找到使模型最优的参数值。(简单理解就是越小越好,不断执行找到极小点)
以隐层到输出层的连接层为例
误差,给定学习率
(学习率在0-1),有:
右侧的是求偏导,即求出梯度的方向,
决定了幅度。学习了线性回归对这个不难理解。但w和E没法之间求偏导,注意到
先影响到
,再影响到
,然后才影响到
,有:
(链式法则,微积分中应该也有涉及)
接下来是运算,可以看下图的推理理解即可,得到的值
同理等都能算出来了,不再演示,理解即可。
4.BP算法概括
BP神经网络的流程大概就是一开始所有权重参数随机生成,输入x,经过一轮后,得到。
再和
得到误差
,再根据上面的运算,得到权重的
值,比如
。
再通过迭代,再训练得到
,继续得到
,在得到
值,再迭代变化,再训练…
因此,我们也可以理解,当值趋于零的时候,模型的性能理论上就是最优越的,因为不再需要变化调整。
但是,如果我们的值每次变化太大,会造成模型的振荡,总是无法达到
值趋于0的效果;相反
值变化太小的话,需要很多次的训练才能让
值趋于0,会浪费很多算力。除了训练效果不好,还有更棘手的过拟合问题:其训练误差持续降低,但测试误差却可能上升。
为了解决值变化太大或太小的问题,我们要合理选择训练的轮数(round/epoch),这个不难理解。BP算法概括中:
再通过
迭代,再训练得到
,继续得到
,在得到
值,再迭代变化
这就是一轮训练,很好理解。
选择训练轮数要结合算力与值变化的考量,比方说
值基本上在0.01左右徘徊,就停止训练。最重要的是,
值是有学习率
决定的,我们对学习率的选择也是决定模型训练效果的重要因素。
因此,模型训练轮数的选择,学习率的选择也是可以进行讨论的,这就是敏感度分析,是数学建模取得高奖项必不可少的一步。
除了定量讨论,像是动态学习率也是可以考虑的方向。
在现在的实验研究中,解决过拟合是主要问题,这里提供两种方案解决过拟合问题,当然这也是一个研究方向:
1.早停
训练集误差降低,测试集误差升高停止训练。
2.正则化
通过在损失函数中添加惩罚项来限制模型复杂度,防止其过度拟合训练数据。