3. 学习率对分子生成的影响

训练分子生成模型时,学习率就像方向盘上的灵敏度。调得太灵敏,车会左右乱晃;太迟钝,半天拐不过弯。我刚开始跑分子生成项目那会儿,就吃过学习率过大的亏——模型直接崩了,生成的分子全是带五元环的垃圾结构。

说白了,学习率决定了参数每次更新的步长。在分子生成这个场景里,模型需要在化学空间里找出有效的分子结构。步长错了,模型要么越过最优解,要么原地踏步。

3.1 学习率过大:震荡与无效分子

学习率设置太大,损失曲线像过山车。你回顾一下训练日志:

Epoch  1  Loss: 2.4532  
Epoch  2  Loss: 1.8763  
Epoch  3  Loss: 0.9341  
Epoch  4  Loss: 3.2110   ← 突然反弹  
Epoch  5  Loss: 1.0123  
Epoch  6  Loss: 4.5678   ← 完全发散

为什么?因为参数每次更新都跳过山谷,反复在两边弹跳。分子生成模型里,解码器输出的 SMILES 字符串对参数变化非常敏感。参数震荡一下,生成的分子就从合法变成不合法的。

我记得有次跑一个基于 VAE 的分子生成实验,学习率设成 0.01。结果前 20 个 epoch 还能看到损失下降,到第 30 轮直接 nan。检查生成的分子,80% 的 SMILES 语法都错了,连基本的碳链都连不上。

避坑指南:我曾经在训练图神经网络分子生成器时,学习率设到 0.005 就崩了。后来先试 1e-4 起步,才稳定下来。建议你从 1e-4 或 1e-3 开始,再根据损失曲线微调。

3.2 学习率过小:慢性毒药

学习率太小不会崩,但你会怀疑模型是不是睡着了。损失曲线很平稳,每天看都在缓慢下降,但下降幅度极其可怜。

Epoch   1  Loss: 4.5230  
Epoch  50  Loss: 4.5012  
Epoch 100  Loss: 4.4897  
Epoch 200  Loss: 4.4683

通常分子多样性与生成质量都需要在合理步数内收敛。如果学习率 1e-6,训练 500 个 epoch 生成的分子还是高度雷同,基本都在同一个化学子空间里打转。

我的经验:检查生成分子的有效性率和新颖性率。如果有效性高但新颖性很低(比如低于 20%),十有八九是学习率太小,模型困在局部最优,只会模仿训练集里的常见分子。

3.3 不同学习率下的表现对比

学习率 损失曲线 分子有效性 分子多样性
1e-2 及以上 震荡/发散 低(<50%) 不稳定
1e-3 ~ 1e-4 平滑下降 高(>85%) 中等
1e-5 ~ 1e-6 极慢下降 较高(>80%) 低(<30%)
一点建议:如果训练资源有限,优先用默认的 Adam 优化器 + 初始学习率 1e-3。Adam 自带自适应步长,能缓和一些学习率带来的波动。

3.4 学习率对分子生成质量的影响

说白了,学习率决定了模型在化学空间里的“探索深度”。下图展示了不同学习率策略下,训练过程中损失变化与最终生成分子质量的关系。

不同学习率对分子生成的影响 学习率过大 (>1e-2) 损失震荡发散 合适学习率 (1e-3~1e-4) 损失平滑下降 生成分子 有效高、多样性好 学习率过小 (<1e-5) 损失下降极慢 收敛在局部最优 生成分子多样性低 生成分子 有效性高但重复 关键观察 过大 → 分子无效,甚至 NaN 过小 → 分子死板,新颖性低

3.5 如何判断当前学习率是否合适

  1. 看损失曲线斜率:如果每轮下降幅度小于 0.5% 且持续 50 轮,说明学习率太小。
  2. 看生成分子有效性:有效性突然掉落到 50% 以下,通常是学习率过大触发了不合法序列。
  3. 看分子多样性:用 Tanimoto 相似度检验,若生成分子间平均相似度 >0.8,多半是学习率太小导致过度收敛。
我的调试习惯:先在 10% 的小数据上跑一个学习率扫描(lr = 1e-2, 1e-3, 1e-4, 1e-5),每个跑 20 个 epoch。看哪个损失下降最平稳,就选那个。你想想看,这能省你至少一天的盲目调参时间。

嗯,这里要补充一个实际案例。我之前处理一个基于 Transformer 的分子生成模型,在 60 万 SMILES 数据上训练。学习率设为 1e-4 时,前 30 epoch 损失从 4.5 降到 0.8,生成分子有效性 92%。后来不小心把学习率改到 5e-4,过了 20 epoch 后有效性直接掉到 65%,而且生成的分子经常有断链。我换成 5e-5,有效性虽然回到 90%,但新颖性只有 12%,生成的东西全是苯环排列组合。最后还是用 1e-4 + cosine annealing 学习率衰减搞定的。

所以啊,学习率不是恒定的。我建议你在训练中期启用学习率衰减,比如每 50 个 epoch 乘 0.5,或者用余弦退火。这样既能前期快速探索,后期也能精细收敛。