《Noisy Activation Function》噪声激活函数(一)

本文介绍了ICML 2016年的一篇论文,探讨了噪声激活函数如何改善深度学习中激活函数饱和导致的训练难题。通过在激活函数饱和部分添加噪声,论文提出了一种新的训练技术,有助于优化过程探索并提高训练效果。实验表明,这种方法在多种任务中表现出色,特别是在需要课程学习的情况下。
摘要由CSDN通过智能技术生成


本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/51736830


Noisy Activation Functions是ICML 2016年新发表的一篇关于激活函数的论文,其中对以往的激活函数进行了深入的分析,并提出了训练过程中添加噪声的新方法,效果不错,觉得很有意义,目测会在今后的深度学习领域产生比较大的影响,因此将其原论文翻译,并略作注解(计划分两篇博客来写,本文涵盖从摘要到第三节的内容),希望能够帮助大家理解,如有纰漏,请指正。

Paper URL: http://arxiv.org/pdf/1603.00391v3.pdf

Abstract

神经网络中使用的常见的非线性激活函数(Nonlinear Activation Functions,同样也可以简称为 NAF),由于激活函数本身的饱和(Saturation)现象(饱和现象,后文有讲解是指训练收敛接近目标时,导数趋向于0的现象,这对于收敛是不利的,也就是越接近目标,如果学习率固定的话,每次迭代更新的结果与前一次迭代结果的差异性就会越小),会导致训练困难,这种情形中可能会使得一些 vanilla-SGD (只使用一阶梯度)不敏感的相关性损失。论文提出注入合适的噪音,从而让梯度更加显著(相对于不使用噪声的激活函数可能会出现零梯度的情形)。引入大量噪声会支配无噪声梯度(意思是引入噪声,改变了无噪声情形下的梯度大小以及方向),使得随机梯度下降(Stochastic Gradient Descent, SGD)算法在收敛过程中可以进行更多的尝试。我们通过在记过函数的不确定部分(problematic parts)添加噪声(在后文可以看到,噪声添加在激活函数两端导数为零的部分,这部分可能被称为 problematic parts),尝试让优化过程探索退化/饱和与激活函数良好部分(良好部分应该是与不确定部分互补的部分吧)之间的边界。当噪声的数量呈退火下降,会使得优化硬目标函数更加容易,我们建立了模拟退火关系。通过实验发现,用含噪声变量的激活函数替代传统的饱和激活函数,能够在很多情形下帮助训练,在不同数据集和任务中,产生非常好的结果,尤其是当训练看似非常困难的时候,例如,当需要通过课程学习(Curriculum Learning, Bengio et al., 2009)获得好的结果时。

LibNoise分形噪声函数库的JAVA翻译版,个人开发,仅供参考。 包包含: 异常模块: noise.Exception noise.ExceptionInvalidParam 无效的参数异常。 noise.ExceptionNoModule 无模块异常,无法检索到该源模块 noise.ExceptionOutOfMemory noise.ExceptionUnknown 模型模块: noise.model.Line 线 noise.model.Plane 平面 noise.model.Sphere 球体 noise.model.Cylinder 圆柱 发生器模块: noise.module.Perlin 培林噪声 noise.module.RidgedMulti 脊多重分形噪声 noise.module.Billow 巨浪 value = |perlin_value|*2-1.0; noise.module.Voronoi 细胞噪声,Voronoi图 noise.module.Const 常量 value = const; noise.module.Cylinders 圆柱 noise.module.Checkerboard 棋盘格 value = (floor(x) & 1 ^ floor(y) & 1 ^ floor(z) & 1) != 0 ? -1.0 : 1.0; noise.module.Spheres 球体 选择器模块: noise.module.Select 选择 noise.module.Blend 混合 value = ((1.0 - (modules[3].value+1)/2) * modules[0].value) + ((modules[3].value+1)/2 * modules[1].value); 修饰器模块: noise.module.Invert 倒置 value = -value; noise.module.Abs 绝对值 value = |value|; noise.module.Clamp 截取 value = (value < lowerBound ?lowerBound : value) or (value > upperBound ?upperBound : value);lowerBound:下截取值;upperBound:上截取值 noise.module.Curve 曲线 value = noise.module.Curve.ControlPoint 控制点 noise.module.ScaleBias 偏移缩放, value = value*scale+offset noise.module.Turbulence 湍流 value = modules[0].getValue(x+modules[1].value * power,y+modules[2].value * power,z+modules[3].value * power); noise.module.Exponent 指数 value = (pow(abs((value + 1.0) / 2.0), exponent) * 2.0 - 1.0); 组合模块: noise.module.Add 添加 value = modules[0].value+modules[1].value; noise.module.Max 最大值 value = max(value); noise.module.Min 最小值 value = min(value); noise.module.Multiply 乘法 value = modules[0].value * modules[1].value; noise.module.Power 权重 value = pow(modules[0].value , modules[1].value); 变压模块: noise.module.Displace 位移替换,扭曲 value = modules[0].getValue(x+modules[1].value,y+modules[2].value,z+modules[3].value); noise.module.RotatePoint 点旋转 noise.module.ScalePoint 点缩放,轴缩放 value = modules[0].getValue (x * xScale, y * yScale,z * zScale); noise.module.Terrace 露台,梯台 noise.module.TranslatePoint 位移变换 value = modules[0].getValue (x * xTranslation, y * yTranslation,z * zTranslation); 其他: noise.module.Cache 缓存 value = noise.module.Module 噪声模块基类 如果发现有要更改的地方,请发邮件给我,或者本人QQ:343179390,欢迎技术探讨
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值