
神经网络初始化看似只是模型训练前的一个“小动作”但我在带团队做工业级视觉检测项目时亲眼见过三次因初始化不当导致的全线返工一次是产线缺陷识别模型在验证集上准确率突然掉到42%查了三天才发现权重全初始化为0.1另一次是医疗影像分割模型收敛极慢梯度几乎不更新最后发现用了标准正态分布初始化卷积核而输入通道数高达128还有一次更隐蔽——LSTM的隐藏状态初始化偏差导致时序预测在第5步后误差爆炸式增长调试两周才定位到torch.nn.init.orthogonal_没配对称正交矩阵。这些都不是理论题是凌晨三点服务器报警、客户催交付、实习生盯着loss曲线发呆的真实现场。这三个问题不是教科书里轻描淡写的“可能影响收敛”而是会直接卡死项目进度、误导调参方向、甚至让整个模型架构设计看起来“无效”的硬伤。它们分别对应权重全零初始化引发的对称性陷阱、方差失配导致的梯度消失/爆炸、循环结构中隐藏状态与门控参数的协同失衡。你不需要记住所有公式但必须清楚每一种问题在训练日志里长什么样、在tensorboard上怎么识别、在代码里哪一行能一锤定音地修复。这篇文章就是我从2017年至今在17个落地项目覆盖CV/NLP/时序预测/多模态融合中把论文里的初始化策略一条条拉进生产环境、踩坑、记录、验证、固化成checklist后的实操总结。没有抽象推导只有命令行可执行的配置、tensorboard可验证的现象、以及我亲手改过的每一行PyTorch代码。1. 初始化失效的三大典型现象与底层机理1.1 全零或常量初始化对称性陷阱如何让整个网络“集体躺平”很多人以为“初始化为0”只是起点低一点大不了多训几轮。错。这是最危险的初始化方式之一尤其在全连接层和卷积层中。它的本质问题不是数值大小而是破坏了网络的表达多样性基础。我们以一个最简单的两层全连接网络为例输入维度为100隐藏层128个神经元输出10类。如果所有权重W₁和W₂都初始化为0那么无论输入x是什么第一层所有神经元的输出都是0因为W₁x b 0·x 0 0第二层输入全为0输出也全为0。反向传播时∂L/∂W₁ ∂L/∂a₂ · ∂a₂/∂z₁ · ∂z₁/∂W₁其中a₂是第二层激活值z₁是第一层加权和。由于a₂恒为0∂L/∂a₂为常数但∂a₂/∂z₁取决于激活函数导数如ReLU在0处导数为0最终导致所有梯度为0——网络彻底停止学习。更隐蔽的是“全常量初始化”比如全部设为0.01。此时所有神经元在初始阶段计算出完全相同的输出经过激活函数后仍保持一致梯度更新也完全相同。这意味着128个神经元在训练初期永远做着一模一样的事网络的有效宽度瞬间坍缩为1。这就像让128个工人同时抄同一份图纸而不是分工协作画整栋楼。我在做PCB板缺陷分类时就栽过这个跟头。当时为了快速验证数据流把所有Conv2d层的weight用nn.init.constant_(m.weight, 0.02)统一初始化。结果训练30个epoch后验证准确率卡在12.3%——恰好等于随机猜测10类的基线。用torch.histc(m.weight.grad, bins50)检查梯度分布发现99.7%的梯度集中在0附近只有边缘几个通道有微弱更新。根本原因在于所有卷积核形状、数值完全一致对同一张图像的不同区域提取出完全相同的特征图后续层无法区分空间差异。提示PyTorch中nn.init.constant_、nn.init.zeros_、nn.init.ones_等函数在任何非线性网络中都应视为禁用项除非你明确在做某种特定的可控实验如研究对称性破缺机制。真正有效的破局点是引入可控的、带统计约束的随机性。关键不在于“随机”而在于“随机得恰到好处”既要打破对称性又要控制数值范围避免初始信号过大或过小。这引出了第二个核心问题。1.2 方差失配为什么你的ReLU网络刚启动就“断气”或“暴走”假设你用标准正态分布N(0,1)初始化一个1000维输入连接到1000维隐藏层的全连接层。每个输出神经元的输入是1000个输入与对应权重的乘积之和z Σwᵢxᵢ。若xᵢ均值为0、方差为1wᵢ独立同分布于N(0,1)则z的方差为ΣVar(wᵢxᵢ) ΣVar(wᵢ)Var(xᵢ) 1000×1×1 1000。z的标准差≈31.6意味着z值大概率落在[-95, 95]区间。对于ReLU激活函数z0时输出为0z0时线性通过。此时约50%的神经元被永久关闭dead ReLU且z值过大导致后续层输入饱和。反过来如果用很小的方差初始化比如N(0, 0.001)则z的方差仅为1000×0.001 1标准差为1z集中在[-3,3]大部分神经元能正常工作。但问题来了当网络加深时这种“保守”初始化会累积衰减。例如一个20层的ResNet若每层输出方差都缩小为前一层的0.9倍则第20层输出方差仅为0.9²⁰ ≈ 0.12信号越来越弱梯度回传时逐层衰减最终底层权重几乎不更新——这就是典型的梯度消失。这个问题的本质是前向信号传播的方差稳定性与反向梯度传播的方差稳定性需要分别满足不同条件。GlorotXavier初始化针对tanh/sigmoid等对称激活函数要求输入和输出的方差相等He初始化则专为ReLU及其变体设计考虑到ReLU只保留正半轴其输入方差需比Glorot更大才能保证输出方差稳定。具体计算如下对于全连接层y Wx b假设x各分量独立、均值为0、方差为σₓ²W元素独立、均值为0、方差为σ_w²则y的方差为Var(y) Var(Wx) n_in × σ_w² × σₓ² n_in为输入维度为使Var(y) ≈ σₓ²即输出方差与输入方差一致需令σ_w² 1 / n_in —— 这是Glorot均匀分布的理论依据均匀分布U(-a,a)方差为a²/3故a √(3/n_in)。而ReLU的特殊性在于其输出y⁺ max(0, y)数学期望E[y⁺] (1/2)E[|y|]方差Var(y⁺) ≈ (1/2)Var(y)当y对称分布时。为补偿这一半损失He初始化将权重方差设为σ_w² 2 / n_in即a √(6/n_in)均匀分布或标准差√(2/n_in)正态分布。我在做卫星遥感图像超分辨率时曾对比过三种初始化在EDSR模型上的表现nn.init.normal_(m.weight, std0.02)训练100 epoch后PSNR仅28.3dBloss下降缓慢nn.init.xavier_uniform_(m.weight)PSNR达31.7dB但前20 epoch loss震荡剧烈nn.init.kaiming_normal_(m.weight, modefan_in, nonlinearityrelu)PSNR稳定在32.9dBloss平滑下降。关键区别在于mode参数fan_in按输入维度归一化适合前向传播稳定fan_out按输出维度归一化适合反向传播稳定。EDSR中残差块内卷积主要用于特征变换fan_in更优而最后的重建卷积层因需精确控制输出动态范围改用fan_out反而PSNR提升0.15dB。注意Kaiming初始化中的nonlinearity必须与实际使用的激活函数严格一致。若代码中写的是nn.LeakyReLU(negative_slope0.1)却用nonlinearityrelu初始化会导致负半轴响应过弱。正确做法是自定义初始化函数根据leaky_relu的理论方差修正系数约为2/(1α²)α为负斜率。1.3 循环结构初始化LSTM/GRU中隐藏状态与门控参数的“四重奏失谐”CNN和全连接网络的初始化问题相对直观但RNN类模型的初始化复杂度呈指数上升。以LSTM为例其单步计算包含四个核心张量输入门iₜ、遗忘门fₜ、输出门oₜ、候选记忆单元gₜ。每个门都由独立的权重矩阵W_i、W_f、W_o、W_g驱动且隐藏状态hₜ和记忆单元cₜ需协同演化。常见错误是分别初始化所有权重为kaiming_normal这会导致严重失衡。例如若W_f的初始方差过大遗忘门在训练初期持续输出接近1记忆单元cₜ几乎不被重置网络变成“记忆永动机”无法遗忘无关历史反之若W_i方差过小输入门长期关闭新信息无法注入模型退化为静态预测器。更致命的是隐藏状态h₀和c₀的初始化。很多教程简单地设为0但这在长序列任务中会引发“零状态偏置”。以电力负荷预测为例输入是过去7天每小时的用电量168维模型需预测未来24小时。若c₀全零则第一个时间步的c₁ f₁⊙c₀ i₁⊙g₁ i₁⊙g₁完全依赖初始输入。而实际场景中系统存在固有惯性如变压器热时间常数初始记忆应包含某种“稳态偏置”。我们实测发现将c₀初始化为服从N(0, 0.1)的小噪声比全零初始化在测试集MAE上降低12.7%。LSTM官方实现如PyTorch的nn.LSTM默认对门控权重使用orthogonal_初始化对偏置项设置特定模式遗忘门偏置b_f初始化为1鼓励初始遗忘输入/输出门偏置为0。这是有深刻物理意义的遗忘门设为1使初始记忆单元主要由当前输入决定避免历史噪声污染训练过程中b_f会自动学习调整实现动态遗忘策略。我在做风电功率预测时曾尝试将所有偏置初始化为0结果模型在第3个预测点后误差陡增。用torch.norm(lstm.bias_hh_l0[128:256], p2)检查遗忘门偏置PyTorch中LSTM bias顺序为[i,f,o,g]各占hidden_size发现其范数趋近于0导致fₜ σ(W_f·x U_f·h 0) ≈ 0.5无法有效控制记忆流。手动添加lstm.bias_hh_l0.data[128:256].fill_(1)后误差曲线立即平滑。实操心得对于LSTM/GRU绝不能只关注权重初始化必须同步处理三类参数1门控权重矩阵推荐orthogonal_2偏置向量遗忘门设为1其余为03初始隐藏状态h₀/c₀建议用小方差正态噪声而非全零。2. 工业级初始化方案选型与参数精调指南2.1 激活函数-初始化匹配矩阵一张表解决90%的选型困惑面对ReLU、LeakyReLU、ELU、Swish、GELU等十余种激活函数新手常陷入“该用哪个初始化”的选择困难。其实核心逻辑非常简单看激活函数的输出方差相对于输入方差的压缩/扩张比例并据此调整权重方差补偿系数。下表总结了主流组合的实操配置基于PyTorch 1.13已通过ImageNet/UCI等基准验证激活函数理论方差压缩比推荐初始化方法关键参数设置生产环境实测效果ReLU~0.5正半轴保留kaiming_normal_modefan_in,nonlinearityreluResNet50训练速度提升1.8×top1准确率0.3%LeakyReLU (α0.01)~0.50005几乎无压缩kaiming_normal_modefan_in,nonlinearityleaky_relu,a0.01语音唤醒模型WER降低2.1%无额外计算开销ELU (α1.0)~0.78负半轴渐近kaiming_normal_modefan_in,nonlinearityreluELU在0点导数为1近似ReLU医疗文本NER F1提升0.15%收敛更稳定Swish (β1.0)~0.62平滑过渡kaiming_uniform_a√(6/5*fan_in)经验公式视频动作识别mAP0.4%显存占用降低5%GELU~0.65高斯概率加权xavier_normal_无特殊参数因GELU近似于带缩放的tanhBERT微调收敛步数减少12%下游任务提升0.2%这张表不是凭空而来。以Swish为例其数学形式为x·σ(βx)当β1时在x∈[-3,3]区间内Swish输出均值≈0.12方差≈0.62。而标准ReLU在此区间的方差为0.5因此Swish的“有效方差”比ReLU高24%。为补偿这一差异我们将Kaiming的方差系数从2/n_in提升至2.48/n_in对应均匀分布边界a √(3×2.48/n_in) ≈ √(7.44/n_in) ≈ √(6/5×6/n_in)故采用√(6/5*fan_in)作为经验边界。提示表格中“生产环境实测效果”数据来源于我们团队在2022-2023年真实项目的A/B测试所有对比均控制其他超参一致仅变更初始化策略。效果提升虽小但在工业场景中0.1%的准确率提升可能意味着每年减少数百万次误检。2.2 卷积层初始化的深度解析为什么fan_in和fan_out在CNN中如此关键全连接层的fan_in输入神经元数和fan_out输出神经元数概念清晰但卷积层的等效维度常被误解。以一个标准卷积层nn.Conv2d(in_channels64, out_channels128, kernel_size3, stride1, padding1)为例其权重张量形状为[128, 64, 3, 3]。计算fan_in时应统计每个输出通道所连接的输入连接数即in_channels × kernel_height × kernel_width 64×3×3 576。fan_out则为out_channels × kernel_height × kernel_width 128×3×3 1152。这个计算直接影响初始化尺度。若错误地将fan_in设为64仅输入通道数则Kaiming正态分布的标准差为√(2/64)≈0.177远大于正确值√(2/576)≈0.059导致初始权重过大首层卷积输出方差爆炸。我在做自动驾驶BEV感知模型时曾因混淆此概念付出代价。模型包含一个Conv2d(256, 512, 1)的1×1卷积用于通道升维其fan_in256fan_out512。我误用fan_in256初始化结果训练初期feature map出现大量饱和值1e4BN层统计值异常loss直接nan。修正为fan_in256×1×12561×1卷积特殊fan_inout_channels×1×1不fan_in始终是输入连接数即in_channels×k×k256后恢复正常。更复杂的是转置卷积ConvTranspose2d。其fan_in和fan_out定义与普通卷积相反fan_in对应输出通道数fan_out对应输入通道数。这是因为转置卷积的数学本质是普通卷积的转置操作信号流动方向反转。PyTorch文档明确指出“For transposed convolution, fan_in refers to the number of input channels, and fan_out refers to the number of output channels.” 这一反直觉设定导致大量开发者踩坑。实操中我建立了一套自动化检查机制在模型__init__末尾插入校验代码def _check_init_consistency(self): for name, module in self.named_modules(): if isinstance(module, (nn.Conv2d, nn.ConvTranspose2d)): # 计算正确fan_in/fan_out if isinstance(module, nn.ConvTranspose2d): fan_in module.out_channels fan_out module.in_channels else: fan_in module.in_channels * module.kernel_size[0] * module.kernel_size[1] fan_out module.out_channels * module.kernel_size[0] * module.kernel_size[1] # 检查权重标准差是否在合理范围 std_est module.weight.data.std().item() std_target (2.0 / fan_in) ** 0.5 if hasattr(module, nonlinearity) and relu in module.nonlinearity else (1.0 / ((fan_in fan_out) / 2)) ** 0.5 if abs(std_est - std_target) 0.1 * std_target: warnings.warn(fLayer {name} weight std {std_est:.4f} deviates from target {std_target:.4f})这段代码在模型构建时自动校验初始化质量将问题拦截在训练前。2.3 BatchNorm层的初始化为什么gamma1, beta0是黄金标准BatchNorm层包含两个可学习参数缩放因子γgamma和偏移因子βbeta。其初始化看似简单但细节决定成败。标准做法是gamma初始化为1beta初始化为0。原因在于BN层的数学形式为y γ·((x-μ)/σ) β。若γ1、β0则BN层初始等价于恒等映射不对原始信号做任何扭曲。这保证了网络在训练起始时刻信号流与未加BN时一致避免因BN的“强制归一化”引入额外偏差。但问题在于很多框架包括旧版PyTorch默认gamma初始化为1beta为0这看似正确实则埋雷。因为gamma是可学习参数若其初始值为1而网络其他部分如前一层卷积初始化不当可能导致BN输入x的分布极度异常如方差接近0此时(x-μ)/σ会出现除零或极大值引发NaN。更稳健的做法是在BN层前插入一个“软启动”机制。我们在所有BN层前添加一个可学习的缩放层Scale Layerclass ScaleLayer(nn.Module): def __init__(self, init_value1e-3): super().__init__() self.scale nn.Parameter(torch.FloatTensor([init_value])) def forward(self, x): return x * self.scale并在模型初始化时将ScaleLayer的scale设为极小值如1e-3使BN层初始输入接近0避免极端归一化。训练开始后scale自动学习增长平滑过渡到正常工作状态。在工业缺陷检测项目中此方案使训练首epoch的NaN率从12%降至0.3%。注意不要试图通过修改BN的eps参数来规避此问题。eps是数值稳定性常数默认1e-5增大它会削弱BN的归一化能力导致性能下降。真正的解法是控制输入信号的动态范围而非掩盖问题。3. 完整初始化流程与生产环境Checklist3.1 从零构建可复现初始化的七步法工业项目要求初始化策略可版本化、可审计、可复现。我团队采用以下七步法已固化为CI/CD流水线中的标准步骤第一步声明初始化策略字典在配置文件config/init.yaml中明确定义每类层的初始化规则conv2d: method: kaiming_normal params: {mode: fan_in, nonlinearity: relu} linear: method: kaiming_uniform params: {mode: fan_in, nonlinearity: relu} lstm: method: orthogonal params: {gain: 1.0} batch_norm: method: constant params: {gamma: 1.0, beta: 0.0}第二步编写通用初始化函数创建utils/initializer.py支持YAML配置驱动def init_model(model, init_config_pathconfig/init.yaml): with open(init_config_path) as f: rules yaml.safe_load(f) for name, module in model.named_modules(): layer_type module.__class__.__name__.lower() if layer_type in rules: rule rules[layer_type] if rule[method] kaiming_normal: init.kaiming_normal_(module.weight, **rule[params]) elif rule[method] orthogonal: init.orthogonal_(module.weight, **rule[params]) # ... 其他方法 if hasattr(module, bias) and module.bias is not None: init.constant_(module.bias, 0)第三步注入LSTM专用逻辑在init_model中添加分支处理LSTM的门控偏置if isinstance(module, nn.LSTM): # 初始化遗忘门偏置为1 for name, param in module.named_parameters(): if bias_hh in name or bias_ih in name: # 偏置向量分为四段[input, forget, output, cell] hidden_size module.hidden_size param.data[hidden_size:2*hidden_size].fill_(1.0) # forget gate第四步添加初始化质量校验在init_model末尾插入统计校验# 校验所有可训练参数的初始化质量 for name, param in model.named_parameters(): if param.requires_grad: std param.data.std().item() if weight in name and std 1e-4: raise ValueError(fWeight {name} std {std} too small) if bias in name and std 0.1: raise ValueError(fBias {name} std {std} too large)第五步生成初始化报告运行init_model时自动输出init_report.txt[INIT REPORT] 2023-10-15 14:22:33 Model: ResNet50-DefectDetector v2.1 Total trainable params: 24,587,232 Weight std stats: min0.012, max0.067, mean0.041, std0.008 Bias std stats: min0.000, max0.000, mean0.000 (all zero) LSTM forget gate bias: set to 1.0 for all layers第六步集成到训练脚本在train.py中初始化调用必须位于模型构建后、优化器创建前model build_model(config) init_model(model, config.init_config) # 必须在此处 optimizer torch.optim.Adam(model.parameters(), lrconfig.lr)第七步版本化与回滚将config/init.yaml纳入Git管理每次初始化策略变更需提交PR并附带A/B测试报告。例如将conv2d的nonlinearity从relu改为leaky_relu必须附带在验证集上的loss曲线对比图及收敛步数统计。这套流程已在我们团队的12个项目中稳定运行平均减少初始化相关bug排查时间83%。最关键的是它让“初始化”从一个模糊的经验项变成了可审计、可追溯、可自动化的工程环节。3.2 不同场景下的初始化策略速查表场景推荐策略关键操作风险提示小样本学习1k imageskaiming_normal 权重衰减增强在初始化后对所有权重施加L2正则系数设为0.01高于常规0.0001小数据下过强初始化易导致过拟合需配合更强正则超深网络100层orthogonalresidual_scaling对残差连接的权重矩阵用orthogonal_并在残差分支末尾乘以0.1nn.init.constant_(scale_layer.scale, 0.1)深层叠加导致信号放大需显式缩放残差分支知识蒸馏模型xavier_normal 教师引导用教师模型最后一层输出的方差反推学生模型初始化标准差std sqrt(var_teacher / num_classes)学生模型初始化需与教师输出分布对齐否则KL散度初始值过大稀疏训练pruning-awarekaiming_uniform mask-aware初始化后应用剪枝mask再对未剪枝权重重新归一化weight[~mask] / weight[~mask].std()稀疏结构下有效连接数减少需重新校准方差联邦学习客户端kaiming_normal client-specific bias对每个客户端的BN层beta初始化为该客户端本地数据均值预计算各客户端数据分布差异大全局初始化无法适配需个性化偏置这张表中的每一个条目都来自我们团队在真实场景中的血泪教训。例如在联邦学习项目中我们最初对所有客户端使用统一的beta0初始化结果某医疗客户端CT图像亮度普遍偏高的BN层输出持续为负ReLU全部关闭模型完全失效。改为用该客户端本地训练集计算均值并初始化beta后收敛速度提升4.2倍。4. 常见问题与实战排障手册4.1 问题诊断树从现象到根因的五步定位法当训练异常时按此顺序排查初始化问题90%的初始化故障可在5分钟内定位第一步检查训练日志首行loss正常CrossEntropyLoss首epoch首batch约2.3~3.0ImageNet、MSE首batch约0.8~1.5回归任务异常lossinf/nan → 检查权重是否含nantorch.isnan(model.weight).any()异常loss0.0001 → 权重全零或极小检查init函数是否被跳过第二步可视化首层权重分布用TensorBoard记录model.conv1.weight的直方图writer.add_histogram(conv1/weight, model.conv1.weight, 0)正常钟形分布标准差≈0.05Kaiming Normal异常全为0 →init未执行异常双峰分布±1→ 错误使用xavier_uniform初始化ReLU网络第三步监控梯度范数在optimizer.step()前添加grad_norm torch.norm(torch.stack([p.grad.norm() for p in model.parameters() if p.grad is not None])) writer.add_scalar(grad/norm, grad_norm, step)正常首epoch从1e-2增长至1e0平稳上升异常持续≈0 → 梯度消失检查fan_in计算是否错误异常首step1e5 → 梯度爆炸检查fan_out是否误用第四步检查BN层统计量记录model.bn1.running_mean和running_var正常running_mean≈0±0.1running_var≈1±0.3异常running_var≈0 → 输入信号全零检查前层权重异常running_mean持续偏离0 → BN前有偏置未清零第五步隔离测试构造最小可复现案例x torch.randn(1, 3, 224, 224) model ResNet18() model.eval() # 关闭BN/DP with torch.no_grad(): y model(x) print(y.mean(), y.std()) # 应为0±0.1, 1±0.3若此处异常则100%为初始化问题若正常则问题在训练循环中如loss计算错误。4.2 典型报错与修复命令行清单报错信息根因分析修复命令PyTorch验证方式RuntimeError: Function MulBackward0 returned nan values in its 0th output权重初始化过大导致ReLU前z值过大exp(z)溢出nn.init.kaiming_normal_(m.weight, modefan_in, nonlinearityrelu)print(m.weight.std())应≈0.05Warning: NaN or Inf found in input tensorBN层输入方差≈0(x-μ)/σ分母过小nn.init.constant_(m.weight, 1); nn.init.constant_(m.bias, 0) 前置ScaleLayerprint(m.running_var)首batch后应0.5ValueError: Expected more than 1 value per channel when training, got input size [1, 64, 1, 1]BatchNorm在batch_size1时无法计算均值/方差但根本原因是初始化导致所有样本输出相同改用InstanceNorm2d或增大batch_size同时检查初始化是否使网络退化print(model(x).std())若≈0则确认退化CUDA error: device-side assert triggeredLSTM遗忘门偏置为0导致cₜ在某步变为nanlstm.bias_hh_l0.data[hidden_size:2*hidden_size].fill_(1.0)print(lstm.bias_hh_l0[hidden_size:2*hidden_size].mean())应1.0UserWarning: torch.nn.utils.clip_grad_norm_ is now deprecated梯度裁剪警告实为梯度爆炸的前兆nn.init.orthogonal_(m.weight)替代kaiming_normalprint(torch.norm(m.weight.grad))首step应10这些命令不是凭空写出的。例如最后一个orthogonal_替换源于我们在语音识别项目中发现当RNN层数3时kaiming_normal初始化的梯度范数首step常达1e3而orthogonal_可将其压至1e1且收敛更快。orthogonal_的本质是生成正交矩阵其奇异值全为1完美保持向量长度避免信号在RNN展开中指数级放大。4.3 我踩过的三个最隐蔽的初始化坑坑一DataParallel导致的初始化失效在多卡训练时若先model nn.DataParallel(model)再init_model(model)则init_model作用于包装后的DataParallel对象其named_modules()返回的是module.conv1而非conv1导致初始化函数找不到目标层。正确顺序是先初始化再包装。我们曾因此在8卡A100集群上浪费17小时训练时间。坑二HuggingFace Transformers的from_pretrained覆盖初始化调用AutoModel.from_pretrained(bert-base-uncased)时模型会加载预训练权重覆盖你之前的所有初始化。若你想在预训练模型上做Adapter微调必须在from_pretrained后单独对Adapter层重新初始化model AutoModel.from_pretrained(bert-base-unc