李宏毅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问题。

bevfusion训练自己的数据集_ide


bevfusion训练自己的数据集_机器学习_02


bevfusion训练自己的数据集_jupyter_03


bevfusion训练自己的数据集_python_04


bevfusion训练自己的数据集_机器学习_05


关于为什么代码中要控制输入序列的长度。

bevfusion训练自己的数据集_jupyter_06


解决方案:

在训练时,对每一个问题的答案附近切一个固定长度的窗口,在测试的时候由于不知道答案的位置信息,切出多个窗口,在每个窗口中找答案。total score最大的为最终的答案。

bevfusion训练自己的数据集_bevfusion训练自己的数据集_07


bevfusion训练自己的数据集_jupyter_08

二、实验过程

2.1 跑助教提供的原始代码

在代码中有两个库比较重要:

BertForQuestionAnswering#下载预训练模型
BertTokenizerFast#下载Tokenizer

结果:

bevfusion训练自己的数据集_机器学习_09


训练时长:10min

Kaggle得分:0.48481 0.47482

2.2 修改窗口

在测试集上做测试时,如果答案在窗口附近或者横跨两个窗口的话,模型会看不到,所以要改成overlapping window

操作:doc_stride = 300

bevfusion训练自己的数据集_ide_10

结果:

bevfusion训练自己的数据集_ide_11


运行时长:10min

Kaggle得分:0.36217 0.34725

可以看到训练效果变差。所以视频里助教这里讲错了,应该减小doc_stride,才能做到重叠窗口的效果。操作:doc_stride = 75

结果:

bevfusion训练自己的数据集_python_12


运行时长:12min

Kaggle得分:0.59828 0.57894(显著提升)

结论:正确使用重叠窗口这个技巧可以提升训练结果。

2.3 加Linear Learning rate decay

bevfusion训练自己的数据集_机器学习_13

操作:在2.2基础上,加入Adjust learning rate manually。

结果:

bevfusion训练自己的数据集_python_14


运行时长:15min

Kaggle得分:0.69627 0.67906

在public score上已经达到medium baseline。

结论:训练时使用Linear Learning rate decay可以提供训练效果。

2.4 改变窗口切取位置

在baseline中,以答案为中点切窗口,导致模型学到本不该学到的信息,比如答案在窗口中间的情况。

bevfusion训练自己的数据集_bevfusion训练自己的数据集_15


操作:窗口选取时加入随机性

结果:

bevfusion训练自己的数据集_jupyter_16


Kaggle得分:0.76446 0.74485(提升明显)

在public score和private score都已经达到medium baseline

2.5 后续可以改进的方向:postprocessing

预测结果中可能有一些错误信息,比如end_index < start_index或者答案为空的情况。

可以在下面这段代码中进行添加内容。

bevfusion训练自己的数据集_机器学习_17

2.6 后续可以改进的方向:换pre-train model

bevfusion训练自己的数据集_bevfusion训练自己的数据集_18

https://huggingface.co/models?sort=downloads

三、总结

bevfusion训练自己的数据集_机器学习_19


由于本人并不是NLP方向的学生,所以对于今天的bert问答任务就不再花过多时间改进了。有兴趣的同学可以在我的代码基础上进行修改。