超参数类型:学习率、嵌入维度、正则化、batch size、epoch等

做药物KG模型,说白了就是在跟一堆旋钮打交道。这些旋钮就是超参数。你调得好,模型收敛快、泛化强;调得不好,嗯,训练三天 loss 纹丝不动,或者直接炸成 NaN。我刚开始接触这个领域时,觉得超参数嘛,随便设设得了,结果被现实狠狠教育了一回。今天咱们就把这几个核心超参数掰开揉碎聊清楚。

学习率 — 最敏感的旋钮

学习率决定了参数每步迈多大。步子太大,容易在最优解附近来回震荡,甚至直接发散;步子太小,走得跟乌龟似的,训练到地老天荒。我个人习惯先把学习率设到 0.001 试试水,然后观察 loss 曲线的下降趋势。

你会问,怎么判断学习率合不合适?记住一个简单技巧:画一条 loss 曲线。如果曲线下降很慢,说明学习率偏小;如果曲线震荡剧烈甚至往上跑,那就是学习率太大了。我曾经在一个关系预测任务上设了 0.01,结果 loss 前三轮直接飞到正无穷。嗯,从那以后我再也不敢小看这玩意了。

经验之谈:对于药物 KG 模型,建议使用学习率预热 + 余弦退火调度。前 10% 的 step 把学习率从 0 线性升到目标值,后面再慢慢降下来。这样既能避免初期震荡,又能保证后期精细收敛。

# 典型的学习率调度配置
learning_rate: 0.001
scheduler:
  type: cosine_with_warmup
  warmup_steps: 500
  min_lr: 1e-6

嵌入维度 — 表达能力的开关

嵌入维度决定了实体和关系能被编码成多丰富的向量。维度太低,模型学不到复杂的语义关系;维度太高,参数量暴涨,容易过拟合,而且训练速度直线下降。说白了,这就是一个容量控制的问题。

我在项目中发现,对于药物 KG,实体数量通常在几万到几十万这个量级。嵌入维度设 128 到 256 之间,大部分场景都能覆盖。如果数据量特别大,比如超过 50 万实体,可以试试 512。但别贪,我见过有人直接上 1024,结果显存直接爆炸,训练速度慢到令人崩溃。

实体数量 推荐嵌入维度 参数量(约)
< 10,000 64 - 128 0.6M - 1.3M
10,000 - 100,000 128 - 256 1.3M - 25.6M
100,000 - 500,000 256 - 512 25.6M - 256M
> 500,000 512 - 1024 256M - 1B+

小技巧:嵌入维度最好设置成 2 的幂次(64、128、256、512)。GPU 对这样的尺寸计算效率更高,训练速度能快 10% 左右。

正则化 — 防止模型死记硬背

药物 KG 模型很容易过拟合——实体和关系的模式太多了,模型一不小心就把训练集里的噪声也记住了。常用的正则化手段有 L2 正则化、Dropout 和标签平滑。L2 给大的参数加惩罚,Dropout 随机让一部分神经元失活,标签平滑让 softmax 输出不要那么极端。

我曾经在一个抗菌药物预测任务上,模型在验证集上 AUC 死活上不去。后来检查发现 L2 系数设了 0.01,惩罚太重了,模型根本不敢学。降到 1e-5 之后,指标一下子涨了 3 个点。嗯,正则化这东西,真不是越大越好。

# 常用的正则化配置
regularization:
  l2: 1e-5
  dropout: 0.2
  label_smoothing: 0.1

注意:Dropout 在训练和推理时的行为不一样。训练时随机失活,推理时所有神经元都参与,但输出要乘以 (1 - dropout_rate)。PyTorch 和 TensorFlow 会自动处理这个,但你自己写底层逻辑时千万别忘了。

Batch Size — 效率和稳定性的天平

Batch size 决定了每次更新参数用多少样本。设得大,梯度方向更准,训练稳定,但显存占用高,而且容易收敛到 sharp minima(尖锐最小值),泛化能力反而变差。设得小,收敛快(迭代次数多),梯度噪声大,但反而可能找到 flat minima(平坦最小值),泛化更好。

我记得有一次在 48GB 显存的 A6000 上跑实验,batch size 设到 1024,显存快满了,但 loss 下降特别平稳。后来换成 64,虽然震荡大了点,但验证集指标反而更好。你想想看,这不就是典型的泛化与效率的 trade-off 吗?

建议:对于药物 KG 模型,batch size 从 32 到 256 之间尝试。如果显存够大,可以先试 128,然后根据梯度噪声和收敛速度上下调整。

Epoch — 练多久才算够

Epoch 数决定了模型完整看几遍训练数据。太少了,模型欠拟合;太多了,过拟合风险直线上升。我建议不要硬设一个固定值,而是配合早停策略。当验证集指标连续 N 轮不提升,就果断停下来。

我习惯把最大 epoch 设到 200,早停的 patience 设 20。这样既给了模型充分的学习时间,又不会在过拟合的路上越走越远。你可能会问,20 轮不提升会不会太浪费?其实后面那些轮次 loss 通常已经 plateau 了,继续跑纯属浪费电。

# 早停配置示例
epochs: 200
early_stopping:
  patience: 20
  min_delta: 0.001
  monitor: val_loss

超参数之间的相互影响

上面的每个超参数都不是孤立的。学习率和 batch size 一起决定了梯度更新的信噪比;嵌入维度和正则化强度需要联动调整——维度越高,正则化通常也要越强;epoch 数和早停策略又跟学习率调度紧密相关。下面的图把这层关系梳理清楚了。

超参数影响关系图 学习率 嵌入维度 正则化 Batch Size Epoch 收敛速度 · 稳定性 模型容量 · 过拟合 泛化能力 · 抗过拟合 训练效率 · 梯度质量 训练充分度 · 过拟合 联动 联动 联动 五个超参数共同决定模型最终表现 调参时不能孤立地看某个参数,要理解它们之间的耦合关系 例如:学习率 warmup 配合大 batch size,高维度搭配强正则化

调参优先级与实用建议

这么多超参数,从哪下手?我一般按这个顺序来:先定学习率(最敏感),再调嵌入维度(容量基础),然后试 batch size(效率与稳定性),接着配正则化(防止过拟合),最后用早停确定 epoch。但说实话,实际项目中经常要来回调好几轮。你想想看,每个参数都在互相影响,不可能一步到位。

总结一下我的调参清单:

  • 学习率:先试 0.001,配合预热 + 余弦退火
  • 嵌入维度:根据实体数量选 128 - 512,取 2 的幂次
  • 正则化:L2 从 1e-5 开始试,Dropout 从 0.2 开始
  • Batch Size:从 32 到 256,结合显存和梯度噪声调整
  • Epoch:设 200 上限,配合 patience=20 的早停

一个常见的坑:千万别在验证集上调超参数调过头。每调一次就看一下验证集指标,不知不觉就把验证集信息泄露到模型里了。我建议单独留一份测试集,只有在最终评估时才碰它。中间对比选型,用验证集就够了。

好了,这五个核心超参数咱们都过了一遍。记住,没有一套参数能通吃所有任务,关键是要理解每个旋钮在干什么,然后根据你的数据和资源去试。这章的内容够扎实了,接下来就可以动手跑实验了。