作者参加了由北京大学詹卫东教授课题组组织的SpaCE2022空间语义角色识别的标注任务。此后,作者完成了该任务3个task的transformers模型搭建和训练工作。
任务官网:https://2030nlp.github.io/SpaCE2022/
运行环境:
CUDA v11.2
Linux Ubuntu 20.04.4
Pytorch v1.10
项目结构:(省略部分结构相仿)
- chinese_wwm_ext_pytorch(来自哈工大科大讯飞实验室的用于BERT的预训练模型)
- data(源数据及分割数据)
- task1
- task1_train.json(原始训练集)
- task1_dev_input.json(验证集)
- task1_train.json(原始训练集)
- task2
- task2_1
- task3_1
- test_set
- task1_test_input.json(task1测试集)
- task2_test_input.json(task2测试集)
- task3_test_input.json(task3测试集)
- task1_test_input.json(task1测试集)
- task1
- get_answer(将结果.json文件转换为.jsonl文件以提交)
- task1
- experiment(保存日志文件、训练好的模型及结果)
- config.py(保存文件文件夹路径)
- dataloader_build.py(实现Dataset类的子类)
- metrics.py(评估相关函数)
- run.py(程序运行入口)
- test.py(测试部分代码)
- train.py(训练部分代码)
- utils.py(创建Logger,分割训练集)
- experiment(保存日志文件、训练好的模型及结果)
- task2
- task2_1
- task3_1
本项目基于Hugging Face提供的BERT实现。
其中,task1是简单的SequenceClassification任务模型;
task2将三个错误类型合并为一个TokenClassification任务,进行联合训练,
效果差,遂放弃;
task2_1将数据集根据错误种类A、B、C分为3个部分,将识别每个错误类型视为一个TokenClassification任务,之后将测试集分别通过3个TokenClassification模型得到答案;
task3_1分为3个step训练:
step1:空间实体(S信息)标注的TokenClassification任务;
step2:对每个空间实体(S信息),标注其空间语义信息(TEP信息)的TokenClassification任务;
step3:对每组空间语义信息,判断真值的SequenceClassification任务
训练成绩:
task1:
score: 0.6678299492385786
task2:
score1: 0.008559201141226819
score2: 0.7412048324911064
score3: 0.6396795643493179
task3:
score: 0.4541270427631183
一些个人总结:
- 本系统的问题:
- 本系统提出的方法没有经过充分的验证和试错(尤其是task3)
- task1的得分过低,应当优化。是否要考虑从Pytorch搭建模型而非使用现有模型?
- task2会出现某实体同时作为S1和S2的情况。可能在标注设计时应增加标注。
- task3的错误传递问题无法解决。
- 本系统提出的方法没有经过充分的验证和试错(尤其是task3)
- 对本次任务的看法:
- 本次任务task3的标注太多,而且很多时候互相重叠,不利于ML系统搭建、训练、测试、评估(还是比较for linguistic);
- 同样的,task2也存在标注互相重叠的情形;
- 数据量过少,训练效果很可能不理想。是否要考虑小样本学习?
- 本次任务task3的标注太多,而且很多时候互相重叠,不利于ML系统搭建、训练、测试、评估(还是比较for linguistic);