返回列表

7th place solution

587. Stanford Ribonanza RNA Folding | stanford-ribonanza-rna-folding

开始: 2023-09-07 结束: 2023-12-07 基因组学与生物信息 数据算法赛
第7名解决方案 - Iafoss团队

第7名解决方案

作者:Iafoss(Kaggle Grandmaster)

团队协作者:DrHBslime

竞赛排名:第7名

发布时间:2023年12月8日

投票数:44票

摘要

  • 基于Transformer的解决方案
  • 使用掩码一维卷积替代多层感知机(MLP)
  • 多种bpp融入方式:注入注意力矩阵、基于bpp的token混合、矩阵混合以及双流设置(注意力增强)

引言

我们的团队要感谢竞赛组织者和Kaggle举办这场比赛。同时,我想向杰出的队友@drhabib@martynoveduard致以诚挚的感谢,感谢他们为我们的最终成绩做出的卓越贡献。

详情

数据

碱基配对概率(BPP):我们使用vienna_2(同时使用了二级结构输出)、contrafold_2、rnaformerv1和rnafm生成了额外的bpp。然而,与仅使用主办方提供的bpp相比,改进几乎可以忽略不计。

外部数据(EX数据):我们尝试在此数据上进行微调,因为它是唯一提供序列末端真实标签的数据源。该过程带来了5-10个基点的CV提升(Iafoss/DrHB方法),并且使长距离依赖关系的可视化效果最佳。然而,在序列末端预测值会因未知原因趋近于零。在Private LB上,EX数据未带来任何提升。

交叉验证拆分:slime使用了随机4折拆分。DrHB和Iafoss使用了基于序列相似性的拆分,以避免任何可能的数据泄露,同时排除了与测试集重叠的训练数据。验证集大小约为20k个通过SN标准的样本。

模型

在比赛初期,我们迅速意识到bpp对模型性能非常有帮助。最初,我们尝试将其作为辅助输出,计算为平均注意力矩阵,但收敛相当缓慢(典型的运行需要200-250个epoch)。随后,我们构建了也将bpp作为输入的方案,大幅加速了收敛,仅需数十个epoch即可达到相似的效果。

我们考虑了多种方案:

(1) bpp注入(Iafoss):将bpp(以logit形式)直接添加到注意力矩阵中(对于多个bpp,每个bpp添加到特定头中)。我们在最后几层逐渐将注入衰减至零,让模型有自由发展空间来学习bpp中缺失的相互作用。模型的关键部分是使用掩码1d x5卷积替代MLP,执行邻近token的混合。Transformer宽度为384,头大小为64,深度为24,droppath为0.3,dropout为0.1。我们使用旋转编码来定义token的相对位置。考虑了单bpp和6个bpp的方案。最佳单模型在Private LB上达到0.14375,Public LB为0.14013;使用伪标签后分别为0.14292和0.13973。

(2) bpp混合(DrHB):不再将bpp注入注意力矩阵,而是添加基于bpp执行token混合的矩阵乘法模块。模型总结构:3 × [bpp eterna → 卷积 → transformer → bpp rest均值 → 卷积 → transformer → ss作为邻接 → graph transformer]。

(3) 矩阵混合(slime):遵循上一届竞赛方案,我们添加了由应用于bpp的卷积流和ALIBI式位置编码生成的可学习注意力偏置。使用了2个bpp来源。矩阵混合器由多个带SE模块的卷积层表示。Transformer由12个矩阵混合层和12个常规transformer块组成,宽度为384。最佳单模型在Private LB上达到0.14509,Public LB为0.14066。该模型使用了不同的训练流程,无法直接与其他模型比较。

(4) 双流(Iafoss):矩阵混合的缺点是注意力偏置基于输入bpp独立于transformer更新。那么注意力增强如何?我们对注意力状态进行简单投影,然后使用缩放tanh非线性函数限制累积值并稳定训练。该值被添加到注意力矩阵中,然后结果输入到下一个transformer层。这一改进使模型性能提升至Private LB 0.14296和Public LB 0.13697(单模型)。遗憾的是,我们在比赛结束前几天才发现此方案,没有时间进行多次训练和伪标签流程,我们预计这将进一步提升LB约10个基点。

模型示意图如下:

模型示意图

训练

(Iafoss/DrHB) 损失根据误差加权,我们不基于SN标准筛选数据:w = 1/sqrt(1/6 + err.clip(100))。使用AdamW优化器,带warmup的余弦退火,lr=5e-4,wd=0.05,bs=16(小批量大小效果更好,原因不明)。我们为训练和TTA使用了翻转增强,但关键是使用针对正确核苷酸顺序计算的bpp,这显著提升了CV,带来10-15个基点的提升。我们还使用了基于bin的辅助损失,带来轻微改进。

我们将训练数据分为4折,训练4个模型(40-48个epoch),在外部数据+训练数据上微调(5-6个epoch,EX数据过采样10倍),在去噪样本上微调12个epoch。然后我们根据逆误差校正提供的训练数据权重(GT和PL,假设PL误差为0.15)。提供的训练数据噪声很大,减慢了收敛速度。测试数据和序列末端仅基于PL标记。然后我们在完整训练集(排除验证样本)+测试数据上训练PL模型,在EX数据上微调,在去噪样本上微调。该流程提升了CV 10个基点,所有生成模型的加权平均进一步提升了性能。

(slime) 预训练:首先我们在整个数据集上进行5个epoch的MLM预训练(40%的输入token被替换为掩码token)。使用余弦衰减至零,带1个epoch warmup,AdamW优化器,base_lr=5e-4,wd=0.05。模型通过交叉熵损失训练以预测缺失的核苷酸。

微调:在微调阶段,我们用MLM预训练的权重初始化模型,这对最终结果有显著提升[CV提升10个基点]。我们在SN(DMS)==1或SN(2A3)==1的样本上微调50个epoch,batch_size=16,根据给定测试的SN屏蔽损失[相比筛选SN(DMS)==1和SN(2A3)==1的训练数据集,提升10个基点]。此外,我们根据真实数据提供的反应误差对样本加权:loss *= torch.log(1.1 + snr) / 2。与预训练类似,我们使用AdamW优化器[lr=5e-4, wd=0.05]和余弦调度器将lr衰减至零。由于矩阵混合模型在卷积中未考虑掩码,该模型采用长度匹配的批次采样(精确相同长度的样本)。

最佳单模型和集成

最佳单模型(双流模型):Private LB 0.14292,Public LB 0.13711,本身可进入前10名。如果我们有时间运行完整的PL流程,该结果将进一步提升10个基点至~0.1419。

我们的最终提交结合了约20个模型,在Private LB上达到0.14189,Public LB为0.13604。

未生效的方法

  • EX数据在CV和Public LB上有帮助(5-10个基点提升),但在Private LB上无效
  • 与仅使用主办方提供的单个bpp相比,额外的bpp带来的改进几乎可以忽略不计
  • 在3000万外部RNA序列数据集上的MLM
  • EMA、AWP、Floyd-warshall距离矩阵
  • 2D Ushape模型
同比赛其他方案