Datawhale AI 夏令营生命科学方向Task2学习笔记

RNN模型的使用

注意

        为了确保模型的正确学习与训练,RNN模型的输入一般保持每个样本长度一致,在官方Baseline中使用填充的方法来保证样本长度一致,Baseline中通过如下代码的操作,在事先算出一个所有序列编码后的最大长度后,对样本进行了补‘0’的操作,即为填充。

        查阅相关资料后,实现使输入序列等长的操作还有截断 、变长输入、批处理的变长序列等,在最近的学习中,填充较为常见。

RNN模型分析

class SiRNAModel(nn.Module):
    def __init__(self, vocab_size, embed_dim=200, hidden_dim=256, n_layers=3, dropout=0.5):
        super(SiRNAModel, self).__init__()
        
        # 初始化嵌入层
        self.embedding = nn.Embedding(vocab_size, embed_dim, padding_idx=0)
        # 初始化GRU层
        self.gru = nn.GRU(embed_dim, hidden_dim, n_layers, bidirectional=True, batch_first=True, dropout=dropout)
        # 初始化全连接层
        self.fc = nn.Linear(hidden_dim * 4, 1)  # hidden_dim * 4 因为GRU是双向的,有n_layers层
        # 初始化Dropout层
        self.dropout = nn.Dropout(dropout)
    
    def forward(self, x):
        # 将输入序列传入嵌入层
        embedded = [self.embedding(seq) for seq in x]
        outputs = []
        
        # 对每个嵌入的序列进行处理
        for embed in embedded:
            x, _ = self.gru(embed)  # 传入GRU层
            x = self.dropout(x[:, -1, :])  # 取最后一个隐藏状态,并进行dropout处理
            outputs.append(x)
        
        # 将所有序列的输出拼接起来
        x = torch.cat(outputs, dim=1)
        # 传入全连接层
        x = self.fc(x)
        # 返回结果
        return x.squeeze()

        上述RNN模型基于GRU构建,首先对索引进行了embedding,对于embedding,其能够将每个高维的稀疏表示转换为低维的密集向量表示,即在一个连续的向量空间中表示对象,这样做的目的是使相近的对象彼此接近,从而使得离散的对象变得稠密,有助于提高计算效率。

        RNN模型能够记住之前的数据,利用之前的数据来分析下一次的结果,但RNN模型依旧有不小的问题:

  • 长期依赖问题:RNN 难以记住和利用很久以前的信息。这是因为在长序列中,随着时间步的增加,早期的信息会逐渐被后来的信息覆盖或淡化。

  • 梯度消失和爆炸问题:在反向传播过程中,RNN 的梯度可能会变得非常小(梯度消失)或非常大(梯度爆炸),这会导致训练过程变得困难。

        为了解决这些问题,研究人员引入了LSTM(长短期记忆网络)GRU(门控循环单元),最近的学习中,GRU较长使用,LSTM没有过多了解 。

lightgbm模型

注意

        使用lightgbm模型前需进行模型下载,在终端界面输入pip install lightgbm即可,同时可能需要更新pytorch版本 

模型体验

        lightgbm模型是一个高效的梯度提升框架,专门用于机器学习任务,具有高效性,采用基于直方图的算法,能够直接处理类别特征,控制过拟合现象的发生,并支持多种损失函数。

        在这次的代码跑通中,能较为明显地感受到lightgbm模型的潜力,体验过程如下:

原代码参数:

gbm = lgb.train(
    params,
    train_data,
    num_boost_round=15000,
    valid_sets=[test_data],
    callbacks=[print_validation_result],
)

修改后:

gbm = lgb.train(
    params,
    train_data,
    num_boost_round=100000,
    valid_sets=[test_data],
    callbacks=[print_validation_result],
)

        对比两次参数将迭代次数有15000直接提升到100000,运行结果未发生过拟合现象,并且提交后得到的分数有明显上涨,从0.7590提升到了0.7703。

        后续我甚至调整到了200000迭代次数,不过魔搭环境出现了明显地卡顿,且结果过拟合查阅资料后,若要对lightgbm模型的过拟合现象进行控制,可使用早停法和正则化,简单了解下,前者通过设置一个耐心值指定在连续多少个迭代(轮次)中,如果验证集的性能没有改善,就停止训练,而后者通过lightgbm提供的正则化参数,进行特征选择或保持模型对特征依赖权重的相对平衡,更为详细的内容在以后的学习中再深入了解。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值