NLP(十八)利用ALBERT提升模型预测速度的一次尝试

本文探讨使用ALBERT模型在时间识别任务中的应用,对比BERT模型,ALBERT在保持较高识别精度的同时,大幅减少了模型预测时间,平均每个句子的预测时间不超过40ms。

前沿

  在文章NLP(十七)利用tensorflow-serving部署kashgari模型中,笔者介绍了如何利用tensorflow-serving部署来部署深度模型模型,在那篇文章中,笔者利用kashgari模块实现了经典的BERT+Bi-LSTM+CRF模型结构,在标注了时间的文本语料(大约2000多个训练句子)中也达到了很好的识别效果,但是也存在着不足之处,那就是模型的预测时间过长,平均预测一个句子中的时间耗时约400毫秒,这种预测速度在生产环境或实际应用中是不能忍受的。
  查看该模型的耗时原因,很大一部分原因在于BERT的调用。BERT是当下最火,知名度最高的预训练模型,虽然会使得模型的训练、预测耗时增加,但也是小样本语料下的最佳模型工具之一,因此,BERT在模型的架构上是不可缺少的。那么,该如何避免使用预训练模型带来的模型预测耗时过长的问题呢?
  本文决定尝试使用ALBERT,来验证ALBERT在提升模型预测速度方面的应用,同时,也算是本人对于使用ALBERT的一次实战吧~

ALBERT简介

  我们不妨花一些时间来简单地了解一下ALBERT。ALBERT是最近一周才开源的预训练模型,其Github的网址为:https://github.com/brightmart/albert_zh ,其论文可以参考网址:https://arxiv.org/pdf/1909.11942.pdf 。
  根据ALBERT的Github介绍,ALBERT在海量中文语料上进行了预训练,模型的参数更少,效果更好。以albert_tiny_zh为例,其文件大小16M、参数为1.8M,模型大小仅为BERT的1/25,效果仅比BERT略差或者在某些NLP任务上更好。在本文的预训练模型中,将采用albert_tiny_zh。

利用ALBERT训练时间识别模型

  我们以Github中的bertNER为本次项目的代码模板,在该项目中,实现的模型为BERT+Bi-LSTM+CRF,我们将BERT替换为ALBERT,也就是说笔者的项目中模型为ALBERT+Bi-LSTM+CRF,同时替换bert文件夹的代码为alert_zh,替换预训练模型文件夹chinese_L-12_H-768_A-12(BERT中文预训练模型文件)为albert_tiny。当然,也需要修改一部分的项目源代码,来适应ALBERT的模型训练。
  数据集采用笔者自己标注的时间语料,即标注了时间的句子,大概2000+句子,其中75%作为训练集(time.train文件),10%作为验证集(time.dev文件),15%作为测试集(time.test文件)。在这里笔者不打算给出具体的Python代码,因为工程比较复杂,有兴趣的额读者可以去查看该项目的Github地址:https://github.com/percent4/ALBERT_4_Time_Recognition
  一些模型的参数可以如下:

  • 预训练模型:ALBERT(tiny)
  • 训练样本的最大字符长度: 128
  • batch_size: 8
  • epoch: 100
  • 双向LSTM的个数:100

  ALBERT的模型训练时间也会显著提高,我们耐心地等待模型训练完毕。在time.dev和time.test数据集上的表现如下表:

数据集 precision recall f1
time.dev 81.41% 84.95% 83.14%
time.test 83.03% 86.38% 84.67%

  接着笔者利用训练好的模型,用tornado封装了一个模型预测的HTTP服务,具体的代码如下:

# -*- coding: utf-8 -*-

import os
import json
import time
import pickle
import traceback

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options

import tensorflow as tf
from utils import create_model, get_logger
from model import Model
from loader import input_from_line
from train import FLAGS, load_config, train

# 定义端口为12306
define(
评论 28
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值