我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

ScreenShot基础模型:少样本学习如何重塑组合药物筛选

ScreenShot基础模型:少样本学习如何重塑组合药物筛选 做药物研发的朋友应该对“组合筛选”不陌生两个药放在一起可能比单药效果更好也可能相互抵消甚至毒性叠加。传统做法是把候选药物两两配对铺在 96 孔板或 384 孔板上做高通量实验筛完一轮下来人力、试剂、时间和设备成本都很高。更麻烦的是药物组合空间是组合爆炸级别的哪怕只有几百个候选药两两组合也有上万种如果考虑到三联、四联用药实验量根本做不完。这就是 ScreenShot 这类基础模型真正切入的痛点。它的目标不是替代实验而是先用模型把“哪些组合值得做实验”这个问题快速过滤一遍让研究者把有限的湿实验资源花在最有希望的方向上。而且它主打的是 Few-Shot也就是哪怕某一类新的癌细胞系、新的药物结构、新的适应症数据很少模型也能通过少量样本快速迁移给出相对可靠的排序预测。坦白说“AI 预测药物组合”并不是一个新方向之前有 DeepSynergy、基于图神经网络的组合预测方法等。但 ScreenShot 的关键判断在于它不再把一个药物对当作孤立的输入而是先在海量数据上学习药物本身的“通用表示”。换句话说它想成为药物筛选领域的“预训练底座”下游任务只需要少量微调。这个思路很大也很有争议但从技术演进角度看确实是组合药物筛选走向基础模型化的一个代表性信号。这篇文章会用工程视角拆解 ScreenShot 到底做了什么、Few-Shot 在这里意味着什么、以及如果你想在自己的药物筛选流程里尝试这类模型需要准备哪些数据、写哪些代码、避开哪些坑。文章不会给你堆论文术语而是尽量把每个概念都落到可操作的层面。1. 组合药物筛选的困境为什么传统方法越来越不够用1.1 实验筛选的成本曲线在药物研发早期阶段组合筛选主要依赖体外实验。比如你要研究两种药物对某种肿瘤细胞系的抑制效果通常要做剂量梯度矩阵实验。假设每种药取 8 个浓度梯度两药组合就是 8×864 个孔位加上重复实验一组组合下来就是几百个数据点。若有 100 个候选药物两两组合 4950 对按每对 64 组浓度组合计算就是约 31 万个实验孔位。这个数字已经超出了绝大多数实验室的物理极限。所以行业里一直存在一个需求怎么在实验量缩小一到两个数量级的前提下仍然找到最优或近似最优的药物组合传统方法主要靠经验规则比如机制相关的药对优先测试但这会漏掉很多跨通路的意外协同。1.2 计算预测的难点计算模型介入后问题并没有立刻变简单。因为药物组合效应不仅取决于两个药各自的分子结构还取决于靶点通路、细胞环境、剂量比例、时序给药等因素。此前很多预测模型的输入就是“药物 A 的结构指纹 药物 B 的结构指纹 细胞系特征”然后输出一个协同分数。这类模型有两个问题对数据量要求高。每个细胞系、每个药物组合的标签都需要实验测定冷启动时效果很差。泛化能力有限。模型学到的往往是特定实验条件下的相关性换一个新细胞系或新药物性能大幅下降。1.3 ScreenShot 的不同思路ScreenShot 的核心变化是先不直接预测组合效应而是先在大量单药数据上学习“药物表示”。就像 NLP 里先在大规模语料上预训练 BERT再在下游任务上微调。它的名字也很有意思看着像“截图”实际上对应的是“screening shots”——对药物筛选特征空间的多次“抓拍”用多尺度的方式把药物映射成稠密向量。这个点后面我们会展开。需要注意的是任何计算模型都不能替代湿实验和临床验证。ScreenShot 的价值在于缩小候选范围、优化实验设计而不是直接给出“这个药能上市”的结论。这一点无论做研究还是做工程都要时刻记住。2. 基础模型与 Few-Shot 在药物筛选中的真实含义2.1 什么是基础模型Foundation Model基础模型最早在大语言模型领域流行指的是在大规模、多样化数据上预训练的模型之后可以通过微调、提示或适配器等方式迁移到多种下游任务。它的两个关键特点是规模大训练数据量和参数量都远超传统任务模型。通用性预训练阶段学习的不是某一个任务的输入输出映射而是数据本身的结构和分布。在药物筛选场景里基础模型的“数据”不再是文本而是药物分子结构、药物响应谱、基因表达谱、细胞系特征等生物化学数据。它学习的是“什么样的药物特征组合更常见”“哪些结构特征与哪些生物机制相关”而不是一开始就去拟合某个具体细胞系的协同分数。2.2 Few-Shot 的含义Few-Shot少样本学习指的是模型只需要极少量的标注样本就能适应新任务。在 ScreenShot 的场景中它往往意味着新细胞系只有几十个药物组合的实验数据。新药物只有少量已知的协同/拮抗标签。某个罕见适应症只有很少的临床或体外数据。如果模型是“从零训练”的这些数据量远远不够。但如果模型已经在大量组合筛选数据上做过预训练那么只需要少量新样本“告诉”模型新场景的特殊性它就能做出合理预测。这也是 Few-Shot 与传统迁移学习的微妙差异迁移学习通常也要求下游数据达到一定规模而 Few-Shot 强调的是在极端低数据条件下通过先验知识快速适应。ScreenShot 的设计目标就是在准确率和数据效率之间取得更好的平衡。2.3 概念对比维度传统药物组合预测模型ScreenShot 基础模型方案输入特征手工指纹 细胞系 ID学习到的药物稠密表示 可泛化的生物特征训练方式针对特定数据集训练大规模自监督预训练 下游微调数据需求每个任务需要大量标签新任务只需少量标签Few-Shot泛化能力对新细胞系/新药适应性差通过预训练表示迁移泛化更强主要目标预测协同分数提供可复用的药物表示底座从这张表能看出ScreenShot 想做的不是“又一个更强的新模型”而是从范式上改变组合药物筛选模型的构建方式。3. ScreenShot 的核心技术拆解3.1 从“单向量”到“量化指纹序列”很多分子表示方法最终会落到一个固定长度的向量上比如摩根指纹可以变成 1024 位或 2048 位的位向量图神经网络可以池化出一个图向量。这种做法的问题是一个药物往往有多个方面的特性比如一个分子可能既作用于激酶通路又有某些物理化学性质压缩成一个向量会丢失信息。ScreenShot 采用的是一种“归一化量化指纹”Normalized Quantized Fingerprint, NQF思路。简单理解它不是把一个药物映射成单个向量而是把药物特征分配到多个“码本向量”的组合上。这些码本向量可以理解为模型自动学到的“特性基元”一个药物表达为多个基元的加权组合。3.2 弥补离散编码的信息损失量化表示在信息论里并不新鲜传统做法是最近邻查找也就是把输入特征就近映射到最相似的一个码本向量。但问题是最近邻量化会丢失很多细节两个相似但不相同的药可能落到同一个码本里导致后续表示不可分。ScreenShot 的做法更接近软量化或组合量化一个药物同时与多个码本向量相关并且按归一化的权重组合。这样既保留了离散表示的泛化能力又不会因为硬量化而损失区分度。这也是 NQF 被强调的核心原因之一。3.3 自监督预训练与药物机制摘要自监督预训练是基础模型的核心环节。在 ScreenShot 中模型会在大量药物特征数据上执行类似“掩码重建”的任务——你遮住一部分药物特征让模型根据剩余特征预测被遮住的内容。这样模型被迫学习特征之间的依赖关系从而形成有意义的药物表示。另一个重要设计是模型会学习生成某种“药物机制摘要向量”。这个向量可以被理解为模型对“这个药在细胞里大概干了什么”的压缩理解。下游任务中这个摘要向量会和药物对组合特征拼接在一起作为协同/拮抗预测的依据。这个设计有一个实际好处不只是输入分子结构还引入药物作用机制的信息通道。即使某个药物对的直接实验数据很少只要它们的机制摘要向量清晰模型也能做出相对可靠的推断。3.4 ScreenShot 在实际流程中的位置如果画一条从药物候选到实验验证的流水线候选药物列表 ↓ ScreenShot 预训练模型编码药物特征 ↓ 得到药物表示向量 / 量化指纹 ↓ 在目标细胞系上做 Few-Shot 微调 ↓ 预测所有药物组合的协同概率 / 分数 ↓ 排序选出 Top 组合 ↓ 湿实验验证 ↓ 确认协同效应进入下一轮验证从流程可以看到ScreenShot 不是在替代实验而是在“实验优先级排序”这一步提供决策支持。这个定位很重要它能帮我们判断模型的输出应该被如何使用。4. 环境准备与数据准备要真正尝试 ScreenShot 这类模型我们首先要准备一套可复现的开发环境。虽然不同版本的官方仓库细节可能不同但整体依赖是相似的。4.1 推荐运行环境操作系统LinuxUbuntu 20.04 或 22.04 均可有 GPU 更佳Python3.8 或 3.9 以上深度学习框架PyTorch 1.13 或 2.x化学信息学工具RDKit 2022.09 或更新版本数据处理NumPy、Pandas、scikit-learn可选CUDA 11.x 或 12.x用于 GPU 加速这里不写死具体版本号因为官方仓库更新较快建议以你实际克隆到的仓库依赖文件为准。但 RDKit 和 PyTorch 是几乎必然要安装的。4.2 创建虚拟环境并安装依赖conda create -n screenshot python3.9 conda activate screenshot pip install torch --index-url https://download.pytorch.org/whl/cu118 pip install rdkit pandas numpy scikit-learn tqdm如果只是想快速跑通 CPU 版本可以不加--index-url直接安装官方默认 PyTorch 版本。不过药物筛选模型通常涉及较多矩阵运算建议还是用 GPU 跑实际应用。4.3 数据结构设计不管官方仓库的输入格式是什么你先搞清楚自己要解决什么问题。以“给定细胞系和新药物预测组合效应”为例最核心的数据结构是一张表字段示例说明drug_a_smilesCC(C)Nc1ncc(-c2ccc3c(c2)OCO3)nc1N药物 A 的 SMILESdrug_b_smilesCC(C)C1CCC(CC1)C(O)NCCN2CCCCC2药物 B 的 SMILEScell_lineHCC1954细胞系名称或 IDsynergy_score12.5协同分数可来自实验或公开数据集response1 / 0是否协同0/1 标签如果要做 Few-Shot数据组织还要额外区分哪些样本作为预训练微调时的支撑集support set哪些作为验证集query set。也就是说每个任务要构建类似“少量带标签样本 大量无标签候选组合”的结构。mkdir -p screenshot_fsl/data # 将整理好的 CSV 文件放在 data/ 目录 # 建议结构 # data/train_pairs.csv # data/test_pairs.csv # data/fewshot_support.csv5. 完整示例代码少样本药物组合筛选流程下面提供一套基于 ScreenShot 思路的通用示例代码。注意如果官方仓库已经公开请以官方接口为准以下代码主要帮助你理解这个流程的骨架方便读者在自己的数据上试跑。5.1 步骤一药物 SMILES 标准化与 RDKit 特征提取# 文件路径src/featurize.py from rdkit import Chem from rdkit.Chem import AllChem import numpy as np import pandas as pd def canonicalize_smiles(smiles: str) - str: mol Chem.MolFromSmiles(smiles) if mol is None: return return Chem.MolToSmiles(mol) def morgan_fingerprint(smiles: str, radius: int 2, n_bits: int 2048) - np.ndarray: mol Chem.MolFromSmiles(smiles) if mol is None: return np.zeros(n_bits, dtypenp.float32) fp AllChem.GetMorganFingerprintAsBitVect(mol, radius, nBitsn_bits) arr np.zeros((0,), dtypenp.int8) Chem.DataStructs.ConvertToNumpyArray(fp, arr) return arr.astype(np.float32) def build_drug_representation_from_smiles(smiles_list): results [] for smi in smiles_list: smi canonicalize_smiles(smi) if not smi: results.append(np.zeros(2048, dtypenp.float32)) else: results.append(morgan_fingerprint(smi)) return np.vstack(results)这里用了摩根指纹作为基础特征。实际 ScreenShot 使用的药物表示会比这个复杂它包含可学习的量化编码层。但如果你想先把流程跑通指纹是最简单可靠的起点。5.2 步骤二构建 Few-Shot 任务的数据集# 文件路径src/dataset.py import torch from torch.utils.data import Dataset class DrugPairDataset(Dataset): def __init__(self, df, drug_fp_map): self.df df.reset_index(dropTrue) self.drug_fp_map drug_fp_map def __len__(self): return len(self.df) def __getitem__(self, idx): row self.df.iloc[idx] fp_a self.drug_fp_map[row[drug_a_smiles]] fp_b self.drug_fp_map[row[drug_b_smiles]] x torch.tensor(np.concatenate([fp_a, fp_b]), dtypetorch.float32) y torch.tensor(float(row[synergy_score]), dtypetorch.float32) return x, y注意drug_fp_map的键建议用标准化后的 SMILES。这样即使两个样本中同一个药物的写法不同也能共享同一个指纹。5.3 步骤三定义一个小型少样本预测模型# 文件路径src/model.py import torch import torch.nn as nn class FewShotDrugPairModel(nn.Module): 一个简化的少样本药物组合预测模型示例。 ScreenShot 原模型比这个复杂很多但训练流程是相通的。 def __init__(self, input_dim4096, hidden_dim256, n_quant_vectors64): super().__init__() self.encoder nn.Sequential( nn.Linear(input_dim, hidden_dim), nn.ReLU(), nn.Dropout(0.3), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), ) # 简化版“量化编码”层通过线性层把表示映射到多个码本权重 self.quant_head nn.Linear(hidden_dim, n_quant_vectors) self.predictor nn.Sequential( nn.Linear(hidden_dim n_quant_vectors, 128), nn.ReLU(), nn.Linear(128, 1), ) def forward(self, x): h self.encoder(x) q_weight torch.softmax(self.quant_head(h), dim-1) # 将量化权重和编码向量拼接用于预测 combined torch.cat([h, q_weight], dim-1) out self.predictor(combined) return out.squeeze(-1)这个模型保留了“编码器 量化头 预测头”的骨架你可以把它理解为一个极其简化版的 ScreenShot。在真实模型里量化结构和预训练任务复杂很多但下游微调时核心思路类似冻结一部分参数训练一小部分参数即可。5.4 步骤四Few-Shot 微调循环# 文件路径src/train_fewshot.py import torch import torch.nn as nn from torch.utils.data import DataLoader from src.dataset import DrugPairDataset from src.model import FewShotDrugPairModel def train_fewshot(model, support_loader, val_loader, epochs50, lr1e-3): device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) # 在真实验证中建议对模型的大部分参数做冻结/解冻策略 # 这里为了示例简单全参数参与训练 optimizer torch.optim.Adam(model.parameters(), lrlr) loss_fn nn.MSELoss() for epoch in range(epochs): model.train() total_loss 0.0 for x, y in support_loader: x x.to(device) y y.to(device) optimizer.zero_grad() pred model(x) loss loss_fn(pred, y) loss.backward() optimizer.step() total_loss loss.item() model.eval() val_loss 0.0 with torch.no_grad(): for x, y in val_loader: x x.to(device) y y.to(device) pred model(x) val_loss loss_fn(pred, y).item() if (epoch 1) % 10 0: print(fEpoch {epoch1}, train_loss{total_loss / len(support_loader):.4f}, fval_loss{val_loss / len(val_loader):.4f}) return model5.5 步骤五主流程整合# 文件路径run_fewshot.py import pandas as pd from sklearn.model_selection import train_test_split from src.featurize import build_drug_representation_from_smiles, canonicalize_smiles from src.dataset import DrugPairDataset from src.model import FewShotDrugPairModel from src.train_fewshot import train_fewshot from torch.utils.data import DataLoader # 读取数据 df pd.read_csv(data/train_pairs.csv) # 构建药物指纹映射表 all_smiles pd.concat([df[drug_a_smiles], df[drug_b_smiles]]).unique() fp_list build_drug_representation_from_smiles(all_smiles) drug_fp_map {smi: fp for smi, fp in zip(all_smiles, fp_list)} # 划分 Few-Shot 支撑集和验证集 support_df, val_df train_test_split(df, test_size0.3, random_state42) support_dataset DrugPairDataset(support_df, drug_fp_map) val_dataset DrugPairDataset(val_df, drug_fp_map) support_loader DataLoader(support_dataset, batch_size16, shuffleTrue) val_loader DataLoader(val_dataset, batch_size32, shuffleFalse) # 训练 model FewShotDrugPairModel(input_dim4096, hidden_dim256) trained_model train_fewshot(model, support_loader, val_loader, epochs50) # 导出模型 torch.save(trained_model.state_dict(), outputs/fewshot_model.pt) print(模型已保存到 outputs/fewshot_model.pt)这段代码是完整可跑的骨架。如果你准备在真实项目中使用有两个地方要做强化一是药物特征应该用更丰富的表示而不是简单指纹二是 Few-Shot 过程应该引入“任务采样”逻辑每个任务从不同细胞系中抽取少量样本这样才更符合实际 Few-Shot 场景。6. 运行结果与效果验证6.1 验证指标的选择药物组合筛选常见评估指标有回归任务RMSE、MAE、R²二分类任务AUC-ROC、AUC-PR、F1排序任务NDCGk、Recallk从材料看ScreenShot 更强调少样本条件下的预测能力所以建议重点看小样本支撑集下模型在验证集上的 AUC-ROC 或 Spearman 相关系数。因为实际用药筛选中你更关心排序是否合理而不只是绝对分数是否接近。6.2 期望输出示例如果你的模型训练正常会看到类似日志Epoch 10, train_loss2.3104, val_loss3.0248 Epoch 20, train_loss1.0247, val_loss1.8834 Epoch 30, train_loss0.5211, val_loss1.2045 Epoch 40, train_loss0.3144, val_loss0.9231 Epoch 50, train_loss0.2208, val_loss0.8145如果 val_loss 只是下降了一点点说明支撑集数据量太少或特征表达不够需要检查特征质量、学习率和模型容量。6.3 如何判断“少样本微调”是否成功一个常见误区把 Few-Shot 学习等同于普通的“数据少时微调”。真正的 Few-Shot 评估应该这样设计准备多个不同细胞系作为不同任务。每个任务只提供 1050 条药物组合标签作为支撑集。用同一个模型在每个任务上微调。在所有任务的验证集上取平均结果。如果你的模型只在某一个细胞系上微调效果好换一个细胞系效果骤降说明它的泛化能力还不到位这恰恰是 Few-Shot 方法需要解决的问题。这也是为什么 ScreenShot 强调先在大规模数据上预训练让表示本身具备跨任务迁移能力。6.4 失败时的第一步排查看 loss 是否发散发散则降低学习率。看特征是否退化打印一个 batch 的特征统计检查是否有大量 NaN。看数据是否泄漏确保支撑集和验证集没有重叠的药物组合。7. 常见问题与排查思路问题现象可能原因排查方式解决方案安装 RDKit 失败conda 源或 pip 源不匹配检查pip list尝试conda install -c conda-forge rdkit换成 conda-forge 源安装SMILES 解析大量失败数据含有非标准化学式或错误字符批量打印解析失败的 SMILES做清洗去掉无法解析的行训练 loss 为 NaN学习率过高或特征包含 NaN检查输入特征是否有 NaN降低 lr对特征做标准化验证集效果差支撑集数量太少特征表达能力不够对比不同支撑集数量下的效果增加支撑集或使用预训练表示模型过拟合模型参数远多于样本数看训练 loss 很低但验证 loss 高使用更小的模型加入 Dropout 或权重衰减GPU 内存不足batch size 过大或特征维度过高查看 nvidia-smi降低 batch size简化特征新细胞系效果差模型未见过的分布偏移观察该细胞系特征与训练集差异做域适应或在微调时加入该细胞系的少量数据提示未知的模型类名官方代码版本不一致检查源码目录结构和导入路径按官方 README 调整 import 路径这里特别提醒一个很常见的问题药物筛选数据中 SMILES 字符串往往包含各种盐、混合物、电荷表示直接用Chem.MolFromSmiles解析可能会失败。实际项目中建议统一用Chem.MolFromSmilesChem.MolToSmiles做标准化并丢弃解析失败的行而不是直接报错中断。8. 最佳实践与工程建议8.1 数据层面构建药物组合筛选数据集时不是数据越多越好而是覆盖度越广越好。理想的数据集应该覆盖不同细胞系、不同药物机制类别、不同剂量比例。因为基础模型预训练的核心目标是学习“可迁移的药物表示”这要求数据在化学空间和生物空间上都有足够多样性。另外要非常小心数据泄漏。药物对中的一个药物如果出现在训练集和测试集的不同组合中模型可能通过记忆药物特征而不是学习组合规律来取得虚高分数。实际评估时最好按药物划分而不是按组合划分。8.2 模型层面如果要在自己的项目里复现 ScreenShot 思路建议分阶段做阶段一用公开数据集如 DrugComb、NCI-ALMANAC上跑通预训练和微调流程。阶段二在目标实验室内部数据集上做域适应。阶段三用真实实验数据验证 Top-K 组合的命中率。不要一上来就追求复现论文的全部细节。先跑通最小闭环再逐步增加组件复杂度比如量化编码、自监督预训练、跨任务微调。8.3 工程层面实验记录尤其重要。药物筛选实验涉及多种条件每次跑模型前都要记录数据版本、特征版本、模型版本、超参数和随机种子。建议用config.yaml管理这些参数# 文件路径configs/exp001.yaml data: train_path: data/train_pairs.csv fewshot_support_size: 30 random_seed: 42 model: encoder_dim: 256 num_quant_vectors: 128 training: lr: 0.001 epochs: 50 batch_size: 16 weight_decay: 1e-5 output: save_dir: outputs/exp001这种配置管理方式在团队协作中特别有用任何人拿到exp001.yaml都能完整复现一次实验。这在药物研发这种强监管、重审计的场景里是基本要求。8.4 安全与合规边界这一条必须单独强调任何 AI 药物预测模型都不能直接用于临床试验决策或患者治疗。模型输出只是“候选优先级”最终是否进行实验、进入临床必须由专业研究人员、药理毒理实验和监管机构共同决定。你在写代码、跑实验结果时所有结论都要标注“该结果仅为计算预测需要湿实验验证”。另外如果使用外部公开数据集务必核对数据许可证和伦理要求。涉及人类细胞系或患者数据时要确保数据来源合规、脱敏处理到位。不要因为只是写代码就忽略这些问题。8.5 与湿实验团队协作在实践中计算团队最好在模型设计早期就与湿实验团队确认清楚输出必须包含哪些字段比如除了协同分数是否需要提供推荐浓度、置信区间、类似已验证组合这些信息直接影响模型预测头的设计和输出格式。建议在最终交付物里增加一个“解释字段”# 文件路径src/explain.py import shap import numpy as np import pandas as pd def get_top_contributing_drug_pair(model, x, drug_a, drug_b): 简单的特征归因示例用 SHAP 或一阶梯度找到对预测贡献最强的特征。 这里的返回值不是完整解释只是给湿实验团队一个参考。 model.eval() x_t torch.tensor(x, dtypetorch.float32).unsqueeze(0) x_t.requires_grad_(True) pred model(x_t) pred.backward() grad x_t.grad.squeeze(0).numpy() top_idx np.argsort(np.abs(grad))[-10:][::-1] return { drug_a: drug_a, drug_b: drug_b, pred_score: float(pred.item()), top_feature_indices: top_idx.tolist(), }这类辅助信息虽然不是模型的核心能力但能显著提升结果的可信度和可用性。9. 总结与后续学习方向ScreenShot 为代表的组合药物筛选基础模型本质上是把深度学习里“预训练 微调”的方法论迁移到药物组合空间。它降低了新细胞系、新药物场景下建立预测模型的数据门槛也让跨任务迁移成为可能。但你需要清醒地认识到这个方向还处于快速发展期模型架构、训练策略、评估规范都没有完全标准化。如果你想继续深入建议按这个顺序走先跑通一个通用的药物组合预测流程理解数据格式和评估指标。再研究 ScreenShot 论文中量化指纹的实现细节对比硬量化和软量化的差异。设计自己的 Few-Shot 实验选择 3 到 5 个细胞系每个只给 20 条组合标签看模型排序能力如何。尝试加入自监督预训练任务看预训练表示是否真的比手工指纹更有效。与湿实验同事沟通确定 Top-K 评价指标而不是只盯着 RMSE。这个领域最吸引人的地方是它把“药物筛选”从纯粹的实验问题变成了“表征学习 少样本泛化 实验验证”的交叉工程问题。能走通这条路的人既要懂分子结构又要懂深度学习还要理解生物实验的边界。这门槛确实不低但也正是它价值所在。如果你正在做药物组合筛选或者准备进入 AI 制药方向建议先收藏本文提到的流程骨架然后尽早跑通一个最小实验。任何模型都替代不了你亲手在数据上体验过一遍“预训练、微调、评估、踩坑”的完整过程。
返回列表