5

神经网络参数的初始化问题

 2 years ago
source link: https://ylhao.github.io/2018/05/21/29/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

神经网络参数的初始化问题

创建时间:2018-05-21 11:14
字数:630 阅读:27

为什么参数 ωω 要随机初始化而不能全部初始化为一个相同的值?

如果将 ωω 全都设置成一个相同的值,会出现“完全对称”的情况。下面举例说明“完全对称”是什么意思。

如上图所示,当隐藏层的 4 个神经元对应的 ωω 全部初始化为一个相同值时,这 4 个神经元除了偏置可能互不相同外,其它相关因素都是相同的(比如:输入、参数等)。这会导致这 4 个神经元的输出也基本上是相同的,进而导致下一层也是类似的情况,也就是说这会导致每层的神经元基本上都是相同的。起到的作用跟用一个神经元差不多,导致模型的表达能力大大下降。由于我们需要的是尽可能不同的神经元,所以我们需要随机初始化 ωω 来增加神经元的多样性。

为什么初始值要设置的很小?

将初始值设置的很小是考虑到激活函数的一些特性,在 sigmoid 函数和 tanh 函数中,我们在“对常见的激活函数的总结”一文中提到过当 |z||z| 很大时,激活函数的斜率(梯度)很小,因此,在这个区域内,梯度下降算法会运行得比较慢。在实际应用中,应该尽量避免使 |z||z| 落在这个区域,应该使 |z||z| 尽可能的限定在 0 值附近,提高梯度下降法的效率。我们将初始值设置的很小,就是为了这个目的。

初始化 ωω 时可供参考的经验

下面以 numpy 为例,介绍下当选取不同的激活函数时,应该如何随机初始化参数 ωω。

当选的激活函数为 ReLU 时,可按照以下方式初始化各层的权重矩阵:
w[l]=np.random.randn(shape)∗np.sqrt(2n[l−1])w[l]=np.random.randn(shape)∗np.sqrt(2n[l−1])

当选的激活函数为 tanh 时,可按照以下方式初始化各层的权重矩阵:
w[l]=np.random.randn(shape)∗np.sqrt(1n[l−1])w[l]=np.random.randn(shape)∗np.sqrt(1n[l−1])

或者按以下方式:
w[l]=np.random.randn(shape)∗np.sqrt(2n[l−1]+n[l])w[l]=np.random.randn(shape)∗np.sqrt(2n[l−1]+n[l])

其中 np.random.randn(shape) 得到的是一个形状为 shape 的矩阵,矩阵中的每个元素都符合标准正态分布(μ=0,σ2=1μ=0,σ2=1)。

  1. 深度学习工程师微专业 —— 吴恩达

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以在文章下方的评论区进行评论,也可以邮件至 [email protected]

文章标题:神经网络参数的初始化问题

文章字数:630

本文作者:ylhao

发布时间:2018-05-21, 11:14:53

最后更新:2019-06-07, 11:50:53

原始链接:https://ylhao.github.io/2018/05/21/29/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

未找到相关的 Issues 进行评论

请联系 @ylhao 初始化创建


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK