任务一:
机器通过对论文摘要等信息的理解,判断该论文是否属于医学领域的文献。
本次竞赛的评价标准采用F1_score,分数越高,效果越好。
总体而言,这是一个二分类的问题,初期可以采用机器学习的方法来初步的完成baseline的选择,并且可以在初步进行相关的数据处理,便于后期的上分。
文献领域分类
针对文本分类任务,可以提供两种实践思路,一种是使用传统的特征提取方法(如TF-IDF/BOW)结合机器学习模型,另一种是使用预训练的BERT模型进行建模。
当然啦,咱们Datawhale 的大神们在最后也给出了最优的方案,topline方案!!充满期待……
使用特征提取 + 机器学习的思路步骤如下:
-
数据预处理:首先,对文本数据进行预处理,包括文本清洗(如去除特殊字符、标点符号)、分词等操作。可以使用常见的NLP工具包(如NLTK或spaCy)来辅助进行预处理。
-
特征提取:使用TF-IDF(词频-逆文档频率)或BOW(词袋模型)方法将文本转换为向量表示。TF-IDF可以计算文本中词语的重要性,而BOW则简单地统计每个词语在文本中的出现次数。可以使用scikit-learn库的TfidfVectorizer或CountVectorizer来实现特征提取。
-
构建训练集和测试集:将预处理后的文本数据分割为训练集和测试集,确保数据集的样本分布均匀。
-
选择机器学习模型:根据实际情况选择适合的机器学习模型,如朴素贝叶斯、支持向量机(SVM)、随机森林等。这些模型在文本分类任务中表现良好。可以使用scikit-learn库中相应的分类器进行模型训练和评估。
-
模型训练和评估:使用训练集对选定的机器学习模型进行训练,然后使用测试集进行评估。评估指标可以选择准确率、精确率、召回率、F1值等。
-
调参优化:如果模型效果不理想,可以尝试调整特征提取的参数(如词频阈值、词袋大小等)或机器学习模型的参数,以获得更好的性能。
我们的Baseline选择使用机器学习方法,在解决机器学习问题时,一般会遵循以下流程:
-
导入模块
首先进行baseline的学习
#import 相关库
# 导入pandas用于读取表格数据
import pandas as pd
# 导入BOW(词袋模型),可以选择将CountVectorizer替换为TfidfVectorizer(TF-IDF(词频-逆文档频率)),注意上下文要同时修改,亲测后者效果更佳
from sklearn.feature_extraction.text import CountVectorizer
# 导入LogisticRegression回归模型
from sklearn.linear_model import LogisticRegression
# 过滤警告消息
from warnings import simplefilter
from sklearn.exceptions import ConvergenceWarning
simplefilter("ignore", category=ConvergenceWarning)
在飞桨平台上运行出来的结果如下:
然后将生成的submit_task1.csv文件提交到讯飞平台!提交的分数和大伙一样都是0.67116,希望能够在最后学习到咱们的topline的上分技巧!!!
Topline学习
通过大神的分享,目前有两种topline都能够产生到1分的成绩,我使用的是深度学习torch框架产生的topline,在阿里云的服务器上打开了相关的算力资源后,对数据进行压缩处理,之后再训练,最后推理得到结果。
代码学习:
tokenized = tokenizer(sample, truncation='longest_first') # 分词处理,使用最长优先方式截断
input_ids, attention_mask = tokenized['input_ids'], tokenized['attention_mask'] # 获取输入ID和注意力掩码
input_ids, attention_mask = torch.tensor(input_ids), torch.tensor(attention_mask) # 转换为PyTorch张量
这段代码对一个样本进行了分词处理,提取了input_ids和attention_mask,并将它们转换为PyTorch张量,以便在PyTorch模型中进一步使用。
分词处理将连续的文本序列划分为离散的标记或单词的过程。分词处理在NLP中起着关键的作用,它是将连续文本转化为离散表示的重要步骤,为文本理解、特征提取和各种NLP任务提供了基础。
# 超参数类 - 可修改的所有超参数都在这里~
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 # 是否显示验证过程
这是大神的超参数,我进行更改后,增加了相关的epoch使得训练结果更准确,同时尝试调整了一些学习率learning _rate,最后通过调整超参数也是从0.999分数提高到了1分。
后续提高:
①调整超参数
包括学习率、Batch_size、正则化系数等,可以使用网格搜索的方法(Grid search)来寻找模型更好的超参数组合。
②调整最大序列长度
在数据处理阶段中,调整最大序列长度MAX_LEN。
③更改损失函数
一般分类任务中,最常使用的损失函数是交叉熵(CE, Cross-Entropy),但最简单的也可以换成BCE。
④冻结模型部分参数
如feature1在模型训练的前期,相对feature2而言可能并不能带来太好的表征,所以第一个epoch可以先将它的参数进行冻结(又或者将该特征对应全连接层的学习率调小),然后等到第二个epoch后再正常训练。
⑤融合更多特征
融合更多特征,如考虑加入Glove、Word2Vec、Fasttext结合TextCNN、BiLSTM、LSTM+Attention等特征提取器所提取的文本特征。
⑥模型集成
使用一或多个与本文模型能够互补优劣的模型,并进行集成。
⑦对比学习
设计代理任务,加入对比损失函数,在训练阶段中获得更好的嵌入表示,提高模型性能。
⑧提示学习
在预训练模型的基础上使用提示学习范式,通过硬提示/软提示的方法提高模型性能。
这次通过大佬们的开源,我对于深度学习有了更深层次的了解,也学习到了机器学习和深度学习之间的区别,希望能够再接再厉⑧!
大模型Topline学习
大模型简介 近些年,研究人员通过在大规模语料库上预训练 Transformer 模型产生了预训练语言模型(PLMs),并在解决各类 NLP 任务上展现出了强大的能力。并且研究人员发现模型缩放可以带来性能提升,因此他们通过将模型规模增大进一步研究缩放的效果。有趣的是,当参数规模超过一定水平时,这个更大的语言模型实现了显著的性能提升,并出现了小模型中不存在的能力,比如上下文学习。为了区别于 PLM,这类模型被称为大型语言模型(LLMs)。
1. 完成服务器的部署后,在终端输入代码,下载 clone 微调脚本
2.下载加载模型chatglm2-6b
3.运行微调代码:自己注意调整参数!!!
最终将提交的结果交上去,和许多的同学一样都是只有0.735分左右,我觉得应该对于调参的部分要自己改变一下,希望自己再接再厉!!!