李宏毅2021年机器学习作业7学习笔记
- 前言
- 一、问题描述
- 二、实验过程
- 2.1 跑助教提供的原始代码
- 2.2 修改窗口
- 2.3 加Linear Learning rate decay
- 2.4 改变窗口切取位置
- 2.5 后续可以改进的方向:postprocessing
- 2.6 后续可以改进的方向:换pre-train model
- 三、总结
前言
声明:本文参考了李宏毅机器学习2021年作业例程,开发平台是kaggle notebook。
一、问题描述
给机器一个文章和一个问题,要求输出问题的答案,简单来说就是QA问题。
关于为什么代码中要控制输入序列的长度。
解决方案:
在训练时,对每一个问题的答案附近切一个固定长度的窗口,在测试的时候由于不知道答案的位置信息,切出多个窗口,在每个窗口中找答案。total score最大的为最终的答案。
二、实验过程
2.1 跑助教提供的原始代码
在代码中有两个库比较重要:
BertForQuestionAnswering#下载预训练模型
BertTokenizerFast#下载Tokenizer
结果:
训练时长:10min
Kaggle得分:0.48481 0.47482
2.2 修改窗口
在测试集上做测试时,如果答案在窗口附近或者横跨两个窗口的话,模型会看不到,所以要改成overlapping window
操作:doc_stride = 300
结果:
运行时长:10min
Kaggle得分:0.36217 0.34725
可以看到训练效果变差。所以视频里助教这里讲错了,应该减小doc_stride,才能做到重叠窗口的效果。操作:doc_stride = 75
结果:
运行时长:12min
Kaggle得分:0.59828 0.57894(显著提升)
结论:正确使用重叠窗口这个技巧可以提升训练结果。
2.3 加Linear Learning rate decay
操作:在2.2基础上,加入Adjust learning rate manually。
结果:
运行时长:15min
Kaggle得分:0.69627 0.67906
在public score上已经达到medium baseline。
结论:训练时使用Linear Learning rate decay可以提供训练效果。
2.4 改变窗口切取位置
在baseline中,以答案为中点切窗口,导致模型学到本不该学到的信息,比如答案在窗口中间的情况。
操作:窗口选取时加入随机性
结果:
Kaggle得分:0.76446 0.74485(提升明显)
在public score和private score都已经达到medium baseline
2.5 后续可以改进的方向:postprocessing
预测结果中可能有一些错误信息,比如end_index < start_index或者答案为空的情况。
可以在下面这段代码中进行添加内容。
2.6 后续可以改进的方向:换pre-train model
https://huggingface.co/models?sort=downloads
三、总结
由于本人并不是NLP方向的学生,所以对于今天的bert问答任务就不再花过多时间改进了。有兴趣的同学可以在我的代码基础上进行修改。