Instructions to use RomanCohort/RNAQwen with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use RomanCohort/RNAQwen with Transformers:
# pip install -U transformers accelerate # Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("RomanCohort/RNAQwen", device_map="auto") - Notebooks
- Google Colab
- Kaggle
RNAQwen
状态:研究进行中 —— 本仓库当前没有训练好的权重。 本页描述的是方法与本仓库放出的数据/代码。
0. 这个项目现在是什么
不是 RNA-GPT 的复现了。 我们一开始是照 RNA-GPT(NeurIPS 2024 MLSB Workshop)做的, 过程中把它那条"冻结 LLM + 一个线性投影层学模态对齐"的路线用测量证伪了,随后转向。
转向的证据、失败记录、方法论约定全部保留在 PLAN_v2.md 与 PROGRESS.md 里 —— 包括我们自己的错。
(其中两个指标设计错误差点导致一次假的成功结论,原文都在。)
1. 构型
冻结 可训练 冻结 + LoRA
┌──────────┐ ┌─────────────┐ ┌────────┐ ┌──────────┐ ┌─────────────────┐
│ RNA 序列 │──▶│ ERNIE-RNA │──▶│ FSQ │─▶│ 码embed │─▶│ Qwen3-8B │
│ ≤1024 nt │ │ 768维/位点 │ │4096 码 │ │4096×4096 │ │ 文本问答 │
└──────────┘ └─────────────┘ └────────┘ └──────────┘ └─────────────────┘
① ② ③ ④
没有投影层把 768 维硬压到 4096 维。 RNA 不再被"翻译"进 LLM 的向量空间,而是被 离散化成 LLM 词表里的一批条目,让 LLM 把它当普通 token 处理。
| 环节 | 是什么 | 参数量 |
|---|---|---|
| ① 编码器 | ERNIE-RNA,768 维,全程冻结 | 0(冻结) |
| ② 压缩码表 | 线性降到 12 维 → FSQ 2 级量化 → 4096 个离散码,相当于"RNA 自己的 tokenizer" | ~16.8M |
| ③ 码 → 向量 | 4096×4096 可训练 embedding;RNA 位置不过 BPE,直接用 inputs_embeds |
16.8M |
| ④ 对齐 | 底座冻结 + LoRA(attn) + 码表可训练 | 7.67M (LoRA) |
选 FSQ 而不是学习式码本,是因为学习式码本天然塌缩,FSQ 从构造上不会。 选 4096 而不是 65536,是实测出来的(65536 那档只有 4.5 个位点/码、39.7% 的码只出现一次; 4096 是 31.4 个位点/码、中位重用 12 次、90.2% 利用率)。
2. 判据链 —— 每一关都是一个能证伪的数,不是 loss
loss 降下来也可能只是模型学会了忽略 RNA 直接编答案。 所以我们不接受 loss 作为判据。
| 关 | 判据 | 阈值 | 现有值 |
|---|---|---|---|
| ② | 跨序列 6-mer 迁移倍数 | ≥ 2.0x | 1500 条上 2.88x |
| ④ | vs 随机表 / vs 常数码的负 Δlogp 比例 | < 45% | 待跑 |
为什么重建误差和利用率都不算数。 重建是循环的(码表就是照它训的);利用率在词表远小于 样本数时必然好看(哈希也能给出 90%)。唯一非循环的判据是:在没见过的序列上, 同一个码是否指向同一类局部 6-mer —— 靶子来自输入序列本身,不是编码器学出来的。
逐 token 消融(Δlogp = logp_real − logp_ablated)三个对照缺一不可:
vs 零表 低 => RNA 位置上「有东西」在起作用
vs 随机表 低 => 起作用的是**码的内容**
vs 常数码 低 => 起作用的是**码的区分度**
后两个 ≈50% 就是「语言模型眼里的 RNA 是乱码」,只是换了个形式。
对照臂(冻结投影 + 软提示,即原路线)已训完,其 per-token 负 Δlogp 为 **58.4%**。
3. 数据
由 RNAcentral "Lit Scan" 子集重建(原论文描述为约 420,000 条 RNA,≤1024 nt,取 407,616 条; 本仓库为其中 4,481 条 RNA / 92,680 条问答,约为论文报数所用 5K/121K 子集的 90% / 77%)。
| 文件 | 内容 | 大小 |
|---|---|---|
data/rnaqa_n6_merged.jsonl |
4,481 RNA / 92,680 QA。字段:sequence qa[{question,answer,kind,source,variant}] annotation rna_type organism uid |
52 MB |
data/evalset_merged/ |
train 3,552 / val 441 / test 488,K=20 划分 | 20 MB |
data/pretrain_rna.jsonl |
149,598 条序列,供继续预训练用 | 56 MB |
问答由 DeepSeek 生成,标注由 RNAcentral 的文献摘要汇总而来;qa[].kind 区分
open_ended(47,779)与 closed(44,901),qa[].source 区分 ais(45,821)与 dc(46,859)。
划分的注意点:evalset_merged/ 的 train/val/test 之间确实存在同源序列
(11,744 个跨划分的 20-mer 重叠,涉及 292 条记录)。这是有意保留的,不要把它当作
无泄漏基准来引用。
4. 本仓库放出了什么
- ✅ 代码:
scripts/(数据构建、编码器校验、FSQ 训练、消融评测)、src/rnaqwen/ - ✅ 数据:上表三个文件
- ✅ 研究记录:
PLAN_v2.md(当前方案 + 失败记录)、PROGRESS.md(逐日日志)、reports/*.json(各项测量的原始结果) - ❌ 权重:尚无。截至本页更新时,路线 C 尚在验证阶段,未产出可发布的模型
5. 复现环境
Windows / AMD gfx1151(APU,无独立显存),PyTorch 2.12.0a0+rocm7.13.0a20260313,
ERNIE-RNA 作为 RNA 编码器,Qwen3-8B 作为语言底座。
python scripts/48_stage1_full_tokenizer.py # 第一阶段:全量压缩码表
python scripts/46_fsq_code_transfer.py # 判据 ②:跨序列 6-mer 迁移
python scripts/47_routeC_short_sft.py # 判据 ④:逐 token 消融
6. 引用
本项目未发表。相关工作:
- RNA-GPT — arXiv
2411.08900(我们起点,非当前方案) - MAPO — 跨模态互信息的逐 token 度量(我们的消融仪器来自这里)
- RiboSphere — RNA + FSQ 的量化方案
- ProVQ — "Premature Discretization" 的命名与量化课程
- DPLM-2 — 生物模态离散 token + 语言模型建模的先例
7. 诚实声明
PLAN_v2.md 里保留了我们被自己证伪的假设和设计错误的指标。这个方向尚未验证成功;
判据 ④ 还没有跑出可信结果。请据此评估本仓库的成熟度。