返回列表

11th Lightweight Single Architecture [Conv-GCN]-> RNN

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

开始: 2020-09-11 结束: 2020-10-06 药物研发 数据算法赛
第11名 轻量级单一架构 [Conv-GCN]-> RNN

第11名 轻量级单一架构 [Conv-GCN]-> RNN

作者: Anthony Chiu, Fatih Öztürk, Emin Ozturk
比赛: Stanford COVID- Vaccine

简介

在比赛结束前一周,我们就在排行榜(LB)第二名使用这种轻量级架构。它的速度比 @mrkmakr 分享的方案快大约 2 倍甚至 3 倍。顺便提一下,@mrkmakr 当时确实公开了进入金牌区的秘密。

核心思想

考虑到序列位置之间的依赖关系,我们如何将信息从一个序列位置传递到另一个位置?

将信息从位置 i 传递到 j

模型示意图

如上图所示,我们的模型通过 3 个步骤实现这一点:

  1. 使用 1D Conv(一维卷积)收集局部信息。
  2. 通过跨越序列维度的 Paired/Skip connections(配对/跳跃连接)传递远程信息。
  3. 再次使用 1D Conv 收集局部信息。

最后,通过双向 RNN 将信息推向更远的范围。

代码笔记本

这是关于该解决方案的笔记本,请注意这是一个简化版本,主要移除了一些融合和优化部分。

https://www.kaggle.com/kingychiu/mrna-base-degradation-keras-cnn-gcn-rnn

模型

卷积步骤 (1+2+3),其中 GraphConv 仅仅是一个点积,用于计算可学习权重 + 过滤器,代码参考自:
Spektral GraphConv 源码链接

    def conv_block(x):
        conv = tf.keras.layers.Conv1D(hidden_dim*2, 5, 
                                  padding='same',
                                  activation='tanh')(x)
        gcn = GraphConv(
            graph_channels,
        )([conv, As_in])

        gcn_2 = GraphConv(
            graph_channels,
        )([conv, bpp_inputs])
        
        gcn = tf.keras.layers.Conv1D(graph_channels, 5, 
                                  padding='same',
                                  activation='tanh',
                                 )(gcn)

        conv = tf.keras.layers.Concatenate()([conv, gcn, gcn_2]) 
        
        conv = tf.keras.layers.Activation("relu")(conv)
        conv = tf.keras.layers.SpatialDropout1D(0.1)(conv)
        return conv

结合 RNN 的代码:

    hidden = conv_block(reshaped)
    hidden = gru_layer(hidden_dim, dropout)(hidden)
    hidden = conv_block(hidden)
    hidden = gru_layer(hidden_dim, dropout)(hidden)

致谢

  1. 感谢 @its7171 在此笔记本中提供的可靠验证方案:
    GRU-LSTM with feature engineering and augmentation
同比赛其他方案