生信转大模型:序列数据和表格数据不是一回事

发布时间:2026/10/23 18:17:26
生信转大模型:序列数据和表格数据不是一回事

版权与内容来源声明
本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容,均在附表 A 中标注来源;引用官方原文保持原样,不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准,标注「待验证」的部分请以你本地环境实际输出为判断依据。本文不推荐任何不合规的软件获取方式,也不对任何收益结果作承诺。转载请注明出处。

第1章 同一个动作,换了名字

1.1 生信岗每天在做的,是把变长的东西变等长

先交代两个格式。FASTA是一种纯文本序列文件:一行以>开头写标识,后面若干行是碱基或氨基酸字母。FASTQ在序列之外多存一行质量分,也就是测序仪对每个碱基「读得准不准」的打分。

这两个格式有一个共同点:每条记录长度都不一样。一个基因几百个碱基,一条染色体上亿个,一批样本里长短混着来。

而模型要的是形状固定的张量——可以理解成「每一维长度都必须提前写死」的多维表格,第一维是批量,第二维是序列长度,第三维是每个位置的表示。长度不写死,矩阵就拼不起来。

于是每个生信流程里都有同一段代码:读序列 → 决定用什么方式表示 → 拼成矩阵。以前这段代码的输出交给统计检验(差异表达、富集分析、系统发育树),现在交给注意力层(Transformer 里让每个位置去「看」其他位置、按相关程度加权汇总的那一层)。

动作没变,接收方变了。这就是本文要谈的全部内容。

1.2 序列和表格的差别,不在「有没有噪声」

行业文章常把这件事说成「生物数据噪声大、标注贵」。这说法不算错,但没法指导你今天写哪行代码。真正的差别在结构上。

维度注释表(如表达矩阵)序列(如 FASTA 记录)
一行的含义一个基因 / 一个样本一条完整的链
长度列数固定,行数可变每条记录各不同,几十到上亿
顺序行顺序、列顺序都可以打乱位置就是语义,ATG挪到末尾就不是起始密码子
能不能加列能,随便造「表达量 / 长度」这种新特征不能,你只能决定「一个 token 是什么」
缺失有专门的缺失值语义用N这类模糊符号表示「这里读不出来」
切分单位按行切,天然独立按条切会切碎同源关系,切错就泄漏

表格建模的第一步是「选特征」,序列建模的第一步是「定词表」——这是两件不同的事。生信人最容易在这里踩空:你习惯的特征工程在序列上失效,因为你没法凭空加一列,只能改变「一个符号代表几个字符」。

1.3 判据:谁负责把变长变成等长

把上面收成一句可执行的判断:

一段序列喂进模型之前,必须有一段代码负责把它变成等长的数字矩阵。这段代码选了什么,决定了你后面所有工作的上限。

这句话能用来判断三件事:面试时问对方团队「你们怎么处理超过窗口长度的序列」,答不上来的,说明这一层是别人写的;接手一个项目时先找collate_fn或 dataset 类,找不到就说明编码散在业务代码里;自己动手时先定这一层,再谈模型。

第2章 三条路,代价不一样

2.1 一张对照表

先给人话解释。token(词元)是模型真正读进去的最小单位,可以是一个字符、一段几个字符的组合,也可以是一个完整的词;tokenizer(分词器)就是决定「怎么把一串字符切成 token」的那套规则。

路线词表怎么来词表大小token 数能不能保住跨边界基序主要代价
① k-mer 计数 + 词表自己统计所有长度 k 的子串核酸 4 的 k 次方,蛋白 20 的 k 次方长度减 k 加 1,几乎不缩能,只要窗口够长词表随 k 指数膨胀
② one-hot 定长切片符号表定死单符号 4 或 20;k-mer 则是 4 的 k 次方等于长度不能,跨边界的被切断维度乘长度,长序列直接爆
③ 预训练模型自带 tokenizer别人定好的字母表几十个约等于长度取决于你怎么切稀有字符被映射成未知符号

基序(motif)在这里指序列上一段有功能的短片段,比如转录因子结合的位点、酶的识别位点,长度通常几个到二十几个字符。它必须连续存在才有效,被切开两半就什么都不剩。

三条路不是「哪个先进」,而是「你愿意把哪个成本背在身上」。下面逐条说。

2.2 路线①:k-mer 计数,等于自己造一个分词器

k-mer是把相邻 k 个字符当成一个整体来看,长度为 L 的序列会切出 L 减 k 加 1 个这样的片段。统计它们的出现次数,就得到一个向量——这正是 NLP 里词袋的做法,只不过「词」是碱基组合。

这条路在生信里是日常。BLAST 找同源序列的第一步就是拿短「词」去数据库里做精确匹配,NCBI 的官方手册写明蛋白默认词长 3、核酸默认 11,核酸还能往下调到 7(见附表 A)。这个默认值本身就是个提示:k 一直很小,因为词表涨得太快。

fromcollectionsimportCounterdefkmer_counts(seq:str,k:int)->Counter:"""把长度 L 的序列切成 L-k+1 个长度为 k 的词。"""returnCounter(seq[i:i+k]foriinrange(len(seq)-k+1))print(kmer_counts("ACGTACGT",3))# Counter({'ACG': 2, 'CGT': 2, 'GTA': 1, 'TAC': 1})

代价在词表上。核酸 4 种字符,k 取 6 是 4096 个词;蛋白 20 种字符,k 取 4 就是 16 万,k 取 5 是 320 万。如果给每个词配一个 768 维的嵌入向量(把离散符号映射成稠密向量的那张表),蛋白 5-mer 光这张表就要 9.16 GiB——这是本机按词表 × 维度 × 4 字节算出来的(附表 A 有脚本路径)。

还有一处常被误解:k-mer 并不会缩短序列。长度 3000 的序列,逐残基是 3000 个 token,3-mer 是 2998 个,8-mer 是 2993 个,压缩比 0.998。k-mer 压的是「可能出现的模式数」,不是「token 数」。所以它的收益是局部上下文,不是省算力。

2.3 路线②:one-hot 定长切片,维度跟着符号表走

one-hot 编码:一个位置上有几种可能,就用几个格子表示,命中的那格填 1,其余填 0。核酸有 4 种可能,一个碱基就是[1,0,0,0]这样的 4 维向量。

这里有个容易混淆的地方,值得单独说清:one-hot 的维度永远等于「你选的符号表大小」,所以你选什么符号表,代价完全不同。

编码对象单条序列张量(FP32)说明
逐碱基,长度 10 万1.53 MiB维度 4,矩阵本身很小
6-mer,长度 10 万1.53 GiB维度 4096,开始难受
10-mer,长度 10 万390.62 GiB维度 104 万,单条就放不下
蛋白 5-mer,长度 6007.15 GiB600 个残基就 7 GiB

(残基就是蛋白质序列上的一个氨基酸位置,说法等同于「一个字符」。)

所以「one-hot 会爆显存」这句话要分两半说:逐碱基 one-hot 只占 1.53 MiB,不爆;真正爆的是维度乘长度这个乘积,一旦你把符号表换成 k-mer,维度就是 4 的 k 次方,长度乘上去立刻上天。至于逐碱基 one-hot,它的瓶颈不在编码,在下游——注意力矩阵是长度的平方,长度 10 万、单头单批量就要 37.3 GiB。

另一半代价是切片。定长切片的代码几乎人人会写,问题在于边界。

deffull_windows(n:int,w:int,s:int)->list[tuple[int,int]]:"""步长 s、窗口 w,只保留完整落在 [0, n) 内的窗口。"""return[(a,a+w)forainrange(0,n-w+1,s)]defloss_rate(n:int,w:int,s:int,m:int,trials:int,rng)->float:"""在完整窗口覆盖区内随机放 trials 个长度 m 的基序,统计被切断的比例。"""spans=full_windows(n,w,s)p_max=spans[-1][1]-m lost=0forpinrng.integers(0,p_max+1,size=trials):end=int(p)+mifnotany(a<=pandend<=bfora,binspans):lost+=1returnlost/trials

2.4 路线③:预训练模型的自带 tokenizer

主流蛋白语言模型的做法是逐残基一个 token:一个氨基酸一个 token,再额外加几个特殊符号。以 Meta 的 ESM 系列为例,它的开源仓库里写明 token 0 是句首标记、序列里可以带<mask>这种特殊 token(附表 A)。这意味着词表只有几十个,比 20 的 5 次方小五个数量级。

好处很直接:不用自己定词表,也不用担心「k 取几」。坏处也直接:字母表是别人定的,你序列里的稀有符号会被映射成未知标记;长度上限也是别人定的,超了就得切。

这里要纠正一个误解:路线③ 不是免掉编码,而是把「词表怎么定」外包出去了。你要负责的变成「怎么切、怎么补、怎么遮」——恰恰是第 3 章那些问题,一个都没少。

第3章 本机实测:边界与聚合

3.1 怎么测的

项目取值
环境Python 3.13.14、numpy 2.5.2,纯本地,无接口调用
序列固定种子 20261022 生成的合成序列,核酸字母表 ACGT,蛋白字母表 20 种标准氨基酸
规模核酸 20 万碱基、蛋白 2 万残基;切片实验用 40960 长度、窗口 512
随机化每档 2 万到 4 万次随机放置,报告频率而非单次结果
显存算术换算,没有真正申请显存

三条边界先说清:合成序列不含真实物种的重复结构,所以「观测到的词表条目数」只是上限的逼近值;切片实验测的是「被边界切断的频率」,与被切断那段有没有功能无关;显存那一栏是乘法,不是跑出来的。

3.2 切片丢基序:重叠要多少才够

窗口 512、步长等于窗口(也就是不重叠)时,长度 21 的基序有 3.795% 被切断。这个数字看着不大,但它是每一条序列、每一次推理都带着的概率。

基序长度步长重叠碱基实测被切断所需最小重叠
651200.8900%507
2151203.7950%492
21500121.6600%492
21493190.1950%492
21492200.0000%492
21491210.0000%492

规律很干净:只要重叠长度不小于「基序长度减 1」,就不会有任何基序被切断;少 1 个碱基,立刻开始丢(0.1950%)。这不是巧合,是窗口几何决定的——一个基序要跨过边界,它离边界最多 m 减 1 个位置,重叠够长就一定被下一个窗口完整接住。

更要紧的是另一面:重叠很便宜。20 个碱基的重叠只让窗口数量多出不到 4%,代价几乎可以忽略。这条路真正的难点不是成本,而是「你必须先知道 m 有多大」——而基序长度通常未知。所以判据是:

先数一下你关心的最短功能片段有多长,重叠就按那个长度减 1 设;如果连这个都说不出来,就别用不重叠切片。

n,w,m,trials=40_960,512,21,40_000s_ok,s_bad=w-m+1,w-m+2# 重叠恰好 m-1,和少 1 个碱基assertloss_rate(n,w,s_ok,m,trials,rng)==0.0assertloss_rate(n,w,s_bad,m,trials,rng)>0.0

这两行断言在本机跑过(附表 A),输出 PASS。它比一句「记得留重叠」有用,因为它在你的数据上会真的失败。

3.3 one-hot 取平均会丢掉顺序

很多人把序列编码成 one-hot 之后,直接对所有位置取平均,得到一个定长向量拿去检索。这个做法有一个确定的失效场景:组成相同、顺序不同的两条序列,平均之后向量完全一样。

本机结果:核酸的ACGTACGT与TGCATGCA,组成向量余弦相似度1.000000,而 3-mer 频次向量的余弦是0.000000。蛋白的一条 20 残基序列与它的倒序,组成向量余弦同样是1.000000,3-mer 向量是0.055556。

defonehot(seq:str,alphabet:str):idx={c:ifori,cinenumerate(alphabet)}m=np.zeros((len(seq),len(alphabet)),dtype=np.float32)m[np.arange(len(seq)),[idx[c]forcinseq]]=1.0returnm

这条结果不是要否定 one-hot,而是要说明:one-hot 本身不带顺序信息,顺序信息在你怎么聚合。逐位平均是最省事也最丢信息的聚合,它等价于「只保留碱基组成」。想要顺序,就得让向量里出现「相邻关系」——要么换成 k-mer,要么上一个会看上下文的模型。

第4章 你原来的三样本事,能直接用

4.1 一张能力对照表

先说结论:生信背景在转大模型时,真正值钱的不是「懂生物」,是三样很硬的手艺。

旧技能在新岗位对应什么直接能用的部分会失效的部分
统计检验评测设计与置信区间知道小样本上的提升不算提升,知道要看分布不只看均值「显著性过了就能交付」的验收习惯
流程编排数据管道与训练脚本幂等、可重跑、中间产物落盘、失败可续跑单机脚本思维,缺分布式与显存概念
数据质控训练集卫生先量脏数据比例再决定清不清洗只清洗不追溯,缺「清洗改动了多少分布」的记录

4.2 统计直觉:从「p 值」到「别被三条样本骗了」

生信分析里最常见的动作是比较两组、看差异是否显著。这套直觉搬到模型评测上几乎不用改:你要判断的是「新方法和旧方法的差别,是不是比同一方法重复跑几次的波动更大」。

真正要改的是验收方式:统计检验的终点是一张表,模型评测的终点必须是一条会失败的断言,比如「同一批固定查询上,同家族召回不低于基线」。前者给人看,后者给流水线看。

4.3 流程编排:你写过的 DAG,就是今天要写的 pipeline

跑过 Snakemake 或 Nextflow 的人,脑子里天然有一个有向无环图:每个步骤声明输入输出文件,不存在就重算,存在就跳过。这正是训练脚本最缺的——多数人第一次写训练脚本,预处理、编码、训练、评测全塞在一个文件里,改一行就得从头跑。

搬运的时候有个具体动作:把「编码」单独拆成一个产出文件的步骤。原始序列读一次、编码一次、落盘成数组,后面调模型只读数组。这一步能省掉大量重复计算,也让「换了编码方式」变成可对比的实验,而不是重跑整条链。

4.4 数据质控:FASTQ 的质量分,对应语料的去重

生信人对「低质量数据必须先过滤」有肌肉记忆:质量分低于阈值的裁掉、接头污染切掉、重复序列标记。搬到语料侧,对应的是长度过滤、去重、毒性过滤。

两者共享同一条判据,也是最值得带走的习惯:先量一下脏数据的比例,再决定要不要清洗。不做这一步,清洗就是凭感觉调阈值;做完才知道阈值该定在哪、清洗后分布偏移了多少。

第5章 要补的三件事

5.1 张量化与批处理:变长怎么塞进一个 batch

这是最容易被低估的一关。一个 batch 里序列长度不同,矩阵拼不起来,标准做法是补齐(padding):把所有序列补到 batch 内最长的长度,短的空位填 0。

补齐带来一个新问题:那些补出来的 0,模型不该看见。所以要同时给一张掩码(mask),逐位置告诉注意力层「这一格是假的,别加权」。漏了掩码,模型会把补齐区当成真实序列来读,短序列的结果会被系统性污染——而且不报错。

两个能立刻用的技巧:按长度排序再组 batch,能减少补齐比例;把长度分桶,每桶内部自成一个 batch。

5.2 评测:同源泄漏比过拟合更隐蔽

生信人对这件事其实很熟。同源泄漏指测试集里出现与训练集高度相似的序列,模型不是学会规律,是背过答案。序列比对里做去冗余(按相似度聚类、每簇留代表)就是为了避免这件事。

判据只有一条,但很硬:切分必须按「家族」切,不能按「条目」切。同一个家族的序列只能整体落在训练侧或测试侧。按条目随机切,测试分数会好看得多,上线就掉——因为真实查询往往正是训练集里的近亲。

5.3 工程:缓存、显存、可续跑

三件小事,缺一件就会在最忙的时候卡住。缓存:编码结果落盘,按序列标识做键,重复序列不重复算。显存:序列长度在注意力里是平方项,长度翻倍、显存四倍,这个账要在选窗口大小时就算。可续跑:长任务必须能从中断处继续,靠的是分片产出加已完成清单,而不是「再跑一遍」。

这份资料是什么:一份从私有化部署讲到 RAG 与 Agent 编排的视频课目录,其中数据处理与 Embedding 那一模块,讲的正是「把原始数据变成向量再入库」这条链路。第 5 章这三件事都在这条链路上。放在资料包里,扫码即可获取:

第6章 最小闭环:序列到向量到检索

6.1 交付物长什么样

面试或转岗时,「我做过序列建模」这句话没有说服力,「我有一个能跑通的检索脚本,输入 FASTA 输出最相似的前几条」才有。最小闭环只需要五步:读序列 → 编码 → 归一化 → 算相似度 → 返回排序结果。

值得强调的取舍是:闭环里不要放模型。先用 k-mer 频次向量跑通全流程,你得到的是一个可复现的基线;等基线稳了,再把编码那一步换成预训练模型的输出,两者可以直接对比。一开始就上模型,出了问题分不清是编码、是切分、还是模型本身。

defkmer_vector(seq:str,k:int,alphabet:str):"""k-mer 频次向量,维度 = 字母表大小^k,L2 归一化。"""idx={c:ifori,cinenumerate(alphabet)}v=np.zeros(len(alphabet)**k,dtype=np.float32)foriinrange(len(seq)-k+1):code=0forchinseq[i:i+k]:code=code*len(alphabet)+idx[ch]v[code]+=1.0returnv/(np.linalg.norm(v)+1e-12)deftop1(vectors):"""按余弦相似度取最近邻,跳过自己。"""sim=vectors @ vectors.T np.fill_diagonal(sim,-1.0)returnsim.argmax(axis=1)

6.2 在什么数据上验证

本机用一个刻意做小的样本:25 条蛋白序列、5 个同源家族(其中第 5 个是第 1 个原型的倒序版本)、每条 60 个残基、家族内成员按 10% 的位置随机突变。3-mer 频次向量 8000 维,同家族命中25/25,构建耗时 1.9 ms;换成 20 维的组成向量,同样 25/25,耗时 0.7 ms。

这组数字要如实读:两种向量在这个任务上打平,说明「同源检索」对编码方式并不挑。分水岭在 3.3 那个场景——组成相同、顺序不同时,组成向量直接失效。所以选编码方式不该看「谁在这个任务上分高」,该看「我的查询里有没有顺序敏感的样本」。

6.3 验收怎么写

三条,按顺序检查:一是可复现,固定种子、固定输入,两次跑出相同结果;二是可对比,换编码方式只改一个函数,其余不动;三是有失败判据,准备一组「必须命中」和一组「必须不命中」的查询,跑不过就不算完成。

第7章 落地顺序与停手线

7.1 五步,顺序别调

第一步:定符号表。先回答「一个 token 是什么」,是单碱基、k-mer,还是模型自带的字母表。这一层定了,后面才谈得上调参。

第二步:定切分与重叠。先数最短功能片段有多长,重叠按「该长度减 1」设;说不出来就先做不重叠版本,但要在文档里写明这个风险。

第三步:跑通无模型的闭环。k-mer 或 one-hot 都行,目标是拿到一条能复现的基线。

第四步:换成预训练模型输出。只换编码那一步,其余不动,直接和基线比。

第五步:把评测写成断言。固定查询集、按家族切分、同家族召回有下限。

7.2 什么时候不该自己训

三个信号,出现任何一个就该停:评测集做不出来——你没法构造一组可信的正负样本,训了也不知道好坏;数据量和任务不匹配——几十条序列去训一个 Transformer,不如用现成的蛋白语言模型做特征提取;算力账算不过来——序列长度是平方项,先把窗口调小、把批量调小,再谈训练。

反过来说,有两件事几乎总是值得做:用现成模型抽特征接一个简单分类器,以及把编码与切分管线工程化。这两件事的投入产出比,比从头训一个模型高得多。

7.3 停手线

  • 切片不重叠,且说不出最短功能片段多长——停手,先把这个数字找到。
  • 序列编码直接取平均,然后拿去算相似度——停手,先确认你的查询是否顺序敏感。
  • 按条目随机切训练测试集——停手,改成按家族切。
  • 补齐区忘了加掩码,且结果「看起来还行」——停手,这个错不会报错。
  • 一开始就上预训练模型,没有无模型基线——停手,出问题你分不清是哪一层。

7.4 一句话

序列建模里,编码方式选错,后面调参都是白调。这句话对生信出身的人尤其要紧:你原来的手艺(统计、编排、质控)一样没浪费,但「把序列变成矩阵」这一步的判据,得按新岗位的规矩重写一遍。

这份资料是什么:一份大模型学习路线图,把「先定数据怎么进模型、再谈模型怎么选」这个顺序讲得比较清楚,适合用来对着自查转岗时缺的是哪一层。放在资料包里,扫码即可获取:

附表 A:本文引用事实与出处对照表

事实出处本文位置
环境为 Python 3.13.14、numpy 2.5.2,纯本地无接口调用;序列由种子 20261022 生成,核酸字母表 ACGT、蛋白字母表 20 种标准氨基酸本机实测(work/2026-10-22-06_序列编码实测.py / .log),日志第 1 至 2 行3.1
不重叠切片(窗口 512、基序长度 21)实测切断比例 3.7950%;步长 500 为 1.6600%;步长 493 为 0.1950%;步长 492 及以下为 0.0000%同上日志「实验二」表3.2
基序长度 6、不重叠切片时切断比例 0.8900%同上日志「实验二」表第 1 行3.2
判据「重叠不小于基序长度减 1 时无丢失」经断言验证通过(重叠 20 为 0.0000%,重叠 19 为 0.1900%)同上日志「实验七」,断言r_ok == 0.0与r_bad > 0.0均通过3.2
核酸 k=3 至 6 的词表上限为 64、256、1024、4096,20 万碱基合成序列上观测到 64、256、1024、4096(k≤6 已饱和)同上日志「实验一」表2.2
蛋白 k=3 至 5 的词表上限为 8000、160000、3200000;2 万残基合成序列上观测到 7326 与 18808同上日志「实验一」表2.2
嵌入表按「词表 × 维度 × 4 字节(FP32)」换算:蛋白 5-mer 配 768 维为 9.16 GiB,蛋白 4-mer 为 0.46 GiB,核酸 10-mer 配 128 维为 0.50 GiB同上日志「实验一」嵌入表段2.2、2.3
长度 3000 的序列:逐残基 3000 token、3-mer 2998、8-mer 2993,压缩比 0.998同上日志「实验三」表2.2
单条序列 one-hot 张量(FP32):逐碱基 10 万长为 1.53 MiB,6-mer 为 1.53 GiB,10-mer 为 390.62 GiB,蛋白 5-mer 长 600 为 7.15 GiB同上日志「实验六」表2.3
注意力矩阵按「批量 × 头数 × 长度 × 长度 × 4 字节」换算:单批量单头长度 10 万为 37.3 GiB;批量 32、12 头、长度 3000 为 12.9 GiB同上日志「实验六」注意力段,算术换算,未真正申请显存2.3
组成相同、顺序不同的两条序列:核酸ACGTACGT与TGCATGCA的组成向量余弦 1.000000、3-mer 向量余弦 0.000000;蛋白 20 残基序列与其倒序组成向量余弦 1.000000、3-mer 向量余弦 0.055556同上日志「实验四」表3.3
25 条蛋白序列、5 个同源家族(第 5 个为第 1 个原型倒序)、每条 60 残基、10% 位点突变;3-mer 8000 维同家族命中 25/25、构建 1.9 ms;20 维组成向量同为 25/25、0.7 ms同上日志「实验五」段6.2
FASTA 定义行必须以大于号开头,标识不加空格;序列可折行,建议每行不超过 80 字符;不确定字符用N表示NCBI《FASTA Format for Nucleotide Sequences》,https://www.ncbi.nlm.nih.gov/genbank/fastaformat/ (2026-10-22 直连抓取)1.1、1.2
SeqIO.parse()返回迭代器、逐条给出SeqRecord;FASTA 的换行方式任意,解析出的记录相同,Biopython 输出默认按 60 字符折行;超大文件可用SimpleFastaParser直接拿两个字符串Biopython 1.88 Tutorial and Cookbook 第 5 章「Sequence Input/Output」,https://biopython.org/docs/latest/Tutorial/chapter_seqio.html (2026-10-22 直连抓取)1.1
BLAST 取「词」长度:蛋白默认 3、核酸默认 11,核酸可下调至最低 7;一条长度 L 的查询最多产生 L 减 w 加 1 个词NCBI《BLAST Command Line Applications User Manual》附录 C(word_size:blastp 默认 3、有效 2 至 7);NCBI《BLAST Program Selection Guide》(blastn 默认 11、最低 7);PMC138974(w 为 3 与 11,最多 L-w+1 个词)。检索核验:books 页面直连遇人机验证,取 PDF 摘录与 PMC 正文2.2
Meta ESM 开源仓库:token 0 固定为句首标记,序列可含<mask>特殊 token,2021 年 8 月为 tokenizer 增加空格与特殊 token 支持fair-esm 官方仓库 README,https://github.com/facebookresearch/esm (2026-10-22 直连抓取)2.4
ESM-2 词表为 33 个 token(20 种标准氨基酸加特殊符号),上下文长度为 1026 token待验证:直连 huggingface.co 的模型卡与 raw README 均失败,仅取到第三方站点转载的模型卡元数据(savrn.com、inferencebench.io),未经官方页面复核,故正文只写「几十个」2.4
「重叠不小于基序长度减 1 即无丢失」的推导、以及「k-mer 不缩短 token 数」的结论本文归纳,依据为上列本机实测与窗口几何,非引用原文2.2、3.2

说明:所有比例、耗时、字节数照抄work/2026-10-22-06_序列编码实测.log;显存一项为乘法换算,脚本中没有申请显存,不能当作硬件实测。

附表 B:术语速查表

术语一句话解释在本文哪里用到
FASTA纯文本序列文件,一行用大于号写标识,后面若干行写序列1.1
FASTQ在序列之外多存一行测序质量分的格式1.1
张量每一维长度都必须提前写死的多维数组,模型实际吃的就是它1.1
注意力层让每个位置按相关程度去看其他位置并加权汇总的那一层1.1
token模型真正读进去的最小单位,可以是一个字符也可以是一段字符2.1
tokenizer决定「一串字符怎么切成 token」的规则2.1
基序序列上一段有功能的短片段,必须连续存在才有效2.1
k-mer把相邻 k 个字符当成一个整体来统计的片段2.2
嵌入表把离散符号映射成稠密向量的那张查找表2.2
one-hot有几种可能就用几维,命中位填 1、其余填 02.3
残基蛋白质序列上的一个氨基酸位置,等同于「一个字符」2.3
补齐与掩码短序列补到同长以便组批,再用掩码标出哪些位置是假的5.1
同源泄漏测试集里混进了与训练集高度相似的样本,分数虚高5.2

写在最后:这篇用到的资料

写这篇文章时,把相关的官方文档和源码又翻了一遍,顺手也整理了几份配套的东西:

  • 大模型学习路线图:从零基础到能自己动手做 Agent,按阶段说明每一步该学什么、哪些可以先跳过
  • 《LangChain + LangGraph + MCP 智能体开发实战》视频课:7 个模块,从私有化部署、Embedding+RAG 到 MCP+Agent 全流程
  • AI 大模型知识库(在线可查):Agent Skills 从入门到落地、Claude Skills 完全指南等专题,按目录浏览即可
  • 640 套 AI 大模型行业报告 + 经典 PDF 书籍:看行业落地案例和别人怎么做的时候用得上
  • 大模型零基础到精通教学视频:跟着敲一遍,比只读文档快得多

资料是我自己整理的,放在下面这个码上,扫码即可获取:






添加时备注「AI」,优先通过。

资料按「先路线、再动手、最后查漏」的顺序整理好了,建议先看学习路线那一份,照着它挑一条适合自己当前基础的路径再往下看。