在开始训练网络之前,还需要初始化网络的参数。方式有:

       错误:全零初始化。让我们从应该避免的错误开始。在训练完毕后,虽然不知道网络中每个权重的最终值应该是多少,但如果数据经过了恰当的归一化的话,就可以假设所有权重数值中大约一半为正数,一半为负数。这样,一个听起来蛮合理的想法就是把这些权重的初始值都设为0吧,因为在期望上来说0是最合理的猜测。这个做法错误的!因为如果网络中的每个神经元都计算出同样的输出,然后它们就会在反向传播中计算出同样的梯度,从而进行同样的参数更新。换句话说,如果权重被初始化为同样的值,神经元之间就失去了不对称性的源头。即出现对称权重的现象。

       小随机数初始化。因此,权重初始值要非常接近0又不能等于0。解决方法就是将权重初始化为很小的数值,以此来打破对称性。其思路是:如果神经元刚开始的时候是随机且不相等的,那么它们将计算出不同的更新,并将自身变成整个网络的不同部分。小随机数权重初始化的实现方法是:W = 0.01 * np.random.randn(D,H)。其中randn函数是基于零均值和标准差的一个高斯分布(译者注:国内教程一般习惯称均值参数为期望)来生成随机数的。根据这个式子,每个神经元的权重向量都被初始化为一个随机向量,而这些随机向量又服从一个多变量高斯分布,这样在输入空间中,所有的神经元的指向是随机的。也可以使用均匀分布生成的随机数,但是从实践结果来看,对于算法的结果影响极小。

警告。并不是小数值一定会得到好的结果。例如,一个神经网络的层中的权重值很小,那么在反向传播的时候就会计算出非常小的梯度(因为梯度与权重值是成比例的)。这就会很大程度上减小反向传播中的“梯度信号”,在深度网络中,就会出现问题。

  使用1/sqrt(n)校准方差。上面做法存在一个问题,随着输入数据量的增长,随机初始化的神经元的输出数据的分布中的方差也在增大。我们可以除以输入数据量的平方根来调整其数值范围,这样神经元输出的方差就归一化到1了。也就是说,建议将神经元的权重向量初始化为:w=np.random.randn(n)/ sqrt(n)。其中n是输入数据的数量。这样就保证了网络中所有神经元起始时有近似同样的输出分布。实践经验证明,这样做可以提高收敛的速度。

上述结论的推导过程如下:假设权重w和输入x之间的内积为,这是还没有进行非线性激活函数运算之前的原始数值。我们可以检查s的方差:

Glorot等在论文Understanding the difficulty of training deep feedforward neural networks中作出了类似的分析。在论文中,作者推荐初始化公式为,其中是在前一层和后一层中单元的个数。这是基于妥协和对反向传播中梯度的分析得出的结论。该主题下最新的一篇论文是:Delving Deep into Rectifiers: Surpassing Human-Level P erformance on ImageNet Classification,作者是He等人。文中给出了一种针对ReLU神经元的特殊初始化,并给出结论:网络中神经元的方差应该是 。代码为w =np.random.randn(n) * sqrt(2.0/n)。这个形式是神经网络算法使用ReLU神经元时的当前最佳推荐。

稀疏初始化(Sparse initialization)。另一个处理非标定方差的方法是将所有权重矩阵设为0,但是为了打破对称性,每个神经元都同下一层固定数目的神经元随机连接(其权重数值由一个小的高斯分布生成)。一个比较典型的连接数目是10个。

偏置(biases)的初始化。通常将偏置初始化为0,这是因为随机小数值权重矩阵已经打破了对称性。对于ReLU非线性激活函数,有研究人员喜欢使用如0.01这样的小数值常量作为所有偏置的初始值,这是因为他们认为这样做能让所有的ReLU单元一开始就激活,这样就能保存并传播一些梯度。然而,这样做是不是总是能提高算法性能并不清楚(有时候实验结果反而显示性能更差),所以通常还是使用0来初始化偏置参数。

实践。当前的推荐是使用ReLU激活函数,并且使用w = np.random.randn(n) * sqrt(2.0/n)来进行权重初始化。

来源:CS231

神经网路权重初始化方式相关推荐

  1. 为什么需要权重初始化(weight initialization)?常见的权重初始化方式有哪些?启发式权重初始化的好处?

    为什么需要权重初始化(weight initialization)?常见的权重初始化方式有哪些?启发式权重初始化的好处? 目录 为什么需要权重初始化(weight initialization)?常见 ...

  2. 权重初始化方式对神经网络迭代次数的影响

    做一个网络 输入X范围是[1e-16,37] 权重初始化方式 Random rand1 =new Random(); int ti1=rand1.nextInt(98)+1; tw[a][b]=(do ...

  3. 用数学方法构造神经网路的迭代次数1-9

    神经网络对应每个收敛标准δ都有一个特征的迭代次数n,因此可以用迭代次数曲线n(δ)来评价网络性能. 一个二分类网络分类两组对象A和B,B中有K张图片,B的第i张图片被取样的概率为pi,B中第i张图片相 ...

  4. 深度学习的实用层面 —— 1.11 神经网络的权重初始化

    针对梯度消失或者梯度爆炸问题,我们想出了一个不完整的解决方案,虽然不能彻底解决问题,却很有用.有助于我们为神经网络更谨慎地选择随机初始化参数,为了更好地理解它,我们先举一个神经单元权重初始化的例子,然 ...

  5. 目标检测——卷积神经网路基础知识

    目标检测--卷积神经网路基础知识 卷积神经网络 LeCun的LeNet(1998)网络结构 卷积神经网络发展历史 卷积神经网络可以做什么 全连接层 介绍 BP神经网络 通过BP神经网络做车牌数字识别 ...

  6. 优达学城《DeepLearning》2-3:权重初始化

    目录 初始重量并观察训练损失 数据集和模型 导入库并加载数据 可视化一些训练数据 定义模型结构 初始化权重 全部为0或1 比较模型行为 均匀分布 统一初始化,基线 设置权重的一般规则 正态分布(Nor ...

  7. 【深度学习理论】(4) 权重初始化,Batch Normalization

    各位同学好,最近学习了CS231N斯坦福计算机视觉公开课,讲的太精彩了,和大家分享一下. 1. 权重初始化 1.1 相同的初始化权重 神经网络中的所有权重都能通过梯度下降和反向传播来优化和更新.现在问 ...

  8. 神经网络中的权重初始化一览:从基础到Kaiming

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在进行各种小实验和思维训练时,你会逐步发现为什么在训练深度神经网络 ...

  9. 1.11 神经网络的权重初始化-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.10 梯度消失与梯度爆炸 回到目录 1.12 梯度的数值逼近 神经网络的权重初始化 (Weight Initialization for Deep Networks) 上 ...

最新文章

  1. 一张心酸得不想起名字的照片,人艰就别拆了好吗 | 每日趣闻
  2. JEE6 CDI 扩展实现 MVC (四) 实现多模板引擎支持,并提供扩展接口
  3. RandomForest随机森林总结
  4. java 图片动画_java在窗口中添加图片做动画,怎么一闪一闪的?
  5. 随机:修改centos主机名
  6. Java 8 集合不完全一览
  7. Kaggle竞赛方案分享:如何分辨杂草和植物幼苗(转)
  8. 非线性动力学_非线性动力学特辑 低维到高维的联通者
  9. 软件LoadRunner 产品信息(product information)
  10. 随机向量x的协方差阵_【科普】如何正确理解特征值与特征向量
  11. 20145316许心远《网络攻防》第三次实验:免杀原理与实践
  12. 阵列信号处理 窄带信号与包络
  13. java实现AES密钥生成
  14. 吴恩达老师深度学习课程完整笔记
  15. 海天老师 资深TTT/思维训练专家
  16. SqlServer误删数据恢复
  17. 数学思想:4、数学归纳法
  18. 计算机教案在幻灯片中插入影片,在幻灯片中插入影片和声音教学设计
  19. Vivado与Modelsim联合仿真配置【图文并茂】
  20. 分发服务器性能,高性能P2P流媒体内容分发服务器的设计与实现

热门文章

  1. 理解javascript
  2. USACO SEC.1.3 No.3 Calf Flac
  3. oracle更新视图。
  4. CPU漏洞可导致RSA被攻击
  5. 【Scala】使用Scala程序实现WordCount--词频统计(代码)
  6. Java数据结构与算法-环形队列
  7. maven详解scope
  8. 怎么做软件安全性测试
  9. 什么是软件测试,软件测试需要注意些什么?
  10. Servlet 客户端 HTTP 请求