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提供的正则化参数,进行特征选择或保持模型对特征依赖权重的相对平衡,更为详细的内容在以后的学习中再深入了解。