Lila Sciences 与 AI for Science 技术面试实战指南
状态:2026-08-10 核验版。本文用于数周复习和模拟面试,不是 Lila Sciences 泄露题库。
最后核验:2026-08-10。职位、流程和网页内容会变化,临近面试时应再次确认。
如何阅读这份指南
本文始终把信息分成三层。任何题目、统计或建议都不应越过这条边界。
- Lila 已确认:来自 Lila 官方职位页面,或 Jingyi 与 Lila ML Scientist 的面试录音转写。
- 近邻已观察:来自候选人公开面经、公司官方招聘流程或面试官公开的方法说明。它能说明相似岗位怎样考,但不能证明 Lila 会采用相同题目。
- 练习变体:为了训练能力而设计的题。它只说明“值得练”,不能表述为“面试出现过”。
全文的目标不是预测一道神秘原题,而是建立一套即使题目变化也能工作的能力:读懂陌生 ML 代码,判断科学和软件风险,写出基础 PyTorch,口头定义 ML 问题,并经得住连续追问。
先给结论
- Lila 当前职位不是单纯的蛋白模型岗,也不是传统软件工程岗。官方职责同时覆盖生物序列、分子结构、多模态实验数据、问题定义、模型设计、训练、评估和实验闭环。Lila 官方职位
- 技术面已经由 Lila 明确分为三场:Live coding、ML case study、Code comprehension。总计约三小时,每场不到一小时,可以分开安排。
- Live coding 已确认是不用 AI 手写 PyTorch 和基础机器学习概念,题目很小,约半小时,不考计算机视觉。蛋白设计或邻近问题是题面,但仍会包含一般 ML 基础。Transformer、VAE 和 diffusion 被回答为“可能”。这不等于三者都会考,更不等于要在半小时写完整模型。
- Code comprehension 已确认是提前给 repository,正式面试时先问已有代码,再提交一个候选人没有见过的 PR,继续追问。提前研究 repo 可以用 AI,正式面试不可以。
- 没有找到这个 Lila 职位公开流出的原题。因此本文的练习情境全部显式标为练习变体。
- 高度相似公司的真实记录反复显示:一般 ML、Python/PyTorch、代码质量、数据与评估是主体;科学或蛋白问题通常承担数据语境、约束、验证和追问层。
- 对 Jingyi 当前最重要的不是半年式全面培养,而是两周内恢复基础编码肌肉,形成固定的 repo 阅读法、PR review 法和 case study 回答骨架。
证据底座与局限
Lila 一手证据
面试录音转写确认:
- “one or more hiring manager interviews”;
- 三场技术面,总计约三小时;
- code comprehension、without-AI code writing、ML case study;
- PyTorch from scratch 和 basic machine learning concepts;
- protein design 或 protein-design-adjacent,另加基础 ML;
- “super small, half an hour, nothing super complicated”;
- 提前 repository,加现场 unseen PR;
- 技术面后还有 conversational one-on-ones;
- 最后一阶段有约一小时 research talk,但建议准备能压到约 40 分钟,因为会有很多问题;
- talk 之外还有多场约 30 分钟 one-on-one;
- 各阶段都是 gating。
证据是 Jingyi 与 Lila ML Scientist 的 Hiring Manager 面试录音转写,重点时间段为 0:25:12–0:31:15。录音不公开;网页只保留与面试准备有关的流程事实。
官方职位说明进一步确认,该岗位要:
- 构建覆盖生物序列、分子结构和多模态实验数据的生成模型;
- 完成 problem formulation、model design、training、evaluation;
- 把生物问题翻译成 ML 问题;
- 与 wet-lab scientists 和 computational biologists 合作;
- 参与 Lab-in-the-Loop 数据生成和反馈;
- 独立拥有 research sub-problem;
- 熟练使用 PyTorch、JAX 或 TensorFlow;
- 蛋白设计是 bonus,而不是唯一基本门槛。
最强的近邻证据
- BigHat 的 ML Scientist 面经把 diffusion 或 Transformer 这样的基础 ML 支柱放进抗体设计 case。BigHat
- Latent Labs 的蛋白岗位出现 protein diffusion take-home、position embedding 和“一百万个蛋白设计如何产生与筛选”。Latent Labs
- 10x Genomics 的 Computational Biologist 先做 toy dataset interactive coding 和生物数据解释,再进入 full-day、1 小时 talk 和 1:1。10x Genomics
- Tempus AI 的 MLE 候选人经历了 dataset/model take-home、Docker、HM、三小时 onsite,并讨论 coding style、项目和 metrics。Tempus AI
- Deliveroo 官方 MLE 流程要求 production-style code、peer review、ML fundamentals、问题定义、评估和 productionization。Deliveroo
- Slack 的候选人明确遇到 PR code review,要发现 code smell 和 bad practice,同时考如何沟通建议。Slack
- Snyk 的候选人先 review dependency-tree PR,再与两位工程师讨论,选择最重要问题修复,并回答怎样推进到 production。Snyk
- Jacob Kaplan-Moss 的面试官方法文把 reverse code review 的主要信号定义为 comprehension、communication、问题严重性和协作语气。Reverse code review
- Chip Huyen 将 buggy ML program debugging 描述为测试 code comprehension、面对他人代码的反应和 debugging 能力。ML interview formats
- GitHub 官方 take-home 使用真实 repository、PR、automated tests、rubric 和统一 scorecard。GitHub
局限
- Glassdoor、Taro 等面经是匿名候选人自述,不能视为公司承诺。
- 相似公司在职位级别、团队和年份上不同。
- 同一公司不同团队可以有完全不同的 loop。
- 公开记录更容易留下特别好或特别差的体验,存在选择偏差。
- 预测题库和 SEO 页面只能作为低置信度线索,不进入“真实出现频率”统计。
- 下面的 rubric 是多个来源的综合,不是 Lila 官方评分表。
第一部分:完整面试流程
1. Application 与 recruiter screening
已确认和已观察
Lila 官方申请表直接询问:是否需要签证支持、是否居住在美国大陆、是否能在指定地点工作或愿意搬迁,以及“Why Lila, why this role, and why at this moment in your life?”。Lila 官方职位
Lila 的录音没有逐项披露 recruiter screen 内容,但 HM 在对话中询问了其他面试、时间线、可入职日期和 OPT。Deliveroo 官方 MLE screen 为 20–30 分钟,主要讨论 career 和 motivation;GSK、Calico、Truecaller、Moniepoint 的流程也普遍把 recruiter 放在 HM 或技术环节之前。
准备清单
必须准备一版 60–90 秒回答:
- 我是谁:AI for Science 的连续主线是什么。
- 我做过什么:一个最能证明建模、数据和科研判断的项目。
- 为什么 Lila:不是泛泛说“AI + biology 很酷”,而是对应 Lab-in-the-Loop、generative models、scientific verification 或 sequence/structure/multimodal。
- 为什么现在:毕业、研究方向和下一阶段能力建设之间的逻辑。
- 为什么这个 level:能独立拥有怎样的 research sub-problem,同时哪些方面仍希望成长。
还要能够简明回答:
- OPT/EAD 当前状态、最早入职日和潜在 sponsorship;
- 是否愿意去 San Francisco;
- 其他面试流程和 deadline;
- 期望的工作类型,而不是先报一个抽象 title;
- 薪资问题若出现,先结合官方范围和总体 package,不仓促锁死单点数字。
常见失败
- 把所有时间用来复述简历。
- “Why Lila”只重复官网口号。
- 对签证和时间线含糊,导致 recruiter 无法规划。
- 说自己什么都愿意做,却无法说明岗位与未来方向的匹配。
- 讲很多模型名,却没有一句可验证的成果。
2. Hiring Manager interview
Lila 已确认的风格
Lila 说明会有一次或多次 HM interview。本次 HM 并没有做百科式问答,而是从 Jingyi 的 RNA 项目持续追问:
- RNA motif 是什么,额外结构从哪里来;
- cropping 为什么有用,除了显存限制外是否仍有统计价值;
- motif 已包含在 full structure 中,重复加入是否只是改变权重;
- 如果 RAM 足够,是否仍保留 motif;
- 结果相对已有方法改善多少;
- PDB 本身有 clash,模型为何没有学会 clash;
- conditional generation 具体怎样降低 clash;
- guidance 为什么没有改善;
- 当前解释是结果、假设,还是尚待验证的猜想。
这段真实追问说明 HM 观察的是研究判断,而不是模型名词数量。
每个主项目必须准备的十个答案
- Problem:问题是什么,为什么值得解决。
- Data:来源、规模、质量、缺失、噪声和许可。
- Split:如何避免同源、同一结构派生样本或实验批次泄漏。
- Baseline:最简单 baseline 和当前最好 baseline。
- Model:为什么选这个模型,而不是更简单方案。
- Objective:loss 与真正科学目标的差异。
- Evaluation:metric、error bars、重复实验和 failure slices。
- Contribution:自己具体做了什么,合作者做了什么。
- Failure:一个没有成功的实验,以及从中改变了什么。
- Next experiment:如果再给两周或两倍资源,怎样最快证伪关键假设。
固定追问模板
对任何回答都继续问五层:
你观察到了什么?
→ 还有什么替代解释?
→ 哪个实验能区分它们?
→ 失败时你会看到什么?
→ wet-lab 或外部 verifier 怎样闭环?
Jingyi 当前项目的专项准备
针对 HM 已经问过的 RNA motif、clash 和 diffusion:
- 准备一张 full structure 与 motif sampling 的数据分布图。
- 明确 motif 重复采样等价于怎样的隐式 weighting。
- 区分“改善显存”和“改善学习信号”两种假设。
- 给出严格的 structure-level split,避免同一母体结构的 motif 跨 split。
- 定义 clash score、几何质量、结构相似性和任务相关 metric。
- 解释无 guidance 改善的可能原因,但每个原因都标为 hypothesis。
- 为 guidance failure 设计最小 ablation。
- 准备一句诚实边界:“目前结果支持 X,但还不能证明 Y;区分它们需要 Z。”
3. 三场技术面的总结构
| 场次 | Lila 已确认 | 不能假装知道的内容 |
|---|---|---|
| Live coding | 无 AI;手写 PyTorch;基础 ML;蛋白设计或邻近;约半小时小题;不考 CV | 具体模型、函数签名、是否允许查官方文档 |
| ML case study | 口头走一个 ML 问题,中途追问 | 具体领域、数据集和最终 metric |
| Code comprehension | 提前 repo;问已有代码;现场 unseen PR;继续问新代码 | repo 名称、PR 大小、官方 rubric 和 bug 数量 |
三场都应练习“先澄清、再建立结构、持续解释、主动检查”。不要把沉默写完代码当成高分表现。
第二部分:Live coding
1. 准备边界
Lila 的原话把题目限定为“super small, half an hour, nothing super complicated”,又提醒不要为此“go crazy”。因此两周内不应以完整实现 AlphaFold、完整 diffusion pipeline 或困难 LeetCode 为目标。
优先级:
- tensor 创建、reshape、permute、broadcast、mask、gather;
nn.Module、forward、parameter registration;- MSE、cross entropy、BCE、KL;
- MLP、embedding、normalization、attention 小组件;
- dataset、batch、training step、validation;
- Transformer/VAE/diffusion 的小部件,而不是完整系统;
- 蛋白 sequence 或 coordinate 作为题面。
2. 最小能力表
在没有 autocomplete 的情况下,应能从空白文件写出:
- 一个两层 MLP;
- 一个训练循环,包括 optimizer 和 validation;
- masked MSE;
- sequence mean pooling,忽略 padding;
- scaled dot-product attention;
- VAE reparameterization 和 KL;
- forward diffusion
q(x_t | x_0)的小函数; - pairwise distance 或 contact map;
- 变长蛋白序列的
collate_fn; - 简单 metrics 和 shape assertions。
3. Live coding 的口头节奏
1. 重述输入、输出、shape 和边界条件。
2. 给最简单正确方案。
3. 写最小可运行版本。
4. 用一个微型输入手算或打印检查。
5. 检查 device、dtype、mask、batch size 1。
6. 说明复杂度和下一步优化。
如果忘了某个 PyTorch 参数,不要编造。明确说出所需语义,再选择一个自己确定的写法。
第三部分:ML case study
1. 十步回答骨架
- Clarify objective:预测、生成、排序还是实验选择?
- Decision:模型输出会触发什么实际决策?
- Unit of observation:序列、结构、复合物、实验还是 batch?
- Data and label:来源、噪声、缺失、偏差和成本。
- Split and leakage:同源、时间、实验批次、scaffold 或 target split。
- Baseline:规则、简单统计模型、最近邻或小 MLP。
- Model and objective:为什么与数据规模和约束匹配。
- Evaluation:离线、分层、校准、生成质量和实验成功率。
- Failure analysis:在哪些 slice 失效,怎样发现 shortcut。
- Closed loop:下一批实验怎样选,结果怎样回流训练。
2. AI for Science 特别追问
- label 是 ground truth,还是有测量误差的 assay?
- negative sample 是真的 negative,还是未观察到 positive?
- acquisition function 怎样平衡 exploitation 与 exploration?
- 哪些候选模型分数高但实验不可行?
- 如何设计盲测,避免同系列样本泄漏?
- 实验容量固定时怎样分配 replicate 和 diversity?
- 模型不确定性是否校准?
- wet-lab 失败怎样区分模型错、合成失败和 assay 失败?
- 何时停止继续训练,转而生成更有信息的数据?
3. 三个练习 case
Case A:一百万个蛋白设计中选 96 个实验
近邻来源:Latent Labs 候选人真实遇到“一百万个 protein designs”问题。练习时应覆盖 validity、novelty、diversity、predicted function、uncertainty、manufacturability 和实验 batch 设计。
Case B:少量有标签 assay 加大量无标签序列
练习 semi-supervised/pretraining、retrieval baseline、active learning、calibration、OOD 和 cluster split。先提出简单 baseline,再讨论 foundation model。
Case C:结构生成模型离线 metric 改善,wet-lab 不改善
区分 metric misalignment、data shift、simulation bias、synthesis failure、assay noise 和 selection bias。给出最省实验的诊断矩阵。
这些 case 是练习变体,不是 Lila 原题。
第四部分:提前 Repository 的阅读方法
1. 第一遍:30 分钟建立地图
不要从第一行 README 开始逐字读到最后。先回答:
- 项目的科学目标和 ML 输出是什么?
- 训练、评估和推理入口在哪里?
- 顶层目录各自拥有什么职责?
- 配置如何进入模型?
- 数据如何变成 batch?
- 最重要的三个 class/function 是什么?
- tests 在哪里,覆盖了什么?
产出一页地图:
config
├─ data paths / split / featurization
├─ model architecture
└─ optimization / evaluation
↓
Dataset → collate → batch contract
↓
Model.forward
↓
outputs → loss → optimizer
↓
evaluator
2. 第二遍:逐条追踪一个样本
选一个最小样本,从加载一直追到 metric:
| 节点 | 必须记录 |
|---|---|
| raw record | 字段、单位、缺失值 |
| featurizer | token/atom/residue 映射 |
| collate | padding、mask、batch index |
| model input | shape、dtype、device |
| intermediate | 关键层 shape 和 invariant |
| output | logits、coordinates、scores |
| loss | target、mask、reduction |
| metric | aggregation、denominator、split |
如果不能给每个维度命名,就还没有真正读懂。
3. 第三遍:训练与推理的差异
检查:
train()/eval();- dropout、normalization 和 stochastic sampling;
no_grad()/ inference mode;- teacher forcing 或 conditioning;
- checkpoint、EMA、scheduler;
- deterministic 与 sampled output;
- preprocessing 和 postprocessing 是否一致。
4. 第四遍:证据与测试
运行或阅读现有 tests,并建立表格:
| 假设 | 当前证据 | 缺少的测试 |
|---|---|---|
| padding 不影响 loss | 某 unit test | all-padding、batch size 1 |
| rotation 不改变 scalar output | 无 | random rotation property test |
| checkpoint 可恢复 | smoke test | optimizer/scheduler state |
| split 无同源泄漏 | 无 | cluster-overlap audit |
5. 面试前必须能回答的二十问
- 项目一句话是什么?
- 谁调用训练入口?
- 一个 batch 的完整 schema?
- 模型输出的物理或生物意义?
- loss 的数学定义?
- padding 和 missing data 怎样处理?
- split 单位是什么?
- 最简单 baseline?
- 最重要 metric?
- 最危险的 silent failure?
- 最消耗内存的 tensor?
- 随机性来自哪里?
- checkpoint 包含什么?
- inference 与 training 有何不同?
- 怎样新增一个 dataset?
- 怎样新增一个 model head?
- 哪个 abstraction 最值得保留?
- 哪个部分最难维护?
- 现有 tests 最明显的缺口?
- 如果有一天时间,先验证什么?
6. 使用 AI 准备 repo 的正确方式
Lila 明确允许在提前准备 repo 时使用 AI,但正式面试禁止。AI 可以帮助:
- 生成目录摘要和调用图候选;
- 解释陌生库的 API;
- 提出可能的 shape 和 test 问题;
- 生成自己随后手工验证的问答。
AI 不能替代:
- 自己运行入口和 tests;
- 回到源代码核对每个解释;
- 不看笔记时口头讲一遍;
- 手工画 data flow;
- 在没有 AI 时定位一个新 diff。
最后一天必须完全脱离 AI 做一次 45 分钟 repo oral exam。
第五部分:Unseen PR Review
1. 固定工作流
第 0–3 分钟:理解 intent
- 读 title、description、changed files 和 tests。
- 用一句话说 PR 想改变什么行为。
- 问清楚 success criteria 和兼容性要求。
第 3–8 分钟:建立影响图
- changed function 的 callers 和 callees;
- input/output contract;
- training、validation、inference 哪些路径受影响;
- checkpoint、config、data format 是否变化。
第 8–22 分钟:先找 correctness
按顺序检查:
- shape、broadcast、index;
- mask、padding、missing data;
- gradient、train/eval;
- loss、metric、reduction;
- device、dtype、numerical stability;
- split、leakage、scientific invariant;
- edge cases;
- performance 和 maintainability。
第 22–30 分钟:最小反例和测试
每个重要评论都附:
- 触发输入;
- 当前行为;
- 期望行为;
- 最小 test;
- 修复方向。
第 30–38 分钟:排序和口头 review
先说 blocker,再说 high,最后才是 non-blocking suggestion。不要把五个 naming 意见放在一个 silent scientific bug 前面。
第 38–45 分钟:follow-up
准备回答:
- 为什么这是 bug,而不是 preference?
- 哪条测试会失败?
- 最小安全 patch?
- 是否有 backward compatibility?
- 怎样 rollout、monitor 和 rollback?
2. 严重性
- P0 / Blocker:结果根本错误、数据泄漏、gradient 无效、科学结论无效、常见输入 crash。
- P1 / High:常见 edge case、metric 系统偏差、train/inference 不一致、checkpoint/API 破坏、严重性能 regression。
- P2 / Medium:罕见边界、明显可维护性、测试覆盖和 reproducibility 问题。
- P3 / Low:命名、格式、局部文档和不改变行为的优化。
排序考虑 impact、likelihood、detectability 和 fix cost。静默错误往往比立即 crash 更危险。
3. 综合练习 rubric
这是近邻证据综合出的训练评分表,不是 Lila 官方 rubric。
| 维度 | 分值 | 高分行为 |
|---|---|---|
| Repository mental model | 20 | 准确解释入口、数据流、shape 和依赖 |
| Correctness 与 ML semantics | 20 | 找到真实行为错误并给出反例 |
| PR impact 与 regression | 15 | 解释上下游、兼容性和行为变化 |
| Severity 与 prioritization | 15 | 区分 blocker、bug、architecture 和 style |
| Tests 与验证 | 15 | 给最小复现、unit、integration 和科学验证 |
| Communication | 10 | 清晰、具体、协作、主动澄清 |
| Production/reproducibility | 5 | 考虑 rollout、monitoring、device、seed、performance |
自动失败风险
- 基本误解主执行路径;
- 对关键代码作出自信但错误的解释;
- 完全没有发现显著 correctness 问题;
- 找到 bug 但不能说明触发条件和后果;
- 只谈 style,不谈行为;
- 批评作者而不是代码;
- 编造没有读到的实现细节。
4. Review comment 模板
[Blocker] Padded residues are included in the loss denominator.
When sequences have different lengths, `error.mean()` averages padded zeros
as if they were real residues. This makes the loss depend on padding length
and biases shorter sequences. Could we mask before reduction and divide by
the number of valid residues? A regression test with lengths 2 and 5 should
give the same loss as evaluating the two valid regions separately.
好的评论包含位置、触发条件、后果、建议和验证。语气应是协作式的,不需要降低技术判断的明确程度。
第六部分:十四个详细 Repo / PR 练习情境
以下全部是练习变体。它们覆盖从基础 PyTorch 到蛋白与结构生成的高风险点,但不声称 Lila 使用过这些代码。
情境 1:Masked MSE 被 silent broadcasting 污染
背景
一个 residue-level regression 模型输出每个位置的标量质量分数。PR 为了“统一 shape”给 target 增加了一维。
伪 diff
def masked_mse(pred, target, mask):
- error = (pred - target) ** 2
- return error[mask].mean()
+ target = target.unsqueeze(-1)
+ error = (pred - target) ** 2
+ return (error * mask).sum() / mask.sum()已知 pred.shape == [B, L],target.shape == [B, L],mask.shape == [B, L]。
应发现的问题
target.unsqueeze(-1) 变成 [B, L, 1],与 [B, L] 广播后可能得到 [B, L, L],把不同 residue 互相比较。代码可以运行,所以比 crash 更危险。若 mask 是 bool,乘法的广播也会隐藏问题。
Blocker 排序
- P0:错误 broadcasting 改变 loss 的数学定义。
- P1:分母没有与最终 error shape 对齐。
- P2:缺少显式 shape assertion。
参考 review
Blocker:
target.unsqueeze(-1)changes the subtraction from elementwise[B, L]to a broadcasted pairwise result. This silently trains a different objective. Please keep both tensors[B, L], assert equal shapes, mask valid elements, and reduce only those values.
测试建议
B=1, L=2,手算 prediction 和 target,断言精确 loss。- 两个位置交换 target 后,验证 loss 按 elementwise 定义变化。
- all-padding 输入应明确 raise,而不是除零。
- property test:增加 padded positions 不改变 loss。
追问
- 为什么 PyTorch 没有报错?
- 怎样在公共 loss helper 中系统防止 broadcasting?
- 若输出本来是
[B, L, 1],最清晰的 contract 应是什么?
情境 2:Cross entropy、padding 与 double softmax
背景
一个 protein language model PR 增加 token accuracy。
伪 diff
logits = model(tokens[:, :-1]) # [B, L-1, V]
targets = tokens[:, 1:] # [B, L-1]
+probs = logits.softmax(dim=-1)
+loss = F.cross_entropy(
+ probs.reshape(-1, vocab_size),
+ targets.reshape(-1),
+)
+accuracy = (probs.argmax(-1) == targets).float().mean()应发现的问题
cross_entropy期望 logits;先 softmax 会改变 gradient 和数值稳定性。- padding token 没有被
ignore_index或 mask 排除。 - accuracy 把 padding 当作真实 target。
- 若不同序列 padding 长度不同,指标系统偏移。
Blocker 排序
- P0:padding 进入训练目标,模型被奖励预测 padding。
- P1:double softmax 破坏预期 loss。
- P1:accuracy denominator 错误。
- P2:没有报告 per-sequence 或长度分层指标。
参考 review
Blocker: The current objective includes padded targets, so batch composition changes both the loss and accuracy. Pass raw logits to
cross_entropywithignore_index=pad_id, and compute accuracy over the same valid-token mask.
测试建议
- 同一条序列 pad 到 8 和 pad 到 16,loss 与 accuracy 必须相同。
- 全部非 padding 的小样本与手算 CE 一致。
- one-token sequence、全 padding batch 和 unknown token。
- 检查 raw logits 极大时仍为 finite。
追问
- label smoothing 与
ignore_index怎样交互? - token accuracy 是否足以评价生成蛋白?
- macro sequence accuracy 与 micro token accuracy 有何不同?
情境 3:Validation 仍处于训练模式
背景
PR 抽出统一的 run_epoch,减少训练和验证重复代码。
伪 diff
def run_epoch(model, loader, optimizer=None):
is_train = optimizer is not None
- model.train() if is_train else model.eval()
+ model.train()
losses = []
for batch in loader:
output = model(batch["x"])
loss = criterion(output, batch["y"])
if is_train:
loss.backward()
optimizer.step()
optimizer.zero_grad()
losses.append(loss)
return torch.stack(losses).mean()应发现的问题
- validation 仍开启 dropout,并更新 BatchNorm statistics。
- validation 未使用
no_grad(),保留 graph,浪费显存。 - 把带 graph 的 loss 放进 list,训练时可能保留整个 epoch graph。
- optimizer 顺序可工作,但更安全的模式是在 forward 前清零。
Blocker 排序
- P0:validation 改变模型状态,metric 不可信。
- P1:validation 建 graph,显存风险。
- P1:保存 graph-connected losses。
- P2:
zero_grad(set_to_none=True)的效率建议。
参考 review
Blocker: Validation calls
model.train(), so dropout remains stochastic and BatchNorm updates on validation data. That both corrupts the evaluation and leaks validation distribution into model state. Set mode fromis_trainand wrap evaluation intorch.no_grad().
测试建议
- 固定输入连续两次 validation,dropout 模型输出应一致。
- validation 前后 BatchNorm running stats 不变。
- validation 后所有 parameter gradients 仍为
None。 - 长 validation loader 的显存不随 batch 单调增长。
追问
torch.no_grad()与torch.inference_mode()的区别?- 有 MC dropout 时怎样有意保持 stochastic evaluation?
- 为什么仅检查 loss 数值可能发现不了这个 bug?
情境 4:子模块和常量没有注册
背景
PR 把不同尺度的 residue projection 放到列表中,并缓存 positional frequencies。
伪 diff
class Encoder(nn.Module):
def __init__(self, dims):
super().__init__()
- self.layers = nn.ModuleList(...)
+ self.layers = [nn.Linear(dims[i], dims[i + 1])
+ for i in range(len(dims) - 1)]
+ self.freqs = torch.arange(128).float()
def forward(self, x):
for layer in self.layers:
x = F.relu(layer(x))
return x + positional_term(self.freqs, x)应发现的问题
- 普通 list 中的 layers 不注册为 submodules,不进入
parameters()、state dict 或.to(device)。 freqs不是 parameter,但应register_buffer,否则 device 和 checkpoint 行为不一致。- CPU smoke test 可能通过,GPU 才失败。
Blocker 排序
- P0:核心 layers 不会被 optimizer 更新。
- P1:GPU device mismatch。
- P1:checkpoint 丢失 layers 和 buffer。
参考 review
Blocker: Storing
nn.Linearobjects in a plain list prevents PyTorch from registering them. They will not be optimized, moved with the model, or serialized. Usenn.ModuleList; registerfreqsas a non-persistent or persistent buffer according to checkpoint needs.
测试建议
- 断言 expected parameter count。
- 一步 optimizer 后每层 weight 都变化。
- state dict round-trip 输出一致。
- CUDA 时所有 parameters/buffers 与 input 同 device。
追问
- 何时用
ParameterList、ModuleList和 buffer? - buffer 是否一定要写入 checkpoint?
- 怎样检测“loss 下降但部分层从未训练”?
情境 5:Attention scale 与 mask polarity
背景
PR 实现 protein sequence self-attention,并接受 valid_mask,其中 True 表示真实 residue。
伪 diff
scores = q @ k.transpose(-2, -1)
-scores = scores / math.sqrt(q.size(-1))
-scores = scores.masked_fill(~valid_mask[:, None, None, :], -torch.inf)
+scores = scores / math.sqrt(model_dim)
+scores = scores.masked_fill(valid_mask[:, None, None, :], -1e9)
attn = scores.softmax(dim=-1)
out = attn @ v应发现的问题
- scale 应基于 head dimension,而不是整个 model dimension。
- mask polarity 反转,真实 residue 被屏蔽,padding 被关注。
- 某一 query 的所有 key 都被 mask 时,softmax 可能产生 NaN 或无意义均匀分布。
- query-side padding 的输出也应明确处理。
Blocker 排序
- P0:mask polarity 反转。
- P1:all-masked row 的数值行为。
- P1:scale 错误改变 attention distribution。
- P2:query padding 输出未清零。
参考 review
Blocker:
valid_mask=Truedenotes real residues, but the new line masks those positions and leaves padding visible. Invert the mask at the key axis and add an explicit all-padding policy so softmax cannot produce invalid rows.
测试建议
- 一个真实 token 加三个 pad,注意力只能落在真实 token。
- 增加任意 pad 不改变真实位置输出。
- 多 head 与手算单 head 对比。
- all-padding input 明确 raise 或返回约定值。
- mixed precision 下无 NaN。
追问
- causal mask 与 padding mask 如何组合?
-inf和大负数在 fp16 下的权衡?- 为什么只测试固定长度序列会漏掉问题?
情境 6:VAE reparameterization 和 KL reduction
背景
一个 protein VAE PR 重构 latent sampling 和总 loss。
伪 diff
def reparameterize(mu, logvar):
eps = torch.randn_like(mu)
- std = torch.exp(0.5 * logvar)
+ std = torch.exp(logvar)
return mu + eps * std
recon = F.cross_entropy(logits.transpose(1, 2), tokens, reduction="mean")
-kl = -0.5 * (1 + logvar - mu.pow(2) - logvar.exp()).sum(-1).mean()
+kl = 0.5 * (1 + logvar - mu.pow(2) - logvar.exp()).mean()
loss = recon + beta * kl应发现的问题
logvar是 log variance,标准差需要exp(0.5 * logvar)。- KL 符号反了,优化会鼓励增大 divergence 或让总 loss 异常。
- KL reduction 从 latent-sum/batch-mean 变成全元素 mean,beta 的含义改变。
- reconstruction 没忽略 padding。
Blocker 排序
- P0:KL 符号错误。
- P0:reparameterization variance 错误。
- P1:padding 进入 reconstruction。
- P1:reduction 改变 beta 语义和旧 checkpoint comparability。
参考 review
Blocker: The new KL expression is the negative of the usual non-negative divergence. Combined with
exp(logvar)as the standard deviation, this optimizes a different and unstable objective. Restoreexp(0.5 * logvar), the negative sign, and document reductions before retuning beta.
测试建议
mu=0, logvar=0时 KL 精确为 0。- 采样很多次,经验 variance 接近
exp(logvar)。 - padding 长度改变不影响 reconstruction。
- KL 对随机输入非负且 finite。
- deterministic inference 使用
mu,输出可复现。
追问
- beta-VAE 中 beta 的比较为何依赖 reduction?
- posterior collapse 怎样检测?
- 训练时 sample、评估时 sample 和使用
mu各适合什么目的?
情境 7:Diffusion 训练目标和 sampling 解释不一致
背景
一个 coordinate diffusion 模型训练预测噪声。PR 为了“减少一次模型调用”重写 reverse step。
伪 diff
def training_loss(model, x0, t):
noise = torch.randn_like(x0)
xt = q_sample(x0, t, noise)
pred = model(xt, t)
return F.mse_loss(pred, noise)
def p_sample(model, xt, t):
- eps = model(xt, t)
- x0_hat = predict_x0_from_eps(xt, t, eps)
+ x0_hat = model(xt, t)
return posterior_mean(x0_hat, xt, t)应发现的问题
训练目标明确把模型输出定义为 epsilon,但 sampling 把相同输出当成 x0_hat。shape 完全相同,代码可能运行并生成看似合理的坐标,因此属于静默的语义错误。还要检查 timestep t=0 的方差和 indexing。
Blocker 排序
- P0:prediction parameterization 在训练和采样之间不一致。
- P1:
t=0是否仍注入噪声。 - P1:checkpoint/config 中没有保存 parameterization 类型。
- P2:函数和变量名不足以表达 contract。
参考 review
Blocker: The model is optimized to predict epsilon, but
p_samplenow interprets its output as x0. Because both tensors have the same shape, this will not fail loudly; it changes the reverse process. Convert epsilon to x0 before constructing the posterior, or change the training target and version the checkpoint/config contract.
测试建议
- 使用 oracle noise predictor,单步重构的
x0_hat应等于已知x0。 t=0的输出行为手算验证。- epsilon、x0 和 v-parameterization 各自有独立 contract test。
- checkpoint 加载时 parameterization 不匹配应失败。
- 固定 seed 的短 sampling smoke test 无 NaN。
追问
- epsilon、x0 和 v prediction 的权衡?
- 为什么肉眼看 sample 不能替代这个 unit test?
- 如何迁移旧 checkpoint?
情境 8:Diffusion schedule 的 off-by-one 与 device bug
背景
PR 把 noise schedule 预先缓存以提升速度。
伪 diff
class Diffuser(nn.Module):
def __init__(self, steps):
super().__init__()
- self.register_buffer("alpha_bar", make_schedule(steps))
+ self.alpha_bar = make_schedule(steps + 1)
def q_sample(self, x0, t, noise):
- a = self.alpha_bar[t].view(-1, 1, 1)
+ a = self.alpha_bar[t + 1].view(-1, 1, 1)
return a.sqrt() * x0 + (1 - a).sqrt() * noise应发现的问题
- tensor 没注册 buffer,模型转 GPU 时仍留在 CPU。
- PR 同时改变 schedule 长度和 indexing,没有证明新旧定义等价。
- 最大 timestep 可能越界,或者训练与 sampling 相差一步。
- schedule dtype 可能在 AMP 下隐式提升或降低精度。
Blocker 排序
- P0:GPU 路径 device mismatch,常规训练直接失败。
- P0/P1:timestep 定义改变,取决于 sampling 是否同步更新。
- P1:最大 timestep 和 checkpoint 兼容性。
- P2:dtype 和注释。
参考 review
Blocker:
alpha_baris no longer a registered buffer, so.to(device)will not move it with the model. The addedt+1also changes the schedule contract without corresponding sampling changes. Please keep the schedule as a buffer and define whether valid timesteps are[0, T-1]or[1, T]in one shared helper.
测试建议
- CPU 与 CUDA 的
q_sample在同 seed 下数值接近。 - 最小和最大 timestep 不越界。
t=0的 signal/noise 比符合 schedule 定义。- training 和 sampling 使用同一 indexing helper。
- state dict round-trip 保留 schedule 或能确定性重建。
追问
- buffer 应 persistent 还是 non-persistent?
- schedule 更改怎样影响旧 checkpoint 的可复现性?
- 哪些 schedule 运算在 fp32 中更安全?
情境 9:坐标单位和 equivariance 被 preprocessing 破坏
背景
结构模型训练坐标以 Å 为单位。PR 接入一个以 nm 返回坐标的新数据源,并增加数据增强。
伪 diff
def featurize(record):
coords = torch.tensor(record["coords"])
+ if record["source"] == "simulation":
+ coords = coords / 10.0
coords = coords - coords.mean(dim=0)
+ coords[:, 0] += torch.randn(()) * 0.5
return coords应发现的问题
- 若 simulation 数据本来是 nm,转为 Å 应乘 10,而不是除 10;必须先确认 contract,不能凭变量名猜。
- 只扰动 x 轴不是 rotation-invariant 的 isotropic augmentation。
- 缺失 atom 若以零坐标填充,会污染中心化均值。
- 训练 target、邻接阈值和 metric 是否使用同一单位未说明。
Blocker 排序
- P0:单位转换方向可能错误,改变全部几何尺度。先查数据 contract。
- P0/P1:missing coordinate 若参与 centering,会系统偏置结构。
- P1:方向性 augmentation 破坏预期 symmetry。
- P1:distance cutoff 和 metric 的单位兼容。
参考 review
Blocker pending clarification: The PR changes simulation coordinates by
1/10, but the source contract says simulations are stored in nm while the model expects Å. If that contract is correct, the conversion should be*10. Please add an explicit unit field/assertion and a distance-based regression test rather than relying on source names.
注意“pending clarification”:不确定时先问,不把猜测写成事实。
测试建议
- 已知 0.1 nm 的两点转换后距离应为 1 Å。
- 随机 rotation 前后 scalar prediction 一致。
- equivariant vector output 按相同 rotation 变化。
- missing atoms 不参与 centroid。
- Å 与 nm 两个等价 record 的 features 一致。
追问
- invariance 和 equivariance 分别怎样 property-test?
- centering 是否足以获得 translation invariance?
- chirality 是否会被 reflection augmentation 破坏?
情境 10:Protein split 的同源泄漏
背景
PR 把昂贵的 cluster split 改成随机行 split,以便“每次训练更快”。每条 full structure 会产生多个 motif records。
伪 diff
-train_ids, val_ids, test_ids = split_by_sequence_cluster(records, threshold=0.3)
+rng.shuffle(records)
+n = len(records)
+train = records[: int(0.8 * n)]
+val = records[int(0.8 * n): int(0.9 * n)]
+test = records[int(0.9 * n):]应发现的问题
- 高同源序列跨 split,评价变成记忆相似家族。
- 同一母体结构裁出的 motif 也可能跨 split,形成直接派生泄漏。
- 随机 seed 和 record order 会使结果不可复现。
- 加快 preprocessing 不能证明科学评价仍有效。
Blocker 排序
- P0:同源和母体结构泄漏,使 validation/test 结论无效。
- P1:未固定 seed 和未保存 split artifact。
- P1:旧实验与新实验不可比较。
- P2:性能优化应缓存 cluster,而不是删除它。
参考 review
Blocker: A row-level random split allows both homologous sequences and motifs from the same parent structure into different partitions. That directly inflates generalization estimates. Keep grouping at the parent-structure level, then apply the sequence-cluster constraint; cache the resulting split if clustering time is the concern.
测试建议
- 任意 parent structure 只出现在一个 split。
- split 间最大 sequence identity 不超过阈值。
- split artifact hash 被记录并可重载。
- 输入 record 顺序改变不改变 grouping 结果。
- 比较 random 与 cluster split 的 metric gap,作为 leakage audit 而非主结果。
追问
- protein sequence、structure、scaffold、target 和 time split 各回答什么问题?
- cluster threshold 怎样选择?
- 数据很少时怎样权衡无泄漏与统计方差?
情境 11:生成模型 metric 被重复样本和 missing atoms 放大
背景
PR 新增结构生成质量 metric,报告生成样本与 reference 的平均 RMSD。
伪 diff
def mean_rmsd(samples, reference):
values = []
for sample in samples:
+ filled = torch.nan_to_num(sample.coords, nan=0.0)
+ values.append(rmsd(filled, reference.coords))
+ return torch.stack(values).mean()应发现的问题
- missing atom 变成原点,会制造巨大且无物理意义的距离。
- 未对齐 rotation/translation 时 RMSD 不可比。
- 重复生成相同 sample 可以保持平均 RMSD 很好,却没有 diversity。
- 不同长度、蛋白和家族按 sample micro-average,可能由高频组支配。
- 单一 reference 不能覆盖多构象。
Blocker 排序
- P0:missing 坐标的处理使 metric 无效。
- P0/P1:若没有几何对齐,RMSD 不能解释。
- P1:重复样本和 aggregation 使总体结果误导。
- P1:没有 validity/diversity/novelty 补充 metric。
参考 review
Blocker: Replacing missing coordinates with the origin turns missingness into geometry and can dominate RMSD. Compute over the intersection of valid atoms with a minimum-coverage rule, align structures under the intended symmetry, and report coverage alongside RMSD.
测试建议
- 同一结构做刚体旋转和平移后 RMSD 为约 0。
- 一个 missing atom 不应等价于坐标原点。
- 重复同一样本时 diversity metric 显示 collapse。
- macro per-target 与 micro per-sample 都报告。
- symmetric atoms 或等价排列有明确处理。
追问
- Kabsch alignment 解决什么,不解决什么?
- 生成模型为什么需要 validity、quality、diversity、novelty 多维评价?
- model score 与 wet-lab success 怎样校准?
情境 12:Gradient accumulation、scheduler 与 checkpoint
背景
显存不足,PR 增加四步 gradient accumulation 和 resume training。
伪 diff
for step, batch in enumerate(loader):
loss = model.loss(batch)
- loss.backward()
- optimizer.step()
- optimizer.zero_grad()
+ loss.backward()
+ if step % accumulation_steps == 0:
+ optimizer.step()
+ scheduler.step()
+ optimizer.zero_grad()
def save(path):
- torch.save({"model": model.state_dict(),
- "optimizer": optimizer.state_dict(),
- "scheduler": scheduler.state_dict()}, path)
+ torch.save(model.state_dict(), path)应发现的问题
- loss 未除以 accumulation steps,effective gradient 放大四倍。
step % k == 0在 step 0 就更新,只累积一个 batch;通常应检查(step + 1) % k。- epoch 末不足 k 个 batch 的余数 gradient 可能丢失。
- scheduler 的期望单位要确认,是 optimizer update、batch 还是 epoch。
- checkpoint 只存 model,无法真实 resume optimizer moments、scheduler、AMP scaler、epoch 和 RNG。
Blocker 排序
- P0:第一步和后续 accumulation 语义错误,训练行为改变。
- P1:余数 batch 丢失。
- P1:resume 不是真正 resume。
- P1:scheduler step contract 未定义。
参考 review
Blocker: This updates on step zero and does not normalize the accumulated loss, so it neither matches a four-batch effective batch nor the previous learning-rate assumptions. Scale the loss, update on
(step + 1) % k, flush the final partial group, and define scheduler steps in optimizer-update units.
测试建议
- 固定数据下,四个 micro-batches 与一个等价大 batch 的 parameter update 接近。
- loader 长度不能被 k 整除时仍处理全部样本。
- 连续训练 N 步与 save/resume 后训练 N 步输出一致或在允许误差内。
- optimizer、scheduler、scaler、epoch、global step、RNG 全部 round-trip。
- 每次 optimizer update 的 scheduler step 数精确一致。
追问
- BatchNorm 下 micro-batch 与大 batch 为什么不完全等价?
- mixed precision 时 scaler 在哪里更新?
- 分布式训练中 accumulation 与
no_sync()怎样交互?
情境 13:Inference cache 忽略模型版本
背景
PR 为昂贵的蛋白 embedding 增加磁盘 cache。
伪 diff
def embed(sequence, model, cache):
- return model.encode(sequence)
+ key = hashlib.sha1(sequence.encode()).hexdigest()
+ if key not in cache:
+ cache[key] = model.encode(sequence).cpu()
+ return cache[key]应发现的问题
- key 只含 sequence,不含 model/checkpoint、tokenizer、preprocessing、dtype 或 config。
- 模型升级后会静默复用旧 embedding。
- 是否在
eval()和no_grad()下计算不明确。 - 不同 chain delimiters、大小写或 unknown token normalization 可能碰到语义冲突。
- cache corruption 和并发写入未处理。
Blocker 排序
- P0:stale cache 混合不同模型版本,结果不可追溯。
- P1:tokenization/preprocessing 未进入 key。
- P1:inference mode 与 graph/device 行为。
- P2:并发、原子写入、空间淘汰。
参考 review
Blocker: The cache key identifies only the raw sequence, but embeddings also depend on checkpoint, tokenizer and preprocessing. A model update will silently return stale vectors. Include a versioned model/config fingerprint and normalized token IDs in the key, and record provenance with each value.
测试建议
- 相同 sequence、不同 checkpoint 必须产生不同 cache entry。
- tokenizer config 改变时 cache miss。
- cache hit 与 fresh compute 数值一致。
- corrupted entry 能检测并重算。
- 两进程并发写不产生部分文件。
追问
- 哪些内容属于 data lineage?
- cache key 用 checkpoint hash 的成本和替代方案?
- production rollout 时怎样预热、监控和失效 cache?
情境 14:多链图把不同 chain 错连成相邻 residue
背景
PR 简化 protein graph construction,按 flatten 后的 residue index 添加 backbone edges。
伪 diff
residues = chain_a + chain_b
n = len(residues)
+src = torch.arange(n - 1)
+dst = src + 1
+backbone_edges = torch.stack([src, dst])应发现的问题
chain A 的末 residue 被错误连接到 chain B 的首 residue。若模型依赖 edge type,错误边会暗示共价 backbone。还要检查 reverse edges、missing residue numbering 和 insertion codes。
Blocker 排序
- P0:跨 chain 的虚假共价边破坏结构语义。
- P1:只添加单向边是否符合 message passing contract。
- P1:PDB residue numbering discontinuity 和 missing residues。
- P2:edge construction 应集中在可测试 helper。
参考 review
Blocker: Flattening chains before adding
i → i+1edges creates a false backbone bond across each chain boundary. Construct sequential edges within each chain using explicit chain IDs, then add inter-chain spatial contacts as a different edge type.
测试建议
- 两条长度分别为 2 和 3 的 chain,backbone edges 只能是各 chain 内部。
- chain order 改变不改变每条 chain 内部连接。
- missing residue 和 insertion code 有明确规则。
- 若图为无向,反向边完整且无重复。
- inter-chain contact 与 backbone edge type 可区分。
追问
- sequence adjacency 与 spatial adjacency 如何编码?
- 多链 complex 的 permutation symmetry 怎样处理?
- 数据中 chain ID 不稳定时如何建立 canonicalization?
第七部分:PR Review 的追问树和答题语言
1. 标准追问树
这个 PR 想改变什么?
├─ 哪些调用路径受影响?
├─ 输入输出 contract 是否改变?
├─ train / eval / inference 都覆盖吗?
└─ checkpoint / config / data format 是否兼容?
你认为最严重的问题是什么?
├─ 触发条件?
├─ 最小反例?
├─ 会 crash 还是 silent failure?
├─ 科学或产品后果?
└─ 现有 test 为什么没发现?
你会怎样修?
├─ 最小安全 patch?
├─ 是否改变公共 API?
├─ 哪些 tests?
├─ 如何 rollout?
└─ 如何 monitor / rollback?
2. 不确定时的语言
高分不是永不说“不确定”,而是精确限定:
- “从这个 diff 我能确认 X;Y 取决于 caller 的 contract,我会先打开 Z。”
- “如果
True表示 valid,这里是 blocker;如果表示 masked,命名仍容易误用,我会通过 test 确认。” - “我先把它标成 high-risk question,而不是断言 bug。”
- “这个结果在 shape 上可运行,但语义上可能错;最小反例是……”
3. 与作者意见不同时
不要弱化正确性,也不要攻击作者:
我理解这个改动是在减少重复计算。当前实现会让 validation data
更新 BatchNorm state,因此我会阻止合并。我们仍可以保留统一 helper,
但需要由 `is_train` 设置 mode,并给 validation 加 no-grad test。
Slack 和 Kaplan-Moss 的公开资料都把沟通方式视为 code review 信号;Snyk 还显示候选人可能被要求从所有评论中选出一个最重要问题并实现。
第八部分:Onsite conversational one-on-ones
1. Lila 已确认
技术面通过后,会有更多 conversational one-on-ones。最后阶段可 onsite 或 virtual,并在 research talk 外安排多场约 30 分钟 one-on-one。所有阶段都是 gating。
2. 需要准备的主题
Research collaboration
- 与 wet-lab scientist 对同一现象理解不同时怎样推进。
- 数据生成成本很高时怎样决定下一实验。
- 如何把模糊科学问题变成可验证 ML objective。
- 怎样把 negative result 讲清楚,而不是掩盖。
Technical ownership
- 从想法、数据、实验到代码和结果,自己拥有什么。
- 怎样 review 他人代码和接受 review。
- 遇到无法复现的结果怎样处理。
- deadline、研究质量和工程债务冲突时怎样排序。
Judgment and behavior
- 一个错误技术决定及修复。
- 一个失败实验及其改变。
- 与合作者冲突但最终达成决策。
- 何时坚持,何时停止继续优化。
- 如何帮助比自己背景不同的人理解模型。
Questions for interviewers
针对不同角色准备不同问题:
- 对 ML scientist:当前最难的 evaluation 或 data bottleneck。
- 对 computational biologist:模型假设最常在哪些生物场景失败。
- 对 wet-lab collaborator:实验反馈的 latency、noise 和容量。
- 对 manager:前三个月成功的可观测定义。
- 对 platform/engineering:研究代码怎样进入可复用 pipeline。
不要假装已经知道内部计划。用问题校准,而不是用猜测展示“懂公司”。
第九部分:40–60 分钟 Research Talk
1. 时间结构
Lila 名义上要求约一小时 talk,但 HM 明确建议显著少准备一些,或至少能切到约 40 分钟,因为会问很多问题。最安全的主版本是 38–42 分钟内容,加 15–20 分钟互动空间。
建议时间:
| 部分 | 时间 | 目标 |
|---|---|---|
| Opening | 3 min | 一句话问题、贡献、结论 |
| Scientific context | 4 min | 只讲理解问题所需背景 |
| Data and formulation | 6 min | 数据、split、objective、constraints |
| Method | 8 min | 设计选择和最重要机制 |
| Evaluation | 10 min | baseline、metric、ablation、uncertainty |
| Failures and limitations | 5 min | 负结果、替代解释、边界 |
| Lab-in-the-loop / next | 3 min | 验证和下一实验 |
| Closing | 2 min | 三点 takeaways |
准备同一套 slide 的 20 分钟、40 分钟和 55 分钟路线。每个可选模块都能完整跳过,不依赖临场乱删单页。
2. 每张结果 slide 的七问
- 数据多少,来自哪里?
- split 单位和泄漏控制?
- baseline 是谁?
- error bar 或重复实验?
- improvement 有多大,是否实际重要?
- 你个人贡献是什么?
- 哪个替代解释尚未排除?
3. 必须展示的研究成熟度
- 把 observation、interpretation 和 speculation 分开。
- 明确失败实验,不只展示最好结果。
- 解释为什么一个更复杂模型值得额外成本。
- 用 ablation 支撑机制,但不把 correlation 说成 causation。
- 说明 metric 与真正科学目标的差距。
- 给出可执行的下一实验,不用“收集更多数据”结束。
4. 针对已发生 HM 追问的 talk 防守
Motif data augmentation
在 talk 中主动回答:
- motif 如何定义和抽取;
- full structures 与 motifs 的数量及权重;
- parent-level split;
- 为什么不是简单重复数据;
- 显存收益与统计收益分别怎样验证;
- 如果 RAM 无限,motif sampling 是否仍保留。
PDB clash 与 refinement
主动回答:
- clash label 和质量过滤;
- training data 本身含 clash 的影响;
- conditioning 为什么可能有效;
- 输出改善怎样与 trivial smoothing 区分;
- guidance failure 的结果和假设;
- geometry metric 之外是否有功能或实验验证。
Diffusion design choice
主动回答:
- 为什么使用 diffusion,而不是 energy minimization、autoregressive 或 direct regression;
- prediction parameterization;
- symmetry 和 coordinate handling;
- training/inference cost;
- 对小数据量的 regularization 和 pretraining;
- 模型成功与科学成功的差别。
5. Backup slides
至少准备:
- 数据清洗和 split;
- architecture 细节和 tensor shapes;
- loss 推导;
- 更多 baseline;
- failure slices;
- guidance ablation;
- compute 和显存;
- 复现与代码结构;
- wet-lab validation plan;
- limitation 和风险。
10x、Genentech 和 Illumina 的候选人记录共同支持 research talk、Q&A、panel 和 1:1 是 scientist 类岗位的常见组合,但 talk 内容和评分仍以 Lila 实际通知为准。
第十部分:两周准备计划
总原则
- 每天必须有无 AI 的手写或口头环节。
- 基础先于模型名词。MSE、CE、MLP、mask、shape、training loop 不熟,就不要先写完整 diffusion。
- 每道练习都要在时间限制内重新做一遍,而不是只看答案。
- 每天只保留一份 error log:错误、原因、正确 invariant、下次检测方法。
- Repo 和 PR 训练必须计时并录音回放。
- 如果提前 repo 抵达,立刻替换当天一半通用练习为真实 repo 阅读。
Day 1:建立基线
标准路径,3–4 小时
- 30m:不看资料写两层 MLP、MSE training loop。
- 30m:写 sequence padding、mask、masked mean。
- 45m:口头回答一个 ML case,录音。
- 60m:读一个小 PyTorch repo,画 data flow。
- 45m:review 情境 1 和 2。
- 15m:建立 error log。
验收
- 代码能运行,且能解释每个 tensor shape。
- 能说出至少三个自己的基础错误。
- case 回答包含 split、baseline、metric,而不是直接跳模型。
Day 2:Loss、metrics 与基础训练
- 手写 MSE、masked MSE、CE、BCE、KL。
- 练习 logits/probability、reduction、class imbalance、padding。
- 从零写 train/eval loop,包含 mode、no-grad、checkpoint。
- Review 情境 3 和 6。
- 口头解释 optimizer、scheduler、gradient accumulation。
验收
- 看到 loss code 能立刻检查 shape、input semantics、mask 和 denominator。
- 能用最小数值例子手算结果。
Day 3:Tensor、sequence 与 attention
- 熟练
reshape/view/permute/transpose/unsqueeze/squeeze/gather。 - 手写 scaled dot-product attention。
- 加 padding mask 和 causal mask。
- Review 情境 5。
- 练习 batch size 1、all-padding、变长输入。
验收
- 不查资料写出 attention 核心。
- 能解释
[B, H, L, D]每个维度。 - 能指出 mask polarity 和 all-masked row 风险。
Day 4:PyTorch module 与 debugging
ModuleList、Parameter、buffer、state dict、device、dtype。- Review 情境 4。
- 故意制造未注册 layer、CPU buffer、detach gradient 三个 bug,再定位。
- 练习阅读 100–200 行陌生 NN 代码。
验收
- 一步 optimizer 后验证哪些参数真的更新。
- 能检查 state dict 和 checkpoint completeness。
Day 5:VAE 与生成模型基础
- 手写 reparameterization、KL 和 masked reconstruction。
- 解释 posterior collapse、beta 和 deterministic inference。
- Review 情境 6。
- 做一个 30m 超小 VAE live coding,不追求完整项目。
验收
mu=0, logvar=0的 KL 能手算。- 能解释 reduction 如何改变 beta 的含义。
Day 6:Diffusion 小部件
- 写 forward noising。
- 写 epsilon 到 x0 的转换。
- 画出 training 和 sampling 的 contract。
- Review 情境 7 和 8。
- 练习 timestep 边界和 schedule buffer。
验收
- 不混淆 epsilon、x0、v。
- 能用 oracle predictor 写最小 correctness test。
Day 7:第一周模拟与修补
- 45m live coding mock。
- 45m ML case mock。
- 45m code comprehension mock。
- 回放录音,统计沉默、跑题、自信错误和优先级错误。
- 只修第一周最常出现的三个问题。
验收
- 三场都在时间内结束。
- PR review 能先说 blocker。
- 任何猜测都能明确标注。
Day 8:蛋白 sequence 与数据 split
- amino-acid alphabet、unknown、gap、padding。
- sequence identity、cluster、parent structure、time split。
- Review 情境 10。
- Case:少量 assay + 大量 unlabeled sequences。
- 设计 leakage audit。
验收
- 能解释 random split 为什么可能严重高估 generalization。
- 能提出缓存 cluster split,而不是删除科学约束。
Day 9:Coordinate、geometry 与 equivariance
- unit、centering、rotation、translation、missing atoms。
- Review 情境 9、11 和 14。
- 写 pairwise distance/contact map。
- 设计 invariance/equivariance property tests。
验收
- 区分 invariant scalar 和 equivariant vector output。
- 遇到单位不明时先找 contract,不凭直觉修改。
Day 10:工程与 production
- gradient accumulation、checkpoint、resume、cache、provenance。
- Review 情境 12 和 13。
- 练习从 bug 到 minimal patch、test、rollout、monitor。
- Case:离线指标提升但 wet-lab 不提升。
验收
- 能说明“模型 state 恢复”和“训练精确恢复”的区别。
- 每个 blocker 都带验证和 rollout 风险。
Day 11:HM 和 research talk
- 把主项目做成 20 分钟和 40 分钟两版。
- 对 motif、clash、guidance 做完整追问。
- 准备 data、split、baseline、failure、next experiment backup slides。
- 录制一次 40 分钟 talk,允许朋友中途打断。
验收
- 被打断后能回到主线。
- 对未证明结论不使用确定语气。
- 结束时仍有清晰三点 takeaway。
Day 12:真实 repo 或替代 repo 深读
若 Lila repo 已发:
- 第一遍目录地图;
- 第二遍追一个样本;
- 第三遍 train/eval/inference;
- 第四遍 tests 和风险;
- 生成二十问并完全脱离 AI 回答。
若尚未发:
- 选择一个 200–500 行 PyTorch science repo 做同样流程;
- 让练习伙伴提交一个 50–100 行 PR。
验收
- 五分钟内讲完整 data flow。
- 能指出两个明确测试缺口,但不把猜测当 bug。
Day 13:全流程模拟
- 20m screening/HM opening。
- 45m live coding。
- 45m case study。
- 45m repo + unseen PR。
- 40m research talk 片段与连续追问。
- 30m behavioral/one-on-one。
验收
- 全程无 AI。
- 时间控制稳定。
- 错误后能恢复,不掩盖。
- 问题排序和结论可信。
Day 14:减量和稳定
- 重写最常错的三个基础函数。
- 口头走一遍 case 骨架。
- 看一页 repo 地图和 PR checklist。
- 讲 10 分钟 research opening。
- 检查环境、时间、屏幕共享、纸笔和通知。
- 不再开启新模型或大题。
验收
- 睡眠和状态优先。
- 只复习高频错误,不追求知识面扩张。
三条强度路径
最低路径,每天 90–120 分钟
- 30m 无 AI PyTorch。
- 30m repo/PR。
- 20m case 或 HM 口头。
- 10m error log。
不可省略:Day 1、2、3、7、10、12、13、14 的核心验收。
标准路径,每天 3–4 小时
执行上述逐日安排。这是两周内从“知道原理但编码生疏”恢复到可面试状态的主方案。
冲刺路径,每天 5–6 小时
在标准路径上增加:
- 第二次计时重做;
- 一名伙伴做 interviewer;
- 每天一个新 50–100 行 diff;
- research talk 的 20m/40m 双版本;
- 真实 repo 到达后每天一次 oral defense。
冲刺路径不能以熬夜换小时,也不能把时间花在完整实现大型模型。
第十一部分:面试当天速查
Live coding
- 先说 input、output、shape、边界。
- 写最小正确版。
- 测 batch size 1、mask、device、dtype。
- 忘 API 时说明语义,不编造。
- 结束前检查 train/eval、gradient 和 reduction。
ML case
- objective 和 decision。
- data/label/noise。
- split/leakage。
- baseline。
- model/loss。
- metrics/calibration。
- failures。
- closed loop。
Repo comprehension
- 入口和 data flow。
- tensor contract。
- train/eval/inference。
- loss/metric/split。
- tests 和最大风险。
- 事实与猜测分开。
PR review
- intent。
- impacted path。
- blocker first。
- minimal counterexample。
- fix and test。
- production/scientific consequence。
- collaborative comment。
Research talk
- 40 分钟主内容。
- 问题、贡献、结论在开头三分钟讲清。
- 每个结果有 baseline、split 和 uncertainty。
- 主动讲 failure 和 limitation。
- 中断后回到主线。
第十二部分:如何判断准备已经够了
不以“看完多少课程”验收,而以行为验收:
- 30 分钟内从零写完小 PyTorch 任务并自测。
- 五分钟讲清陌生 repo 的主 data flow。
- 45 分钟 review 一个 50–100 行 ML diff,先找到 blocker。
- 每个 blocker 都有触发条件、后果、修复和 test。
- 口头 case 不跳过 split、baseline 和 metric。
- 对主研究项目能承受十分钟连续“为什么”。
- 40 分钟 talk 被多次打断仍能完成三点结论。
- 能诚实说“不确定”,并指出验证路径。
如果这些已经稳定,就不要因为网上还有新模型题而无限扩张范围。
来源索引
Lila 第一方
- ML Scientist I / II, Foundation Models for Life Sciences
- Jingyi 与 Lila ML Scientist 面试录音转写,本地文件,重点 0:25:12–0:31:15。
AI for Science 与生物近邻
Repo、PR 与 ML 面试方法
最终免责声明
本文没有掌握 Lila 原题。它把一手流程、近邻观察和训练设计分开,是为了提高准备的迁移性和诚实度。若 Lila 后续邮件或 recruiter 给出新指示,应以最新一手信息覆盖本文的推断。