前情提要
正在做一个AI制药平台项目,前端使用vue3、后端采用双后端(主后端Java、SpringBoot做业务,次后端Python、FastAPI做AI服务)
Vue3 前端
|
| REST API
v
SpringBoot 主后端
|
| 任务管理 / 数据管理
v
PostgreSQL + Redis
|
| 调用
v
Python AI Service
|
| RDKit / PyTorch / PyG / scikit-learn
v
模型推理与分子计算
会把自己认为比较重要的部分,单独写成文章以便记录。写这个项目的主要目的是以赛代练,因为不想从头到尾啃生物信息学、生物化学原理这些AI制药理论。通过项目能快速理解核心概念,剩下零零散散的后续慢慢补。
此篇就是第 5 周的记录。
第 5 周:Morgan Fingerprint 和 MLP 的第一次模型对比
第 5 周的重点是把 PyTorch 训练流程接进分子预测任务。输入特征从上一周的 RDKit descriptors 换成 Morgan Fingerprint,模型从 RandomForest 换成 MLP。
这周跑通的链路是:
ESOL CSV
-> SMILES
-> Morgan Fingerprint
-> Dataset / DataLoader
-> MLP
-> loss curve
-> metrics
-> model checkpoint
它看起来比第 4 周复杂很多,但最后的结果反而提醒我:复杂模型不一定自动带来更好的效果。
Morgan Fingerprint 作为输入
Morgan Fingerprint 可以理解成一种固定长度的分子结构编码。它把分子局部结构转成 bit vector,常见配置是:
radius = 2
n_bits = 2048
相比 RDKit descriptors,fingerprint 的维度更高,也更像“结构模式”的集合。它不直接告诉我分子量、极性表面积这些人工描述符,而是用 bit 位表达某些子结构是否出现。
这一点很适合接 MLP。MLP 可以在高维稀疏特征上学习组合模式,但前提是数据量、正则化和划分方式都要站得住。
MLP 结构
这一版模型没有做复杂设计:
2048-bit Morgan fingerprint
-> Linear(2048, 256)
-> ReLU
-> Dropout(0.1)
-> Linear(256, 64)
-> ReLU
-> Linear(64, 1)
-> predicted logS
ESOL 是回归任务,输出是连续的 logS,所以最后一层保持线性输出,不加 sigmoid。如果加了 sigmoid,输出会被压到 [0, 1],而 logS 本身并不在这个范围内。
训练时使用 MSELoss。目标值先根据训练集均值和标准差做标准化,评估 MAE、RMSE、R2 时再还原到原始 logS 尺度。
PyTorch 训练闭环
核心脚本是:
ml-experiments/esol_mlp.py
新增输出包括:
models/esol_mlp.pt
ml-experiments/outputs/esol_mlp_metrics.json
ml-experiments/outputs/esol_mlp_predictions.csv
ml-experiments/outputs/esol_mlp_training_log.csv
ml-experiments/outputs/figures/esol_mlp_loss_curve.png
ml-experiments/reports/esol_model_compare.md
Dataset 负责定义一条样本如何取出,DataLoader 负责批量加载。训练时记录 train loss 和 validation loss,并加入 early stopping。validation loss 连续多轮不下降时停止训练,再恢复验证集表现最好的参数。
模型 checkpoint 里保存了:
model_state_dict- MLP 结构参数
- fingerprint 参数
- 目标值标准化参数
- train / validation / test 指标
这样后续做预测服务时,不需要重新猜模型结构和特征配置。
对比结果
这周最关键的文件不是单个模型结果,而是:
ml-experiments/reports/esol_model_compare.md
在同样的 random split 下,第 4 周和第 5 周的测试集结果是:
| 模型 | MAE | RMSE | R2 |
|---|---|---|---|
| RDKit descriptors + RandomForest | 0.5415 | 0.7690 | 0.8611 |
| Morgan Fingerprint + MLP | 0.9183 | 1.1934 | 0.6655 |
这次 MLP 没有超过 RandomForest。
这个结果并不意外。ESOL 数据集规模不大,RandomForest 对低维描述符的处理很稳,而 MLP 对训练细节更敏感。高维 fingerprint 加 MLP 如果没有足够数据和调参,很容易学不到比传统 baseline 更好的规律。
这周真正留下来的判断
第 5 周最大的收获不是“写了一个神经网络”,而是把深度学习模型放进了同一套评估框架里。
如果没有第 4 周的 baseline,这周只看 MLP 自己的 loss 曲线,很容易误以为模型已经有效。但一对比指标,就能看到它并没有带来收益。
这也改变了后续路线的判断顺序:
- 先保证数据处理正确
- 先建立传统 ML baseline
- 再比较 MLP 或 GNN 是否真的提升
- 不用模型复杂度替代实验结论
第 5 周结束后,项目里已经有了两类分子表征:人工描述符和 Morgan Fingerprint。下一步进入 Tox21,多标签毒性分类会比 ESOL 回归更接近 AI 制药里的 ADMET 语境。