AI Optimizing - 揭秘神经网络容易被忽略的权重初始化

x
用微信扫描二维码
分享至好友和朋友圈

  

  

  本文作为小白入门的最后一篇,通过之前的学习,大家应当已经了解到最基本的深度学习的原理,之后小白将会带给大家深度学习的中阶内容。本章需要了解导数计算以及神经网络中的参数梯度计算(如果不会,请跳过本文,因为你肯定看不懂)。

  

  权重初始化是构建神经网络的第一步,但也是最容易让人忽略的一步。在小白刚入门的时候,没有对权重初始化太过上心,觉得无论权重初始化成什么样,都会随着梯度优化而慢慢的逼近完美值。而直到一天在同一组数据集,使用同一个神经网络结构进行多次训练的时候,突然发现每一次的训练模型的性能竟然不同,而且差距有时候竟然达到20%。这不得不让小白重新审视起权重初始化的问题。而这篇文章,也希望给刚入门的小白们一个警醒 -- 权重初始化过程并非没那么重要

  在《AI Optimizing - 深度学习中大道至简的Batch Normalization》中,我们引用了一张图来解释不同的权重初始化对于神经网络训练的影响,这篇也引用一下(三张图使用同样的数据和网络结构):

  

  最左边的图代表着Zero-Initialization(零初始化),也就是用0来初始化所有的权重(不知道这种办法是谁想出来的。)。很明显0初始化几乎不可用,网络无法从数据中学习到任何信息,甚至网络在0权重下完全无法收敛。中图使用中值0方差0.4的高斯分布来初始化权重,效果明显提升,收敛过程也比较平滑,但是其收敛的缓慢,而网络收敛后损失也与0有一定的距离。第三张图选择权重的方式依然是依照正态分布,只不过其方差是动态选择的 -- 与每一个神经元输入的数量成反比,而这种初始化的方式在三张图中也取得了最好的成绩,不但收敛快,而且训练后的模型性能也达到几乎99%的准确度。

  在看了上面的图之后,有几个问题亟待我们去探究 -- 为什么会发生这种情况,我们如何去选择合适的权重初始化方法?目前主流的深度学习框架类似TensorFlow和Keras中提供了一些较优的默认初始化方法,但是为什么它们会这么选,glorot_uniform初始化方法中的根号6是怎么来的?本文将揭露不同的初始权重选取策略以及其所带来的结果。

  痛点遍布的神经网络 - 全连接神经网络中的信息流分析

  本文将使用不同权重初始化策略来追踪神经网络中每层输出的信息流,为了便于理解,我们是用《AI Coding -- 模糊到清晰,小白的第一个深度学习实践》中编码过的网络,示意图如下:

  

  我们都知道,下一层的神经元输入,是根据当前层神经元的加权和得到的:

  跟踪一下神经元输入输出的信息流:

  

  而神经网络是通过递归求导的方式来更新第i层第j个神经元中第k个参数,再次呈上万恶的数学公式(相邻层参数计算):

  

  从中可以看出,参数梯度由两部分组成,前面的部分暂时可以不用理会(可以用递归求导的方式从最底层慢慢计算上来),我们看看公式的第二部分,通过上面说的第一个公式展开:

  

  呼~~~ 最重要的部分完成了。仔细想想,从公式中能看出什么?没错,无论是神经元输出为零或者其导数为0结局都会导致整个信息流崩溃。如果说导数与权重关联不大的话,那么神经元输出则与权重值息息相关,错误的权重值将会引起连锁反应,每层神经元间的信息流通会由于某一层权重的错误设置而完全截断。另一个角度来说,如果两者突然变大(无论是神经元输出或者加权和导数),那么整个信息流将会变得极度不可控,这会导致更可怕的情况,整个神经网络都会因为这小小的一点错误导致过拟合的情况。所有这些都表明,为了避免上面强调的两种极端情况并保证神经网络有效的充要条件,就需要保证整体激活方差的稳定性。那么,权重初始化过程能否保证我们达到这一目标?

  OK,math time again! 再次回顾一下本文的第一个公式,利用方差性质:

  

  结合上文说过我们需要保证激活方差的稳定性,那么最理想的情况就是相邻层的激活方差一致,所以有:

  

  从公式中看出什么了没?这就是本文要说的第一件事情,每层权重初始化时应满足其方差与当前层神经元数量成反比。再想想我们对神经网络的第二个梦想是什么?梯度稳定性!别急,我们再看看梯度递归更新公式,这次对x求导,得到:

  

  考虑梯度稳定的情况:假设每层来说,激活函数的梯度值都为1,就是g函数的导数为1。再次利用方差公式:

  

  还是那句话,保持方差稳定性:

  第二个推论出来了:每层最优的权重应满足其方差与当前层神经元数量成反比

  结合原函数与一阶函数,最优的当前层权重的设置应当与当前层的神经元数量成反比,且与下一层神经元数量也成反比。最简单的做法就是求平均:

  所以这也是为什么在使用正态分布时应当选择标准差为:

  

  的权重初始化策略可以达到比较好的效果。

  当然,一些人习惯使用均匀分布U(-a,a)来生成初始权重(uniform distribution),而使用均匀分布主要需要确定其超参数a,直接使用均匀分布的方差公式:

  

  好了,如果你耐心读懂了上面看似可怕的数学推导,你们应当完全了解了权重初始化对于神经网路训练的重要性。当然,在实际项目中,还应当考虑数据分布的情况来微调每层权重初始化策略,而这一切都暂时需要人为的参与。神经网络并不是万能的,其中有很多的缺陷和痛点,希望以后随着科技的发展可以得以解决吧。就目前而言,人不参与的神经网络,就是神经。

  

  至此,最最最入门的内容小白已经彻底介绍完毕,接下来,小白将更多的介绍中阶内容,希望准大神们做好准备。春节快乐,Newbs!!!!

  

特别声明:本文为网易自媒体平台“网易号”作者上传并发布,仅代表该作者观点。网易仅提供信息发布平台。

跟贴 跟贴 1 参与 1
© 1997-2019 网易公司版权所有 About NetEase | 公司简介 | 联系方法 | 招聘信息 | 客户服务 | 隐私政策 | 广告服务 | 网站地图 | 意见反馈 | 不良信息举报

AI小白笔记

如果数学不好,就学AI吧

头像

AI小白笔记

如果数学不好,就学AI吧

8

篇文章

273

人关注

列表加载中...
请登录后再关注
x

用户登录

网易通行证/邮箱用户可以直接登录:
忘记密码