4. 词向量与浅层序列嵌入
在把蛋白序列送入下游模型之前,最基础也最常被低估的一步,是把离散的氨基酸字符变成稠密向量。词向量方法原本来自自然语言处理,但蛋白序列与自然语言有一个关键相似点:局部上下文决定语义。一个残基的功能倾向,往往由它前后若干残基共同决定。因此,Word2Vec、GloVe、FastText 这类浅层嵌入方法可以直接迁移到蛋白序列上,形成“残基级”或“k-mer 级”的向量表示。
本节不讨论复杂预训练语言模型,而是聚焦最轻量、最容易复现的一类方案:把每条蛋白序列当作一个“句子”,把每个氨基酸或 k-mer 当作一个“词”,用滑动窗口构造共现关系,再训练出每个 token 的向量。理解这条链路,是后续判断嵌入质量、选择窗口、决定是否升级到更深模型的基础。
一、三种方法的定位差异
Word2Vec 有两种训练目标:Skip-gram 用中心词预测上下文,CBOW 用上下文预测中心词。蛋白序列通常残基种类只有 20 种左右,数据量相对 NLP 小,因此 Skip-gram 更常用,因为它对低频 token 更友好。它的核心是“共现即相似”:如果两个残基经常出现在相似上下文中,它们的向量就会靠近。
GloVe 不直接做预测,而是先统计全局共现矩阵,再对矩阵做加权最小二乘分解。它更强调全局统计,适合共现结构稳定、序列数量较大的场景。对蛋白而言,GloVe 的优势是训练结果可解释性较强,向量点积近似共现概率比值的对数。
FastText 在 Word2Vec 基础上引入子词(subword)思想。对蛋白序列,可以把一个残基或 k-mer 拆成更短的字符 n-gram,例如把三肽 “ACD” 拆成 “A”“C”“D”“AC”“CD”“ACD”。这样即使某个 k-mer 在训练集中出现次数很少,它的向量仍可由子词向量组合得到,缓解未登录词问题。对蛋白而言,这尤其适合处理稀有 motif 或突变位点。
二、训练流程:从 FASTA 到向量表
假设我们有一份去重后的蛋白序列 FASTA 文件,目标是训练 128 维残基向量。一个可复现的流程如下。
第一步是序列清洗。去掉长度过短(如小于 30 aa)的片段,去掉含大量 X、B、Z 等非标准残基的序列,避免噪声 token 污染共现统计。若做 k-mer 嵌入,还要决定 k 的取值,常用 k=3,因为三肽足以覆盖局部构象倾向,又不至于组合爆炸。
第二步是构造语料。残基级直接把每条序列写成空格分隔的 token 串;k-mer 级则用步长 1 滑窗切分,例如序列 “MKT AYI” 在 k=3 时得到 “MKT”“KTA”“TAY”“AYI”。每条序列仍保持独立,不跨序列拼接,否则会引入虚假的序列边界共现。
第三步是设置窗口。Word2Vec 的 window 参数决定中心 token 左右各取多少个 token 作为上下文。对蛋白序列,window=3 到 7 是常见起点。窗口太小,只能学到相邻残基的局部偏好;窗口太大,会把不同二级结构片段甚至不同结构域的残基强行拉进同一上下文,稀释信号。实际做法是固定其他参数,分别训练 window=3、5、7 三组向量,再用下游任务比较。
第四步是训练与超参数。以 Skip-gram 为例,常用配置为:vector_size=128,min_count=5,sg=1,negative=5,epochs=10,learning_rate 从 0.025 线性衰减到 0.0001。min_count 用于过滤极低频 token,避免为只出现一两次的 k-mer 分配不可靠向量。FastText 则额外设置 min_n=2、max_n=5,让子词参与训练。
# 以 gensim 为例的残基级 Skip-gram 训练片段(示例参数)
from gensim.models import Word2Vec
sentences = [list(seq) for seq in protein_sequences] # 每条序列一个 token 列表
model = Word2Vec(
sentences=sentences,
vector_size=128,
window=5,
min_count=5,
sg=1, # 1 表示 Skip-gram
negative=5,
epochs=10,
workers=8,
seed=42
)
model.wv.save_word2vec_format("protein_residue_w5.vec")
训练完成后,得到的是一个“token → 128 维向量”的查找表。下游使用时,可以把一条序列的所有残基向量做平均池化,得到整条序列的定长表示;也可以保留序列矩阵,送入 CNN 或 BiLSTM 做更细粒度的建模。
三、窗口选择:不是越大越好
窗口的本质,是定义“多大范围内的残基算作彼此相关”。在蛋白中,这个范围与结构层级直接对应。window=1 到 2 主要反映相邻残基的局部偏好,适合捕捉二级结构倾向;window=3 到 5 能覆盖一个短螺旋或一个转角附近的残基;window=7 以上开始跨越更远的序列距离,可能引入三级接触信息,但也更容易混入无关片段。
一个实用的判断方法是:先看下游任务类型。如果任务是残基级分类,如结合位点预测、二硫键预测,窗口不宜过大,3 到 5 通常更稳;如果任务是序列级分类,如家族归类、亚细胞定位,窗口可以稍大,5 到 7 有助于聚合更全局的上下文。若数据量很小,窗口应偏小,否则共现矩阵过于稀疏,向量估计方差大。
四、嵌入质量评估:四类可操作信号
训练出向量后,不能只看损失下降就认为嵌入可用。对蛋白浅层嵌入,建议从以下四个角度评估。
第一,相似性检查。取若干已知功能相关的残基或 k-mer,计算其余弦相似度。例如,催化位点附近的残基向量是否比随机残基更接近;同一家族蛋白的序列平均向量是否比跨家族更相似。若相似性排序与生物学预期明显不符,说明窗口或语料有问题。
第二,类比关系检查。词向量中经典的“king - man + woman ≈ queen”在蛋白中可类比为“残基 A 的向量 - 残基 B 的向量 + 残基 C 的向量 ≈ 与 C 具有类似替换关系的残基 D”。这类检查不追求绝对精确,而是看最近邻是否落在合理的理化性质类别中。
第三,下游任务验证。这是最可靠的信号。把嵌入固定,接一个简单分类器(如逻辑回归或浅层 CNN),在标准数据集上比较不同窗口、不同方法的 F1 或 AUC。若 Word2Vec 与 FastText 差距很小,说明稀有 token 不是瓶颈;若 FastText 明显更好,说明子词信息确实有帮助。
第四,稳定性检查。用不同随机种子重复训练,观察同一 token 的向量余弦相似度是否稳定。若种子一变,向量就大幅漂移,说明训练不充分或语料太小,此时应增加数据量、降低维度或增大 min_count。
五、方法选择与常见误区
三种方法没有绝对优劣。数据量大、追求全局统计稳定性时,GloVe 值得尝试;数据量中等、希望快速得到可用向量时,Word2Vec Skip-gram 是稳妥起点;存在大量稀有 k-mer 或需要处理突变引入的新 token 时,FastText 的子词机制更有优势。