想象你手里捧着一本用四个字母写成的“天书”——A、T、C、G。这本天书长达三十亿个字母,里面藏着“你是谁”的全部秘密。可惜,你完全不认识这种语言。这时,你请来了两位“阅读高手”:一位叫 CNN,他拿着不同倍数的放大镜,擅长在局部区域快速扫描、寻找特定的“词语”(比如启动子、结合位点);另一位叫 Transformer,他不看局部,而是把整本书摊开,用“注意力”在所有文字之间建立关联,擅长发现相隔十万八千里却能遥相呼应的“伏笔”(比如增强子与启动子的远程互动)。这两位高手,就是 DNA/RNA 序列建模的核心工具。本文将以这本“天书”为喻,带你走进 AI 读懂基因序列的世界。
掌握基因序列建模,你将站上 AI 与生命科学交叉的浪尖——既能理解生物信息学数据的本质,又能将深度学习架构迁移到最前沿的科学发现场景,成为稀缺的复合型 AI 人才。
可视化演示
展示DNA序列One-Hot编码、CNN卷积核滑动检测基序、Transformer多头自注意力三阶段交互。
本节配有交互动效(进入视口后自动加载,约 3KB)。
DNA序列One-Hot编码 ACGT四碱基独热编码向量 GC含量反映序列特征 编码向量送入深度学习模型 编码:A=[1,0,0,0], C=[0,1,0,0], G=[0,0,1,0], T=[0,0,0,1] One-Hot是序列建模最基础的编码方式
序列语言基础
在基因的世界里,DNA 和 RNA 是两本用四字母写成的“天书”——DNA 使用 A、T、C、G 四种碱基,RNA 则将 T 换成了 U。就像中文有三千常用汉字,但基因这本天书只有四个“字”,却拼出了生命的所有复杂与精妙。每个基因序列就像书中的一句话,由成百上千个字母连缀而成;而启动子、增强子、剪接位点这些调控元件,则是句中反复出现的“固定搭配”——如同中文里的“因为……所以”“不仅……而且”。
对于 AI 模型而言,这些序列不是能直接理解的文本,而是需要被翻译成机器可读的数字。正如一个外国人读《红楼梦》前必须先学会汉字,深度学习模型读取基因前,也需要先掌握这套“字母表”。幸运的是,这套字母表极其简洁——只有四个符号,这让编码变得异常干净。
在计算生物学中,通常将序列视为离散符号的线性序列,这与自然语言处理中的“词序列”高度同构。一个长度为 L 的 DNA 片段,就是一个长度为 L 的字符串,其中每个字符来自有限字母表 Σ = {A, T, C, G}。这种形式化定义,使得 NLP 中的一切技术——从嵌入到注意力——都能迁移到基因组上。
就像读英文小说前先认识 26 个字母一样,理解碱基字母表是建模的第一步。现在我们知道“书”长什么样了,下一步就是把它翻译成模型能算的“数字”。
- 序列定义将 DNA 片段形式化为有序字符集合。$s_i$ 表示第 $i$ 个位置的碱基。
- 碱基字母表限定字符取值范围为四种碱基,这是最小完备集。
One-Hot编码
有了天书和字母表,下一步是把这些字母变成数字。有人说“把 A=1, T=2, C=3, G=4 不就行了?”——这看似聪明,实则埋了大坑。试想,如果 A=1、T=2,那么 A+T=C,这会让模型误以为碱基之间存在算术关系,但实际上 A 和 T 只是两种不同的“字”,并无大小之分。这就好比给苹果=1、香蕉=2,模型便会学到“苹果+苹果=香蕉”的荒谬规则。One-Hot 编码就是为了避免这种“假关系”。
One-Hot 编码的做法是为每个碱基创建一个四维向量,其中该碱基对应的位置为 1,其余为 0。比如 A 可以编码为 [1,0,0,0],T 为 [0,1,0,0],C 为 [0,0,1,0],G 为 [0,0,0,1]。这样整条长度为 L 的序列,就变成了一个 4×L 的矩阵——如同一排灯开关,每个位置只亮一盏灯,其他全灭。每个碱基都用一个“独热”的位置表示。
在 PyTorch 或 TensorFlow 中,这个操作由 one_hot 函数轻松完成。编码后,我们得到了一个形状为 (N, 4, L) 的张量,其中 N 是样本数。值得注意的是,One-Hot 编码保留了一个重要性质——位置信息。第 3 个位置是 A 还是 T,不会被混淆,因为每个位置的“灯”是独立的。这种编码方式成为基因组深度学习的事实标准,正如独热编码是分类变量的标准预处理方式。
One-Hot 编码就像给天书的每个字配了一个独一无二的“身份证”,模型拿到这份表格,终于可以进行计算了。但读法不同,理解就不同——CNN 和 Transformer 走的是两条截然不同的阅读路径。
- 独热结果形状编码后矩阵的维度由类别数(4种碱基)和序列长度 L 决定。
- 单列唯一每列恰好一个元素为 1,其余为 0,保证“一灯亮”。
CNN局部扫描
拿到编码矩阵后,CNN 出手了。它的阅读方式像什么呢?想象你读一本侦探小说时,拿着一张镂空的纸片,纸片上挖了一个长约 6-20 个字母的“窗口”。你把这个窗口沿着文字逐次滑动,每停一次就记下窗口内字形的特征。这种“滑动窗口”的阅读方式,就是卷积核的工作方式。CNN 的卷积核就相当于一个可学习的“放大镜”,它的长度(通常 6-20bp)恰好覆盖一个典型 DNA 模体(motif)的长度——比如转录因子结合位点通常只有 6-12bp。
CNN 的卷积层可以这样理解:它用一组可学习的卷积核(filter)对输入的 4×L 矩阵做滑动窗口内积,每个卷积核本质上是 4×k 的权重矩阵。当这个权重矩阵恰好与某个 motif 的 One-Hot 模式相似时,就会产生大数值响应——相当于“亮灯报警”。多个卷积核就像多个不同敏感度的探针,每个专门寻找特定类型的“固定搭配”。
卷积之后通常接池化层(pooling),它像编辑给一篇长文做“摘要”——在一个局部区域取最大值(Max Pooling)或平均值(Average Pooling),把重要信息保留下来,把不重要的细节丢掉。这样可以大幅降低数据维度,也能让模型对序列的微小移位更鲁棒——哪怕 motif 从位置 100 移到 103,池化后的特征仍然相似。
CNN 就像一位捧着放大镜逐段精读的侦探,对局部模体极为敏感,但它的视野有限——如果两个重要信号相隔 1000bp,它就很难发现它们的关联。这时候,就需要请出另一位高手——Transformer。
- 卷积操作对位置 $i$ 开始、长度 $k$ 的窗口与权重矩阵 $\mathbf{W}$ 做逐元素乘积并求和。
- 非线性激活加偏置后过激活函数(如 ReLU),引入非线性表达。
Transformer全局关联
Transformer 的阅读方式截然不同。它不拿放大镜,而是把整本书摊开在桌面上,用“注意力”在任意两个位置的字符之间画线。好比一位通读全书的文学评论家,能发现第 3 页埋下的伏笔在第 2500 页得到了呼应——这种跨越时空的“连线”,就是自注意力(Self-Attention)机制。
自注意力的核心是一个三元组:查询(Query)、键(Key)、值(Value)。可以把 Query 想象成“我在找什么”,Key 是“我拥有什么”,Value 是“我要输出的内容”。每个位置的碱基都发出一个 Query,去匹配所有位置的 Key,得到的匹配分数决定了“我该多关注谁”,然后用这些权重加权求和所有位置的 Value。这样,每个输出位置都能“看”到全局的信息。
然而,Transformer 的注意力机制本身是“无序”的——它不知道第 5 个位置和第 80 个位置谁在前谁在后。于是,研究者加入了位置编码(Positional Encoding):给每个位置加上一个唯一的“坐标标记”,像给每本书编上页码。这样,模型既能利用位置信息,又能保持全局视野。
Transformer 的长程依赖建模能力使其在捕捉增强子-启动子远程互作、RNA 二级结构等任务中表现卓越。但它的“通读全书”也带来巨大算力开销——注意力矩阵随序列长度平方增长,读一本长书会非常费力。因此,CNN 和 Transformer 并非谁替代谁,而是各擅胜场。
- 相似度计算查询与所有键做点积,衡量匹配程度。
- 缩放防止饱和除以 $\sqrt{d_k}$ 避免点积过大导致 Softmax 梯度消失。
- 权重归一化Softmax 将分数转为非负且和为 1 的注意力权重。
- 加权聚合用注意力权重对值向量做加权求和,得到输出。
数据准备要点
无论是 CNN 还是 Transformer,都离不开优质的数据喂养。数据准备就像给厨师备菜——食材不新鲜,再好的厨艺也白搭。在基因组序列建模中,“食材”来自参考基因组(Reference Genome),如人类基因组 hg38。常用数据格式是 FASTA,一种纯文本格式,> 开头的是序列名称,后续是碱基序列。
正负样本的设计是建模成败的关键。例如,要预测某个 DNA 片段是否为增强子,正样本是真增强子序列,负样本则来自非增强子区域。一种常见的做法是“负样本匹配”——让负样本与正样本在 GC 含量、长度、染色体分布上保持一致,避免模型学到这些“表面特征”而非真正的生物学信号。就像让盲测的两种咖啡温度相同,才能真正测出风味差异。
数据增强也是基因组建模的利器。由于 DNA 有双链结构,一条序列的反向互补链(Reverse Complement)在生物学上等价于原序列。因此,将序列与其反向互补同时放入训练集,等效于两倍扩充数据。还能通过随机移位、截断、突变增强(引入随机点突变)来增加数据多样性,帮助模型抵抗过拟合。这些方法简单却极为有效。
数据是模型的燃料,而“反向互补增强”是基因组任务特有的“免费午餐”。但有了好数据后,到底选 CNN 还是 Transformer?这需要一套决策方法。
- 互补替换每个碱基替换为互补碱基。
- 反转顺序将互补后的序列倒序排列。
模型选择实践
面对具体任务时,选择 CNN 还是 Transformer,不能凭偏好,而要像老中医看病一样辨证施治。核心指标有三个:序列长度、任务类型、数据规模。序列长度是首要判断依据:如果输入序列较短(如 200bp 以内)且任务依赖局部模体(如预测转录因子结合位点),CNN 是优选项——它参数少、训练快、小数据下不易过拟合。但如果序列长达数千甚至数万 bp,且关键信号可能相距遥远(如预测剪接位点需要同时看到外显子两端),Transformer 的能力就体现出来了。
任务类型同样关键。如果是分类任务(如判断片段是否为启动子),CNN 或混合模型足以;如果是需要输出逐位置标注的序列标注任务(如预测每个碱基是否属于外显子),Transformer 的全局建模能力更有优势。此外,数据规模也决定选择:Transformer 在没有海量数据时容易“营养不良”,而 CNN 在小数据上表现稳健。近年来,研究者常采用"CNN+Transformer"的混合架构——先由 CNN 提取局部特征,再由 Transformer 建模全局依赖,兼取两者之长。
模型评估方面,基因组任务常用 AUC、F1、准确率等指标,但更关键的是“跨染色体验证”——即训练集和测试集来自不同染色体,确保模型学到的不是染色体的特异性偏好。部署时,还要关注推理速度和服务稳定性。CNN 模型体积小、推理快,适合大规模全基因组扫描;Transformer 性能强但资源消耗大,适合小范围高精度任务。
回头再看那本天书:CNN 像拿着放大镜寻找固定搭配的侦探,Transformer 像通读全文的学者。真正的高手会让他们合作——先用 CNN 快速扫描出“关键词”,再用 Transformer 理解这些关键词之间的“深意”。这就是现代基因组深度学习的真实图景。
- 真阳性与真阴性预测正确且实际为正/负的样本数。
- 假阳性与假阴性预测错误且实际为负/正的样本数。
- 准确率正确预测数量占总样本数的比例。
- F1 分数精确率与召回率的调和平均,单值综合评估。
AI 应用场景
场景一:转录因子结合位点预测
阶段:模型训练与推理
解决的问题:传统实验方法(如 ChIP-seq)识别转录因子结合位点成本高、周期长,且对细胞类型敏感。深度模型可基于序列直接预测结合概率,大幅降低实验负担。
具体案例:某生物信息学团队使用 CNN 模型 Enformer 对 ENCODE 项目的 ChIP-seq 数据建模,输入 200bp 的 DNA 序列窗口,输出 1000 多个转录因子的结合概率。模型在跨细胞系预测中 AUC 达 0.92,成功辅助研究团队将候选结合位点从数百万个压缩至几千个,显著加速了后续湿实验验证。
场景二:RNA剪接位点识别
阶段:数据准备与特征工程
解决的问题:RNA 剪接位点识别需要同时观察外显子-内含子边界的多个远端信号,传统 Motif 扫描方法召回率低,线性模型难以学习复杂组合模式。
具体案例:某基因诊断公司利用 Transformer 模型 SpliceAI 进行全基因组剪接位点预测。模型以 5000bp 的 RNA 序列为输入,利用深度残差网络和注意力机制识别隐蔽剪接突变。在 2022 年的一项临床验证中,模型对致病性剪接变异的检测灵敏度达 95%,帮助诊断团队发现了传统外显子组分析遗漏的致病突变。
场景三:CRISPR基因编辑的脱靶效应预测
阶段:模型评估与部署
解决的问题:CRISPR-Cas9 系统可能在其他位置产生非预期切割(脱靶),传统算法使用简单序列比对导致假阳性高企。深度学习使模型能学习复杂的错配容忍模式。
具体案例:某基因治疗初创公司使用 CNN+Transformer 混合架构,以 gRNA 序列和候选脱靶位点序列为输入,预测切割活性评分。模型在 GUIDE-seq 数据集上取得了目前最优的 F1 分数 0.87,并将其部署为云端 API,供科研人员实时评估 gRNA 安全性,将脱靶验证成本降低了 70%。
Python 演示
"""DNA序列建模演示:使用CNN和Transformer对启动子序列进行分类。"""import numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import roc_auc_score, f1_score # ------------------------- 数据准备 -------------------------# 生成模拟数据:正样本含TATA-box启动子模体,负样本为随机序列def generate_data(n_samples=400, seq_len=100): rng = np.random.RandomState(42) X, y = [], [] letters = 'ACGT' for _ in range(n_samples): # 随机生成一段DNA序列 seq = ''.join(rng.choice(list(letters), size=seq_len)) if rng.rand() < 0.5: # 正样本:插入启动子模体 TATAWAW 在随机位置 pos = rng.randint(0, seq_len - 6) motif = 'TATAAA' seq = seq[:pos] + motif + seq[pos + 6:] y.append(1) else: y.append(0) # 反向互补增强 comp = {'A': 'T', 'T': 'A', 'C': 'G', 'G': 'C'} rc_seq = ''.join(comp.get(b, b) for b in seq[::-1]) X.append(seq) X.append(rc_seq) y.extend([y[-1]] * 2) # 反向互补等价,标签不变 return X, np.array(y) def one_hot_encode(seqs, seq_len=100): """将字符串序列编码为独热矩阵。""" mapping = {'A': 0, 'C': 1, 'G': 2, 'T': 3} X = np.zeros((len(seqs), 4, seq_len), dtype=np.float32) for i, s in enumerate(seqs): for j, ch in enumerate(s[:seq_len]): if ch in mapping: X[i, mapping[ch], j] = 1.0 return X # ------------------------- 模型构建 -------------------------# 简易CNN模型(用numpy实现单层卷积+全连接)class SimpleCNN: def __init__(self, kernel_size=6, n_filters=16, lr=0.01): self.k = kernel_size self.n_f = n_filters self.lr = lr # 卷积核形状: (n_filters, 4, kernel_size) self.W_conv = np.random.randn(n_filters, 4, kernel_size) * 0.01 self.b_conv = np.zeros((n_filters, 1)) # 全连接层权重 self.W_fc = None self.b_fc = np.zeros((1,)) def forward(self, X): # X: (batch, 4, L) -> 卷积 -> ReLU -> 全局最大池化 n, _, L = X.shape out_L = L - self.k + 1 # 卷积: 对每个窗口位置计算所有滤波器响应 conv_out = np.zeros((n, self.n_f, out_L)) for i in range(n): for f in range(self.n_f): for j in range(out_L): window = X[i, :, j:j + self.k] conv_out[i, f, j] = np.sum(self.W_conv[f] * window) + self.b_conv[f] conv_out = np.maximum(conv_out, 0) # ReLU # 全局最大池化: 每个滤波器取最大值 pooled = np.max(conv_out, axis=2) # (n, n_filters) return pooled def fit(self, X, y, epochs=10): n = X.shape[0] X_pooled = self.forward(X) # 初始化全连接层(相当于逻辑回归) self.W_fc = np.random.randn(self.n_f) * 0.1 for epoch in range(epochs): logits = X_pooled @ self.W_fc + self.b_fc[0] probs = 1.0 / (1.0 + np.exp(-logits)) loss = -np.mean(y * np.log(probs + 1e-9) + (1 - y) * np.log(1 - probs + 1e-9)) # 梯度下降 grad = (probs - y) / n self.W_fc -= self.lr * (X_pooled.T @ grad) self.b_fc -= self.lr * np.sum(grad) if (epoch + 1) % 5 == 0: print(f'Epoch {epoch+1}: loss={loss:.4f}') def predict_proba(self, X): X_pooled = self.forward(X) logits = X_pooled @ self.W_fc + self.b_fc[0] return 1.0 / (1.0 + np.exp(-logits)) def predict(self, X, threshold=0.5): return (self.predict_proba(X) >= threshold).astype(int) # ------------------------- 训练与评估 -------------------------if __name__ == '__main__': print("生成模拟DNA序列数据...") X_text, y = generate_data(300) print(f"数据量: {len(X_text)} (含反向互补增强)") # 编码并划分 X = one_hot_encode(X_text) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y) # 训练CNN model = SimpleCNN(kernel_size=6, n_filters=16, lr=0.05) print("开始训练简易CNN模型...") model.fit(X_train, y_train, epochs=20) # 评估 y_pred = model.predict(X_test) f1 = f1_score(y_test, y_pred) auc = roc_auc_score(y_test, model.predict_proba(X_test)) print(f"\n测试集结果: F1={f1:.3f}, AUC={auc:.3f}")
comp = {'A': 'T', ...}; rc_seq = ''.join(comp.get(b, b) for b in seq[::-1])实现反向互补增强:先逐个碱基互补,再反转整个序列,一箭双雕扩展数据集。mapping = {'A': 0, 'C': 1, 'G': 2, 'T': 3}; X[i, mapping[ch], j] = 1.0独热编码核心:每个位置在对应碱基的通道上置 1,生成 4×L 矩阵。conv_out[i, f, j] = np.sum(self.W_conv[f] * window) + self.b_conv[f]卷积操作:卷积核与局部窗口逐元素乘累加,检测模体模式。pooled = np.max(conv_out, axis=2)全局最大池化:每个滤波器在整个序列上取最大值,保留最强响应、降低维度。grad = (probs - y) / n; self.W_fc -= self.lr * (X_pooled.T @ grad)梯度下降更新权重,训练分类器区分正负样本。X_train, X_test, y_train, y_test = train_test_split(...)数据划分:防止信息泄漏,确保评估可靠。
常见误区
误区我听说 Transformer 的注意力复杂度是 O(n²),那基因组序列动辄上百万碱基,是不是根本没法用深度学习?也许应该用传统方法。
正解这是一个常见的认知偏差。实际上,基因组深度学习模型的输入通常不是整条染色体,而是“滑窗截取”的短片段(如 200bp、2000bp、5000bp 等)。模型的任务是理解局部上下文和特定调控区域,而非通读全部三十亿碱基。就像读一本长篇小说时,评论家也是逐章精读,而非一次输入全本。只需将序列按窗口切分,CNN 和 Transformer 都能高效处理。
为何常见:人们容易被“全基因组”这个宏大规模吓住,忽略了建模任务的实际输入粒度。序列建模本质上是“局部理解”任务。
误区NLP 里 BERT、GPT 都用词嵌入把词映射为稠密向量,One-Hot 又稀疏又浪费。DNA 建模是不是也该用 Embedding 层或预训练向量?
正解DNA 只有四个字母,One-Hot 编码的信息论效率已经很高。更重要的是,One-Hot 保持了碱基之间的“正交性”——任意两种碱基的距离相等,不会引入虚假的相似性。而词嵌入依赖大规模语料统计共现,DNA 的“语法”远未被完全解读,贸然使用预训练向量反而可能掺入噪声。实际上,目前绝大多数 SoTA 基因组模型(如 Enformer、SpliceAI)的第一层仍然是 One-Hot 或类 One-Hot 编码。简单有时正是优点。
为何常见:习惯了 NLP 的丰富表示,容易忽视生物序列的特殊性和 One-Hot 在正交性上的数学优势。
误区大家都说 Transformer 是深度学习的未来,基因序列建模是不是也应该无脑上 Transformer?CNN 是不是老古董了?
正解这个误区源于对模型能力的过度简化。CNN 的核心优势是“局部连接+平移等变”,在捕捉 DNA 模体(通常 6-12bp)上极其高效,参数少、训练快、小数据下更稳。Transformer 在长程依赖上更强,但数据量不足时容易过拟合,算力消耗也大。关键在于任务匹配:预测 TF 结合位点用 CNN 足够,预测剪接位点的远端交互则 Transformer 更优,现实中更多是"CNN+Transformer"混合架构。工具没有新旧,只有合不合适。
为何常见:技术热度的“光环效应”容易让人忽略不同架构的归纳偏置与任务场景的匹配关系。
误区训练时把所有序列按正链方向输入,模型效果还不错;或者我干脆把反向互补也加入训练,但忘了把标签也一起调整,导致模型变差。
正解DNA 是双链结构,一条序列与其反向互补在生物学上功能等价。如果不做反向互补增强,模型可能学到“只在正链上识别 motif”,而对负链的等价序列毫无反应——这会造成严重的泛化问题。正确做法是:对每个样本,同时加入其反向互补序列,且标签保持不变,等效于两倍数据扩充。这对只有少数正样本的基因组任务尤其重要。
为何常见:初接触基因组任务时,容易忽略生物学先验(双链对称性),把序列当普通字符串处理。
误区我按常规做法随机划分训练集和测试集,模型 AUC 很高,是不是就能说明模型很好了?
正解基因组序列存在高度相似性——同一基因家族的序列、重复元件、同源区域都可能在染色体上重复出现。随机划分会让高度相似的序列同时出现在训练和测试集,模型“记住”了序列模式而非真正理解了生物学规则,导致指标虚高。正确做法是进行“染色体级别”的划分——按染色体分组,确保测试集的序列来自模型从未见过的染色体区域。这就像考试时,题目必须来自学生没做过的练习册,才能测出真实能力。
为何常见:习惯于图像分类的随机划分方式,没意识到基因组数据具有强序列相关性和空间自相关。
面试题
Q1. DNA 序列建模中,One-Hot 编码将每个碱基表示为一个四维向量,其主要优势是什么?
- A.减少数据存储空间
- B.保持碱基之间的距离正交性← 正确答案
- C.自动捕捉碱基的频率信息
- D.引入碱基之间的相似性
答案:B。One-Hot 编码将 A、T、C、G 映射为正交的四维向量,任意两种碱基间的欧氏距离相等,不会引入虚假的数值大小关系。这与“苹果+苹果=香蕉”的荒谬算术不同,避免了模型学到错误归纳偏置。选项 A 错误,One-Hot 反而更占空间;C 和 D 都不是 One-Hot 的特性。
Q2. 在基因组序列建模中,“反向互补增强”的生物学基础是什么?
- A.基因序列在两链上都转录
- B.DNA 双链中两条链都携带遗传信息且互为模板← 正确答案
- C.RNA 聚合酶同时读取两条链
- D.互补链的序列与正链完全相同
答案:B。DNA 是双螺旋结构,一条链的序列可由另一条链通过互补配对(A↔T, C↔G)并反转得到。两条链都携带遗传信息,功能上等价,因此反向互补序列是有效的训练样本。A、C 有误导性,转录通常只发生在一条链上;D 显然错误。
Q3. 为什么 CNN 特别适合捕捉 DNA 序列中的转录因子结合位点?
- A.CNN 能处理任意长度的序列输入
- B.卷积核的尺寸与结合位点的典型长度吻合且具有平移等变性← 正确答案
- C.CNN 天然具有位置编码能力
- D.CNN 能建立序列间长距离依赖
答案:B。转录因子结合位点通常是 6-12bp 的短模体,CNN 卷积核的尺寸恰好可以覆盖这一局部范围;滑动窗口机制使模体无论出现在序列中的哪个位置都能被识别(平移等变性)。A 错误,CNN 卷积层对输入长度限制较严;C 错误,CNN 不内置位置编码;D 是 Transformer 的优势。
Q4. Transformer 的自注意力机制中,为什么要将点积结果除以 $\sqrt{d_k}$?
- A.降低计算复杂度
- B.防止点积过大导致 Softmax 梯度消失← 正确答案
- C.增加模型的非线性表达能力
- D.使注意力权重之和等于 1
答案:B。当向量维度 $d_k$ 较大时,点积的方差也随之增大,会导致 Softmax 落入饱和区,梯度趋近于零。除以 $\sqrt{d_k}$ 将方差稳定在 1 附近,保证梯度正常传播。A 错误,此操作不改变复杂度;C 与非线性无关;D 是 Softmax 的作用。
Q5. 在基因组序列建模中,为什么训练集和测试集应按染色体划分而非随机划分?
- A.减少训练数据量以加速训练
- B.随机划分会导致同源序列泄漏到测试集中,使评估指标虚高← 正确答案
- C.不同染色体的序列长度不一致
- D.模型只能识别特定染色体的模式
答案:B。基因组中存在大量同源序列、重复元件和基因家族序列,随机划分可能让高度相似的序列同时出现在训练和测试集。模型等于“背题”,而非真正学习生物学规则。按染色体划分能迫使模型泛化到未见过的序列区域。C 是数据属性但非原因,D 恰恰是按染色体划分要避免的问题。
Q6. 关于 CNN 和 Transformer 在基因序列建模中的对比,正确的有:
- A.CNN 卷积核适合捕捉局部短模体← 正确答案
- B.Transformer 能建模长距离序列依赖← 正确答案
- C.CNN 在小数据场景下通常比 Transformer 更稳健← 正确答案
- D.Transformer 的计算复杂度与序列长度成线性关系
答案:ABC。A 正确,卷积核尺寸与 DNA 模体长度天然契合;B 正确,自注意力机制让每个位置都能看到全局;C 正确,CNN 参数更少、归纳偏置更强,在小数据下不易过拟合;D 错误,标准 Transformer 的注意力复杂度是 $O(L^2)$。
Q7. 在"CNN+Transformer"混合架构中,CNN 部分的主要作用是什么?
- A.替代位置编码提供序列顺序信息
- B.将局部序列片段转化为高质量的短特征表示← 正确答案
- C.实现注意力权重的可视化
- D.减少训练集数据的冗余
答案:B。混合架构的通常设计是:先用 CNN 对 One-Hot 编码的序列做局部卷积提取模体特征,再将特征序列送入 Transformer 建模远程交互。CNN 在这里充当“特征预处理器”,好比先找出关键词再理解语义。A 错误,位置编码由 Transformer 自身处理;C、D 与架构无关。
Q8. 关于 DNA 序列的数据准备,以下做法正确的有:
- A.正负样本应保持 GC 含量分布相似← 正确答案
- B.反向互补序列的标签应保持不变← 正确答案
- C.数据增强可以引入随机点突变生成更多样本← 正确答案
- D.测试集可以包含训练集序列的直系同源基因
答案:ABC。A 正确,GC 含量差异是常见混淆变量,应匹配控制;B 正确,反向互补序列在生物学上等价,标签不变;C 正确,随机突变增强可提升模型泛化性。D 错误,同源基因序列高度相似,泄漏到测试集会造成指标虚高。
Q9. 人类基因组中,DNA 使用的四种碱基是:
- A.A, U, G, C
- B.A, T, G, C← 正确答案
- C.A, T, G, U
- D.T, U, G, C
答案:B。DNA 使用腺嘌呤(A)、胸腺嘧啶(T)、鸟嘌呤(G)、胞嘧啶(C)四种碱基;RNA 则以尿嘧啶(U)替代胸腺嘧啶(T)。选项 A 和 C 都含 U,是 RNA 的组成;D 缺少 A。
Q10. 在评估基因组序列分类模型时,选用 F1 分数而非仅用准确率的合理场景有:
- A.正负样本类别不平衡时← 正确答案
- B.假阴性(漏检致病突变)的代价远高于假阳性时← 正确答案
- C.所有样本被预测为多数类即可获得高准确率时← 正确答案
- D.测试集完美平衡时
答案:ABC。类别不平衡时准确率会失真——比如 99% 负样本时,全猜负样本就有 99% 准确率,此时 F1 的召回率能暴露问题。假阴性代价高时,F1 能综合衡量模型对正类的识别能力。C 正是准确率失真场景。D 错误,数据集平衡时准确率也有参考价值,F1 的必要性下降。