Google Research aptamers_mlpd 学习模块深度指南:Binned/SuperBin 标签体系、LabeledTensor 轴与 TensorFlow 模型训练
2026/9/20 2:50:01 网站建设 项目流程

Google Research aptamers_mlpd 学习模块深度指南:Binned/SuperBin 标签体系、LabeledTensor 轴与 TensorFlow 模型训练

【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research

本指南聚焦于 Google Research 仓库aptamers_mlpd中 learning 子模块的模型训练体系,核心围绕 aptamers_mlpd/learning/README.md 展开:从 Binned(分箱)与 SuperBin(超级分箱)标签的定义与生成,到基于 LabeledTensor 的带标签轴(labeled axes)约定,再到train_feedforward的训练配置与论文级参数。读者完成后将掌握该模块的标签语义、张量轴组织方式,并能复现论文中 Counts / Binned / SuperBin 三类模型的训练流程。

一、模块定位:从测序计数到亲和力模型

aptamers_mlpd是 Google Research 发布的适配体(aptamer)机器学习项目,整体代码分为四个阶段(见 aptamers_mlpd/README.md):

  1. 数据预处理preprocess):从原始 fastq 文件对出发,产出"序列 × 每个 PD 子实验计数"的矩阵;
  2. 模型训练learning):即本文主题,输入预处理后的 SSTable 分折数据与元数据,输出训练好的模型;
  3. 序列行走search):利用训练好的模型在种子序列局部空间搜索高亲和力突变体;
  4. 数据分析/出图figures):以 ipython notebook 复现论文图表。

learning模块的入口是train_feedforward.py,核心概念则集中在learning/README.md中定义的标签系统轴(axis)约定。由于项目源自 Google 内部代码,README 明确指出存在内部依赖,共享代码无法在 Google 之外直接运行(源码中的xxx均表示被遮蔽的内部路径或合作者名称),因此本指南侧重讲解可移植的模型设计思想与配置语义。

二、Binned 与 SuperBin 标签系统

论文中,分箱模型(binned model)基于**正珠分数(positive bead fraction)**为每条序列在每个子实验中赋予一个三元标签,三元标签与分数区间的对应关系如下(内容出自 learning/README.md):

标签正珠分数区间含义
0[0, 0.1)低结合
1[0.1, 0.9]中等结合
2(0.9, 1.0]高结合

PD 第 2 轮(round 2)的三个子实验分别被命名为low_3binsmed_3binshigh_3bins,作为三个独立的训练目标(target)。

SuperBin 标签的合成规则

这三个 3-bins 标签随后被传入super_bin,合并为一个 7 值标签,规则如下:

super_bin 值判定条件
-1模糊(ambiguous)
0三个子实验全部为 0
1全部为 0,仅low_3bins= 1
2全部为 0,除low_3bins= 2,或low_3bins= 1 且med_3bins= 1
3low_3bins= 2,med_3bins= 1
4low_3bins= 2、med_3bins= 2,或low_3bins= 2、med_3bins= 1、high_3bins= 1
5low_3bins= 2、med_3bins= 2、high_3bins= 1
6low_3bins= 2、med_3bins= 2、high_3bins= 2

其语义是按结合强度的单调递增顺序排序-1表示无法判定(例如部分子实验数据缺失或矛盾),0表示完全无结合,数值越大代表序列在各轮、各亲和力等级下表现出越强的结合能力,6为最强。这一离散化标签将原本连续的测序计数转换为可解释的结合等级,降低了测序噪声对回归目标的影响。

从 CSV 生成两种标签的可复现示例

learning/create_binned_and_super_bin_labels.ipynb 提供了从论文数据 pd_clustered_input_data_manuscript.csv(该文件由仓库对外提供,README 中标注了 Google Cloud Storage 下载地址)出发、一步到位生成 binned 与 super_bin 标签的 notebook,便于验证标签逻辑。

标签到亲和力映射的源码落点

在 learning/config.py 中,DEFAULT_AFFINITY_TARGET_MAPS为每个数据集定义了"亲和力分子 → 训练目标输出名列表"的映射:

'aptitude_binned': { 'target': ['low_3bins', 'med_3bins', 'high_3bins'], }, 'aptitude_super_binned': { 'target': ['super_bin'], },

这印证了 Binned 模型以low_3bins/med_3bins/high_3bins三个目标训练、SuperBin 模型以单一super_bin目标训练的配置方式。该映射同时服务于FullyObserved输出层在推断阶段的亲和力计算(见下文第四节)。论文中train_feedforward相应使用--affinity_target_map=aptitude_binned--affinity_target_map=aptitude_super_binned

三、LabeledTensor 与轴(axis)约定

模块使用 TensorFlow 1.15 的 contriblabeled_tensor库为张量维护有意义的轴名与轴标签。learning/README.md定义了六个共享轴对象:

名称轴标签来源与用途
batch_axis'batch'一批训练/评估样本
input_position_axis'input_position'[0, 1, 2, ..., sequencing_length - 1]核酸距 5' 端的整数偏移
input_channel_axis'input_channel'['A','T','G','C'](不使用二级结构特征时)各输入特征对应的通道
output_axis'output'每个物理测量/化验(assay)的名称训练或验证用的输出;标签与selection_pb2.Experimentproto 中SequencingReads.name字段一致
logit_axis'logit'取决于具体输出层模型前馈网络部分每个不同预测的标签
target_axis'target'output_axis的子集训练损失目标

其中batch_axisinput_position_axisinput_channel_axisoutput_axis由预处理例程 learning/data.py 中的create_input_and_outputs生成;logit_axistarget_axis则由 learning/output_layers.py 中的输出层模型创建。

轴体系在源码中的印证

在 data.py 中:

  • SEQUENCE_ONE_HOT特征通过tf.one_hot(seq_indices, depth=4)生成,其通道轴标签为list(dna.DNA_BASES)(即['A','T','G','C'],对应 config.py 中ORDERED_BASES = 'ATGC',该碱基顺序同时须与custom_ops.cc保持一致);
  • SEQUENCE_KMER_COUNT特征经count_all_dna_kmers统计后,用二项分布解析均值/标准差做标准化(_kmer_mean_and_std,其中n = sequence_length + 1 - kmer_size, p = 1/4**kmer_size);
  • 输出张量通过lt.pack(outputs, ('output', output_names), axis_position=1)打包为[batch_axis, output_axis],输出名依次为所有计数名、绑定阵列名与(可选的)额外输出名。

在 output_layers.py 中,FullyObserved输出层的logit_axis被设为lt.Axis('target', target_names + additional_output)target_axislt.Axis('target', target_names)LatentAffinity(output_layers.py)的logit_axis则为lt.Axis('target', affinity_names + additional_output),其中affinity_names来自实验 proto 中所有 target/background 分子名。

值得注意的术语约定output_layers.py模块 docstring):模块内 "target" 指被预测的测序计数池(对应'target'轴);而选择实验中的目标分子(如 SELEX 用蛋白)被称为 "affinity molecule",对应张量上的'affinity'轴;可选的额外输出(如最小自由能二级结构配分函数)对应'additional_output'轴。三种输出层函数predict_counts/predict_affinity/predict_additional_output分别产生这三类预测。

四、输出层与损失函数:两种建模范式的源码解读

learning/output_layers.py 把"输出层 + 损失函数"封装为AbstractOutputLayer,其关键 API 包括average_loss_per_target(训练用平均损失)、loss_per_example_and_target(评估脚本用逐样本损失)、predict_counts/predict_affinity/predict_additional_output

输出层(output_layer)五选一

常量说明
FULLY_OBSERVED直接预测观测到的(标准化/对数变换后的)计数;亲和力由最后两轮输出的均值计算
LATENT_AFFINITY前馈网络输出直接作为适配体结合亲和力分数,通过affinity_weights * selection_signs线性映射到各计数池
LATENT_WITH_DEPS在 LatentAffinity 基础上加入上一轮观测计数作为先验(prev_round_scale
LATENT_WITH_PRED_DEPS使用预测的上一轮计数而非观测计数
LATENT_WITH_CROSS_DEPS额外加入"亲和力 × 上一轮计数"的交叉交互项,更好地刻画"上一轮出现且亲和力高"的物理选择过程

其中_get_selection_signs(output_layers.py)根据每个 round 的 target/background 浓度计算{+1, -1, 0}符号矩阵,用于约束权重方向;LatentAffinityabs(self.affinity_weights) * self.selection_signs保证符号约束。

损失函数(loss_name)四选一与归一化

常量说明
SQUARED_ERROR平方误差(论文 Counts/Binned/SuperBin 模型均采用)
CROSS_ENTROPYsigmoid 交叉熵(针对二值化目标)
POISSON_LOSS泊松对数似然,必须搭配loss_norm=SKIP
ZERO_TRUNCATED_POISSON_LOSS零截断泊松对数似然(处理测序计数无 0 的物理约束),同样要求loss_norm=SKIP

normalizer工厂函数(output_layers.py)支持四种归一化方式:STANDARDIZE(可选 log 变换后标准化,统计量取自实验 proto 的mean_log_plus_one/std_dev_log_plus_one等)、BINARIZE(按阈值二值化)、TOTAL_COUNTS(按轮总深度归一化为比例)、SKIP(恒等)。其中dependency_norm专门控制LATENT_WITH_*系列中上一轮计数依赖项的归一化——这也解释了论文 SuperBin 模型命令中出现的--dependency_norm=SKIP

五、运行训练:playbook 实战指南

learning/playbook.md详细说明了本地与集群两种训练方式。前置条件:已由预处理管线将 FASTQ 转为 TF example proto,且数据集已登记在 learning/config.py 中——若为新数据集,需在INPUT_DATA_DIRS中加入数据路径,并在DEFAULT_AFFINITY_TARGET_MAPS中加入计数到亲和力的映射(也可直接用目录作为输入,但定义数据集更方便)。

本地调试训练

run learning/train_feedforward \ --save_base=xxx \ --epochs=2 \ --run_name=$RUN_NAME \ --num_fc_layers=1 \ --dataset=aptitude

其中RUN_NAME每次运行必须唯一(用于生成 checkpoint 与结果保存路径),例如export RUN_NAME=xxx.debug0--dataset可换成config.INPUT_DATA_DIRS中其他合法键,或直接用--input_dir指定目录。

epoch 与 eval 设置要点

  • 默认一个 epoch = 完整遍历整个数据集;大数据集建议用--epoch_size限制每个 epoch 的样本数(经验法则:约每小时报告一次训练/验证结果);
  • 模型不会提前停止,学习率也不退火,必须运行满指定 epoch 数,因此需要频繁查看报告以防欠训练或过训练;
  • --eval_size控制每轮评估的样本数,默认最多 100 万(设为 0 表示评估全量数据集);评估基于打乱队列,使用全量时每次评估会随机子采样;
  • 本地拷贝数据后,每个 epoch 在xxx数据集上约 2 分钟完成。
run learning/train_feedforward \ --save_base=xxx/train_feedforward/$USER \ --epochs=2 \ --epoch_size=1e6 \ --eval_size=0 \ --run_name=$RUN_NAME \ --num_fc_layers=1 \ --dataset=aptitude

集群训练与超参搜索

模块区分元参数(meta-parameters/model choices)超参数(hyper-parameters):前者由人固定、不参与自动搜索(如num_fc_layersoutput_layer),后者由 Vizier 在给定范围内取值(如学习率、动量)。典型做法是对每个元参数组合单独做一轮超参优化:

  • 固定组合单任务:--vars="run_group=$RUN_NAME,output_layer=LATENT_AFFINITY,loss_name=CROSS_ENTROPY,num_fc_layers=2,num_conv_layers=0"
  • 多副本评估训练方差:追加num_replicas=20,hpconfig=nonlinearity='tanh',learn_rate=0.01,momentum=0.9,dropouts=[0.1,0.4,0.001]
  • 随机搜索:默认 40 个元参数组合(0–3 层全连接 × 5 种输出层 × 2 种损失),--vars="run_group=$RUN_NAME,num_replicas=100,autotune=true"将启动 40×100=4000 个训练任务,随后人工分析超参结果。

对应源码中,_default_study_hyperparams_get_study(train_feedforward.py)定义了默认超参(nonlinearity='tanh'learn_rate=0.005momentum=0.9等)及 Vizier 搜索空间(如learn_rate取 0.0001–0.01 对数刻度、dropouts取 0.0–0.5 等)。

预测额外辅助特征

--additional_output可附加预测配分函数等 1D 辅助特征,多个特征用逗号分隔、整体加双引号;合法特征名是learning/data.pyfeature_tensors的键:

... --additional_output="partition_function,boltzmann_probability"

实现上(output_layers.py),该 flag 以逗号切分后传入输出层,额外输出与计数损失拼接在一起联合训练。

六、论文模型的完整训练参数

aptamers_mlpd/README.md提供了论文三种模型的train_feedforward参数,与本文标签系统一一对应:

Counts 模型(连续计数回归,潜变量亲和力 + 配分函数辅助输出):

--affinity_target_map=aptitude --additional_output=partition_function --epoch_interval_to_save_best=5 --epoch_size=200000 --epochs=50 --input_features=SEQUENCE_ONE_HOT,SEQUENCE_KMER_COUNT --loss_name=SQUARED_ERROR --loss_norm=STANDARDIZE --max_strides=1 --mbsz=64 --num_conv_layers=3 --num_fc_layers=3 --output_layer=LATENT_AFFINITY --preprocess_mode=PREPROCESS_SKIP_ALL_ZERO_COUNTS --target_names=ALL_OUTPUTS --total_reads_defining_positive=1000 --tuner_algorithm=RANDOM_SEARCH --tuner_loss=auc/true_top_1p --tuner_target=mean

Binned 模型(三元分箱标签,全观测输出层、无全连接隐藏层):

--affinity_target_map=aptitude_binned --additional_output= --epoch_interval_to_save_best=5 --epoch_size=20000 --epochs=50 --input_features=SEQUENCE_ONE_HOT,SEQUENCE_KMER_COUNT --loss_name=SQUARED_ERROR --loss_norm=SKIP --max_strides=1 --mbsz=64 --num_conv_layers=3 --num_fc_layers=0 --output_layer=FULLY_OBSERVED --preprocess_mode=PREPROCESS_ALL_COUNTS --target_names=ALL_OUTPUTS --total_reads_defining_positive=0 --tuner_algorithm=RANDOM_SEARCH --tuner_loss=auc/true_top_1p --tuner_target=mean

SuperBin 模型(7 值超级分箱标签,全观测输出层 + 3 层全连接):

--affinity_target_map=aptitude_super_binned --additional_output= --dependency_norm=SKIP --epoch_interval_to_save_best=5 --epoch_size=20000 --epochs=50 --input_features=SEQUENCE_ONE_HOT,SEQUENCE_KMER_COUNT --loss_name=SQUARED_ERROR --loss_norm=SKIP --mbsz=64 --num_conv_layers=3 --num_fc_layers=3 --output_layer=FULLY_OBSERVED --preprocess_mode=PREPROCESS_ALL_COUNTS --target_names=ALL_OUTPUTS --total_reads_defining_positive=0 --tuner_algorithm=RANDOM_SEARCH --tuner_loss=auc/true_top_1p --tuner_target=mean

关键参数语义速查(依据 train_feedforward.py 的 flag 定义)

参数默认值说明
dataset/input_dirNone二选一;dataset必须是config.INPUT_DATA_DIRS的键
val_fold0验证折(数据共 5 折,实践中以 fold0 为测试、其余为训练)
epochs/epoch_size/eval_size5 / 0 / 1e6训练轮数、每轮样本数(0=全量)、评估样本上限(0=全量)
mbsz128训练小批量大小
num_conv_layers/num_fc_layers0 / None卷积层与全连接层数
output_layerFULLY_OBSERVED见第四节五种输出层
loss_nameSQUARED_ERROR见第四节四种损失
loss_norm/dependency_normSTANDARDIZE损失归一化 / 依赖项归一化方式
input_featuresSEQUENCE_ONE_HOT合法值:SEQUENCE_ONE_HOTSEQUENCE_KMER_COUNT(见data.py常量)
kmer_k_max4使用 kmer 特征时的最大 k-mer 长度
preprocess_modePREPROCESS_SKIP_ALL_ZERO_COUNTS另含PREPROCESS_ALL_COUNTS(Binned/SuperBin 用)与PREPROCESS_INJECT_RANDOM_SEQUENCES
total_reads_defining_positive0判定阳性所需跨条件的总 reads 数
tuner_algorithm/tuner_loss/tuner_targetRANDOM_SEARCH/auc/true_top_1p/meanVizier 搜索算法、优化指标(auc/true_top_1ploss)与目标
epoch_interval_to_save_best5每隔多少 epoch 检查并保存当前最佳模型
train_on_arrayTrue是否用结合阵列(microarray)数据训练亲和力损失
additional_output''逗号分隔的附加预测特征

值得注意的是,Counts 模型使用PREPROCESS_SKIP_ALL_ZERO_COUNTS(跳过全零计数样本)与total_reads_defining_positive=1000,而 Binned/SuperBin 使用PREPROCESS_ALL_COUNTS(保留全部计数)与total_reads_defining_positive=0,从 data.py 可以看出这两种 preprocess 模式对应不同的样本过滤逻辑。训练过程中FeedForwardTrainer(train_feedforward.py)构建输入管线、前向网络与输出层损失,并支持 momentum / adam 优化器。

七、从训练到搜索:模型的消费方

训练好的模型在search模块的序列行走(walking)流程中被用于给突变体打分:先选择种子序列(实验种子 / 随机种子 / 用模型对大量随机序列打分挑出的高分为 ML 种子),再迭代突变-打分-保留最优父序列。相关调用以learning/eval_feedforward.Inferer封装模型推断,配合walkers.SamplingWalkersampling_limit=1000max_trials=2000n_parents=10min_distance=1max_distance=4)执行带步数控制的突变搜索。该流程印证了learning/README.mdoutput_axis标签与selection_pb2.Experimentproto 字段一致这一约定的实际用途——推断时需按物理测量名对齐预测输出。

八、总结

aptamers_mlpd/learning模块的技术要点可归纳为三句话:Binned/SuperBin 标签将连续的测序计数离散为有物理含义的结合等级,是 Binned/SuperBin 两类论文模型的目标定义基础;LabeledTensor 轴体系batch/input_position/input_channel/output/logit/target)让张量在预处理、前馈网络与输出层之间保持语义可追踪;输出层 × 损失 × 归一化的三维配置空间(FULLY_OBSERVEDvsLATENT_AFFINITY家族 × 四种损失 × 四种归一化)支撑了论文中从连续计数到分箱标签的多种建模路线。结合 learning/playbook.md 的本地/集群运行方法与 train_feedforward.py 的完整参数表,读者可以完整复现论文模型配置,并将同样的标签化与轴组织思路迁移到其他高通量测序(HTS)亲和力建模任务中。

【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询