nano- 康一帅
Tensorflow
== 1.14.0Keras
== 2.3.1bert4keras
== 0.8.4
EDA
:用于探索性数据分析。data_utils
:用于预训练语料的构建。pretraining
:用于Bert的预训练。train
:用于新闻文本分类模型的训练。pred
:用于新闻文本分类模型的预测。
通过这道赛题可以引导大家走入自然语言处理的世界,带大家接触NLP的预处理、模型构建和模型训练等知识点。
要求选手根据新闻文本字符对新闻的类别进行分类,这是一个经典文本分类问题。
- 训练集共200,000条新闻,每条新闻平均907个字符,最短的句子长度为2,最长的句子长度为57921,其中75%以下的数据长度在1131以下。
- 测试集共50,000条新闻,每条新闻平均909个字符,最短句子长度为14,最长句子41861,75%以下的数据长度在1133以下。
- 训练集和测试集就长度来说似乎是同一分布。
- 由于文本长度较大,而Bert输入文本长度不能超过512(如果是自己预训练的Bert,长度可以不局限于512),所以需要进行文本截断。
- 文本截断后,输入大小为[batch_size, max_segment, maxlen],其中batch_size是批大小,max_segment是截断后的最大句子数量,maxlen是每个句子的最大长度。
- 将输入reshape后输入Bert,得到大小为[batch_size*max_segment, maxlen]的句向量。
- 将句向量reshape后输入注意力层。
- 最后接全连接层进行分类。
- 预测就是将多个模型预测结果计算算术平均即可。
- 使用训练集和测试集一共25万数据对Bert-base进行预训练。
- 对抗训练属于对抗防御的一种,它构造了一些对抗样本加入到原数据集中,希望增强模型对对抗样本的鲁棒性。
- 详见对抗训练浅谈:意义、方法和思考(附Keras实现)。
- 由于显存有限,无法使用较大的batch size进行训练,梯度累积优化器可以实现使用小的batch size实现大batch size的效果了——只要你愿意花n倍的时间,可以达到n倍batch size的效果,而不需要增加显存。
- 详见用时间换取效果:Keras梯度累积优化器
- 由于训练集和测试集的分布基本一致,所以在验证集和测试集上的结果也基本一致。
- 使用Bert-base单模型可以轻松上到0.96+。
- Bert-base的预训练和微调过程都很消耗时间(硬件条件有限的情况下)。如果时间充裕,预训练更多步,预训练模型的效果应该还能提升。
- 调参和模型融合是很有效的提升手段。