BP神经网络拟合非线性函数
本章涉及知识点:
1、多层神经网络的数学模型
2、前向传播算法
3、经典激活函数
4、经典损失函数
5、神经网络的优化过程
6、反向传播算法的推导
7、梯度下降算法优化
8、衰减学习率的设计
9、案例引出—拟合非线性曲线
10、python编程实现拟合非线性曲线
11、结果分析
一、多层神经网络的数学模型
通常一个多层神经网络由L层神经元组成,分为输入层、输出层和隐藏层
多层神经网络的数学模型输入层:神经网络的第一层,表示一列或多列矩阵的输入
输出层:神经网络的最后一层,表示网络最终的输出结果,通常是一列矩阵
隐藏层:神经网络的中间层,有L-2层,表示每一层神经元通过前向传播算法计算的结果矩阵
上述数学模型理论上可以学习模拟出任何的映射函数,下面我们定义出神经网络中的所有变量含义
X表示:神经网络的输入矩阵:
输入矩阵y表示:神经网络的最终输出矩阵:
输出矩阵第l层的输出表示:第l层隐藏层的第i个神经元的输出,设第l层的有k个神经元,则第l层的输出为:
表示:第l-1层的第j个神经元和第l层的第i个神经元的连接权重,即两个神经元之间的突触
表示:第l层第i个神经元的偏置项
表示:第l层第i个神经元的输入
二、前向传播算法
前向传播算法指的是依次向前计算相邻隐藏层之间的连接输出,直到模型的最终输出值。其特点是:
作用于相邻层的两个神经元之间的连接计算,且前一层神经元的输出是后一层神经元的输入
设对于第l层的第i个神经元,有l-1层的n个神经元与该神经元有突触相连,则
第l层的第i个神经元的输入为:
第l层的第i个神经元的输入第l层的第i个神经元的输出为:
第l层的第i个神经元的输出其中f(.)表示神经元的激活函数
三、经典激活函数
由于线性函数具有叠加性,使得无论计算多少层隐藏层,最后的输出结果都是线性变化的,即整个模型都是线性的。但是实际生活中大多数问题都是非线性问题,而线性模型处理这些非线性问题的效果是非常不理想的,为此我们需要对每个神经元的输出做非线性变化,使得整个模型非线性
激活函数的目的:去除每个神经元输出的线性化,使得整个神经网络模型呈非线性化
神经网络中常用的几种非线性激活函数为
(1)sigmod函数
sigmod函数其导数为
sigmod导数(2)双曲正切函数
双曲正切函数其导数为
双曲正切函数导数(3)ReLU函数
ReLU函数四、经典损失函数
损失函数的意义:神经网络学习到的模型效果,以及优化的目标是通过损失函数来定义量化的
监督式学习有两大类问题:分类和回归
分类问题:根据事先的样本和分好的类目,学习一个分类函数,使得它可以将新样本分类到正确的类目中
回归问题:根据事先的样本和对应的数值,学习一个回归函数,使得它可以用新的输入预测出具体的数值
无论对于学习到的分类函数,还是回归函数,其本质都是模型的前向传播算法
(1)对于分类问题:
我们需要事先定义一个场景(规模),准备好若干样例样本和定义好的所有类目,然后训练神经网络模型学习这个样本的分类逻辑规则,最后对于输入的任何一个新样本,模型都可以输出其所属的类目
需要注意的是,在分类问题的最终输出结果里,由于我们将“一个样例属于某一个类别”视为一个概率事件,则该样例属于所有类目的各自概率就构成了该样例的概率分布,而神经网络的输出却不一定是概率分布,为此我们可以用softmax将结果转化为概率分布:
softmax输出概率分布最后我们使用交叉熵函数,来描述模型输出概率分布p和真实概率分布q之间的距离,即量化其分类损失
交叉熵函数(2)对于回归问题:
我们需要事先准备一组输入输出的数据样本集,然后训练神经网络模型学习这个样本的输入输出映射法则,最后对于任意一个实数R,模型都可以预测出一个具体的数值
我们可以用MSE(均方误差)来描述模型输出结果和真实结果的距离,即量化其回归损失
MSE函数五、神经网络的优化过程
神经网络的优化步骤可以分为下面两个阶段:
(1)通过前向传播算法,通过矩阵乘法计算出输出值,并将真实值和输出值对比得到两者之间的差距
(2)通过反向传播算法,计算损失函数对模型中每个参数的梯度,通过梯度下降算法来更新每一个参数
至此我们可以看到反向传播算法的艺术为:
反向计算出损失函数对每一层隐藏层的突触的梯度,并更新优化其上一层隐藏层的突触。使得神经网络每一次学习到的模型都变得更加聪明
六、反向传播算法的推导
我们先整理出前向传播算法中第l隐藏层的第i个神经元的输入和输出为
第l层第i个神经元的输入 第l层第i个神经元的输出结合上面两个式子,可以得到第l层第i个神经元的输入和第l-1层第i的神经元的输出的函数关系为
第l层第i个神经元的输入为了推导方便,我们定义第i个神经元的损失函数为
第i个神经元的损失函数其中dk(i)表示第i个神经元的真实输出值,yk(i)表示神经网络模型计算出的输出值
下面推导第i个神经元的误差对第l-1()层第j个神经元对第l-2层第i个神经元的突触权重的梯度为:
第l-1层第j个神经元的梯度计算1上式最后3个偏导数的意义为
:表示第l层的第k个神经元的输入对第l-1层的第j个神经元的输出的偏导数
:表示第l-1层的第j个神经元的输出对第l-1层的第j个神经元的输入的偏导数
:表示第l-1层的第j个神经元的输入对第l-1层第j个神经元和第l-2层第i个神经元的权重的偏导数
分别计算出这3个偏导数为
第一个偏导数 第二个偏导数 第三个偏导数带入这三个偏导数,得
第l-1层第j个神经元的梯度计算2同理可以推导出第l-1层第j个神经元的偏置项梯度为:
第l-1层第j个神经元的偏置项梯度为了方便整理输出结果,我们定义
每一层隐藏层的误差系数可以整理出第l-1层的第j个神经元的权重梯度和偏置项梯度为:
由数学归纳法,可以得到第l层的第j个神经元的权重梯度和偏置项梯度为:
七、梯度下降算法优化
得到每一个隐藏层的连接权重和偏置项的梯度后,我们利用学习率和梯度下降算法更新每一层的连接权重和偏置项
梯度下降算法八、衰减学习率的设计
在配合梯度下降优化的过程中,如果学习率设置过大,则容易导致模型过拟合;如果设置过小,会使得模型优化的速度变得很缓慢。为此我们加入衰减因子和学习次数来计算模型每次学习的学习率
衰减学习率这样做的优势是:在初始学习阶段,学习率会较大;随着学习次数的增加,学习率会依次降低
九、案例引出—拟合非线性曲线
案例:求一个神经网络模型,可以拟合下面曲线
案例拟合非线性曲线 案例曲线显然这是一个回归问题,我们构建出案例的神经网络模型如下:
输入层规模:100x1,第一个隐藏层规模:1x24,第二个隐藏层规模:24x3,输出层规模:3x1
则模型按照前向传播算法和矩阵乘法规则,计算过程如下
案例模型的计算过程最终我们得到了100x1的输出规模,即完成回归问题中输入和输出的一一映射关系
十、python编程实现拟合非线性曲线
前向传播算法:
前向传播算法反向传播算法:
反向传播算法训练BP神经网络:
训练BP神经网络十一、结果分析
模型运行结果如下
模型结果从结果中可以看到,学习到模型是一条光滑的曲线来拟合源数据点,且模型的误差在下降得越来越缓慢
至此,我们对比《最小二乘法—多项式拟合非线性函数》,可以总结出深度学习和传统机器学习的一些特点
(1)机器学习是一种实现人工智能的方法,它基于不同的具体数学算法
(2)深度学习是一种实现机器学习的技术,它基于包含多个隐藏层的神经网络
案例代码见:BP神经网络拟合非线性曲线