关于challenge:深度学习基础入门篇六模型调优学习率设置Warm-Uploss自适应衰减等batch-size调优技巧

3次阅读

共计 12170 个字符,预计需要花费 31 分钟才能阅读完成。

深度学习根底入门篇[六]:模型调优,学习率设置(Warm Up、loss 自适应衰减等),batch size 调优技巧,基于方差放缩初始化办法。

1. 学习率

学习率是训练神经网络的重要超参数之一,它代表在每一次迭代中梯度向损失函数最优解挪动的步长,通常用 $\eta$ 示意。它的大小决定网络学习速度的快慢。在网络训练过程中,模型通过样本数据给出预测值,计算代价函数并通过反向流传来调整参数。反复上述过程,使得模型参数逐渐趋于最优解从而取得最优模型。在这个过程中,学习率负责管制每一步参数更新的步长。适合的学习率能够使代价函数以适合的速度收敛到最小值。

1.1 学习率对网络的影响

梯度更新公式: $$\theta=\theta-\eta\frac{\partial}{\partial\theta}J(\theta)$$

根据上述公式咱们能够看到,如果学习率 $\eta$ 较大,那么参数的更新速度就会很快,能够放慢网络的收敛速度,但如果学习率过大,可能会导致参数在最优解左近震荡,代价函数难以收敛,甚至可能会错过最优解,导致参数向谬误的方向更新,代价函数不仅不收敛反而可能爆炸(如图 1a 所示)。如果学习率 $\eta$ 较小,网络可能不会错过最长处,然而网络学习速度会变慢。同时,如果学习率过小,则很可能会陷入部分最长处(如图 1b 所示)。因而,只有找到适合的学习率,能力保障代价函数以较快的速度迫近全局最优解。

1.2 学习率的设置

咱们理解了 只有适合的学习率能力保障网络稳固学习的同时,又以正当的高速收敛来缩小训练工夫 。那么,如何设置学习率呢?
**
通常的,在训练网络的后期过程中,会选取一个绝对较大的学习率以放慢网络的收敛速度。而随着迭代优化的次数增多,逐渐减小学习率,以保障最终收敛至全局最优解,而不是在其左近震荡或爆炸 **。上面将介绍几种罕用的学习率衰减办法,包含:分段常数衰减、指数衰减、天然指数衰减、多项式衰减、距离衰减、多距离衰减、逆工夫衰减、Lambda 衰减、余弦衰减、诺姆衰减、loss 自适应衰减、线性学习率热身等。

1.2.1 分段常数衰减(Piecewise Decay)

在不同的学习阶段指定不同的学习率,在每段内学习率雷同。该过程能够举例说明为:

boundaries = [100, 200]  # 指定学习率扭转的边界点为 100 和 200
values = [1.0, 0.5, 0.1] # 指定不同区间下的学习率大小

learning_rate = 1.0  if epoch < 100 
learning_rate = 0.5  if 100 <= epoch < 200
learning_rate = 0.1  if epoch >= 200

1.2.2 指数衰减(Exponential Decay)

学习率随训练轮数成指数衰减,每次将以后学习率乘以给定的衰减率失去下一个学习率。指数衰减的公式可示意为:

$$new\_learning\_rate=last\_learning\_rate\ast gamma$$

其中,gamma 为衰减率。

1.2.3 天然指数衰减(Natural Exponential Decay)

每次将以后学习率乘以给定的衰减率的天然指数失去下一个学习率。其公式表白为:

$$\textit{new_learning_rate}=\textit{learning_rate}*e^{-gamma*epoch}$$

其中,learning_rate 为初始学习率,gamma 为衰减率,epoch 为训练轮数。

1.2.4 多项式衰减(Polynomial Decay)

通过多项式衰减函数,学习率从初始值逐步衰减至最低学习率。其中,参数 cycle 表学习率降落后是否从新回升。若 cycle=True,则学习率衰减至最低后会从新回升到肯定值,再升高至最低学习率并进行循环。若 cycle=False,则学习率从初始值枯燥递加至最低值。

  • 若 cycle=True,其计算公式为:

$$decay\_steps=decay\_steps*math.ceil(\dfrac{epoch}{decay\_steps})\quad\text{}$$

$$new\_learning\_rate=(learning\_rate-end\_lr)*(1-\dfrac{epoch}{decay\_steps})^{power}+end\_lr$$

  • 若 cycle=False,其计算公式为:

$$epoch=min(epoch,decay\textit{steps})$$

$$new\_learning\_rate=(learning\_rate-end\_lr)*(1-\dfrac{epoch}{decay\_steps})^{power}+end\_lr$$

其中,learning_rate 为初始学习率,decay_step 为进行衰减的步长,end_lr 为最低学习率,power 为多项式的幂。

1.2.5 距离衰减(Step Decay)

学习率依照指定的轮数距离进行衰减,该过程可举例说明为:

learning_rate = 0.5 # 学习率初始值
step_size = 30      # 每训练 30 个 epoch 进行一次衰减
gamma = 0.1         # 衰减率


learning_rate = 0.5    if epoch < 30 
learning_rate = 0.05   if 30 <= epoch < 60
learning_rate = 0.005  if 60 <= epoch < 90

1.2.6 多距离衰减(Multi Step Decay)

学习率按特定距离进行衰减,与距离衰减的区别在于:距离衰减的 epoch 距离是繁多且固定的,而多距离衰减中的 epoch 距离是预先指定的多距离。该过程可举例说明为:

learning_rate = 0.5    # 学习率初始值
milestones = [30, 50]  # 指定轮数距离
gamma = 0.1            # 衰减率

learning_rate = 0.5    if epoch < 30
learning_rate = 0.05   if 30 <= epoch < 50
learning_rate = 0.005  if 50 <= epoch
...

1.2.7 逆工夫衰减(Inverse Time Decay)

学习率大小与以后衰减次数成反比。其计算公式如下:

$$new\_learning\_rate=\frac{l e a r n i n g\_r a t e}{1+g a m m a\ast e p o c h}$$

其中,learning_rate 为初始学习率,gamma 为衰减率,epoch 为训练轮数。

1.2.8 Lambda 衰减(Lambda Decay)

应用 lambda 函数来设置学习率,其中 lambda 函数通过 epoch 计算出一个因子,应用该因子乘以初始学习率。该衰减过程可参考如下例子:

learning_rate = 0.5                      # 学习率初始值
lr_lambda = lambda epoch: 0.95 ** epoch  # 定义 lambda 函数

learning_rate = 0.5                      # 当 epoch = 0 时,0.5 * 0.95 ** 0 = 0.5
learning_rate = 0.475                    # 当 epoch = 1 时,0.5 * 0.95 ** 1 = 0.475
learning_rate = 0.45125                  # 当 epoch = 2 时,0.5 * 0.95 ** 2 = 0.45125
...

1.2.9 余弦衰减(Cosine Annealing Decay)

应用 cosine annealing 的策略来动静调整学习率,学习率随 step 数变动成余弦函数周期变动。该办法为论文 SGDR:Stochastic Gradient Descent with Warm Restarts 中 cosine annealing 动静学习率。学习率调整公式为

$$\eta_t=\eta_{min}+\dfrac{1}{2}(\eta_{max}-\eta_{min})(1+cos(\dfrac{T_{car}}{T_{max}}\pi)),\quad T_{car}\neq(2k+1)T_{max}$$

$$\eta_{t+1}=\eta_t+\dfrac{1}{2}(\eta_{max}-\eta_{min})(1-cos(\dfrac{1}{T_{max}}\pi)),\quad T_{car}=(2k+1)T_{max}$$

1.2.10 诺姆衰减(Noam Decay)

诺姆衰减的计算形式如下:

$$new\_learning\_rate=learning\_rate\ast d^{-0.5}_{mode}\ast min(epsil^{-0.5},epoch\ast uarmip\_steps^{-1.5})$$

其中,$d_model$ 代表模型的输出、输入向量特色维度,warmup_steps 为预热步数,learning_rate 为初始学习率。更多细节请参考 attention is all you need。

1.2.11 loss 自适应衰减(Reduce On Plateau)

当 loss 进行下降时,升高学习率。其思维是:一旦模型体现不再晋升,将学习率升高 2-10 倍对模型的训练往往无益。此外,每升高一次学习率后,将会进入一个沉着期。在沉着期内不会监控 loss 变动也不会进行衰减。当沉着期完结后,会持续监控 loss 的回升或降落。

1.2.12 线性学习率热身(Linear Warm Up)用的比拟多

线性学习率热身是一种学习率优化策略,在失常调整学习率前,先逐渐增大学习率。

当训练步数小于热身步数(warmup_steps)时,学习率 $lr$ 按如下形式更新:

$$lr=start\_lr+(end\_lr-start\_lr)*\dfrac{epoch}{warmup\_steps}\quad$$

当训练步数大于等于热身步数(warmup_steps)时,学习率 $lr$ 为:

$$lr=learning\_rate$$

其中,lr 为热身之后的学习率,start_lr 为学习率初始值,end_lr 为最终学习率,epoch 为训练轮数。

2.batch size

2.1 什么是 BatchSize

  • Batch 个别被翻译为批量,设置 batch_size 的目标让模型在训练过程中每次抉择批量的数据来进行解决。Batch Size 的直观了解就是一次训练所选取的样本数
  • Batch Size 的大小影响模型的优化水平和速度。同时其间接影响到 GPU 内存的应用状况,如果你 GPU 内存不大,该数值最好设置小一点。

在神经网络的训练过程中,一个十分直观的须要调整的超参数就是 batch size。咱们须要决定在一次训练中,要选取多少样本喂给神经网络,这个要抉择的样本个数,就是 batch size。batch size 的可取值范畴为 1 到整体样本数。举个例子,

  • 传统的梯度降落法(Gradient Descent)就是采纳了全副样本来进行训练和梯度更新,
  • 它的变体随机梯度降落法(stochastic gradient descent),则设定 batch size 为 1,即每次只将一个样本喂给神经网络,
  • 在 mini-batch 梯度降落法中,则采纳了一个折中的办法,每次抉择一部分数据用于训练

2.2 batch size 对网络的影响

  • 在没有应用 Batch Size 之前,这意味着网络在训练时,是一次把所有的数据(整个数据库)输出网络中,而后计算它们的梯度进行反向流传,因为在计算梯度时应用了整个数据库,所以计算失去的梯度方向更为精确。但在这状况下,计算失去不同梯度值差异微小,难以使用一个全局的学习率,所以这时个别应用 Rprop 这种基于梯度符号的训练算法,独自进行梯度更新。
  • 在小样本数的数据库中,不应用 Batch Size 是可行的,而且成果也很好。然而一旦是大型的数据库,一次性把所有数据输进网络,必定会引起内存的爆炸。所以就提出 Batch Size 的概念。
  1. 当采取传统的梯度降落法时,神经网络每一次训练都会应用全副数据。梯度基于全样本计算,因而会很精确。对于凸问题,部分最优即为全局最优的状况下,精确的梯度计算能够使梯度更新朝着正确的方向进行,以较快的速度达到全局最优解。但在实在的神经网络训练过程中,咱们通常遇到的都是非凸问题,此时,部分最优解不是全局最优解,而传统的梯度降落法在这种状况下很容易陷入部分最长处或鞍点。同时,当整体样本数不大时,采纳整体样本做 batch size 不会十分耗时,而当样本数很大时,每一次的计算将会十分耗时,也会导致内存爆炸。
  2. 当采取随机梯度降落法时,batch size 值为 1,每次取得的梯度都是依据以后的随机样本计算得来。由一个样本的梯度来近似所有的样本,会导致梯度预计不是很精确。同时,梯度易收到极其值的影响,导致损失激烈震荡。但因为 batch size 为 1,随机梯度降落法的计算速度会十分快。
  3. 如果 选取比拟折中的 batch size 作为 mini-batch 来进行随机梯度降落,其长处是用局部样本来近似全副样本,梯度绝对于 batch size 为 1 更为精确,同时相比与应用全副样本,计算量减小,计算速度和收敛速度都会失去晋升。看到这里可能会有一个疑难,为什么 10000 样本训练 1 次会比 100 样本训练 100 次收敛慢呢?咱们假如样本实在的标准差为 $\sigma$,则 n 个样本均值的标准差为 $\frac{\sigma}{\sqrt{n}}$,$\sqrt{n}$ 表明应用更多样原本预计梯度的办法回报是低于线性的。10000 个样本训练一次和 100 个样本训练一次,因为计算量是线性的,前者的计算量是后者的 100 倍,但均值标准差只比后者升高了 10 倍,那么在雷同的计算量下(同样训练 10000 个样本),小样本的收敛速度是远快于应用整个样本集的。同时,绝对于训练全副样本,因为梯度存在不准确性,噪声的影响很可能会让梯度降落的过程中来到部分最长处或鞍点,从而有机会寻找全局最长处。

2.3 如何设置 Batch_Size 的值?

更大的 batch size 会失去更准确的梯度估计值,但其预计梯度的回报是低于线性的。如果训练集较小,能够间接应用梯度降落法,batch size 等于样本集大小。

设置 BatchSize 要留神一下几点:

     1)batch 数太小,而类别又比拟多的时候,真的可能会导致 loss 函数震荡而不收敛,尤其是在你的网络比较复杂的时候。

     2)随着 batchsize 增大,解决雷同的数据量的速度越快。

     3)随着 batchsize 增大,达到雷同精度所须要的 epoch 数量越来越多。

     4)因为上述两种因素的矛盾,Batch_Size 增大到某个时候,达到工夫上的最优。

     5)因为最终收敛精度会陷入不同的部分极值,因而 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。

     6)过大的 batchsize 的后果是网络很容易收敛到一些不好的部分最长处。同样太小的 batch 也存在一些问题,比方训练速度很慢,训练不容易收敛等。

     7)具体的 batch size 的选取和训练集的样本数目相干。

     8)GPU 对 2 的幂次的 batch 能够施展更佳的性能,因而设置成 16、32、64、128…时往往要比设置为整 10、整 100 的倍数时体现更优,Deep Learning 书中提到,在某些硬件上应用特定大小的数组时,运行工夫会更少。尤其是在应用 GPU 时,通常应用 2 的幂数作为 batch size 能够取得更少的运行工夫。

    我在设置 BatchSize 的时候,首先抉择大点的 BatchSize 把 GPU 占满,察看 Loss 收敛的状况,如果不收敛,或者收敛成果不好则升高 BatchSize,个别罕用 16,32,64 等。

2.3.1 在正当范畴内,增大 Batch_Size 有何益处?

  • 内存利用率进步了,大矩阵乘法的并行化效率进步。
  • 跑完一次 epoch(全数据集)所需的迭代次数缩小,对于雷同数据量的处理速度进一步放慢。
  • 在肯定范畴内,一般来说 Batch_Size 越大,其确定的降落方向越准,引起训练震荡越小。

2.3.2 自觉增大 Batch_Size 有何害处?

  • 内存利用率进步了,然而内存容量可能撑不住了。
  • 跑完一次 epoch(全数据集)所需的迭代次数缩小,要想达到雷同的精度,其所破费的工夫大大增加了,从而对参数的修改也就显得更加迟缓。
  • Batch_Size 增大到肯定水平,其确定的降落方向曾经根本不再变动。

2.3.3 调节 Batch_Size 对训练成果影响到底如何?

  • Batch_Size 太小,模型体现成果极其蹩脚(error 飙升)。
  • 随着 Batch_Size 增大,解决雷同数据量的速度越快。
  • 随着 Batch_Size 增大,达到雷同精度所须要的 epoch 数量越来越多。
  • 因为上述两种因素的矛盾,Batch_Size 增大到某个时候,达到工夫上的最优。
  • 因为最终收敛精度会陷入不同的部分极值,因而 Batch_Size 增大到某些时候,达到最终收敛精度上的最优

    • batchsize 过小:每次计算的梯度不稳固,引起训练的震荡比拟大,很难收敛。

batchsize 过大长处:

  • (1)进步了内存利用率,大矩阵乘法并行计算效率进步。
  • (2)计算的梯度方向比拟准,引起的训练的震荡比拟小。
  • (3)跑完一次 epoch 所须要的迭代次数变小,雷同数据量的数据处理速度放慢。

    batchsize 过大毛病:

  • 容易内容溢出,想要达到雷同精度,epoch 会越来越大,容易陷入部分最优,泛化性能差。

batchsize 设置:通常 10 到 100,个别设置为 2 的 n 次方。

起因:计算机的 gpu 和 cpu 的 memory 都是 2 进制形式存储的,设置 2 的 n 次方能够放慢计算速度。

深度学习中常常看到 epoch、iteration 和 batchsize 这三个的区别:

  1. batchsize:批大小。在深度学习中,个别采纳 SGD 训练,即每次训练在训练集中取 batchsize 个样本训练;
  2. iteration:1 个 iteration 等于应用 batchsize 个样本训练一次;
  3. epoch:1 个 epoch 等于应用训练集中的全副样本训练一次;

举个例子,训练集有 1000 个样本,batchsize=10,那么训练残缺个样本集须要:100 次 iteration,1 次 epoch。

1. 当数据量足够大的时候能够适当的减小 batch_size, 因为数据量太大,内存不够。但自觉缩小会导致无奈收敛,batch_size= 1 时为在线学习,也是规范的 SGD,这样学习,如果数据量不大,noise 数据存在时,模型容易被 noise 带偏,如果数据量足够大,noise 的影响会被“冲淡”,对模型简直不影响。

2.batch 的抉择,首先决定的是降落方向,如果数据集比拟小,则齐全能够采纳全数据集的模式。这样做的益处有两点,

1)全数据集的方向可能更好的代表样本总体,确定其极值所在。

2)因为不同权重的梯度值差异微小,因而选取一个全局的学习率很艰难。

3. 参数初始化

在咱们开始训练神经网络之前,首先要做的是给网络中的每一个权重和偏置赋值,这个赋值的过程就是参数初始化。正当的初始化能够缩短神经网络的训练工夫,而不合理的初始化可能使网络难以收敛。那么,咱们要如何对参数进行初始化呢?或者你有想到过将全副参数都设置为 0,这看起来是一个简略又不便的方法,但遗憾的是神经网络中不能对权重进行全零初始化。在探讨如何对参数进行初始化前,咱们先来看看为什么不能进行全零初始化。

为什么不能全零初始化?

以一个三层网络为例,假如其具体的网络示意图如图 1 所示。

其中,$z4、z5、z6$ 可表白为:

$$z_4=w_{14}*x_1+w_{24}*x_2+w_{34}*x_3+b_4\\ z_5=w_{15}*x_1+w_{25}*x_2+w_{35}*x_3+b_5\\ z_6=w_{16}*x_1+w_{26}*x_2+w_{36}*x_3+b_6$$

因为权重和偏置的初始值都为 0,且同一层网络的激活函数雷同,则有:

$$\begin{array}{c}z_4=z_5=z_6\\ a_4=a_5=a_6\end{array}$$

对于神经网络的最终输入 $a_7$,咱们能够失去:

$$\begin{array}{l}z_7=w_{47}*a_4+w_{57}*a_5+w_{67}*a_6\\ a_7=f(z_7)\\ \end{array}$$

其中,$f(\cdot)$ 为第三层网络的激活函数。

假如实在值为 y, 损失函数为 $Loss(a_7,y)$,依据反向流传算法和链式法则,咱们能够失去:

$$\begin{aligned}\frac{\partial Loss(a_7,y)}{\partial w_{47}}&=\frac{\partial Loss(a_7,y)}{\partial a_7}*\frac{\partial a_7}{\partial z_7}*\frac{\partial z_7}{\partial w_{47}}\\ &=\frac{\partial Loss(a_7,y)}{\partial a_7}*\frac{\partial a_7}{\partial z_7}*a_4\\ \end{aligned}$$

同样地:

$$\begin{aligned}\frac{\partial Loss(a_{7},y)}{\partial w_{57}}&=\frac{\partial Loss(a_{7},y)}{\partial a_{7}}*\frac{\partial a_{7}}{\partial z_{7}}*\frac{\partial z_{7}}{\partial w_{67}}\\ &=\frac{\partial Loss(a_{7},y)}{\partial a_{7}}*\frac{\partial a_{7}}{\partial z_{7}}*a_{5}\\ \frac{\partial Loss(a_{7},y)}{\partial w_{37}}=\frac{\partial Loss(a_{7},y)}{\partial a_{7}}*\frac{\partial a_{7}}{\partial z_{7}}*a_{6}\end{aligned}$$

因为 $a_4=a_5=a_6$,则有:

$$\frac{\partial L o s s(a_7,y)}{\partial w_{47}}=\frac{\partial L o s s(a_7,y)}{\partial w_{57}}=\frac{\partial L o s s(a_7,y)}{\partial w_{67}}=\Delta w\quad$$

权重更新表达式为:

$$\begin{array}{c}w’_{47}=w_{47}+\Delta w\\ w’_{57}=w_{57}+\Delta w\\ w’_{67}=w_{67}+\Delta w\end{array}$$

因为 $w_{47}、w_{57}、w_{67}$ 的初始值均为 0,那么:$w′_{47}=w′_{57}=w′_{67}$,同理:$$w′_{14}=w′_{24}=w′_{34}=w′_{14}=w′_{25}=w′_{26}=w′_{34}=w′_{35}=w′_{36}$$
。由此可见,更新后的参数在每一层内都是雷同的。同时,无论通过多少次网络训练,雷同网络层内的参数值都是雷同的,这会导致网络在学习时没有重点,对所有的特色解决雷同,这很可能导致模型无奈收敛训练失败。这种景象被称为对称生效。

3. 常见的初始化办法

3.1 基于固定方差的参数初始化

一种十分常见的形式是 采纳高斯分布或均匀分布来对权重进行随机初始化。高斯分布和均匀分布的抉择仿佛没有很大差异,但初始散布的大小对于优化过程的后果和网络泛化能力都有很大影响。

高斯分布初始化 :应用一个均值为 $\mu$,方差为 $\sigma_{2}$ 的高斯分布 N(μ,σ2) 对每个参数进行随机初始化,通常状况下,μ=0,并对生成的数乘上一个小数,把权重初始化为很小的随机数。比方:$w=0.01∗np.random.rand(D,H)$,这里抉择乘以 0.01 初始化为一个很小的数是因为,如果最后随机到的 w 值很大,当咱们抉择 sigmoid 或 tanh 激活函数时,函数值 $sigmoid(⋅)$ 或 $tanh(⋅)$ 会停留在一个很平坦的中央,激活值靠近饱和,导致梯度下降时,梯度很小,学习变得迟缓。但也不是说权重值越小越好,如果权重值过小,会导致在反向流传时计算失去很小的梯度值,在一直的反向流传过程中,引起梯度隐没。

均匀分布初始化 :在一个给定区间 [−r,r] 内采取均匀分布进行初始化。假如随机变量在区间 [a,b]内均匀分布,则其方差为 $var(x)=\frac{\left(b-a\right)^2}{12}.$。因而,当在 [−r,r]的区间内均匀分布采样,并满足 $var(x)=\sigma^{2}$ 时,则有 $$r=\sqrt{3\sigma^{2}}\text{.}$$

上述两种基于固定方差的初始随机化办法中,关键点在于如何设置方差 $\sigma^{2}$。过大或过小的方差都会导致梯度降落迟缓,网络训练成果不好等问题。为了升高固定方差对网络性能及优化效率的影响,基于固定方差的随机初始化个别要配合逐层归一化来应用。

3.2 基于方差缩放的参数初始化

方差缩放办法可能依据神经元的链接数量来自适应地调整初始化散布中央差,尽可能的保障每个神经元的输出和输入方差统一。那么,为什么要保障前后方差的一致性呢?这是因为如果输出空间和输入空间的方差差异较大,也就是说数据空间散布差别较大,那么在反向流传时可能会引起梯度隐没或爆炸问题。比方,当输出空间稠密,输入空间浓密时,将在输入空间计算失去的误差反向流传给输出空间时,这个误差可能会显得微不足道,从而引起梯度隐没。而当输出空间浓密,输入空间稠密时,将误差反向流传给输出空间,就可能会引起梯度爆炸,使得模型震荡。

3.2.1 Xavier 初始化

Xavier 初始化的提出,遵循了 Bradley(2009)的实践环境,假如网络中的每一层的激活函数都是对于 0 对称的线性激活函数,权重间的初始化和输出特色互相独立,且均值都为 0。

假如在一个神经网络中,对于一层线性网络,其示意为:

$$y=f(z_1W_1+z_2W_2+z_3W_3+…+z_iW_i+b)\quad\text{}$$

$z_i$ 代表该层网络的第 i 个神经元,y 为该层网络的输入,$W_i$ 为本层网络的权重,b 为偏置,$f(⋅)$ 为激活函数。这里咱们假如激活函数为恒等函数,即 f(x)=x,导数为 1。

对于其中的每个 $z_iW_i$,其方差为:

$$Var(z_i W_i)=E(z_i)^2Var(W_i)+E(W_i)^2Var(z_i)+Var(z_i)Var(W_i)$$

因为 $W_i$ 和 $z_i$ 的均值都为 0,因而能够失去:

$$Var(z_iW_i)=Var(z_i)Var(W_i)$$

又因为 $z$ 和 $W$ 互相独立,则有:

$$Var(y)=n_i*Var(z_i)Var(W_i)\quad\text{}$$

其中,$n_i$ 代表第 i 层的神经元数量。

通过下面的公式咱们能够发现,输出 $z_i$ 的方差和输入 y 方差相差 $n∗Var(W_i)$ 倍,也就是说输出信号在通过神经元后会被放大或放大 $n∗Var(W_i)$ 倍。为保障通过多层网络后,信号不被过分的放大或放大,咱们须要尽可能保障前向流传和反向流传时每层方差保持一致,则有:

$$\begin{matrix}\forall i,\quad n_i*Var(W_i)=1\\ \forall i,\quad n_{i+1}*Var(W_i)=1\end{matrix}$$

衡量上述两个限度,提出一个折中的方法:

$$\forall i,\quad Var(W_i)=\dfrac{2}{n_i+n_{i+1}}$$

依据计算出的现实方差,可抉择通过高斯分布或均匀分布来随机初始化参数。若采纳高斯分布,则权重可依照 $N(0,\frac{2}{n_{i}+n_{i+1}})$ 的高斯分布来进行初始化。若采纳在区间 [−r,r]的均匀分布进行初始化,则初始化散布有:

$$W\sim U[-\frac{\sqrt6}{\sqrt{n_i+n_{i+1}}},\frac{\sqrt6}{\sqrt{n_i+n_{i+1}}}]\quad\text{}$$

Xavier 初始化因为根本保障了输出和输入的方差统一,使得样本空间和类别空间的散布差别类似,因而使得模型的训练速度和分类性能取得晋升。但 xavier 初始化的推导基于激活函数是线性的假如,使其并不适宜于 ReLU、sigmoid 等非线性激活函数。

具体论文参见:Understanding the difficulty of training deep feedforward neural networks

3.2.2 Kaiming 初始化

kaiming 初始化是一种针对 ReLU 的初始化办法,假设应用 ReLU 激活函数时,网络每一层都中有一半的神经元被激活,另一半为 0, 因而其散布的方差也近似为恒等函数的一半。这样在思考前向流传和反向流传时则有:

$$\begin{array}{c}{{\forall i,\quad\frac{1}{2}n_{i}*V a r(W_{i})=1}}\\ {{\forall i,\quad\frac{1}{2}n_{i+1}*V a r(W_{i})=1}}\\ \end{array}$$

$W_i$ 的现实方差为:

$$\forall i,\quad Var(W_i)=\dfrac2{n_i}\quad\text{}$$

当采纳高斯分布时,则权重可依照 $N(0,\frac{2}{n_i})$ 的高斯分布来进行初始化。若采纳在区间 [−r,r]的均匀分布进行初始化,则初始化散布有:

$$W\sim U[+\dfrac{\sqrt{6}}{\sqrt{n_i}},\dfrac{\sqrt{6}}{\sqrt{n_i}}]$$

Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

本文参加了 SegmentFault 思否写作挑战赛,欢送正在浏览的你也退出。

正文完
 0