关于TopLine
整个TopLine分成四部分,包括数据处理/模型训练/评估模型/测试集推理。在数据处理阶段把数据集拆分成训练集和验证集,最后使用testB.csv做测试集。在依照TopLine的代码跑通流程以后,最终在测试集上取得了相当接近满分的结果。
如果最终想要使用Bert模型成功的完成这项文本二分类的任务,则还需要在原来代码的基础上调整超参数。在重新运行时,我注意到有下面这么一段
if not continue_train:
# 判断最佳模型是否已经存在,若存在则直接读取,若不存在则进行训练
if os.path.exists(f'checkpoints/best_model{model_index}.pth'):
best_model = MODEL(model_index)
best_model.load_state_dict(torch.load(f'checkpoints/best_model{model_index}.pth'))
# 加载模型
return best_model
else:
pass
这一段出现在模型训练这一部分,主要是判断是否有已经训练好的模型,这里我重新调参完之后要重新训练模型。只要到对应目录下删除已经训练好的模型就能重新开始训练了。
在后续保存模型之后,如果要重新装载模型,只需要直接加载best_model.ckpt就可以了。在训练过程中,我们已经自动把loss最优秀的模型保存下来了:
if train_loss < best_train_loss: # 更新最佳训练损失
best_train_loss = train_loss
best_epoch = epoch + 1
if device == 'cuda' and gpu_num > 1: # 多GPU保存模型
torch.save(model.module.state_dict(), f'{model_save_dir}/best_model{model_index}.pth')
else:
torch.save(model.state_dict(), f'{model_save_dir}/best_model{model_index}.pt
最后在运行测试集时,拿到了两类文章各1000条的结果,期间对此处的参数进行了一些调整:
class opt:
seed = 42 # 随机种子
batch_size = 16 # 批处理大小
set_epoch = 5 # 训练轮数
early_stop = 5 # 提前停止epoch数
learning_rate = 1e-5 # 学习率
weight_decay = 2e-6 # 权重衰减,L2正则化
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 选择设备,GPU或CPU
gpu_num = 1 # GPU个数
use_BCE = False # 是否使用BCE损失函数
models = ['xlm-roberta-base', 'roberta-base', 'bert-base-uncased',
'microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext', 'dmis-lab/biobert-base-cased-v1.2', 'marieke93/MiniLM-evidence-types',
'microsoft/MiniLM-L12-H384-uncased','cambridgeltl/SapBERT-from-PubMedBERT-fulltext', 'microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract',
'microsoft/BiomedNLP-PubMedBERT-large-uncased-abstract'] # 模型名称列表
model_index = 2 # 根据上面选择使用的模型,这里填对应的模型索引
model_name = models[model_index-1] # 使用的模型名称
continue_train = False # 是否继续训练
show_val = False # 是否显示验证过程
在Bert拿到1分后,我尝试微调chatglm-6B的模型,但是目前调参结果得分只有0.8左右,效果甚至不如Bert,所以目前还在调参。