402. OpenVaccine: COVID-19 mRNA Vaccine Degradation Prediction | stanford-covid-vaccine
2020-10-08 14:22 UTC: 第一版写得很匆忙,所以我更新了一些细节。很高兴最终获得了金牌!
我基于以下四种不同的架构,使用不同的损失函数和数据训练了多个版本的模型。
我的“模型 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 模型,但最终证明第一个模型更好。