bert&kera的文本分类的小项目

前不久了解到bert是在去年十月份的时候由google发行,当时引起一阵轩然大波。因为它在NLP上取得的效率远远超过google以前发布的word2vec的。也可以说bert就是word2vec的升级版,在特征提取效率上面有很显著的效果。

然后昨天我看到有位大佬说结合keras库用bert很方便,而且还提供了许多功能模块,所以就借鉴着调试了这个bert_keras的文本分类的小项目。

不过据昨天某机构说由CMU(也就是卡耐基梅隆大学)&google发布了一个新的模型,叫做XLNet,说是这个模型将比bert和word2vec更好,也就是说以后将取代这两个模型,具体效果指日可待吧!

OK,开始正题!

模型的部分代码:

bert_model = load_trained_model_from_checkpoint(config_path, checkpoint_path)

for l in bert_model.layers:
    l.trainable = True

x1_in = Input(shape=(None,))
x2_in = Input(shape=(None,))

x = bert_model([x1_in, x2_in])
x = Lambda(lambda x: x[:, 0])(x) # 取出[CLS]对应的向量用来做分类
p = Dense(1, activation='sigmoid')(x)

model = Model([x1_in, x2_in], p)
model.compile(
    loss='binary_crossentropy',
    optimizer=Adam(1e-5), # 用足够小的学习率
    metrics=['accuracy']
)
model.summary()

在Keras中调用Bert来做情感分类任务就这样写完了!神奇吧!(惊!)

Keras调用Bert就这么简短。事实上,真正调用Bert的也就只有load_trained_model_from_checkpoint那一行代码,剩下的只是普通的Keras操作。所以,如果你已经入门了Keras,那么调用Bert就很方便了。

如此简单的调用,能达到什么精度?经过5个epoch的fine tune后,验证集的最好准确率是95.5%+!用了Bert之后,寥寥几行,就提升了5个百分点多的准确率!难怪Bert能在NLP界掀起一阵热潮,牛批!(破音)

附:
1.要多少显存才够?(嗯…,在我自己调试运行的过程中就遇到了这个问题。CPU好像是内存不够,导致报了个错?在这篇文章的后面会说的)

事实上,这没有一个标准答案,显存的使用取决于三个因素:句子长度、batch size、模型复杂度。像上面的情感分析例子,在GTX1060 6G显存上也能跑起来,只需要将batch size调到24即可。所以,如果你的显存不够大,将句子的maxlen和batch size都调小一点试试。当然,如果你的任务太复杂,再小的maxlen和batch size也可能OOM,那就只有升级显卡了。

2.有什么原则来指导Bert,后面应该要接哪些层?

用尽可能少的层来完成你的任务。比如上述情感分析只是一个二分类任务,你就取出第一个向量然后加个Dense(1)就好了,不要想着多加几层Dense,更加不要想着接个LSTM再接Dense。如果你要做序列标注(比如NER),那你就接个Dense+CRF就好,也不要多加其他东西。总之,额外加的东西尽可能少。一是因为Bert本身就足够复杂,它有足够能力应对你要做的很多任务;二来你自己加的层都是随即初始化的,加太多会对Bert的预训练权重造成剧烈扰动,容易降低效果甚至造成模型不收敛。

下面开始说一个关于CPU的问题:
在调试的过程中我就报了这个问题,如图所示:
在这里插入图片描述

在这里插入图片描述
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
在这里插入图片描述

大概意思就是说:啊,我的CPU不行了,或者你可以换台电脑了。。。也可以用GPU在服务器上跑跑,总而言之,就是我这台电脑跑不动。(ps:因为我在跑代码的时候,电脑就差点死机了,蓝屏一次,黑屏一次)

进行新的运算的时候,电脑崩溃了。

解决方法(可能有效):深度学习中最直观的方式就是减小batch_size或者hidden_layer中的单元数。

也可能是内存不足,需要修改网络结构,才有可能顺利运行代码。

最后贴上一些结果图(嗯…,由于CPU的原因,你懂得):
在这里插入图片描述
在这里插入图片描述

这个模型等我以后换了一台新电脑或者用上GPU了再回来补充,电脑太垃圾了,没办法。

附:OOM in keras
Hint: If you want to see a list of allocated tensors when OOM happens
Bert官方Github
官方的中文预训练权重

猜你喜欢

转载自blog.csdn.net/qq_33472146/article/details/93191673
今日推荐