基于Spring Boot的ALBERT词向量服务(1)

前言

近期在学习Java EE后台开发,因为工作和流行度的双重原因,选择学习了Spring Boot框架。不同于算法工程师的本职工作,Spring Boot,甚至于是整个Java EE后台的学习曲线和各项技术的依赖项,对于我来说都是全新的领域。总结成博客也算是对初学一段时间的检验。当然,毕竟初学,接下来的东西可能略显粗糙和幼稚,如果有对Java EE很熟的朋友,希望不吝赐教!

词向量生成服务

在自然语言处理(NLP)领域中,一个单词的向量表示是基石。最经典的词向量生成方法,应该是word2vec得到单词的稠密向量嵌入式表示,具体方法有skip-gram和CBOW。近年来最火的当属BERT系列模型,通过大语料集的预训练,再通过在具体小数据集中的微调训练,可成功迁移到各种NLP任务中,例如文本分类,命名实体识别,QA等等,性能明显高于经典的RNN/LSTM系列模型。可以这么理解,BERT系列模型成功的原因之一就在于其在大规模语料库中学习到了高效的词句向量表示,因此由BERT预训练模型生成的向量表示完全可以直接拿过来辅助其他任务的实现。为了方便取得BERT的词向量表示,已经有一个广受欢迎的基于Python实现的bert-as-service项目:https://github.com/hanxiao/bert-as-service,各种用法和说明非常详细和完备。
那BERT有什么缺点?很显然就是体积大,速度慢,吃性能。针对这一点最近也有很多针对BERT的精简算法,其中ALBERT就是其中的典型代表,这里不想阐述其具体原理,总之就是精简之后,体积小了,速度快了。目前ALBERT也有了各种中文预训练模型:https://github.com/brightmart/albert_zh,其中最小的体积仅有16M。当然越小的模型其精度会有一定的损失,但对于与具体下游任务解耦的单纯词向量生成来说,已经足够。
因此,这里想基于Spring Boot (Java)和更轻巧的ALBERT完成一个类似bert-as-service的词向量生成服务。流程简单(处理http请求,返回词向量即可),有一定的实用价值,又能跟我的算法本职工作结合,是一个比较好的能检查自己初学成果的小项目。

词向量生成服务的理解

这里想多谈一下对词向量服务的个人理解。即,为什么要有一个词向量“服务”?词向量确实需要,为什么要单独有这么一个“服务”呢?
1)**词向量服务将与具体业务无关的代码剥离,增强总体可读性和可维护性。**词向量一般是与下游任务是无关,或是说非强相关的,如果在具体业务算法的研发中单独写离线的词向量生成,会使工程代码变得臃肿,或需要引入更多的依赖项,一定程度上增加了维护的难度。
2)词向量服务相比离线词向量生成具有更强的灵活性。只要能正确发送请求,词向量服务就能进行推理并返回词向量,因此可以在不同的开发环境下使用,包括但不限于Python,Java,随取随用;而离线生成词向量往往依赖于某种具体语言,每次需专门启动和保存结果,不够灵活。
3)词向量服务可同时为多个业务需求方生成词向量。作为一个http服务,一旦部署,理论上就可以同时处理多个请求。如果将词向量服务部署到公用的服务器上,那在一定IP范围内的用户都可以进行请求并取得词向量,而离线词向量生成无法做到这一点。

技术/代码要点

分Java和Python两个项目开发,代码完全开源
Java:albert-vec(https://github.com/Aiwiscal/albert-vec)主Spring Boot工程(基于Maven),包含ALBERT词向量服务的所有实现。
Python:albert-vec-support(https://github.com/Aiwiscal/albert-vec-support)上述工程的支持工程,包含生成ALBERT的TensorFlow pb模型文件以供主工程使用;使用post请求测试Spring Boot服务;Python下ALBERT词向量生成示例。

喜欢或有帮助请给star哦~~

发布了30 篇原创文章 · 获赞 205 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_15746879/article/details/105166244