acc定义代码 神经网络_神经网络的这几个坑,你都躲过了吗

因为AI这两年的火爆,大家拿着锤子到处找钉子,锤子当然也砸到了我头上,有很多做业务的同事尝试通过AI的方法解决需要一些很复杂的业务逻辑算法,同时需要很多参数组合才能搞定的问题。但因为都是非科班出身也没有系统学习,所以遇到不少问题,所以在这里一一列出来,并且持续更新,希望能够总结出一些经验,在后续的应用中能够跳过这些坑,把更多精力集中在数据和业务问题上。

关于神经网络为什么不工作,有一篇非常实用的指南,在训练过程中遇到问题可以首先参考这个指南。传送门。

问题1、没有激活函数,你是认真的吗

真的会发生这样的问题,尤其是直接用tensorflow写模型的时候。同事前几天写了段代码,搭了一个单隐层的模型来近似一个产品中的算法,但是怎么训练都不收敛,按说那个算法是复杂,但也没有必要整一个十好几层的模型来模拟,尝试了种种手段也还是没用,最后仔细一看模型代码,所有层都没有激活函数,相当于费很大劲写了个线性回归还要拟合出产品算法(/摊手)。所以对于大多数的应用,不涉及复杂的网络结构或初始化、loss函数的,就用keras吧,毕竟人生苦短。

当然,无激活函数,也就是单位激活函数,在一些场景下也会使用,通常这种使用能够带来减少训练参数的好处。所以除非是有意的设计来简化网络,否则激活函数可不能忘掉。

问题2、还是激活函数,选对了没有

很多指南上也都说过,一般情况下,分类器隐层的激活函数用relu,输出层用sigmoid或softmax就八九不离十了,但是这里也有坑。许多的例子中使用的数据集是离我们面临的问题比较远的,最近被问到一个回归任务的问题,由于是原型尝试没有做数据规范化,训练的时候发现模型不收敛,或是不管多大的batch都在一个epoch中间波动非常大,打印出来才发现输出值区间和目标值区间都差老远,很明显是激活函数限制了输出范围。所以选激活函数,尤其是回归任务或者autoencoder,在写最后一层的时候停一下,回忆回忆每个激活函数的范围,如果都不合适,那就做一下数据预处理。

激活函数还有一个问题就是sigmoid函数用在隐层的时候,要注意梯度消失的问题,sigmoid在x=±5的附近就基本没有梯度了,如果输入值很大或权重初始化函数比较另类,那妥妥的训练效率会比较差。

问题3、损失函数和输出层激活函数,请尊重原配

对于sigmoid输出单元,如果使用非交叉熵损失函数,损失函数就会在sigmoid饱和时饱和,从而导致梯度消失。而最大似然给出的交叉熵损失函数中的log能够抵消sigmoid中的exp,因此sigmoid要搭配交叉熵给出的损失函数。

对数似然之外的许多目标函数对softmax函数不起作用,具体来说,那些不使用对数来抵消softmax中的指数的目标函数,当指数的变量取非常小的负值时会造成梯度消失,从而无法学习。对于softmax函数,当输入值之间的差异变得极端时,输出值会饱和。当softmax饱和时,基于softmax的许多代价函数也会饱和,除非它们能够转化饱和的激活函数,也就是说交叉熵类的损失函数能和输出层的softmax搭配。

线性单元不会饱和,所以和relu系列的激活函数,不挑损失函数。另外对于relu,在初始化参数时,可以将b的所有元素设置成一个小小的正值,这使得relu在初始时就对训练集中的大多数输入呈现激活状态,并且允许导数通过。

问题4、学习率,初始化模型时不要改默认参数

学习率基本上是新手最想调整的一个高参,容易理解,改起来也最方便。但是在初始化网络的时候,还是不要动人家的默认值,除非你对这个问题的损失函数空间和形态非常了解(那就不用黑盒算法了),在其他方面不出问题的情况下,学习率默认值基本上能让网络有一个基本靠谱的收敛,在对问题的收敛水平、精度有一定认识之后再去修改默认值也不迟。默认值一般在1e-3到1e-4的范围内,对于MNIST数据集,不同的学习率对应的loss变化趋势如下,从图中也可以看到,使用默认的学习率能得到一个基本够看的结果:

不同学习率下的loss

问题5、网络规模应该如何选择,参考如何将大象装冰箱

网络规模的选择是个头疼的问题,没有确定的指导思想或策略,花书中也有具体的篇幅讲这个:

“万能近似定理表明,一个前馈神经网络如果具有线性输出层和至少一层具有任何一种“挤压”性质的激活函数的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限空间到另一个有限空间的Borel可测函数。前馈网络的导数也可以任意好地来近似函数的导数”

“具有单层的前馈网络足以表示任何函数,但是网络层可能大得不可实现,并且可能无法正确地学习和泛化”

什么意思呢?理论上单层网络干啥都够,但是随着要拟合的目标函数越来越复杂,需要的神经元和参数是指数级增加的。所以我们要视问题的复杂度来确定网络的层数,问题复杂度是个什么呢,其实就是“要把大象装冰箱,总共分几步”。我们可以结合对于问题的理解,感受下要拟合的这个目标函数都干了些什么事,分了几步,比如大象装冰箱这个问题它就分了三步,三层左右应该就差不多。更深层的网络通常能够对每一层使用更少的单元数和更少的参数,并且经常容易泛化到测试集,但是通常也更难以优化。

问题6、南辕北辙,训练测试集划分要小心

还是同事在拟合产品算法时遇到的问题,拿到的数据是一个持续数小时的记录,系统每隔xxx ms会报一条消息,所以有几万条的样本。他在训练的时候没有做数据的shuffle,仅仅按照时间维度划分了训练集和测试集,结果发现很早就出现了“过拟合”——测试集误差很快就上去了,而且还没收敛到理想的水平就上去了。在这里的问题就在于划分训练集测试集的方式,其实从问题背景出发,这个数小时的记录在时间变化的过程中所反映的环境也肯定是在变化的,所以训练集和测试集所代表的环境不一定会一样。一定要有一个mindset,要保证train-dev-test三个集合都是同分布的,脱离了这个前提,训练就是做样子。所以要shuffle数据,要保证三个集合同分布,或者最好是划分完之后train和dev用k-fold的方法来训练。

不对数据进行shuffle还有一个问题就是,我们拿到的数据很多是顺序数据,在划分batch之后大多数batch对应的目标值很可能都是单一的,这样在训练过程中会出现很大的波动,甚至会导致完全无法收敛

问题7、数据特征的维度够不够

网络是通过输入的特征来学习的,所以要解决一个问题,业务经验在这里十分重要,即使是E2E不考虑特征抽取的神经网络,也需要确保所需要的信息全都输入进来了。在考虑数据特征的时候,可以分为两个阶段:第一个阶段需要业务专家的深度参与,从传统业务的角度看,做这个事情需要哪些输入,能从什么渠道获取这些输入等,这些必须要进行一个完备的分析;第二个阶段就是对这些输入进行必要的处理,以便后续设计网络结构,当然输入形式、网络结构、网络性能这是一个反馈的闭环,需要不断进行更新以达到最好的目标性能。

问题8、性能标准是什么,keras自带的acc合适不

使用keras训练时,一般我们会在compile里定义相关的metrics,有时候犯个懒就直接用系统给的acc了。但是在用了几回吃了几回土之后发现,keras自带的acc,实际上对分类任务更友好一些,对于多维输出的回归问题(我所在的行业涉及的大部分都是这类问题),acc就很容易把人整蒙圈了。有时候训练半天,看着acc一直在0.2左右晃荡,就开始怀疑人生了,但是看着mse loss的值感觉也不应该这么离谱,结果自己结合业务定义一个性能函数,发现已经达到九十好几的精度了。所以对于回归问题,尤其是多维的、稀疏的场景,一开始就要想好性能指标怎么定义,不要犯懒,自己手写一个,这样往后优化模型,目标感也会更强。

问题9、最好把Model的生成封装在一个函数中

还有一个实用的经验是对于模型初始化后调参和ensemble模型优化的场景,把模型的定义、构建等放在一个函数中,每次使用不同参数、不同数据集时调用函数生成模型再进行训练,这样可以避免使用上次训练后遗留的网络权重和偏置等信息,避免因为历史遗留参数而导致收敛问题或无用的性能提升。具体的原因和案例可以参考《为什么Recompile之后你的网络不收敛了》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java事件绑定,Java编程GUI中的事件绑定代码示例

程序绑定的概念:绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定静态绑定:在程序执行前方法已经被绑定,此时由编译器或其它连接程序实…

python抽荣耀水晶_教你2种免费拿荣耀水晶的方法,获奖概率让人惊喜,一般人我不告诉他...

在王者荣耀中荣耀水晶一直是许多玩家想要得到的,那一般来说想要获取一个荣耀水晶需要花费大约2000RMB的样子,但是可喜的是王者荣耀这个游戏就是这么的亲民,会时不时的上线一些免费赠送的活动,那今天就告诉大家最近2种获取荣耀水晶…

matlab中右三角形方向,《有限元基础教程》_【MATLAB算例】4.7.1(2) 基于3节点三角形单元的矩形薄板分析(Triangle2D3Node)...

【MATLAB 算例】4.7.1(2) 基于3节点三角形单元的矩形薄板分析(T riangle2D3Node)如图4-20所示为一矩形薄平板,在右端部受集中力100 000F N 作用,材料常数为:弹性模量7110E Pa ?,泊松比13μ,板的厚度0.1t m 。基于MA T…

uv转化率多少正常_浏览量(PV)和访客数(UV)和跳出率是什么意思?

1.什么是访客数(UV访客数就是指一天之内到底有多少不同的用户访问了网站。访客数要比IP数更能真实准确地反映用户数量。百度统计完全抛弃了IP这个指标,而启用了访客数这一指标,因为IP往往不能反映真实的用户数量。尤其对于一些流量较少的企业站来说&…

vscode中如何创新建php文件,vscode如何创建代码模板

选择菜单里的 文件 > 首选项 > 用户代码片段选择你需要自定义模板的文件,以vue为例配置对应文件json把代码片段写在json里。每个代码段都是在一个代码片段名称下定义的,并且有prefix、body和description。prefix是用来触发代码片段的。使用 $1&…

linux nginx postgresql php,常用Web环境架设手册PNP:Postgresql+Nginx+PHP

一 Postgresql1.1 installready:sudo apt-get updatesudo apt-get install libreadline6-devsudo apt-get install zlib1g zlib1g.devcd source./configuresudo make installsudo adduser postgressudo mkdir /usr/local/pgsql/datasudo chown postgres /usr/local/pgsql/data…

php 利用个人邮箱,利用 Composer 完善自己的 PHP 框架(二)——发送邮件

利用 Composer 完善自己的 PHP 框架(二)——发送邮件2014-10-18 / 阅读数:23506 / 分类: PHP回顾上一篇文章中,我们手工建造了一个简易的视图加载器,顺便引入了错误处理包,让我们的 MFFC 框架在 M、V、C 三个方面都达到…

mysql安装被打断_MySQL安装未响应解决方法

安装MySQL出示未响应,一般显示在安装MySQL程序最后一步的2,3项就不动了。这种情况一般是你以前安装过MySQL数据库服务项被占用了。解决方法:一种方法:你可以安装MySQL的时候在这一步时它默认的服务名是“MySQL” 只需要把这个名字…

启动马达接线实物图_东元伺服驱动马达

东元伺服驱动马达,我公司主营德国SEW,德国法勒VAHLE, 德国UNING,德国同驰Tschan,意大利威卡WESTCAR,德国久茂JUMO,瑞士ABB等几大世界品牌产品。东元伺服驱动马达, 工业机器人电动伺服系统的一般…

php fast cgi nginx,通过fast-cgi连接php-fpm和nginx之间的连接是持...

PHP-FPM是fastCGI协议的一种实现,因此它遵守所有fastCGI规范要求.The Web server controls the lifetime of transport connections. The Web server can close a connection when no requests are active. Or the Web server can delegate close authority to the application…

jsp工程防止外部注入_防止 jsp被sql注入的五种方法

一、SQL注入简介SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。二、SQL注入攻击的总体思路1.寻找到SQL注入的位置…

wordpress是用php几开发的,php-WordPress多个开发人员设置

是否可以让一个以上的人通过测试站点来开发Wordpress应用程序,这是一个很好的选择.我遇到的最大障碍是在本地开发和集成到测试环境时的路径问题.是否有人拥有维护开发人员环境,保持工作内容和链接的良好流程,并且代码在源代码管理中维护?为了澄清起见,我想在本地开发…

python分布式对象存储_推荐:一款分布式的对象存储服务

最近公司在准备内部数据上云,并且内部数据库每天的数据量很大,需要采用大数据存储的方案。方案调研每个程序技术在实现之前,需要进行开源产品的调研,适合自己产品的技术方案才是最好的。需求我们需要处理是图像信息,大…

php如何检测键盘按键,js键盘事件,判断按下的是哪个键

在写页面的时候,尤其是桌面端的时候,我们有时候要知道用户按下了那个按键,对于这个问题我们可以使用js提供的keyCode属性来操作,如:document.onkeydown function (e) {alert(e.keyCode)}这时你在页面上随意按键盘的按…

bch纠错码 码长8_BCH码-BCH码原理-BCH码分类-BCH码的应用-什么是BCH码-测控百科-CK365测控网...

1BCH码概述BCH码取自 Bose、Ray-Chaudhuri 与 Hocquenghem 的缩写,是自1959年发展起来的一种能纠正多位错误的循环码,是编码理论尤其是纠错码中研究得比较多的一种编码方法。用术语来说,BCH 码是用于校正多个随机错误模式的多级、循环、错误校…

oracle 左取,oracle 取子串(转)

SUBSTRING返回字符、binary、text 或 image 表达式的一部分。有关可与该函数一起使用的有效Microsoft SQL Server? 数据类型的更多信息,请参见数据类型。语法SUBSTRING ( expression , start , lengt…

js 中转换成list集合_js将类数组对象转换成数组对象

javascript与dom有许多瑕疵,如著名的类数组对象Arguments,其他诸如HTMLCollection,NodeList如果它们都是数组的子类,那多省时啊。在标准浏览器中,好像只要对象存在length属性,就能把它转换为数组,但IE就不尽…

oracle插入未调用并行,oracle并行之概念篇

概念 串行执行: 串行执行时候,sql语句由一个server process处理(既只运行在一个cpu上),所以sql语句所能使用的资源受cpu限制,除去异步i/o外server process 处理cpu操作时,不可访问disk。 并行处理: 就是多个slave process一起处理同一个sql语…

三维数据平滑处理_黑白象片的密度信息 卫星数据处理 遥感制图 三维建模 善图科技...

黑白象片的密度信息象片上的黑白变化,可划分为若干等级,此等级称之为灰阶。象片上的灰阶数受洗印技术及目视分辨能力的限制,一般不超过10个灰阶。灰阶较多时,象片上层次分明易于分辨一些细节。但灰阶的增多必导至对比度相对下降&a…

oracle左连接数据会对不上吗,一周工作总结–左连接造成的一些问题-Oracle

一周工作总结–左连接造成的一些问题今天有同事告诉我,有个SQL执行了好久好久执行不出来,我说好就是多久?她说一天左右了。真是令人咋舌的SQL。于是我要来了SQL看了看执行计划,确实让人咋舌。下图中就是执行计划的截图&#xff1a…