神经网络为什么要归一化

神经网络为什么要归一化用神经网络的小伙伴都知道,数据需要做归一化,但是为什么要做归一化,这个问题一直模梭两可,网上也没有较全的回答,小编花费了一段时间,作了一些研究,给大家仔细分析分析,为什么要做归一化:1.数值问题。无容置疑,归一化的确可以避免一些不必要的数值问题。输入变量的数量级未致于会引起数值问题吧,但其实要引起也并不是那么困难。因为tansig的非线性区间大约在[-1.7,1.7]。

大家好,又见面了,我是你们的朋友全栈君。

原创文章,转载请说明来自老饼讲解-BP神经网络


目录

一、数值问题

二、求解需要

(1)初始化

(2)梯度

(3)学习率

(4)搜索轨迹

三、小实验

四.对使用matlab工具箱的建议

五、其他网友的看法


用神经网络的小伙伴都知道,数据需要做归一化,但是为什么要做归一化,这个问题一直模梭两可,网上也没有较全的回答,小编花费了一段时间,作了一些研究,给大家仔细分析分析,为什么要做归一化

一、数值问题

无容置疑,归一化的确可以避免一些不必要的数值问题。

常有种错觉,以为输入变量的数量级很难引起数值问题,其实不然,如果没做归一化,在神经网络中要引起数值问题并不是那么困难,由于tansig的非线性区间大约在[-1.7,1.7],意味着要使神经元有效,tansig( w1*x1 + w2*x2 +b) 里的 w1*x1 +w2*x2 +b 数量级应该在 1 (1.7所在的数量级)左右。这时输入较大,就意味着权值必须较小,一个较大,一个较小,两者相乘,就引起数值问题了。

       假如你的输入是421,你也许认为,这并不是一个太大的数,但因为有效权值大概会在1/421左右,例如0.00243,那么,在matlab里输入  421*0.00243 == 0.421*2.43

                                                          神经网络为什么要归一化

可以看到两者不相等了,说明已经引起数值问题了。


二、求解需要

        我们建立了神经网络模型后,只要找到的解足够好,我们的网络就能够正确的预测了。在训练前我们将数据归一化,说明数据归一化是为求解作准备。

        那么,究竟给求解带来了什么方便呢?

         这个问题不能一概而论,不同的算法,在归一化中得到的好处各不相同。假若有一个很牛B的求解算法,那完全用不着归一化,不过目前大部算法,都比较需要归一化,特别是常用的梯度下降法(或梯度下降的衍生方法),归一化和不归一化,对梯度下降法的影响非常大。

        不同的算法,对归一化的依赖程序不同,例如列文伯格-马跨特算法(matlab工具箱的trainlm法)对归一化的依赖就没有梯度下降法(matlab里的traingd)那么强烈。

        既然不同的算法对归一化有不同的理由,篇幅有限,本文就仅以梯度下降法举例


        这里重温一下梯度下降法:梯度下降法一般先初始化一个初始解,然后求梯度,再用“新解=旧解-梯度*学习率 ”的方式来迭代更新解。直到满足终止迭代条件,退出循环。


先看归一化对初始化的好处:

(1)对初始化的影响

        过初始化的同学会发现,输入数据的范围会影响我们初始化的效果。例如,某个神经元的值为tansig(w1*x1+w2*x2+b),由于tansig函数只有在[-1.7,1.7]的范围才有较好的非线性,所以w1*x1+w2*x2+b的取值范围就要与 [-1.7,1.7]有交集(实际上需要更细致的条件),这个神经元才能利用到非线性部分。

        我们希望初始化的时候,就把每个神经元初始化成有效的状态,所以,需要知道w1*x1+w2*x2+b的取值范围,也就需要知道输入输出数据的范围。

        输入数据的范围对初始化的影响是无法避免的,一般讨论初始化方法时,我们都假设它的范围就是[0,1]或者[-1,1],这样讨论起来会方便很多。就这样,若果数据已经归一化的话,能给初始化模块带来更简便,清晰的处理思路。

       注:matlab工具箱在初始化权值阈值的时候,会考虑数据的范围,所以,即使你的数据没归一化,也不会影响matlab工具箱的初始化

(2)对梯度的影响

        以输入-隐层-输出这样的三层BP为例,我们知道对于输入-隐层权值的梯度有2e*w*(1-a^2)*x的形式(e是誤差,w是隐层到输出层的权重,a是隐层神经元的值,x是输入)。

       如果输出层的数量级很大,会引起e的数量级很大,同理,w为了将隐层(数量级为1)映身到输出层,w也会很大,再加上x也很大的话,从梯度公式可以看出,三者相乘,梯度就非常大了,这时会给梯度的更新带来数值问题

(3)对学习率的影响

     由(2)中,知道梯度非常大,学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据归一化,这样学习率就不必再根据数据范围作调整。

     隐层到输出层的权值梯度可以写成 2e*a,而输入层到隐层的权值梯度为 2e *w*(1-a^2)*x ,受 x 和 w 的影响,各个梯度的数量级不相同,因此,它们需要的学习率数量级也就不相同。对w1适合的学习率,可能相对于w2来说会太小,若果使用适合w1的学习率,会导致在w2方向上步进非常慢,会消耗非常多的时间,而使用适合w2的学习率,对w1来说又太大,搜索不到适合w1的解。

     如果使用固定学习率,而数据没归一化,则后果可想而知。

     不过,如果像matlab工具箱一样,使用自适应学习率,学习率的问题会稍微得到一些缓和。

(4)对搜索轨迹的影响

         前面已说过,输入范围不同,对应的 w 的有效范围就不同。

         假设 w1 的范围在 [-10,10],而w2的范围在[-100,100],梯度每次都前进1单位,那么在w1方向上每次相当于前进了 1/20,而在w2上只相当于 1/200!某种意义上来说,在w2上前进的步长更小一些,而w1在搜索过程中会比w2“走”得更快。这样会导致,在搜索过程中更偏向于w1的方向。

                              

神经网络为什么要归一化

         抛开哪种路线更有效于找到最佳解的问题不谈,两点之间直线距离最短,这种直角路线明显会更耗时间,所以不归一化,时间会明显增加

      从上面的分析总结,除去数值问题的影响,最主要的影响就是,每一维的偏导数计算出来数量级会不一致。下面我们来个试验。


三、小实验

●  问题

假设我们有两个输入变量,x1范围是[-1,1],但x2是[-100,100],输出范围是[-1,1]。x2在输入数据上没有做归一化,怎么修改训练过程,才能让训练结果如同数据归一化了一样呢

●  分析

     通过上面的讨论,我们知道x2增大了,会使w2的梯度也很大,因此我们在计算w2梯度时,需要把它的梯度除以100.才能得到它的梯度数量级与w1的一致。然后在更新w步长的时候,w1的有效取值范围(1/1)是w2的有效取值范围(1/100)的100倍,因此w2走的时候,应该以1/100的步去走,所以w2的学习率也需要除以100。

     通过以上的修改(这里不考虑数值问题),会和数据作了归一化的结果是一样的。

●  实验     

     以上经笔者实验后,确实不归一也能训练出相似结果。

     这里就不展示实验的代码了,因为实验需要在整个BP源代码内部进行修改(笔者是扒了matlab源码并进行修改后进行的实验),有兴趣研究的同学在自己的编写的代码上动下刀。

● 实验总结

     这是一个案例分析,说明不考虑数值问题的话,只是影响了这两个地方。假设,x2的输入范围是[100,300],那肯定不是除以100就可以了,需要更复杂一些的变换,这里不再深入纠结。

    为什么要归一化,对于使用梯度下降法训练的三层BP神经网络总结出的就是这些原因了。对于其他的神经网络模型,会有其它的原因,这里就不再作分析。

四.对使用matlab工具箱的建议

关于使用matlab工具箱需要注意的三点

  • Matlab2012b已经会自动将输入数据归一化,所以不必再自己去做数据的预处理,直接用原始数据建立网络就可以。
  • 但输出需要做归一化,因为工具箱计算误差的时候,使用的是原始数据的误差,因此误差数量级可能很大,这样一来梯度就很大了,在学习率还没来得及自适应减小的时候,梯度就一下子把原来初始化好的权重给吞掉了,使网络的权重掉到一个离最优解非常远的地方。所以使用matlab神经网络工具箱,而又要用梯度下降法的话,输出一定要做归一化。

         但如果用默认的trainlm法,而不是梯度下降法 traingd的话,那影响不会像 traingd这么严重,我们可以看到 trainlm(列文伯格-马跨特法) 对方向 h 的计算公式是:                                       

神经网络为什么要归一化

由于JJ和Jf的数量级不会差太多,而且由于有u的调整,最终会得到一个适当的h。

  • 注意注意,这个问题很多很多同学都吃过亏。很多同学在用net.IW提出网络权重,代入表达式后却发现结果与sim函数对不上。这是因为matlab2012b版本及之后的工具箱得到的网络权值,是面向归一化后的数据的。只要预测时,先对数据进行归一化,代入表达式就能与sim函数对得上了(对不上就再将输出反归一化)。如果使用时不归一化那么麻烦,想直接提出能对应原始数据的网络权重,则可以把归一化过程揉合到网络的权值里,请参考文章:​《网络表达式的反归一化》​

五、其他网友的看法

下面是网友关于为什么要归一化的一些回答(欢迎补充):

  1. 避免数值问题。
  2. 使网络快速的收敛。
  3. 样本数据的评价标准不一样,需要对其量纲化,统一评价标准
  4. bp中常采用sigmoid函数作为转移函数,归一化能够防止净输入绝对值过大引起的神经元输出饱和现象 。
  5. 保证输出数据中数值小的不被吞食 。

事实上本文的研究大部分都是借鉴了网友的见解,基于这些观点进一步探讨所得,但对部分观点,本人略有不同看法:

(1)使网络快速的收敛:赞同。

(2)避免数值问题:赞同。

(3)统一量纲:不赞同。本人认为这从属于业务层,与网络的训练无关。

(4)避免神经元饱和:不完全赞同。与权值阈值相乘后,才是sigmoid的输入值,初始化得好的话,并不会饱和输出。若果使用“把权值和阈值随机初始化为[-1,1]之间的值”这种初始化方法,那不归一化就会引起神经元输出饱和现象。

(5)大数吞小数:不完全赞同。若果我们找到适合的权值,是不会吞掉的,例如x1=10000,x2=1, 而w1=0.0001,w2=1,那么w1*x1是不会吞掉w2*x1的。

后语

      本文在很多细节之处,都没有作深入的讨论,一来展开这些讨论会让文章非常冗赘,失去主题。二来(也是最主要的原因),对归一化作用的研究,只能让我们更清晰归一化的好处,减少我们对归一化的疑惑,并不能促进我们更好的改进网络效果。所以本文,都仅从大方面,不十分严谨的提及归一化在训练过程各方面的好处。

      感谢大家的阅读。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152282.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 简述SQL2008部署多实例集群(学习)

    简述SQL2008部署多实例集群(学习)

    2021年11月26日
  • Android端 WebP图片压缩与传输的一点探索

    Android端 WebP图片压缩与传输的一点探索简介直到4g时代,流量依然是宝贵的东西。而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题。我们关注的问题,无非是图片体积和质量如何达到一个比较和谐的平衡,希望得到质量不错的图片同时体积还不能太大。走在时代前列的谷歌给出了一个不错的答案——WebP。WebP是一种图片文件格式,在相同的压缩指标下,webp的有损压缩能比jpg小25-34%。而在

  • 40款帮助你加薪的IDEA神器插件![通俗易懂]

    写在前面的话:大家好,我是全栈小刘,一名零零后的编程爱好者。从初中开始编程,对编程有独特情怀,热爱技术,目前已有五年的编程经验,做过许许多多有意思的项目,这篇博客,算是对自己学习的一个总结,算是一份笔记,如果你对Java全栈感兴趣可以关注我的动态一起学习1.01的365次方=37.78343433289>>>10.99的365次方=0.02551796445…

  • excel 堆积折线图_什么叫堆积折线图

    excel 堆积折线图_什么叫堆积折线图excel中关于折线图和堆积折现图的解释:“堆积折线图和带数据标记的堆积折线图堆积折线图用于显示每一数值所占大小随时间或有序类别而变化的趋势,可能显示数据点以表示单个数据值,也可能不显示这些数据点。如果有很多类别或者数值是近似的,则应该使用无数据点堆积折线图。提示为更好地显示此类型的数据,您可能要考虑改用堆积面积图。更通俗的解释为: 如果有两个数据系列,折线图中两个数据系列是独立…

  • Matlab中fprintf函数使用[通俗易懂]

    Matlab中fprintf函数使用[通俗易懂]fprintf函数将数据写入文本文件。语法fprintf(fileID,formatSpec,A1,…,An)fprintf(formatSpec,A1,…,An)nbytes=fprintf(___)说明fprintf(fileID,formatSpec,A1,…,An)按列顺序将formatSpec应用于数组A1,…An的所有元素,并将数据写入到一个文本文件。fprintf使用在对fopen的调用中指定的编码方案。fprintf(form…

    2022年10月19日
  • WebApp 开发框架推荐以及优缺点分析

    WebApp 开发框架推荐以及优缺点分析不用盲目的百度和问大神们WebApp开发使用哪个框架最好?等等问题。在此,小编尽量解答各位的WebApp 问题。根据国内js大神以及有过WebApp 开发经验的前辈们分析,小编推荐下面6款常用的WebApp 开发框架。第一款:Sencha TouchSenchaTouch是世界上第一个支持HTML5和CSS3标准的移动应用框架,你可以使用HTML5来编写音频和视频组件,还可以使用…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号