2020-5-10 吴恩达-NN&DL-w3 浅层NN(3.11 随机初始化-否则完全对称,多个隐藏单元没有意义)

1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai

3.11 随机初始化 Random Initialization

训练NN时,权重随机初始化是很重要的。
逻辑回归,权重初始化为0是可以的。但是如果把NN的各个参数数组全部初始化为0,那么梯度下降算法会无效。

为什么会这样呢?

在这里插入图片描述
观察上面的网络。

  • 有2个输入特征,n[0]=2
  • 有2个隐藏单元,n[1]=2

所以隐藏层参数矩阵 W[1]维度是2 x 2。初始化为0,那么W[1]=[0000]W^{[1]}=\begin{bmatrix} 0 & 0 \\ 0 & 0 \\ \end{bmatrix}
同样,b[1]也初始化为0,b[1]=[00]b^{[1]}=\begin{bmatrix} 0 \\ 0 \\ \end{bmatrix}

把偏置项b初始化为0是合理的,但是把W初始化为0就会产生问题。因为你给NN输入任何样本,结果都是a1[1]=a2[1]a^{[1]}_1=a^{[1]}_2,所以2个激活函数完全一样,这2个隐藏层都在做完全一样的计算。

同样,在做反向传播时候,出于对称性,dz1[1]=dz2[1]dz^{[1]}_1=dz^{[1]}_2

如果W[2]=[00]W^{[2]}=\begin{bmatrix} 0 & 0 \\ \end{bmatrix},那么2个隐藏单元就完全一样了,我们称之完全对称。这意味这节点在计算完全一样的函数。我们可以通过归纳法证明,无论你计算多久,每次训练迭代,2个隐藏节点都在计算相同的函数,2个节点对输出节点的影响完全一样,永远是对称的。在这种情况下,多个隐藏节点没有任何意义

对于更大的NN,更多的隐藏单元,同样可以证明,如果你把权重W都初始化为0,那么所有的隐藏单元都是对称的,不管你下降了多久,它们都在计算完全一样的函数,完全没有用处。

回到2个隐藏单元NN,我们需要不同的隐藏单元去计算不同的函数。这个问题的计算方案是随机初始化所有参数

W[1]=np.random.randn((2,2))*0.01 #产生参数为(2,2)的高斯分布随机变量,再乘以0.01可以生成一个很小随机数
b[1]=np.zero((2,1)) #b没有完全对称问题,可以初始化为0
W[2]=np.random.randn((1,2))*0.01 #产生参数为(1,2)的高斯分布随机变量,再乘以0.01可以生成一个很小随机
b[2]=0 #b没有完全对称问题,可以初始化为0

为什么初始值要用一个比较小的随机数?

在这里我们乘了1个0.01,而不是一个很大的数,因为通常会把权重矩阵W初始化为非常非常小的随机值。因为在隐藏层或者输出层使用tanh或者sigmoid激活函数,如果权重W太大,那么z会很大或者很小,那么a值就会在曲线非常平缓的区域(激活函数饱和),显然梯度(斜率)会非常小,梯度下降也会非常慢,参数的学习也会非常慢。
在这里插入图片描述

当然,如果不使用tanh和sigmoid函数,可能不会这样的问题。但是二分法类的输出单元采用的是sigmoid函数,初始权重W一定不能太大。

训练一个单隐层的双层NN,这是一个相对较浅的NN,没有太多的隐藏层,使用 0.01设置权重W应该还可以,但是对于一个很深的NN,就可以需要尝试其他常数了,不过无论如何初始化参数一般都应该很小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章