最初实现BP神经网络的时候,我只是简单地用梯度检验法检验了一下,验证自己的求导计算应该是没有问题的。

采用的是标准minist手写数字数据集,就是60000个训练样本和10000个测试样本那个。真的上实际数据测试,一跑,正确率居然只有10%左右!而我在读的Michael A. Nielsen的教程中,他通过Python构建的那个简单的网络,只运行一个世代就有90%以上的正确率,这个结果让我一度十分沮丧。如果我写一个简单的程序,每次都猜这个数字是0,正确率大概也会是10%吧。这真的是个很悲惨的正确率,否定了我的全部劳动成果!

那个时候我对“超参”这个概念还没有特别深入的体会,因为是自己造的轮子,我首先依然是从bug检查,首先发现的问题是,W2矩阵,也就是第一层隐藏层前的权重矩阵内的值居然都近乎为0,我想起看过但还没开始学习的概念“导数消失”。当时我的理解是,如果输入层到第一个隐藏层的权重几乎都是0,这不就意味着输入对最终结果的影响不大吗?

0.1.标准化(normalization)
  我第一个想到的点是输入的取值范围为0~255,但事实上网络接受的值最好还是0~1之间或者-1到+1之间的吧?如果你采用的是随机(-1~+1)初始化参数,所以假如你不做标准化,这部分的运算就会纳入参数迭代的过程中,通过梯度更新的方式来迭代变化。我做出的第一个改变是对输入作了标准化,特征值载入前将其除以255,使得特征值的取值范围在0~1之间。

然而,结果并没有太大的改变。不过这样的尝试还是在我心中构建了一个标准化的概念,同时还让我产生了这样的思考,认为之所以图像识别用计算机来处理这么方便,其实就是因为图像很容易描述成一串量纲等价的向量。目前成熟的机器学习形式最认可的输入也正是这种天然就具有标准、独立、量纲等价的向量。

0.2.世代(epoch)

即样本集遍历次数。显然,世代与运行时间呈线性关系。

这个概念是吴恩达的机器学习视频课里没有提及的。他讲mini-batch的时候,并没有说世代。以至于我最开始的学习一直都是以“世代=1”的方式进行的,在Nielsen的教程中对这个概念也没说得很详细。我认为世代这个概念体现的是一个样本要利用几次。尤其是当你的训练样本比较少的时候,如果一个样本只用了一次,很可能会出现未收敛的情况。

其实,原先世代这个概念之所以会让我感到困惑,还是因为它跟mini-batch的矛盾。mini-batch这个概念好像天然地暗示了一个样本只用一次,世代却把这种概念推翻了。现在想来,这个问题应该这么看,mini-batch的定义,是为了在有限的世代内尽可能多的迭代。更多关于mini-batch的讨论留到下面说。

0.3.偏斜更新(bias update)

在吴恩达的教学视频中,偏斜永远是1不需要更新,Nielsen的笔记则不然,仅只是在正则化的时候忽略偏斜。

从数学角度上讲,即使偏斜始终为1,仅仅通过权重矩阵W自身的变化,也可以实现相同的学习效果,这个问题可能跟标准化一样,将偏斜的更新任务移交给了W,个人倾向于更新偏斜,这样可以最大化利用BP算法计算出的残差。实际测试表明,在充分训练(收敛)的情况下,是否更新偏斜对结果影响不大。

1.训练样本数量m

最没有悬念的放在第一个说,已经有成熟的理论表明,基于大量真实样本的前提下,就连最简单的感知机都可以做得很好。就本数据集而言,事实上4000个训练数据就可以得到差不多90%的正确率,如果把训练数据提升10倍,正确率大概能有2%的提升,不算特别明显。当然,这全部都是基于MINIST训练集和测试集而言的。

从感性上来说,训练样本应该有一种多样性的定义。所以衡量样本,更多的应该从“多样性”的层面去分析。如果再说得功利和具体一点,应该是针对测试样本的多样性。简言之,如果我预先知道或者可以大概估计到需求的“多样性”,那么理论上我只需要能满足这些“多样性”最具代表性的样本进行训练即可,事实上这也是最理想的学习方式。也就是说,最好的样本,应该是最接近实际需求“多样性”的样本。而绝不是一味地增加数量。

说个题外话,前几天我看到因人工智能催生的新产业——人工标注。就是在第三世界国家雇佣一些廉价劳动力给图片做标注,以此扩大训练集数量。足以见得带标签的样本是多么宝贵的资源。本人对这种大规模流水线式的人工智能持一种悲观态度,这种方式跟马拉火车一样荒唐。

样本数量的增加跟学习时间基本呈一个线性增加的关系。另外还有一点值得注意的是,如果用了较小的训练集和测试集,一定记得随机抽取,不要每次都只取前一部分,这样很没有代表性。

2.学习率n

这个超参大概也是比较容易确定的,这可能是少数几个类似mini-batch或世代这样可以通过牺牲运行速度来达到最佳效果的超参,它影响的是迭代的速度。如果设得及其小,就可以保证每次迭代都一定会相应地降低损失,但这样会增加收敛需要的迭代次数。如果设置得大了,就可能无法收敛。

学习率可以很容易从每次迭代后的正确率看出来,一般最初的几次迭代对正确率的提升都很大,随后提升越来越慢。如果波动巨大,就证明学习率太大了。学习率还有一点值得声明的事情是,它是一个迭代速度的系数,原则上来说,它只跟模型参数的取值范围有关,当函数逼近最优解时,由于梯度的下降,收敛速度会自动下降,所以并不需要特意将它设成一个动态收缩的值。

学习率不会直接影响最终的正确率,基本不受其他超参的影响,它也不会影响程序的执行速度。它直接影响的是收敛次数,在定义学习率前,首先应该考虑的是你的运算能力,允许迭代多少次?(由mini-batch,世代数,样本数共同决定)学习率的设置应该满足在迭代次数内使函数收敛,即正确率不再进一步增大,而是在某个小范围内波动。

我认为学习率的调整应该基于这样的原则:首先选择较大的学习率,如1.0,根据学习曲线的波动情况进行小范围向下微调,如果学习曲线能基本保持线形,则可确定这就是要找的学习率了。

总之,学习率不要取得太小,因为时间很宝贵。

3.网络结构(net structure)

对网络结构的架构,比较直观的考虑是,以问题的复杂度为出发点,或者前文中谈到的样本的“多样性”。这里需要定义的是,网络有多少层,每层有多少个节点?(按照吴恩达的视频课程,隐藏层的节点数原则上一般相等)

这个问题可以套用一个已有的结论——只要有充足的样本,感知机也可以做得很好。实际的测试表明,网络的复杂性应该是同测试样本的复杂性相关的,当网络的复杂度尚未满足问题复杂度时,增加网络复杂度(最简单的方式就是增加节点数)可以提升正确率。

设定网络结构的策略可以是,首先从一个较小的节点数开始,比如8。逐步增加节点个数(可以是16、32、64),直到正确率不再明显上升为止。在本问题中,增加层数对正确率的提升并不明显,学习时间却相应地要增加一倍。我最终的网络结构选择是{784,64,10}。

网络结构与算法运行的时间基本成线性关系,所以应该尽量选择简单的网络。

4.小批量数(mini_batch)

即每次学习实际参与的样本数量,这个参数的定义是为了调和随机梯度下降法与完全梯度下降法之间的优缺点。如果这个值取得很小,比如2,那就意味着一个世代中,每2个样本就可以让参数更新一次,这样做会明显增加迭代次数,但显然也会让参数变得不稳定。

原则上来说,这个值会随着增高逐渐达到饱和(再提升也基本不会增加正确率了),有一点需要注意的是,样本数一定的情况下,增大批量数,会线性减少迭代次数这个隐性参数。

另外一点值得注意的是,一般样本都不可能完整整除批量数,比如样本数1000,批量数32,1000%32=8,出于公平原则,最后8个样本个人认为应该抛弃。另外,每个世代开始时都应该对样本重新洗牌然后按顺序提取训练数据。

5.正则化参数(lambda)

十分微妙的一个参数,它的数学意义是在每次更新权重前,先对其进行等比例衰减,L2正则化的衰减率为:                           (1 - n*lambda/mini_batch)它的性质跟学习率有点像,如果取0代表完全不衰减,取一个较小的非0值则会为正确率带来意想不到的提升,只需要一点点就行,一定不能取得太大,太大的正则化参数就跟太大的学习率一样,会让学习效果变得十分不稳定,而且无法收敛。

这个超参需要注意的点是,如果调整了学习率或批量数,衰减率也会相应发生变化,这个时候需要相应地调整衰减率。

正则化参数并不会影响程序的执行效率。

基于java的BP神经网络-初步调超参的体会相关推荐

  1. 【笔记】基于边缘检测和BP神经网络的大豆杂草识别研究

    <基于边缘检测和BP神经网络的大豆杂草识别研究> 单位:吉林农业大学信息技术学院 作者:侯雨 数据获取 设备:大疆 DJI 精灵3 相机:EXMOR 1/2.3 RGB 相机 拍照:飞行高 ...

  2. matlab 神经网络dpi,基于DPI和BP神经网络的P2P流量识别研究

    研究与开发 现代计算机 2019.04 上 文章编号:1007-1423(2019)10-0031-05 DOI:10.3969/j.issn.1007-1423.2019.10.007 基于 DPI ...

  3. 【机器学习】基于AutoEncoder的BP神经网络的tensorflow实现

    [机器学习]基于AutoEncoder的BP神经网络的tensorflow实现 一.基于AutoEncoder的BP神经网络 1.1.BP神经网络 1.1.1.BP神经网络结构 1.1.2.BP神经网 ...

  4. gwo算法matlab源代码,智能优化算法应用:基于GWO优化BP神经网络 - 附代码

    智能优化算法应用:基于GWO优化BP神经网络 - 附代码 智能优化算法应用:基于GWO优化BP神经网络 - 附代码 智能优化算法应用:基于GWO优化BP神经网络 文章目录智能优化算法应用:基于GWO优 ...

  5. Python基于PyTorch实现BP神经网络ANN分类模型项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...

  6. Python基于PyTorch实现BP神经网络ANN回归模型项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...

  7. 生猪价格matlab,基于时间序列的BP神经网络猪肉价格预测

    科技创新 2m6钎第20期I科技创新与应用 基于时间序列的BP神经网络猪肉价格预测 张津张瑞斌 (成都理工大学管理科学学院,四川成都610059) 摘要:猪肉价格是不稳定的,起伏变化的,猪肉价格的预测 ...

  8. 【智能控制实验】基于MATLAB的BP神经网络设计

    实验五:基于MATLAB的BP神经网络设计 一.实验要求: 重点是掌握BP神经网络的学习算法原理和代码设计方法,应用MATLAB编写BP神经网络训练方法:应用神经网络工具箱设计BP神经网络实现对输入输 ...

  9. 基于遗传算法的BP神经网络齿轮箱故障诊断实例

    一.BP神经网络概述 BP网络是一类多层的前馈神经网络.它的名字源于在网络训练的过程中,调整网络的权值的算法是误差的反向传播的学习算法,即为BP学习算法.BP算法是 Rumelhart等人在1986年 ...

最新文章

  1. 膨胀和腐蚀之外的其他形态学变换
  2. OpenCV reshape函数需要注意的细节
  3. Unity Pixel 人物设计(1)
  4. LeetCode 20. 有效的括号(栈)
  5. .net中所用到的编码名称和对应的代码页(Encoding.GetEncoding) .
  6. Flink Java 使用map reduce实现wordcount
  7. 基于JAVA+SpringBoot+Mybatis+MYSQL的送水公司后台管理系统
  8. 我和2035年有个约计算机论文,我和2035有个约
  9. python教程-4.数据处理numpy-pandas
  10. MySQL优化详解(二)——数据库架构和使用优化
  11. 一分六钱用计算机怎么算,交行信用卡分期付款计算器:5000元分6期手续费
  12. Spring(SpringBoot)--事务传播机制--应用/实例/详解
  13. 求平方根java实现
  14. pdf打不开无法启动计算机丢失,电脑打开PDF文档时发生错误文件已损坏怎么修复...
  15. n个单词输入次数 c语言,C语言问题,从键盘输入n个英语单词.输入格式为n,w1,w2,w3…wn,其中n表示随后输入的英语...
  16. echarts3d城市配置项
  17. 投稿开奖丨“轻量应用服务器”征文活动阳光普照奖(8月)开奖啦
  18. IT类职位常用缩写 SA SD RD PG PM DBA MIS QA Sales
  19. 树莓派python图形化编程_BlockPi: 树莓派图形化编程软件,轻松控制GPIO、SenseHAT、Picamera等硬件。...
  20. FDC2214 手势识别方案 以及设计大致流程

热门文章

  1. 丘成桐数学竞赛2016
  2. python 怎么打开文件
  3. 解决git每次提交代码都要输入帐号密码
  4. VMware ESXi 8.0集成网卡驱动
  5. 浙江python信息技术教材_人工智能、Python…浙江省三到九年级将使用信息技术新修订教材...
  6. Guaranteed Outlier Removal for Point Cloud Registration with Correspondences
  7. Spring Aop 获取入参和出参
  8. python期末考试重点_Python期末复习笔记
  9. 传统行业程序员的深度焦虑?——快来互联网行业吧!
  10. LM393芯片功能及原理