模型调优(Turning)(二)

注意力

注意力机制是什么

假设有一天热爱绘画的你决定去户外写生,你来到一片山坡上,极目远去,心旷神怡。头顶一片蔚蓝,脚踩一席草绿,远处山川连绵,眼前花草送香,暖阳含羞云后,轻风拂动衣襟,鸟啼虫鸣入耳,美景丹青共卷。

你集中精神,拿起画笔将蓝天、白云、青草等等这些元素,按照所思所想纷纷绘入画板。在绘画的过程中,你会持续地关注你构思到画板上的元素(比如蓝天,白云),而不会太多关注那些其他的元素,比如风,虫鸣,阳光等等。即你的精神是聚焦在你关心的那些事物上,这其实就是注意力的体现,这种有意识的聚焦被称为聚焦式注意力(Focus Attention)。

然而,正当你在画板上忘我倾洒的时侯,突然有人在背后喊你的名字,你立马注意到了,然后放下画笔,转头和来人交谈。这种无意识地,往往由外界刺激引发的注意力被称为显著性注意力(Saliency-Based Attention)。

但不论哪一种注意力,其实都是让你在某一时刻将注意力放到某些事物上,而忽略另外的一些事物,这就是注意力机制(Attention Mechanism)。

在深度学习领域,模型往往需要接收和处理大量的数据,然而在特定的某个时刻,往往只有少部分的某些数据是重要的,这种情况就非常适合Attention机制发光发热。Attention机制自提出以来,出现了很多不同Attention应用方式,但大道是共同的,均是将模型的注意力聚焦在重要的事情上。

经典注意力机制

假设现在我们要对一组输入 H = [ h 1 , h 2 , h 3 , . . . , h n ] H=[h_1,h_2,h_3,...,h_n] H=[h1,h2,h3,...,hn] 使用Attention机制计算重要的内容,这里往往需要一个查询向量 q q q,然后通过一个打分函数 s ( ⋅ ) s(\cdot) s() 计算查询向量 q q q 和每个输入 h i h_i hi 之间的相关性,得出一个分数。接下来使用softmax对这些分数进行归一化,归一化后的结果便是查询向量 q q q 在各个输入 h i h_i hi 上的注意力分布 a = [ a 1 , a 2 , a 3 , . . . , a n ] a=[a_1,a_2,a_3,...,a_n] a=[a1,a2,a3,...,an],其中每一项数值和原始的输入 H = [ h 1 , h 2 , h 3 , . . . , h n ] H=[h_1,h_2,h_3,...,h_n] H=[h1,h2,h3,...,hn] 一一对应。以 a i a_i ai 为例,相关计算公式如下: a i = s o f t m a x ( s ( h i , q ) ) = e x p ( s ( h i , q ) ) ∑ j = 1 n e x p ( s ( h j , q ) ) \begin{aligned}a_i = softmax(s(h_i, q))= \frac {exp(s(h_i,q))} {\sum_{j=1}^n exp(s(h_j, q))} \end{aligned} ai=softmax(s(hi,q))=j=1nexp(s(hj,q))exp(s(hi,q))最后根据这些注意力分布可以去有选择性的从输入信息 H H H 中提取信息,这里比较常用的信息提取方式,是一种”软性”的信息提取,即根据注意力分布对输入信息进行加权求和,最终的这个结果 context 体现了模型当前应该关注的内容: c o n t e x t = ∑ i = 1 n a i ⋅ h i context = \sum_{i=1}^n a_i \cdot h_i context=i=1naihi打分函数可以使用以下几种方式来计算:

  • 加性模型 s ( h , q ) = v T t a n h ( W h + U q ) s(h, q) = v^Ttanh(Wh+Uq) s(h,q)=vTtanh(Wh+Uq)
  • 点积模型 s ( h , q ) = h T q s(h, q) = h^Tq s(h,q)=hTq
  • 缩放点积模型 s ( h , q ) = h T q / D s(h, q) ={ h^Tq}/{\sqrt D} s(h,q)=hTq/D
  • 双线性模型 s ( h , q ) = h T W q s(h, q) = h^TWq s(h,q)=hTWq

以上公式中的参数 W 、 U W、U WU v v v 均是可学习的参数矩阵或向量, D D D 为输入向量的维度。下边我们来分析一下这些分数计算方式的差别。

加性模型引入了可学习的参数,将查询向量 q q q 和原始输入向量 h h h 映射到不同的向量空间后进行计算打分,显然相较于加性模型,点积模型具有更好的计算效率。

另外,当输入向量的维度比较高的时候,点积模型通常有比较大的方差,从而导致Softmax函数的梯度会比较小。因此缩放点积模型通过除以一个平方根项来平滑分数数值,也相当于平滑最终的注意力分布,缓解这个问题。

最后,双线性模型可以重塑为 s ( h i , q ) = h T W q = h T ( U T V ) q = ( U h ) T ( V q ) s(h_i, q) = h^TWq=h^T(U^TV)q=(Uh)^T(Vq) s(hi,q)=hTWq=hT(UTV)q=(Uh)T(Vq),即分别对查询向量 q q q 和原始输入向量 h h h 进行线性变换之后,再计算点积。相比点积模型,双线性模型在计算相似度时引入了非对称性。

键值对注意力机制

假设我们的输入信息不再是前边所提到的 H = [ h 1 , h 2 , h 3 , . . . , h n ] H=[h_1,h_2,h_3,...,h_n] H=[h1,h2,h3,...,hn] ,而是更为一般的键值对(key-value pair)形式 ( K , V ) = [ ( k 1 , v 1 ) , ( k 2 , v 2 ) , . . . , ( k n , v n ) ] (K,V)=[(k_1,v_1),(k_2,v_2),...,(k_n,v_n)] (K,V)=[(k1,v1),(k2,v2),...,(kn,vn)],相关的查询向量仍然为 q q q。这种模式下,一般会使用查询向量 q q q 和相应的键 k i k_i ki 进行计算注意力权值 a i a_i ai a i = s o f t m a x ( s ( k i , q ) ) = e x p ( s ( k i , q ) ) ∑ j = 1 n e x p ( s ( k j , q ) ) \begin{aligned} a_i=softmax(s(k_i,q)) = \frac{exp(s(k_i,q))}{\sum_{j=1}^n exp(s(k_j, q))} \end{aligned} ai=softmax(s(ki,q))=j=1nexp(s(kj,q))exp(s(ki,q))当计算出在输入数据上的注意力分布之后,利用注意力分布和键值对中的对应值进行加权融合计算: c o n t e x t = ∑ i = 1 n a i ⋅ v i context=\sum_{i=1}^n a_i \cdot v_i context=i=1naivi显然,当键值相同的情况下 k = v k=v k=v,键值对注意力就退化成了普通的经典注意力机制。

多头注意力机制

多头注意力(Multi-Head Attention)是利用多个查询向量 Q = [ q 1 , q 2 , . . . , q m ] Q=[q_1,q_2,...,q_m] Q=[q1,q2,...,qm],并行地从输入信息 ( K , V ) = [ ( k 1 , v 1 ) , ( k 2 , v 2 ) , . . . , ( k n , v n ) ] (K,V)=[(k_1,v_1),(k_2,v_2),...,(k_n,v_n)] (K,V)=[(k1,v1),(k2,v2),...,(kn,vn)] 中选取多组信息。在查询过程中,每个查询向量 q i q_i qi 将会关注输入信息的不同部分,即从不同的角度上去分析当前的输入信息。

假设 a i j a_{ij} aij代表第 i i i 各查询向量 q i q_i qi 与第 j j j 个输入信息 k j k_j kj 的注意力权重, c o n t e x t i context_i contexti 代表由查询向量 q i q_i qi 计算得出的Attention输出向量。其计算方式为: a i j = s o f t m a x ( s ( k j , q i ) ) = e x p ( s ( k j , q i ) ) ∑ t = 1 n e x p ( s ( k t , q i ) ) c o n t e x t i = ∑ j = 1 n a i j ⋅ v j \begin{aligned} a_{ij}=softmax(s(k_j,q_i)) &= \frac{exp(s(k_j,q_i))}{\sum_{t=1}^n exp(s(k_t, q_i))} \\ context_i &=\sum_{j=1}^n a_{ij} \cdot v_j \end{aligned} aij=softmax(s(kj,qi))contexti=t=1nexp(s(kt,qi))exp(s(kj,qi))=j=1naijvj最终将所有查询向量的结果进行拼接作为最终的结果: c o n t e x t = c o n t e x t 1 ⊕ c o n t e x t 2 ⊕ c o n t e x t 3 ⊕ . . . ⊕ c o n t e x t m context=context_1 \oplus context_2 \oplus context_3 \oplus...\oplus context_m context=context1context2context3...contextm公式里的 ⊕ ⊕ 表示向量拼接操作。

自注意力机制

假设当前有输入信息 H = [ h 1 , h 2 , . . . , h n ] H=[h_1,h_2,...,h_n] H=[h1,h2,...,hn],我们需要使用自注意力机制获取每个位置的输出 c o n t e x t = [ c o n t e x t 1 , c o n t e x t 2 , . . . , c o n t e x t n ] context=[context_1,context_2,...,context_n] context=[context1,context2,...,contextn]。首先,需要将原始输入映射到查询空间 Q Q Q、键空间 K K K 和值空间 V V V,相关计算公式如下: Q = H W q = [ q 1 , q 2 , . . . , q n ] K = H W k = [ k 1 , k 2 , . . . , k n ] V = H W v = [ v 1 , v 2 , . . . , v n ] Q=HW_q =[q_1,q_2,...,q_n] \\ K=HW_k =[k_1,k_2,...,k_n]\\ V=HW_v =[v_1,v_2,...,v_n] Q=HWq=[q1,q2,...,qn]K=HWk=[k1,k2,...,kn]V=HWv=[v1,v2,...,vn]接下来,我们将去计算每个位置的注意力分布,并且将相应结果进行加权求和: c o n t e x t i = ∑ j = 1 n s o f t m a x ( s ( q i , k j ) ) ⋅ v j context_i=\sum_{j=1}^n softmax(s(q_i, k_j)) \cdot v_j contexti=j=1nsoftmax(s(qi,kj))vj其中 s ( q i , k j ) s(q_i,k_j) s(qi,kj) 是经过上述点积、缩放后分数值。

最后,为了加快计算效率,这里其实可以使用矩阵计算的方式,一次性计算出所有位置的的Attention输出向量: c o n t e x t = s o f t m a x ( Q K T D k ) V context=softmax(\frac{QK^T}{\sqrt{D_k}})V context=softmax(Dk QKT)V

硬性注意力机制

上面介绍的各种注意力机制其实使用了一种叫做软性注意力的方式进行Attention机制,它通过注意力分布来加权求和融合各个输入向量。而硬性注意力(Hard Attention)机制则不是采用这种方式,它是根据注意力分布选择输入向量中的一个作为输出。这里有两种选择方式:

  • 选择注意力分布中,分数最大的那一项对应的输入向量作为Attention机制的输出。

  • 根据注意力分布进行随机采样,采样结果作为Attention机制的输出。

硬性注意力通过以上两种方式选择Attention的输出,这会使得最终的损失函数与注意力分布之间的函数关系不可导,导致无法使用反向传播算法训练模型,硬性注意力通常需要使用强化学习来进行训练。因此,一般深度学习算法会使用软性注意力的方式进行计算。

Batch Size

什么是batch size

在神经网络的训练过程中,一个非常直观的需要调整的超参数就是batch size。我们需要决定在一次训练中,要选取多少样本喂给神经网络,这个要选择的样本个数,就是batch size。batch size的可取值范围为1到全体样本数。举个例子,传统的梯度下降法(Gradient Descent)就是采用了全部样本来进行训练和梯度更新,而它的变体随机梯度下降法(stochastic gradient descent),则设定batch size为1,即每次只将一个样本喂给神经网络,在mini-batch梯度下降法中,则采用了一个折中的方法,每次选择一部分数据用于训练。那么,不同大小的batch对网络训练有什么区别呢?我们又该如何进行选择呢?

batch size对网络的影响

当采取传统的梯度下降法时,神经网络每一次训练都会使用全部数据。梯度基于全样本计算,因此会很准确。对于凸问题,局部最优即为全局最优的情况下,准确的梯度计算可以使梯度更新朝着正确的方向进行,以较快的速度达到全局最优解。但在真实的神经网络训练过程中,我们通常遇到的都是非凸问题,此时,局部最优解不是全局最优解,而传统的梯度下降法在这种情况下很容易陷入局部最优点或鞍点。同时,当整体样本数不大时,采用全体样本做batch size不会非常耗时,而当样本数很大时,每一次的计算将会非常耗时,也会导致内存爆炸。

当采取随机梯度下降法时,batch size值为1,每次获得的梯度都是根据当前的随机样本计算得来。由一个样本的梯度来近似所有的样本,会导致梯度估计不是很准确。同时,梯度易收到极端值的影响,导致损失剧烈震荡。但因为batch size为1,随机梯度下降法的计算速度会非常快。如果选取比较折中的batch size作为mini-batch来进行随机梯度下降,其优点是用部分样本来近似全部样本,梯度相对于batch size为1更为准确,同时相比与使用全部样本,计算量减小,计算速度和收敛速度都会得到提升。看到这里可能会有一个疑问,为什么10000样本训练1次会比100样本训练100次收敛慢呢?我们假设样本真实的标准差为 σ \sigma σ,则 n n n个样本均值的标准差为 σ n \frac{\sigma}{\sqrt{n}} n σ n \sqrt{n} n 表明使用更多样本来估计梯度的方法回报是低于线性的。10000个样本训练一次和100个样本训练一次,由于计算量是线性的,前者的计算量是后者的100倍,但均值标准差只比后者降低了10倍,那么在相同的计算量下(同样训练10000个样本),小样本的收敛速度是远快于使用整个样本集的。同时,相对于训练全部样本,由于梯度存在不准确性,噪声的影响很可能会让梯度下降的过程中离开局部最优点或鞍点,从而有机会寻找全局最优点。

batch size的选择

在了解了batch size对于网络的影响后,很自然的,我们有一个疑问:如何选择一个适当的batch size呢?batch size的选取通常需要考虑一下几点:

  • 更大的batch size会得到更精确的梯度估计值,但其估计梯度的回报是低于线性的。

  • 如果训练集较小,可以直接使用梯度下降法,batch size等于样本集大小。

  • Deep Learning 书中提到,在某些硬件上使用特定大小的数组时,运行时间会更少。尤其是在使用GPU时,通常使用2的幂数作为batch size可以获得更少的运行时间。

参数初始化

什么是参数初始化

在我们开始训练神经网络之前,首先要做的是给网络中的每一个权重和偏置赋值,这个赋值的过程就是参数初始化。合理的初始化可以缩短神经网络的训练时间,而不合理的初始化可能使网络难以收敛。

要如何对参数进行初始化呢?或许你有想到过将全部参数都设置为0,这看起来是一个简单又方便的办法,但遗憾的是神经网络中不能对权重进行全零初始化。

为什么不能全零初始化

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

在这里插入图片描述

其中, z 4 、 z 5 、 z 6 z_4、z_5、z_6 z4z5z6 可表达为: 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 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 z4=w14x1+w24x2+w34x3+b4z5=w15x1+w25x2+w35x3+b5z6=w16x1+w26x2+w36x3+b6 由于权重和偏置的初始值都为0,且同一层网络的激活函数相同,则有: z 4 = z 5 = z 6 a 4 = a 5 = a 6 z_4 = z_5 = z_6 \\ a_4 = a_5 = a_6 z4=z5=z6a4=a5=a6对于神经网络的最终输出 a 7 a_7 a7 ,我们可以得到: z 7 = w 47 ∗ a 4 + w 57 ∗ a 5 + w 67 ∗ a 6 a 7 = f ( z 7 ) \begin{aligned} z_7 &= w_{47} * a_4 + w_{57} * a_5 + w_{67} * a_6 \\ a_7 &= f(z_7) \end{aligned} z7a7=w47a4+w57a5+w67a6=f(z7)其中, f ( ⋅ ) f(\cdot) f()为第三层网络的激活函数。

假设真实值为 y y y 的损失函数为 L o s s ( a 7 , y ) Loss(a_7,y) Loss(a7,y),根据反向传播算法和链式法则,我们可以得到: ∂ L o s s ( a 7 , y ) ∂ w 47 = ∂ L o s s ( a 7 , y ) ∂ a 7 ∗ ∂ a 7 ∂ z 7 ∗ ∂ z 7 ∂ w 47 = ∂ L o s s ( a 7 , y ) ∂ a 7 ∗ ∂ a 7 ∂ z 7 ∗ a 4 \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} w47Loss(a7,y)=a7Loss(a7,y)z7a7w47z7=a7Loss(a7,y)z7a7a4同样地: ∂ L o s s ( a 7 , y ) ∂ w 57 = ∂ L o s s ( a 7 , y ) ∂ a 7 ∗ ∂ a 7 ∂ z 7 ∗ ∂ z 7 ∂ w 57 = ∂ L o s s ( a 7 , y ) ∂ a 7 ∗ ∂ a 7 ∂ z 7 ∗ a 5 ∂ L o s s ( a 7 , y ) ∂ w 67 = ∂ L o s s ( a 7 , y ) ∂ a 7 ∗ ∂ a 7 ∂ z 7 ∗ a 6 \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_{57}} \\ &= \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_{67}} &= \frac{\partial Loss(a_7, y)}{\partial a_7} * \frac{\partial a_7}{\partial z_7} * a_6 \end{aligned} w57Loss(a7,y)w67Loss(a7,y)=a7Loss(a7,y)z7a7w57z7=a7Loss(a7,y)z7a7a5=a7Loss(a7,y)z7a7a6由于 a 4 = a 5 = a 6 a_4=a_5=a_6 a4=a5=a6则有: ∂ L o s s ( a 7 , y ) ∂ w 47 = ∂ L o s s ( a 7 , y ) ∂ w 57 = ∂ L o s s ( a 7 , y ) ∂ w 67 = Δ w \frac{\partial Loss(a_7,y)}{\partial w_{47}} = \frac{\partial Loss(a_7,y)}{\partial w_{57}} = \frac{\partial Loss(a_7,y)}{\partial w_{67}} = \Delta w w47Loss(a7,y)=w57Loss(a7,y)=w67Loss(a7,y)=Δw权重更新表达式为: w 47 ′ = w 47 + Δ w w 57 ′ = w 57 + Δ w w 67 ′ = w 67 + Δ w w_{47}^{'} = w_{47} + \Delta w \\ w_{57}^{'} = w_{57} + \Delta w \\ w_{67}^{'} = w_{67} + \Delta w w47=w47+Δww57=w57+Δww67=w67+Δw由于 w 47 、 w 57 、 w 67 w_{47}、w_{57}、w_{67} w47w57w67 的初始值均为0,那么: w 47 ′ = w 57 ′ = w 67 ′ w_{47}^{'} = w_{57}^{'} = w_{67}^{'} w47=w57=w67,同理: w 14 ′ = w 24 ′ = w 34 ′ = w 14 ′ = w 25 ′ = w 26 ′ = w 34 ′ = w 35 ′ = w 36 ′ w_{14}^{'} = w_{24}^{'} = w_{34}^{'} = w_{14}^{'} = w_{25}^{'} = w_{26}^{'} = w_{34}^{'} = w_{35}^{'} = w_{36}^{'} w14=w24=w34=w14=w25=w26=w34=w35=w36。由此可见,更新后的参数在每一层内都是相同的。同时,无论经过多少次网络训练,相同网络层内的参数值都是相同的,这会导致网络在学习时没有重点,对所有的特征处理相同,这很可能导致模型无法收敛训练失败。这种现象被称为对称失效

同样地,当权重被初始化为相同的非零值时,也会出现上述情况,此时神经网络模型和一个线性模型的效果相似,失去了神经网络提取特征的意义。

常见的初始化方法

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

一种非常常见的方式是采用高斯分布或均匀分布来对权重进行随机初始化。高斯分布和均匀分布的选择似乎没有很大差别,但初始分布的大小对于优化过程的结果和网络泛化能力都有很大影响。

高斯分布初始化:使用一个均值为 μ μ μ,方差为 σ 2 σ_2 σ2 的高斯分布 N ( μ , σ 2 ) N(μ,σ_2) N(μ,σ2) 对每个参数进行随机初始化,通常情况下, μ = 0 μ=0 μ=0,并对生成的数乘上一个小数,把权重初始化为很小的随机数。比如: w = 0.01 ∗ n p . r a n d o m . r a n d ( D , H ) w = 0.01 * np.random.rand(D,H) w=0.01np.random.rand(D,H),这里选择乘以0.01初始化为一个很小的数是因为,如果最初随机到的 w w w值很大,当我们选择 s i g m o i d sigmoid sigmoid t a n h tanh tanh 函数时,函数值 s i g m o i d ( ⋅ ) sigmoid(\cdot) sigmoid() t a n h ( ⋅ ) tanh(\cdot) tanh() 会停留在一个很平坦的地方,激活值接近饱和,导致梯度下降时,梯度很小,学习变得缓慢。但也不是说权重值越小越好,如果权重值过小,会导致在反向传播时计算得到很小的梯度值,在不断的反向传播过程中,引起梯度消失。

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

上述两种基于固定方差的初始随机化方法中,关键点在于如何设置方差 σ 2 σ^2 σ2。过大或过小的方差都会导致梯度下降缓慢,网络训练效果不好等问题。为了降低固定方差对网络性能及优化效率的影响,基于固定方差的随机初始化一般要配合逐层归一化来使用。

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

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

Xavier初始化

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

假设在一个神经网络中,对于一层线性网络,其表示为: y = f ( z 1 W 1 + z 2 W 2 + z 3 W 3 + . . . + z i W i + b ) y = f(z_1W_1 + z_2W_2 + z_3W_3 + ... + z_iW_i + b) y=f(z1W1+z2W2+z3W3+...+ziWi+b) z i z_i zi 代表该层网络的第 i i i 个神经元, y y y 为该层网络的输出, W i W_i Wi 为本层网络的权重, b b b 为偏置, f ( ⋅ ) f(⋅) f() 为激活函数。这里我们假设激活函数为恒等函数,即 f ( x ) = x f(x)=x f(x)=x,导数为1。

对于其中的每个 z i W i z_iW_i ziWi,其方差为: V a r ( z i W i ) = E ( z i ) 2 V a r ( W i ) + E ( W i ) 2 V a r ( z i ) + V a r ( z i ) V a r ( W i ) Var(z_iW_i) = E(z_i)^2Var(W_i) + E(W_i)^2Var(z_i)+Var(z_i)Var(W_i) Var(ziWi)=E(zi)2Var(Wi)+E(Wi)2Var(zi)+Var(zi)Var(Wi) 由于 W i W_i Wi z i z_i zi 的均值都为0,因此可以得到: V a r ( z i W i ) = V a r ( z i ) V a r ( W i ) Var(z_iW_i) = Var(z_i)Var(W_i) Var(ziWi)=Var(zi)Var(Wi)又因为 z z z W W W 相互独立,则有: V a r ( y ) = n i ∗ V a r ( z i ) V a r ( W i ) Var(y) = n_i * Var(z_i)Var(W_i) Var(y)=niVar(zi)Var(Wi) 其中, n i n_i ni 代表第 i i i 层的神经元数量。

通过上面的公式我们可以发现,输入 z i z_i zi 的方差和输出 y y y 方差相差 n ∗ V a r ( W i ) n * Var(W_i) nVar(Wi),也就是说输入信号在经过神经元后会被放大或缩小 n ∗ V a r ( W i ) n * Var(W_i) nVar(Wi)倍。为保证经过多层网络后,信号不被过分的放大或缩小,我们需要尽可能保证前向传播和反向传播时每层方差保持一致,则有: ∀ i , n i ∗ V a r ( W i ) = 1 ∀ i , n i + 1 ∗ V a r ( W i ) = 1 {\forall}i, \quad n_i * Var(W_i) = 1\\ {\forall}i, \quad n_{i+1} * Var(W_i) = 1 i,niVar(Wi)=1i,ni+1Var(Wi)=1 权衡上述两个限制,提出一个折中的办法: ∀ i , V a r ( W i ) = 2 n i + n i + 1 {\forall}i, \quad Var(W_i) = \frac{2}{n_i + n_{i+1}} i,Var(Wi)=ni+ni+12根据计算出的理想方差,可选择通过高斯分布或均匀分布来随机初始化参数。若采用高斯分布,则权重可按照 N ( 0 , 2 n i + n i + 1 ) N(0, \frac{2}{n_i + n_{i+1}}) N(0,ni+ni+12)的高斯分布来进行初始化。若采用在区间 [ − r , r ] [−r,r] [r,r] 的均匀分布进行初始化,则初始化分布有: W ∼ U [ − 6 n i + n i + 1 , 6 n i + n i + 1 ] W \sim U[- \frac{\sqrt 6}{\sqrt{n_i + n_{i+1}}}, \frac{\sqrt 6}{\sqrt{n_i + n_{i+1}}}] WU[ni+ni+1 6 ,ni+ni+1 6 ]Xavier 初始化因为基本保证了输入和输出的方差一致,使得样本空间和类别空间的分布差异相似,因此使得模型的训练速度和分类性能获得提升。但xavier初始化的推导基于激活函数是线性的假设,使其并不适合于ReLU、sigmoid等非线性激活函数。

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

Kaiming初始化

kaiming初始化是一种针对ReLU的初始化方法,假定使用ReLU激活函数时,网络每一层都中有一半的神经元被激活,另一半为0,因此其分布的方差也近似为恒等函数的一半。这样在考虑前向传播和反向传播时则有: ∀ i , 1 2 n i ∗ V a r ( W i ) = 1 ∀ i , 1 2 n i + 1 ∗ V a r ( W i ) = 1 {\forall}i, \quad \frac12 n_i * Var(W_i) = 1\\ {\forall}i, \quad \frac12 n_{i+1} * Var(W_i) = 1 i,21niVar(Wi)=1i,21ni+1Var(Wi)=1 W i W_i Wi 的理想方差为: ∀ i , V a r ( W i ) = 2 n i {\forall}i, \quad Var(W_i) = \frac{2}{n_i} i,Var(Wi)=ni2当采用高斯分布时,则权重可按照 N ( 0 , 2 n i ) N(0, \frac{2}{n_i}) N(0,ni2)的高斯分布来进行初始化。若采用在区间 [ − r , r ] [−r,r] [r,r] 的均匀分布进行初始化,则初始化分布有: W ∼ U [ − 6 n i , 6 n i ] W \sim U[- \frac{\sqrt 6}{\sqrt{n_i}}, \frac{\sqrt 6}{\sqrt{n_i}}] WU[ni 6 ,ni 6 ]
具体论文参见:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

猜你喜欢

转载自blog.csdn.net/weixin_49346755/article/details/127363005