Bert使用备注

由于最近的工作有涉及到一些NLP的研究,而Bert的效果看起来不错,所以在原有方案上,基于相同的数据集(内部的任务数据集,所以暂时不会公开),做了一下效果对比.

只做一些简单的记录,以备自己将来回溯.

背景是基于中文句子分类.任务数据集在100万左右.

2080 on Pytorch.

原有方案

word2vec(200维度) + LSTM + Attention
网络结构比较简单,常规操作
训练 5 epoch大概需要10分钟左右.
准确率在77%左右.

Bert效果

中文预训练模型
训练 1 epoch大概需要200分钟.
准确率在76%左右.

Bert的一些备注

Bert有三个嵌入层,向量(Token)、上下部分(Segment)、位置(Position), 具体的一些解释可以参考
维度为768,所以比原来的高不少,这慢的一个原因(还有是因为网络结构比较复杂)
基于预训练模型在现有任务上训练一个epoch的效果最好,好像并不是训练的epoch越多越好,还不知道是为什么

其它

具体可以参考pytorch-pretrained-BERT,里面不止有Bert的预训练模型,还有一些其它模型的Pytorch实现,想要快速上手可以参考,特别是examples目录下的代码++

Bert是好,但并不一定在你的场景下也好,正式投产前还是需要做一些研究的.毕竟NLP这类的机器学习任务的数据集变化对模型的影响是很大的.

在Keras 中自定义可训练层

Bert预训练模型有12层或者24层,一般在起上层的Finetune任务会对所有层参数进行微调,也还有可能会在后面再接一些Layer.
但是,如果对所有层都进行微调的话,需要调整的参数量可能过大,12(约1.1亿), 24(2.2亿),耗时会比较久,如果只对后面几层或者特定层进行微调,可以是微调参数大大减少,训练实现也会加快.
主要可有参考:
Fine-tuning BERT with Keras and tf.Module
Finetuning BERT with Keras and tf.Module.ipynb
bert_experimental
TensorFlow Documentions
Keras Documentions