深度神经网络权值初始化的诡异问题

       最近自己些 cnn网络,遇到麻烦事了。直接使用c++从头写,按照层次化 模块化编写。为的是做之后的海量动态增量学习的 cnn。 写完代码,调试,结果基本和预期一样的差,毕竟要注意的参数很多。各个任何地方遗漏一个参数符号都会导致网络失败。于是从头开始bp网络检查错误。

     1、使用1维个输入值,做3层bp网络测试。

          1> 2分类,两输出节点情况。网络快速收敛。样本格式<x, y>, x为输入数值,y为标签类别。

               <0, 0>; <1, 1>     
               sigmod 激活。网络收敛。

               relu激活,网络快速收敛。

               注意这里一个陷阱,relu激活函数只能用于 输出层之外的各层。最后一层必须使用sigmod函数,否则在复杂数据的网络不收敛,或者发散。2个样本的情况下输出层使用relu也会收敛更快速。测试好多次才发现,最后网上搜索到也有少许文章提到。大部分时候大部分人都是默认直接使用输出层为softmax,所以估计没有机会遇到我说的这个麻烦事情。

          2> 2分类,两输出节点情况。 3 个样本。

              <0, 0>;<0.5, 1>   ; <1, 0>     

              sigmod函数激活。网络收敛。

              relu激活。网络也收敛。但是sigmod 情况也是学习率提高到 0.5 甚至0.9。relu情况下,激活值大于0.15 网络就不收敛或者发散。

          3> 2分类,两输出节点情况。 4 个样本。测试出诡异的现象

              <0, 0>;<0.3, 1> ; <0.6, 0> ; <1, 1>     

              sigmod函数激活。网络收敛。

              relu激活。网络不收敛。无论怎么修改学习率,查错。训练之后,网络都发散。

             为此专门网上找了一段最简单的bp 3层网络程序,修改为 relu激活,仍然收敛。反复对比代码是否有逻辑错误等。都没能发现异常。各种改变数值大小,神经元个数等,以期找到可能的原因。持续了几天将近一周,也没有结果。 同时也发现结构几乎和网上下载的简单bp网络一样的逻辑。   最后只注意到网络参数初始化貌似初始化的顺序不一样。

              我的网络使用的初始化为使用过程中动态初始化。这个情况就每次初始化一个神经元的w权重和b偏置。简单bp 网络是固定网络,程序开始一次初始化,并且是所有的神经元权重向量横向初始化, 并不是一次初始化一个神经元的连接权重。而是一层多少个神经元,逐个初始化每个神经元的第一个权重,再循环初始化第一个权重,再第三个。。。 同样一层神经元的偏置B 也是单独做为一个向量一次初始化。

             这样在简单bp网络上, 修改初始化方式之后,发现也变得发散不收敛了。。。。

     我是非数学出生,自行做的学习研究。数学方面不太擅长,所以暂时没找到其中原因。看网上说 relu情况下,使用高斯随机数初始化效果会更好。所以想试试这个,是否还和初始化的横向纵向有关系。 都是随机初始化,这个差别这么大呢。。。而且是sigmod 对这个无影响,relu的情况对这个绝对致命。。。。

 2016-5-19:

        针对上面的问题再次经过反复测试排查。发现初始化顺序稍微不一样,relu就可能发散,而sigmod 则不会。 这样训练神经网络太危险了吧。 重新思考之后,把送入神经网络的样本也随机化。 这样如何初始化权重和偏置,貌似都不会有问题了。而且收敛速度加快。

      再次测试好像还是有问题。。。

       不知道有没有高手给分析下这情况。。。。

2016-5-20:

     网上搜索,无果。。。

     多次思考之后,决定多增加一层网络,把最后两层网络激活函数使用 sigmod, 其他层次使用relu。这个貌似理论上满足传统 bp网络的方法,同时满足深层网络relu的方式传播激活。 对比 大部份cnn,只是观察,发现确实最后不只一层sigmod。

      这样修改之后,网络成功收敛。

2016-6-16:

    1relu +  1 sigmod + 1sigmod,使用5个数值两类 交叉排列。仍然不收敛。relu sigmod 都不收敛。

   加入batchnormalize relu不收敛,将 relu修改为 sigmod 收敛。而且 有了 BN 速度真快。之前 几万次的训练,现在几百次。 有时候几十次就收敛。速度是十倍百倍。

不过没有 relu,多层训练会不会有训练不动的问题呢。。。。

   

  

猜你喜欢

转载自blog.csdn.net/zsyddl2/article/details/51441892