【 Transformer 系列,故事从 d k \sqrt{d_k} dk说起】
LLM这么火,Transformer厥功甚伟,某天心血来潮~,再去看看!
它长这个样子: 深入浅出 Transformer
看完后,想起了老生常谈 d k \sqrt{d_k} dk问题,必须一探究竟:Transformer 中缩放点积注意力机制探讨:除以根号 dk 理由及其影响
感觉不够清楚,还是再Review下考研概率论,有了:基于考研概率论知识解读 Transformer:为何自注意力机制要除以根号 dk,中间会涉及初始化、标准化、Sofrmax函数,于是继续
【初始化相关】:深度学习中的常见初始化方法:原理、应用与比较
【标准化系列】: 数据为什么要进行标准化:Z-标准化的神奇蜕变,带出了关联知识点: 深度 “炼丹” 术之 Batch Normalization 与 Z - 标准化:开启数据的神秘转换
【Softmax复习】:Softmax 层反向传播梯度计算实例解析,中间想到了经常配套使用的交叉熵,于是梳理了交叉熵的前世今生KL 散度:多维度解读概率分布间的隐秘 “距离”
熵与交叉熵:从不确定性角度理解 KL 散度
机器学习、深度学习关于熵你所需要知道的一切
一、引言
在深度学习领域,模型的训练过程本质上是通过优化算法不断调整参数,以最小化损失函数。然而,参数的初始值对模型的训练过程和最终性能有着深远影响。不合适的初始化可能导致模型收敛缓慢,甚至无法收敛,出现梯度消失或爆炸等问题。因此,选择合适的初始化方法至关重要。
二、常见初始化方法
(一)随机初始化
随机初始化是一种简单直接的方法,即从某个分布中随机采样数值来初始化模型参数。最常见的是从均匀分布或正态分布中采样。
- 均匀分布随机初始化:通常从一个较小的范围(如 [ − 0.01 , 0.01 ] [-0.01, 0.01] [−0.01,0.01])内的均匀分布中抽取数值。例如,对于一个权重矩阵 W W W,其元素 w i j w_{ij} wij可以通过 w i j ∼ U ( − 0.01 , 0.01 ) w_{ij} \sim U(-0.01, 0.01) wij∼U(−0.01,0.01)进行初始化。这种方法的优点是简单易行,但缺点是可能导致神经元的输出分布在训练初期过于集中或分散,不利于模型的有效训练。
- 正态分布随机初始化:从均值为0,标准差为0.01的正态分布 N ( 0 , 0.01 ) N(0, 0.01) N(0,0.01)中采样初始化参数。例如, w i j ∼ N ( 0 , 0.01 ) w_{ij} \sim N(0, 0.01) wij∼N(0,0.01)。正态分布随机初始化同样简单,但也面临与均匀分布随机初始化类似的问题,即难以保证神经元输出在训练过程中的稳定性。
(二)零初始化
零初始化是将所有模型参数都设置为0。这种方法看似简单直观,但在实际应用中存在严重问题。由于所有参数相同,在反向传播过程中,所有神经元的梯度也相同,导致它们在训练过程中以相同的方式更新,无法学习到不同的特征,模型难以收敛到一个好的解。
(三)Xavier初始化(Glorot初始化)
Xavier初始化由Xavier Glorot和Yoshua Bengio在2010年提出,旨在解决深度神经网络中梯度消失和爆炸的问题。它基于这样的思想:在神经网络的前向传播和反向传播过程中,要保持信号的方差稳定。
- 原理:对于一个线性层,设输入维度为 n i n n_{in} nin,输出维度为 n o u t n_{out} nout。Xavier初始化从均匀分布 U ( − 6 n i n + n o u t , 6 n i n + n o u t ) U(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}) U(−nin+nout6,nin+nout6)中采样初始化权重。其推导基于以下假设:在激活函数为线性或类似sigmoid、tanh等对称函数时,为了使前向传播和反向传播中信号的方差保持一致,权重的方差应满足 Var ( W ) = 2 n i n + n o u t \text{Var}(W) = \frac{2}{n_{in} + n_{out}} Var(W)=nin+nout2。对于均匀分布 U ( − a , a ) U(-a, a) U(−a,a),其方差为 a 2 3 \frac{a^2}{3} 3a2,由此可得 a = 6 n i n + n o u t a = \sqrt{\frac{6}{n_{in} + n_{out}}} a=nin+nout6。
- 优点:Xavier初始化能够使信号在网络层之间更稳定地传播,避免梯度消失或爆炸,从而加速模型的收敛。它在许多使用sigmoid或tanh激活函数的模型中表现良好。
- 缺点:当激活函数为ReLU及其变体时,Xavier初始化可能无法很好地适应,因为ReLU函数在负半轴的输出为0,会改变信号的分布特性。
(四)Kaiming初始化(He初始化)
Kaiming初始化由何恺明等人在2015年提出,专门针对ReLU激活函数进行设计。
- 原理:Kaiming初始化从正态分布 N ( 0 , 2 n i n ) N(0, \sqrt{\frac{2}{n_{in}}}) N(0,nin2)中采样初始化权重,其中 n i n n_{in} nin是输入维度。其推导基于ReLU函数的特性,由于ReLU函数在正向传播时,只有一半的神经元会被激活,为了保持信号的方差在正向传播中不变,权重的方差应设置为 2 n i n \frac{2}{n_{in}} nin2。
- 优点:在使用ReLU及其变体激活函数的网络中,Kaiming初始化能够有效地保持信号的方差稳定,避免梯度问题,使模型收敛更快且更稳定。它在许多深度卷积神经网络(如ResNet)中取得了显著的效果。
- 缺点:对于非ReLU类型的激活函数,Kaiming初始化可能不是最优选择。
(五)初始化方法的变体
- LeCun正态初始化:这是Kaiming初始化的一种变体,适用于ReLU激活函数。它从正态分布 N ( 0 , 1 n i n ) N(0, \frac{1}{n_{in}}) N(0,nin1)中采样初始化权重,与Kaiming初始化相比,其方差的缩放因子略有不同。
- LeCun均匀初始化:从均匀分布 U ( − 3 n i n , 3 n i n ) U(-\sqrt{\frac{3}{n_{in}}}, \sqrt{\frac{3}{n_{in}}}) U(−nin3,nin3)中采样初始化权重,同样是针对ReLU激活函数设计的一种初始化方法。
三、应用场景与效果比较
不同的初始化方法适用于不同的模型架构和激活函数。在使用sigmoid或tanh激活函数的传统神经网络中,Xavier初始化通常能取得较好的效果。而在以ReLU及其变体(如LeakyReLU、PReLU等)为激活函数的深度神经网络,特别是卷积神经网络和循环神经网络中,Kaiming初始化及其变体表现更为出色。
为了直观地比较不同初始化方法的效果,以一个多层感知机(MLP)模型为例,在MNIST手写数字识别任务中,分别使用随机初始化、Xavier初始化和Kaiming初始化进行训练。实验结果表明,随机初始化的模型收敛速度较慢,且容易陷入局部最优解,导致最终的准确率较低。Xavier初始化的模型收敛速度明显加快,准确率也有所提高。而Kaiming初始化的模型在训练过程中收敛速度最快,且最终达到了最高的准确率,具体如下:
初始化方法 | 适用激活函数 | 适用模型架构 | 优点 | 缺点 | 实际效果(以MNIST手写数字识别MLP模型为例) |
---|---|---|---|---|---|
随机初始化 | 理论上适用于各种激活函数,但实际效果不佳 | 各类神经网络模型 | 简单易行 | 1. 神经元输出分布在训练初期易过于集中或分散 2. 收敛速度慢,易陷入局部最优解 | 收敛速度慢,最终准确率较低 |
零初始化 | 不依赖激活函数类型 | 不适用任何实际模型(因严重缺陷) | 简单直观 | 所有神经元梯度相同,无法学习不同特征,模型难以收敛 | 模型无法有效收敛,准确率极低 |
Xavier初始化(Glorot初始化) | sigmoid、tanh等对称激活函数 | 传统神经网络,如全连接神经网络(FCN) | 1. 使信号在网络层间稳定传播 2. 避免梯度消失或爆炸 3. 加速模型收敛 | 当激活函数为ReLU及其变体时,无法很好适应 | 收敛速度较随机初始化快,准确率有所提高 |
Kaiming初始化(He初始化) | ReLU及其变体(LeakyReLU、PReLU等) | 深度卷积神经网络(CNN)、循环神经网络(RNN)及其变体(LSTM、GRU) | 1. 针对ReLU特性设计,有效保持信号方差稳定 2. 避免梯度问题,使模型收敛更快更稳定 | 对于非ReLU类型激活函数可能不是最优 | 收敛速度最快,最终达到最高准确率 |
LeCun正态初始化 | ReLU及其变体 | 深度卷积神经网络(CNN)、多层感知机(MLP)等使用ReLU的模型 | 基于Kaiming初始化,针对ReLU设计,有助于保持信号稳定传播 | 对于非ReLU激活函数适用性差 | 在使用ReLU的模型中,收敛效果较好,与Kaiming初始化效果相近 |
LeCun均匀初始化 | ReLU及其变体 | 深度卷积神经网络(CNN)、多层感知机(MLP)等使用ReLU的模型 | 针对ReLU函数设计,通过均匀分布初始化权重,利于信号在网络中传播 | 对非ReLU激活函数效果不佳 | 在使用ReLU的模型中,能有效帮助模型收敛,效果与Kaiming初始化相当 |
四、结论
深度学习中的初始化方法是模型训练的关键环节。随机初始化虽然简单,但效果往往不尽人意。零初始化由于其局限性在实际中很少使用。Xavier初始化和Kaiming初始化及其变体通过合理地设计权重的分布,有效地解决了梯度消失和爆炸的问题,提高了模型的训练效率和性能。在实际应用中,应根据模型的架构和所使用的激活函数,选择合适的初始化方法,以获得最佳的训练效果。