深度学习之参数初始化(二)——Kaiming初始化

本文深入探讨了Kaiming初始化方法,该方法由残差网络的作者提出,特别针对ReLU激活函数。Kaiming初始化保证了在前向和反向传播过程中,状态值和激活值梯度的方差保持不变,从而改善深度学习模型的训练。通过数学推导,展示了如何在全连接网络中应用该初始化策略,确保模型的稳定性和收敛性。

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

Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun.
ICCV 2016.

在介绍Xavier初始化方法的这篇博客的最后,我们提到Xavier初始化方法适用的激活函数有限:关于0对称;线性。而ReLU激活函数并不满足这些条件,实验也可以验证Xavier初始化确实不适用于ReLU激活函数。

Kaiming初始化

残差网络的作者在这篇论文中提出了ReLU网络的初始化方法:Kaming初始化。作者的推导过程针对的其实是卷积网络的前向和反向过程(惊奇地发现自己好像没有推导过卷积网络的梯度表达式)。而为了和Xavier初始化方法保持一致,这里我们还是讨论全连接网络结构。
关于期望、方差的性质,我们已经在Xavier初始化一节介绍过了,这里不再重复。

在Xavier论文中,作者给出的Glorot条件是:正向传播时,激活值的方差保持不变;反向传播时,关于状态值的梯度的方差保持不变。这在本文中稍作变换:正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。
网络的表达式:

zi=Wihi1,(1)

hi=f(zi).(2)


前向过程

由公式(1)可知:

Var(zi)===ni1Var(Wihi1)ni1[E(Wihi1)2(E(Wihi1))2]ni1[E(Wi)2E(hi1)2(E(Wi))2(E(hi1))2]

假设
E(Wi)=0(3)

又激活函数是ReLU,所以激活值的期望 E(hi1) 不为0。于是上式可以写成

Var(zi)==ni1E(Wi)2E(hi1
### 如何在 Vision Transformer (ViT) 中实现 Kaiming 初始化 Kaiming初始化是一种有效的权重初始化策略,尤其适用于ReLU激活函数的深层网络。对于Vision Transformer (ViT),同样可以通过调整模型中的权重初始化来提升训练效率和最终性能。 #### 修改 ViT 权重初始化方式 默认情况下,许多ViT实现会使用不同的初始化方法。要改为Kaiming初始化,可以在定义模型时修改各层的初始化逻辑: ```python import torch.nn as nn import math def kaiming_init(module): if isinstance(module, nn.Linear): # 对于线性变换层 nn.init.kaiming_normal_(module.weight, mode='fan_out', nonlinearity='relu') if module.bias is not None: nn.init.constant_(module.bias, 0.) elif isinstance(module, nn.LayerNorm): # 对于Layer Normalization 层 nn.init.constant_(module.weight, 1.) nn.init.constant_(module.bias, 0.) class VisionTransformer(nn.Module): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.patch_embedding = ... # 定义patch embedding部分 self.transformer_encoder = ... # 定义transformer encoder部分 def init_weights(self): """Apply Kaiming initialization to all layers.""" self.apply(kaiming_init) model = VisionTransformer() model.init_weights() # 应用自定义初始化方案[^1] ``` 上述代码展示了如何创建一个`kaiming_init()`辅助函数用于递归遍历并初始化整个网络结构内的参数。特别注意的是,在实际操作过程中可能还需要考虑其他类型的层(比如位置编码等特殊组件),因此建议根据具体使用的ViT版本做适当调整。 此外,考虑到ViT架构中存在大量的自注意力机制模块,这些地方通常不会直接涉及传统的卷积或全连接运算,所以主要关注点还是在线性投影以及后续可能出现的标准MLP子块上[^3]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值