权重初始化方式

常见的四种初始化方式

  • 初始化为常数或者0
  • \frac{1}{\sqrt{n_{in}}}初始化
  • Xavier初始化
  • Kaiming初始化

 相同点:四种更新方式的权重均值都为0

后三种初始化的目的是,设计初始化权重的方差Var(W),使得每层的输出值z_2 的方差与输入值z_1的方差是一样的。

----- 输入输出方差一致性

初始化方式 特点 前向方差一致性 反向方差一致性 激活函数

初始化为常数或者0

同层神经元的输入输出完全相同且更新相同      

\frac{1}{\sqrt{n_{in}}} 初始化

不考虑激活函数,只利用状态值,只考虑了正向传播,得到 Var(W)=\frac{1}{n_{in}}    

Xavier初始化

不考虑激活函数,只利用状态值,既考虑正向传播又考虑反向传播,使用调和平均数,得到Var(W) = \frac{2}{n_{in}+n_{out}}  
Kaiming初始化 考虑激活函数(ReLu),既考虑正向又考虑反向传播,但是只任取其一即可,得到Var(W)=\frac{1}{n_{in}}

注:后三种方式网络的权重初始化,是指对每一层分别按照0均值,不同方差(与n_{in}n_{out}有关)的正态分布进行初始化。

正向传播过程

z_1=W_1x+b_1

a_1=f(z_1)

z_2=W_2a_1+b_2

a_2=f(z_2)

L=\frac{1}{2}||y-a_2||^2

本文以全连接网络为例

1. 初始化化为常数(或者0)

(1)分析对W_2 的导数

\frac{\partial L}{\partial W_2}=\frac{\partial L}{\partial a_2} \cdot \frac{\partial a_2}{\partial z_2} \cdot \frac{\partial z_2}{\partial W_2} \\\\=-(y-a_2)^2f'(a_2)a_1

可以看出,如果将权重初始化为常数,那么网络同一层神经元的输出值都是一样的,从而导致梯度也相同,权重的更新也相同,那么同一层的神经元都完全相同,显然是不合理的。

更特殊的是如果权重和偏置都设置为0,那么梯度也为0,整个网络将不能更新

(2)分析对b_2的导数

\frac{\partial L}{\partial b_2}=\frac{\partial L}{\partial a_2} \cdot \frac{\partial a_2}{\partial z_2} \cdot \frac{\partial z_2}{\partial b_2} \\\\=-(y-a_2)^2f'(a_2)

可以看出每层bias的更新都是相同的

 

2. \frac{1}{\sqrt{n_{in}}} 初始化

一些假设:

权重初始化方式_第1张图片

由于前两个假设条件,我们可以将激活函数看做是恒等映射,也就是相当于没有激活函数。

那么要解决的问题就是将权重W初始化成什么值可以使得输入z_1 输出z_2 的方差保持不变。

下面将通过z_2 、W_2 与 z_1 之间的关系推导得出:想要保证输入输出方差不变时,Var(W) 需要满足的条件。

正向传播过程中,只考虑状态值(激活函数之前):

z_1=W_1x_1+b_1

z_2=W_2+b_2

...

输出值z_2 、W_2 与 z_1 之间的关系推导:

为什么要保证输入输出方差的一致性?

对于L层神经网络有:

Var(z_l)=Var(\sum_j^{n_{in}} (W_l z_{l-1} +b_l))=Var(\sum_j^{n_{in}}W_lz_{l-1})=n_{in}Var(z_{l-1})Var(W_l)

Var(z_{l-1})=n_{in}Var(z_{l-2})Var(W_{l-1})

...

Var(z_2)=Var(x)Var(W_2)

所以可以得到:

Var(z_l)=Var(x) \prod_{l=1}^{L} n_{in}Var(W_l)

由上式可知,由于连乘的存在,如果n_{in}Var(W_l) \ne 1 ,其太大或者太小都会导致随着网络的加深出现问题,所以需要保证输入输出方差的一致性。

 

3. Xavier初始化

Xvaier在 \frac{1}{\sqrt{n_{in}}} 初始化⽅法的基础上考虑了反向传播的梯度输⼊输出的⽅差⼀致性。

由于正向的推导和\frac{1}{\sqrt{n_{in}}} 初始化⽅法⼀样,并且得出的结论也⼀样,所以下⾯只推导反向传播。

反向传播过程中,只考虑状态值(激活函数之前):

z_1=W_1x_1+b_1

z_2=W_2+b_2

...

则反向传播有:

\frac{\partial Cost}{\partial z_1} =\frac{\partial Cost}{\partial z_2}\cdot \frac{\partial z_2}{\partial z_1}

            =W_2^T\cdot\frac{\partial Cost}{\partial z_2}

那么对于第一层的第j个神经元求偏导有:

\frac{\partial Cost}{\partial z_1}=\sum_{i = 1}^{n_{out}} (W_2^{ij})^T\cdot \frac{\partial Cost}{\partial z_2}

输出值z_2 、W_2 与 z_1 之间的关系推导:

(推导过程同正向传播一样,只不过换成偏导数,即通过偏导数的等式建立z_1 和z_2之间的关系)

将上述式子两边取方差:

 

那么前向推导和后向推导就得到Var(W_2)两个约束条件

Var(W_2)=\frac{1}{n_{in}}

Var(W_2^T)=\frac{1}{n_{out}}

一般情况下,网络的n_{in}n_{out}是不相同的,所以前向后向这两个约束无法同时满足。论文作者采用了调和平均数得到了如下的约束条件:

Var(W_2)=\frac{2}{n_{in}+n_{out}}

Xavier所适合的激活函数有限:
1. 关于0对称
2. 线性,也就是没有考虑激活函数,或者初始状态在激活函数的线性部分
ReLU并不满足这些条件,实验也验证了Xavier初始化确实不适用ReLU激活函数。

4. Kaiming初始化

Kaiming初始化是针对ReLU激活函数设计的初始化方式

之前的正向和反向传播推导中均忽略了激活函数,所以下面在推导中加入激活函数:

正向传播推导:

根据前面正向传播推导的结果:Var(z_2)=n_{in}\cdot Var(W_2z_1)

引入激活函数后,同理可得(只要将z_1换成a_1即可):

Var(z_2)=n_{in}\cdot Var(W_2a_1)

同理经过化简可得出z_2a_1的方差之间的关系:

Var(z_2)=n_{in}\cdot Var(W_2) \cdot E(a_1)^2

其中a_1z_1经过激活函数(ReLU)得到的,所以需要计算E(a_1)^2,如下:

将 E(a_1)^2=\frac{1}{2}Var(z_1)

带入到 Var(z_2)=n_{in}\cdot Var(W_2)\cdot E(a_1)^2,得:

Var(z_2)=\frac{n_{in}}{2}\cdot Var(W_2)\cdot Var(z_1)

为了保证正向传播时状态值的方差不变,权重的方差需要满足;

Var(W_2)=\frac{2}{n_{out}}

反向传播推导:

\frac{\partial Cost}{\partial a_1} = \frac{\partial Cost}{\partial a_2} \cdot \frac{\partial a_2}{\partial z_2}\cdot \frac{\partial z_2}{\partial a_1}

            = (W_2)^T \cdot \frac{\partial Cost}{\partial a_2}\cdot f'(z_2)

对于第一层的第j个神经元的激活值的偏导数为:

\frac{\partial Cost}{\partial a_1^j}=\sum_{i=1}^{n_{out}}(W_2^{ij})^T \cdot \frac{\partial Cost}{\partial a_2^j}\cdot f'(z_2^j)

等式两边取方差:

Var(\frac{\partial Cost}{\partial a_1^j})=Var(\sum_{i=1}^{n_{out}}(W_2^{ij})^T )\cdot \frac{\partial Cost}{\partial a_2^j}\cdot f'(z_2^j)

为了简洁省略上标:

Var(\frac{\partial Cost}{\partial a_1})=Var(\sum_{i=1}^{n_{out}}W_2^T \cdot \frac{\partial Cost}{\partial a_2}\cdot f'(z_2))

Var(\frac{\partial Cost}{\partial a_1})=n_{out}\cdot Var(W_2^T \cdot \frac{\partial Cost}{\partial a_2}\cdot f'(z_2))

由E(W)=0,得:

由于激活函数是ReLU,所以f'(z_2)=0或1 ===》 (f'(z_2))^2取值也为0或1 ,所以有:

E(f'(z_2)^2)=\frac{1}{2},所以有:

由于\frac{\partial Cost}{\partial a_2} =\frac{\partial Cost}{\partial z_3}\cdot \frac{\partial z_3}{\partial a_2} = W_3^T \cdot \frac{\partial Cost}{\partial z_3},由于权重的期望为0,所以 E(\frac{\partial Cost}{\partial a_2})=0,可得:

得到权重的方差需要满足的约束条件:

Var(W_2^T)=\frac{2}{n_{out}}

综上,得到两个约束条件:

Var(W_2^T)=\frac{2}{n_{in}}

Var(W_2^T)=\frac{2}{n_{out}}

但是Kaiming初始化没有想Xavier初始化那样取两者的调和平均数。这两个约束条件根据是想保证前向传播还是反向传播输入输出方差的一致性来选择。

权重初始化方式_第2张图片

为什么可以只满足前向反向传播中的任意一个呢?

由:

权重初始化方式_第3张图片

有:

权重初始化方式_第4张图片

需要注意的是,我们有:

n_{l}^{out}=n_{l+1}^{in}

权重初始化方式_第5张图片

由正向和反向推导中间过程得到的:

正向: Var(z_l^j)=Var(\sum_{j=1}^{n_{l}^{in}}W_l^{ij}\cdot f(z_{l-1}^j))

反向: Var(\frac{\partial Cost}{\partial a_{l-1}^j})=Var(\sum_{j=1}^{n_{l-1}^{out}}(W_l^{ij})^T \cdot \frac{\partial Cost}{\partial a_l^j}\cdot f'(z_l^j))

n_{l}^{out}n_{l-1}^{in}是通过 \sum_{j=1}^{n_{l}^{out}}W_l和 \sum_{j=1}^{n_{l-1}^{in}}W_{l}得到的,所以二者相等。

如果保证前向传播的方差一致性,即取 Var(W_l)=\frac{2}{n_l^{in}},那么反向传播的方差为:

Var(\frac{\partial Cost}{\partial x})=Var(\frac{\partial Cost}{\partial z_1})(\prod_{l=1}^L \frac{1}{2}\cdot n_l^{out}\cdot \frac{2}{n_l^{in}})

                       =Var(\frac{\partial Cost}{\partial z_1})\cdot \frac{n_1^{out}}{n_1^{in}}\cdot \frac{n_2^{out}}{n_2^{in}}\cdot ... \cdot \frac{n_L^{out}}{n_L^{in}}

                       =Var(\frac{\partial Cost}{\partial z_1}) \cdot\frac{n_L^{out}}{n_1 ^{in}}

可以看到反向传播到最前面一层的时候,前后两层的方差只相差\frac{n_L^{out}}{n_1^{in}} , 这个是可以接受的。

同理,如果只让反向传播的方差不变,那么我们可以得到:

Var(\partial z_L)=\frac{n_1^{in}}{n_L^{out}}

结论

如果神经网络的激活函数为ReLU,那么一定要用Kaiming初始化方法,效果显著。

如果激活函数是tanh可以使用另外两种方法,但是Kaiming初始化也可以取到比较好的效果。

 

你可能感兴趣的:(深度学习,深度学习基础理论)