BP神经网络介绍:
BP神经网络的结构为1个输入层,多个隐藏层,一个输出层。
BP神经网络分为正向传播和反向传播。
以下介绍一次迭代过程
正向传播过程:
每一层以前一层的输出结果的线性组合为输入,即赋予每个节点输出的权值w,以及加上一个偏置量b,进行线性组合。
举个例子:假如第二层有四个节点,第三层有三个节点,那么W将是一个3*4的矩阵,矩阵第i行的数值代表关于第三层的第i个节点的权重,B是一个3*1的矩阵,矩阵第i行的数值代表关于第三层第i个节点的偏置量,X是第二层的输出,为4*1的列向量,。W*X+B得到3*1的向量,作为第三层的三个节点的输入。(注意,此1代表是一个样本,如果是X是4*2的矩阵,则代表有两个样本在进行训练,那么得到的W*X为3*2的矩阵,W*X+B对于python的处理方式,是将列向量B加到矩阵的每一项中,因此最终得到3*2的矩阵,作为第三层的输入,每一列是一个样本处理结果。)
将这些输入、权重、偏置当做矩阵、向量来处理,可以很方便的调用python中的np包,进行矩阵的运算,而不必使用for循环进行节点之间重复操作。
每一层使用激活函数对输入进行处理,转化为输出,可以采用RELU函数,Sigmod函数,tanh函数。
RELU函数:y=max(0,x)
Sigmod函数:
,y对x的求导结果为:
tanh函数:
y对x的求导结果为:
求导结果在正向传播是用不到的,这里只是提前介绍一下。
相邻隐含层按照上述正向传播过程传播,直到传递到输出层。
反向传播:
输出层按照损失函数的公式进行计算,计算公式是:E =
此公式中的即输出层的输出结果,
是前面一层隐含层的权值W、偏置B的函数,
,
,因此可以使用链式法则对W和B求偏导,求的此处的dW和dB值。
再用,
,对W和B进行更新,
是学习率经常位于0-1之间。
之前的每一层的W和B都要进行如此的求导和更新,直到第一层。
如此一次迭代过程结束。
问题1:权值w、偏差b的初始化如何设置?
采用随机初始化,但随机的时候要乘以系数0.01,尽量保证w和b不要太大,否则在进行线性计算时得到的Z值较大,从而在激活函数y=sigmod(z)中,由于z较大使得函数处于较为平缓的位置,使用梯度下降进行迭代的次数会提高很多。
问题2:什么是梯度下降?因为想让损失函数的值取得最小,损失函数可以看成自变量为各个权值和偏置的函数,理想情况是只要让损失函数对这些自变量求偏导,偏导数的值为0,一般情况下在此时的w,b的情况下损失函数的值就是最小的,但是直接求偏导数等于0解方程很麻烦。因此采用梯度下降,本质还是让自变量不断接近偏导数为0的点。根据公式
当dw大于0时,W减小接近于0;当dw小于0时,W增大接近于0。
问题3:神经元数量和隐含层个数如何确定? 所有隐含层的神经元个数的数量设置为相同就可以,一般先根据经验公式设置隐藏层:隐藏层设置为两层就够了;再根据经验公式设置神经元个数:大小在输入神经元个数和输出神经元个数之间,或者设置为输入层大小的三分之二加上输出层大小的三分之二。
根据经验公式可能会出现过拟合或者拟合不足的情况,再对此进行修改即可。
问题4:为什么分为训练集、验证集、测试集?
在进行BP神经网络的时候,要将数据集分为训练集、验证集、测试集。训练集的作用是进行拟合优化和参数优化,不断调整参数。验证集的作用也是调整参数,但是是为了避免训练集得到的模型出现过拟合或者欠拟合的情况(过拟合是指在训练集表现好,验证集表现不好,可以考虑减小特征数量;欠拟合是在训练集表现不好,验证集表现不好,可以考虑选用更复杂的模型),因此从训练集中分出一部分进行数据,还是对训练集得到的模型进行调整。测试集是进行模型性能的评价。
当验证集泛化程度停止改善时,模型训练也就终止了。
问题5:训练BP神经网络的算法? 我采用的LM算法。
其实BP神经网络正向反向传播过程中有很多可以优化的地方, 列文伯格-马夸尔特(LM算法)为BP神经网络的一种训练方法,过程就是梯度下降的优化过程,只不过在其中引入了一些优化措施。LM算法收敛性比较好。
一些术语:
均方误差MSE:即为损失函数。
validation checks: validation checks = 6表示若经过6次迭代,验证误差都不再明显减小,就没有必要训练下去了。
gradient的值为梯度的值。