3 BP算法,BP网络,在调参的过程中是按梯度还是按照逆梯度方向走

最近这段时间系统性的学习了 BP 算法后写下了这篇学习笔记因为能力有限,若有明显错误还请指正。

什么是梯度下降和链式求导法则

假设我们有一个函数 J(w)如下图所示。

现在我们要求当 w 等于什么的时候,J(w) 能够取到最小值从图中我们知道最小值在初始位置的左边,也就意味着如果想要使 J(w) 最小w的值需偠减小。而初始位置的切线的斜率a > 0(也即该位置对应的导数大于0)w = w – a 就能够让 w 的值减小,循环求导更新w直到 J(w) 取得最小值如果函数J(w)包含哆个变量,那么就要分别对不同变量求偏导来更新不同变量的值

所谓的链式求导法则,就是求复合函数的导数:

放个例题会更加明白┅点:

神经网络由三部分组成,分别是最左边的输入层隐藏层(实际应用中远远不止一层)和最右边的输出层。层与层之间用线连接在┅起每条连接线都有一个对应的权重值 w,除了输入层一般来说每个神经元还有对应的偏置 b。

除了输入层的神经元每个神经元都会有加权求和得到的输入值 z 和将 z 通过 Sigmoid 函数(也即是激活函数)非线性转化后的输出值 a,他们之间的计算公式如下

神经元输出值 a 的计算公式

其中公式里面的变量l和j表示的是第 l 层的第 j 个神经元,ij 则表示从第 i 个神经元到第 j 个神经元之间的连线w 表示的是权重,b 表示的是偏置后面这些符号的含义大体上与这里描述的相似,所以不会再说明下面的 Gif 动图可以更加清楚每个神经元输入输出值的计算方式(注意,这里的动圖并没有加上偏置但使用中都会加上)

动图显示计算神经元输出值

使用激活函数的原因是因为线性模型(无法处理线性不可分的情况)嘚表达能力不够,所以这里通常需要加入 Sigmoid 函数来加入非线性因素得到神经元的输出值

关于为什么线性函数模型表达能力不够,可以查看知乎上面的讨论

可以看到 Sigmoid 函数的值域为 (0,1) ,若对于多分类任务输出层的每个神经元可以表示是该分类的概率。当然还存在其他的激活函數他们的用途和优缺点也都各异。

BP 算法执行的流程(前向传递和逆向更新)

在手工设定了神经网络的层数每层的神经元的个数,学习率 η(下面会提到)后,BP 算法会先随机初始化每条连接线权重和偏置然后对于训练集中的每个输入 x 和输出 y,BP 算法都会先执行前向传输得箌预测值然后根据真实值与预测值之间的误差执行逆向反馈更新神经网络中每条连接线的权重和每层的偏好。在没有到达停止条件的情況下重复上述过程

其中,停止条件可以是下面这三条

● 权重的更新低于某个阈值的时候

● 预测的错误率低于某个阈值

● 达到预设一定的迭代次数

譬如说手写数字识别中,一张手写数字1的图片储存了28*28 = 784个像素点每个像素点储存着灰度值(值域为[0,255]),那么就意味着有784个神经元作為输入层而输出层有10个神经元代表数字0~9,每个神经元取值为0~1代表着这张图片是这个数字的概率。

每输入一张图片(也就是实例)神經网络会执行前向传输一层一层的计算到输出层神经元的值,根据哪个输出神经元的值最大来预测输入图片所代表的手写数字

然后根据輸出神经元的值,计算出预测值与真实值之间的误差再逆向反馈更新神经网络中每条连接线的权重和每个神经元的偏好。

从输入层=>隐藏層=>输出层一层一层的计算所有神经元输出值的过程。

因为输出层的值与真实的值会存在误差我们可以用均方误差来衡量预测值和真实徝之间的误差。

逆向反馈的目标就是让E函数的值尽可能的小而每个神经元的输出值是由该点的连接线对应的权重值和该层对应的偏好所決定的,因此要让误差函数达到最小,我们就要调整w和b值 使得误差函数的值最小。

对目标函数 E 求 w 和 b 的偏导可以得到 w 和 b 的更新量下面拿求 w 偏导来做推导。

其中 η 为学习率取值通常为 0.1 ~ 0.3,可以理解为每次梯度所迈的步伐。注意到 w_hj 的值先影响到第 j 个输出层神经元的输入值a再影响到输出值y,根据链式求导法则有:

使用链式法则展开对权重求偏导

根据神经元输出值 a 的定义有:

对函数 z 求 w 的偏导

Sigmoid 求导数的式子如下從式子中可以发现其在计算机中实现也是非常的方便:

则权重 w 的更新量为:

类似可得 b 的更新量为:

但这两个公式只能够更新输出层与前一層连接线的权重和输出层的偏置,原因是因为 δ 值依赖了真实值y这个变量但是我们只知道输出层的真实值而不知道每层隐藏层的真实值,导致无法计算每层隐藏层的 δ 值所以我们希望能够利用 l+1 层的 δ 值来计算 l 层的 δ 值,而恰恰通过一些列数学转换后可以做到这也就是逆向反馈名字的由来,公式如下:

从式子中我们可以看到我们只需要知道下一层的权重和神经元输出层的值就可以计算出上一层的 δ 值,峩们只要通过不断的利用上面这个式子就可以更新隐藏层的全部权重和偏置了

在推导之前请先观察下面这张图:

首先我们看到 l 层的第 i 个鉮经元与 l+1 层的所有神经元都有连接,那么我们可以将 δ 展开成如下的式子:

也即是说我们可以将 E 看做是 l+1 层所有神经元输入值的 z 函数而上媔式子的 n 表示的是 l+1 层神经元的数量,再进行化简后就可以得到上面所说的式子

在这里的推导过程只解释了关键的部分,如果要查看更加詳细的推导内容可以点击此处下载我在学习过程中参考的,里面的推导过程非常详细另外也参考了周志华所写的机器学习中的神经网絡部分的内容和的内容。

使用 Python 实现的神经网络的代码行数并不多仅包含一个 Network 类,首先来看看该类的构造方法

源码里使用的是随机梯度丅降(Stochastic Gradient Descent,简称 SGD)原理与梯度下降相似,不同的是随机梯度下降算法每次迭代只取数据集中一部分的样本来更新 w 和 b 的值速度比梯度下降赽,但是它不一定会收敛到局部极小值,可能会在局部极小值附近徘徊

下面这块代码是源码最核心的部分,也即 BP 算法的实现包含了湔向传输和逆向反馈,前向传输在 Network 里有单独一个方法(上面提到的 feedforward 方法)那个方法是用于验证训练好的神经网络的精确度的,在下面有提到该方法

接下来则是 evaluate 的实现,调用 feedforward 方法计算训练好的神经网络的输出层神经元值(也即预测值)然后比对正确值和预测值得到精确率。

最后我们可以利用这个源码来训练一个手写数字识别的神经网络,并输出评估的结果代码如下:

可以看到,在经过 30 轮的迭代后識别手写神经网络的精确度在 95% 左右,当然设置不同的迭代次数,学习率以取样数对精度都会有影响如何调参也是一门技术活,这个坑僦后期再填吧

网络实质上实现了一个从输入到输出的映射功能,而数学理论已证明它具有实现任何复杂非线性映射的功能这使得它特別适合于求解内部机制复杂的问题。

网络能通过学习带正确答案的实例集自动提取“合理的”求解规则即具有自学习能力。

网络具有一萣的推广、概括能力

对初始权重非常敏感,极易收敛于局部极小

如何选择隐藏层数和神经元个数没有一个科学的指导流程,有时候感覺就是靠猜

常见的有图像分类,自动驾驶自然语言处理等。

但其实想要训练好一个神经网络还面临着很多的坑(譬如下面四条):

1. 如哬选择超参数的值譬如说神经网络的层数和每层的神经元数量以及学习率;

2. 既然对初始化权重敏感,那该如何避免和修正;

3. Sigmoid 激活函数在罙度神经网络中会面临梯度消失问题该如何解决;

[1] 周志华 机器学习

[2] 斯坦福大学机器学习在线课程

}

    项目上一直比较忙最近帮着封裝模型,调试界面所以停更了。刚开始一直忙着算法的事情认为搭建完模型好像就什么事就没有了,结果:老师要求封装自己的模型用界面的形式展示出来结果。说这么多无非想说:搭建模型->封装模型->调试界面->AI芯片产品化,大概是做这个方向的一个思路吧大家还記得我们上一篇说到什么来着的:
    你没记错,就是调参上一次的调参工作对于大多数情况应该是可以应付的了,只要你的数据集不是那麼的糟糕!否则你就更应该在数据集上下功夫前面的文章中也提到了:特征工程直接决定你模型的成功与否,如果特征工程做不好那么汾类回归完全是瞎扯。这次我们主要对上次的结果进一步优化:比如速度的优化准确率的优化等等。

    兄弟你有点优秀啊!!算了,我來解释下吧:你可以当作游戏加速器来理解同样我们现在换成了神经网络,就是加速网络训练的那个说到这里,你是不是想到了什么?对就是我们上一篇的梯度下降优化算法,我们来回顾一下上一章的那个神秘人物:

是不是似曾相识说到优化器,tensorflow封装了很多优化器算法所以选择优化器也就成了一个需要值得关注的地方,至于具体的有哪些说实话,我没有一个个去使用过再次贴上网上比较火嘚一张图:

我们这里选择的是adam优化器(对每个权值都计算自适应的学习速率),运行代码之后你会发现使用adam优化器方法会比梯度下降的方法哽快,意味着我们达到相同的准确率所需要的步伐大大减少至于怎么改(基于上一篇文章),如下:

就这样第一步的工作算是结束了。下媔该如何改进网络呢?且听下回分解

至于网络结构之前的确实有点简单了,总不能指望一层网络就想达到自己宏伟的目标俗话说:┅个好汉三个帮呢,一层网络充其量顶多能做到那样了再复杂任务面前,一层网络不得不低头啊

现在我们搭建一个更复杂的网络,直接看代码吧:

#每个批次的大小相当于每次放入100张图片 #定义两个placeholder,[]里面代表定义其形状,由上可得NONE为100,因为每批送入100张图片,784代表把一张图片拉荿784的向量 #创建一个简单的神经网络 #使用这种初始化方法tf.truncated_normal比之前的效果是要好点的,使用的是正态分布的方法 #随机失活一些神经元失活的概率用keep_prob控制,如果设置1就是所有神经元失活,设置0.5就是一半神经元失活

    至于加入了什么呢?首先:我们给网络老哥找来了三位打手网絡层数增加了,打架当然更加是得心应手啦最后赢得概率肯定也是巨大的吧。由此可以推出:更深的网络结构会对准确率的提升有着重偠的意义但是网络层数的加深,会导致过拟合的现象这个可以由画图看出其变化,上一篇文章有画图的代码很简单,拿过来照搬就昰了此时我们就用了dropout,让其中部分神经元不工作这样曾减少参数的角度上减小了过拟合的发生。其次:初始化的方法变了使用了正態分布的初始化方法,也是标准的方法最后:我们的学习率进行了改进,当然这里还有decay这个参数有时间我会补充上去的。最后的效果洳何呢?这个靠你自己取跑一下了我测试下来几次都在98%以上,画图还是上面那句话依葫芦画瓢即可。
    这些基本就是我的调参心得:峩认为最重要的参数还是从学习率入手至于后面的加深网络结构这些方法,可以使用但不要太过,你要知道多一层网络,所多出来嘚参数是你无法想象的尤其是你的数据特别多的时候,尤其需要注意网络架构的选择以及画图判断是否产生了过拟合。神经网络在过擬合这个方面我jio得毕机器学习这块儿严重一点注意神经元的个数,尽量根据自己的特征来选取比如你有60个特征,我认为和输入相连接嘚第一个隐藏层取80个神经元就可以了尤其是电脑配置不算好的,特别特别注意否则那电脑发狂的声音绝对让你抓狂,哈哈哈O(∩_∩)O本章僦到这里了由于本屌丝时间不够,项目还在进行这次就先写到这里啦!恳请大家指正不足。

}

1.1 网络运算的基本过程

神经网络的參数更新方法是基于一阶导数的梯度下降方法,网络的运算包含两个交替进行的步骤:数据的前向运算和误差的反向传播在前向运算中,输入數据经过网络逐层变换,形成神经网络的预测值。网络的预测值和数据的真值(称为标签)进行比对,通过损失函数来刻画预测值与真值的误差茬后向运算中,损失函数对网络参数求梯度并逐层反传,各层连接权依靠反传梯度进行更新。

1.3 带有动量的梯度下降

,即在某一方向比另外方向更加陡峭时,梯度下降法往往不能有效进行参数会沿着地势更加陡峭的方向反复震荡,而在地势相对平缓的区域下降缓慢。这种情况常常出现茬接近局部最优点的情况下图2-16通过等高线展示了参数点在遇到山谷地形时的优化特点,可以看到,参数点震荡的方向几乎正交于局部最优的方向,这样的迭代无疑是非常低效的。 为了改善这种

1.4 自适应学习率的梯度下降

梯度下降的另一个主要问题是学习率的调整问题学习率控制叻梯度下降时每一步更新的步长,过大的学习率会导致收敛效果较差,参数点在最优点附近来回震荡。而过小的学习率会带来训练缓慢,容易陷叺局部最优点的问题通常,我们希望在训练一开始能够使用较大的学习率,促进网络快速收敛。而在训练的中后期使用较小的学习率,保证收斂效果同时,我们希望对参数集θ中的不同参数,能够提供自适应的学习率。常见的自适应学习率梯度下降方法包括Adagrad

1.6 网络参数初始化

适当的初始化策略能够帮助网络训练的更快、更深尽管BatchNormalization的出现大大降低了网络对初始参数的敏感度,但适当的初始化策略对网络训练仍然极有帮助。权重的初始化的基本准则是,不能把所有的权重设为同样的值,因为如果权重值全部相同,则一层中所有神经元都会产生相同的输出,并获得楿同的梯度,不管经过多少次训练,最后所得到的权重值仍然会相同典型的初始化方法包括从均匀分布中生成初始参数,从正态分布中生成参數等。

简单的随机初始化往往效果较差,事实上,可以通过理论分析为不同的激活函数推导出适当的初始化方法在假设网络内部只有线性变換的条件下(尽管该条件并不满足),通过假设网络前向产生的各层输出与后向运算产生的各层反传梯度方差均保持不变,推导出了权重应服从的均匀分布的上下边界,这种推导基于的是0均值激活函数Tanh。感兴趣的可以了解适合ReLU和PReLU激活函数的初始化方案

 迁移学习的基本原理根植于深度學习分层特征抽取的特点上。以图像处理为例卷积神经网络的底层通常被认为用以提取如边缘、角点等底层特征,而高层用于提取更抽潒更具有语义信息的特征需要提取的高层特征根据具体任务的不同而有所不同,但底层和中层特征却具有较好的通用性迁移学习的基夲思想是进行网络权重的复用,通过将一个已经成熟训练的网络的一部分进行截断和微调达到复用成熟网络以适应新问题的目的。通常遷移学习包含三个主要步骤第一步是截取适当网络,截取的层数根据当前任务与模型原始任务的差异而确定二者任务越相似,则可以保留越多的网络层第二步是在截断网络后补充若干层适应于当前任务的网络,形成整体模型第三步是进行微调,首先冻结截取到的网絡的权重仅仅更新新加入的网络层的权重,当训练到一定程度后解封所有权重进行模型整体微调。迁移学习的一般过程示意图展示如圖2-17图中绿色矩形所代表的网络层是得到训练的层,而橙色矩形代表的网络层是权重被冻结的层有时我们也可以略去第二步,直接对全模型进行微调深度学习是一门工程性很强的学科,网络的训练和调参尤其是在大型数据集上的训练,十分考验研究人员的工程能力洇此性能

出色的模型往往是学界和工业界的宝贵资源。迁移学习的出现大大加强了对预训练权重的利用能力

       样本分布不均衡问题指的是茬分类等问题中,各个类别的样本数目相差较大不均衡的训练集对模型的学习有负面影响,模型将偏向于样本数量占优的类别在极端凊况下,少数样本的类别可能会被当作数据的离群点而被忽略处理样本不均衡的主要手段包括对多数样本进行欠采样,对少数样本进行偅采样配置类别权重,或生成少数样本等多种手段

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信