返回列表

6th place solution (UPDATED)

402. OpenVaccine: COVID-19 mRNA Vaccine Degradation Prediction | stanford-covid-vaccine

开始: 2020-09-11 结束: 2020-10-06 药物研发 数据算法赛
第6名解决方案 (已更新)

第6名解决方案 (已更新)

作者: nyanp

发布时间: 2020-10-07

比赛排名: 第6名

2020-10-08 14:22 UTC: 第一版写得很匆忙,所以我更新了一些细节。很高兴最终获得了金牌!

模型

我基于以下四种不同的架构,使用不同的损失函数和数据训练了多个版本的模型。

  • 模型 1-a: CNN+GNN (私有榜单 0.35045, 公开榜单 0.24371)
  • 模型 1-b: CNN+GNN+GRU (私有榜单 0.35192, 公开榜单 0.24085)
  • 模型 2: @mrkmakr 优秀 kernel 的修改版
  • 模型 3: @takadaat 优秀 kernel 的修改版

我的“模型 1-a”有点类似于 @kingychiu 的解决方案,这是在思考如何通过配对传播长期相互作用后得出的。以下是我的模型架构:

模型架构图

残差图注意力torch.bmm 和 conv1d 的简单组合。SE-Residual 块与 SE-Resnet 的块相同,只是卷积从 2d 改为了 1d。1d 卷积的核大小很小(3 到 7),以防止过拟合。

class ResidualGraphAttention(nn.Module):
    def __init__(self, ch, dropout):
        super().__init__()

        self.conv = nn.Sequential(
            nn.Conv1d(ch, ch, kernel_size=7, padding=3),
            nn.BatchNorm1d(ch),
            nn.ReLU(),
            nn.Dropout(dropout),
            nn.Conv1d(ch, ch, kernel_size=7, padding=3),
            nn.BatchNorm1d(ch),
            nn.ReLU(),
            nn.Dropout(dropout)
        )
        self.relu = nn.ReLU()

    def forward(self, src, attn):
        """
        :param src: 特征向量. [batch, features, seq]
        :param attn: 注意力矩阵. [batch, seq, seq]
        :return:
        """
        h = self.conv(torch.bmm(src, attn))
        return self.relu(src + h)

最后的 relu 层对应于后处理部分描述的内容。不同模型中的主要和次要 bpps 各不相同,以增加多样性。所有模型都应用了类似 @mrkmakr kernel 的预训练,但我不确定它对私有分数有何影响(预训练完全没有提高公开分数)。

起初我不确定 GRU 和 Transformer 对序列长度变化的鲁棒性如何,所以我专注于 CNN-GNN 建模。后来,我注意到添加 GRU 层在公开 LB 上有一点提升(模型 1-b),所以我开始专注于 GRU 模型,但最终证明第一个模型更好。

数据

  • 用 eternafold 及其 mfe 结构替换原始结构、predicted_loop_type 和 bpps 文件
    • 这给了我很大的提升(公开和私有榜单均提升约 0.005,见我在下面的评论)
    • 基于 mea 的结构没有帮助
  • 将来自 vienna(T=20, 50, 70)、contrafold、rnafold 的 bpps 作为注意力层的额外通道添加

特征

  • bpps 的 max, sum
同比赛其他方案