ASC20 比赛记录 - 2.

ASC20 比赛已经到了中段,是时候给最近的工作做一下总结了。

题目

这一次的赛题是有关 NLP 方向的,要在只使用 Pytorch 框架的情况下完成 Cloze 下游任务的设计,并且以准确率作为最终的分数计算。

主办方并未提供 baseline,只提供了数据集,格式为 json,具体如下:

    {
        'article': '...',
        'options': [[words * 4] * 20],
        'answers': ['A','B'... * 20]
    }

目前的进展及思路

之前所尝试过的预先填词的方法可行性不高,所以只能够将所有的词填进去。我们的算法是以每个空的四个选项去生成四句话,如果出现了一句话多个空的情况,则留空不填,然后以此生成了总共空数 * [ 4, 预填空句子 ] 的矩阵。

然后就得提取特征了,用 BERT 的预训练模型 bert-base-uncased 生成向量矩阵,其中每一句话都会生成一个 [1, 768] 的向量,然后存入 .npy 文件中。把答案的 ABCD 转换为 [1, 4] 的 onehot 向量,也存入另一个 .npy 文件中,供后面训练使用。

训练我们使用的是 BiLSTM + Attention Net,通过注意力机制来提高准确率。

存在问题

目前训练了几波,存在这一些问题:

out of memory

这个是老生常谈的问题了,主要的原因是 batch_size 设置得过大,从而导致显存使用过高。第二个是未终止之前的训练过程,之前通过 nohup 等手段运行的训练不会自动退出,需要主动 kill 掉。

解决方法:使用 nvidia-smi 查看显卡目前的使用状况,把其中正在运行的进程的 PID 用 kill -9 PID 命令杀掉,从而腾出显存空间。

不收敛

因为一些原因,网络在训练了 20 多个 epoch 后出现了不收敛的现象,loss 不再降低。这主要有几个原因所导致,一个是网络层太浅,从而导致没有办法很好地拟合;;第二个是网络设计不对,这个需要通过更换更为适合的网络解决;第三个是超参设置,这个比较玄学需要好好调整。