神经网络权重初始化

深度学习中的weight initialization对模型收敛速度和模型质量有重要影响!
在ReLU 中推荐使用Xavier Initialization的变种,暂且称之为He Initialization:
在这里插入图片描述
使用Batch Normalization Layer可以有效降低深度网络对weight初始化的依赖:
在这里插入图片描述

初始化为0的可行性?
答案是不可行。 为什么将所有W初始化为0是错误的呢?是因为如果所有的参数都是0,那么所有神经元的输出都将是相同的,那在back propagation的时候同一层内所有神经元的行为也是相同的 — gradient相同,weight update也相同。这显然是一个不可接受的结果。

random initialization
随机初始化是很多人目前经常使用的方法,然而这是有弊端的,一旦随机分布选择不当,就会导致网络优化陷入困境。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这是y=wx+b的值比较大(好几十,因为矩阵乘后有累加效果,导致y比较大),经过tanh,多数分布在-1,1附近,传入下层作为x和下层的较大w乘后还是如此。所以一直徘徊在-1,1左右。

Xavier initialization

Xavier initialization可以解决上面的问题!其初始化方式也并不复杂。Xavier初始化的基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0。注意,为了问题的简便,Xavier初始化的推导过程是基于线性函数的,但是它在一些非线性神经元中也很有效。让我们试一下:
(node_in)输入神经元数量
W = tf.Variable(np.random.randn(node_in, node_out)) / np.sqrt(node_in)
在这里插入图片描述

意义:避免上一层传来的y经过和较大的w乘后变的很大

He initialization
在这里插入图片描述

Batch Normalization Layer

意义:强制将上一层的y和w乘完之后,做一次Gaussian Normalization和线性变换。
Batch Normalization是一种巧妙而粗暴的方法来削弱bad initialization的影响,
我们想要的是在非线性activation之前,输出值应该有比较好的分布(例如高斯分布),以便于back propagation时计算gradient,更新weight。Batch Normalization将输出值强行做一次Gaussian Normalization和线性变换:
在这里插入图片描述
在这里插入图片描述
参考链接:
雷锋网 https://www.leiphone.com/news/201703/3qMp45aQtbxTdzmK.html

猜你喜欢

转载自blog.csdn.net/weixin_43167121/article/details/88176101