开场白:好久不写博客,以后会多多记录工程中的问题及其解决方案,今天来分享一下Bert的应用。
在工程应用中使用Bert来进行对下游任务的处理过程中,一开始采用Bert-as-service这个服务,但是在实际应用中发现即使采用这个开源的服务资源,仍然对机器的性能有一定的要求,在没有GPU显卡的机器上运行经常会出现并发问题。在1080ti的机器上运行调用一次服务大概花费的时候一秒左右。这样对于在线需要实时率的应用来说仍然达不到使用标准,当然离线应用的话可以当我没说过。对于上面的问题我目前的解决办法就是抽取Bert的语义向量。
具体怎么从Bert的模型中抽取的语义向量就不在此过多展示了,我已经抽取好了向量放在百度网盘,请大家自行下载,当然在使用语义向量的同时也需要使用词表,一并放在百度网盘,向量文件一共不到200M,维度21128*768。这个向量是Bert最后一层得词典语义表征,下面我将给出我在后续分类任务中向量得使用详情。
链接:https://pan.baidu.com/s/1d0FEamUR_1afxC2QJW26XQ,提取码:5su7。
下面是Bert文件的语义向量表示文件,在notepad上截了图,就是Bert的词表维度*每个词的向量表示维度。
文章图片
1. 下面开始处理向量。这段代码用来处理Bert的向量文件,把向量处理成array能够送进网络的形式。
import numpy as npdef get_vector():
embeddings_index = {}
with open('bert_embedding', 'r', encoding="utf-8", errors='ignore') as f:
for i , line in enumerate(f):
if i == 0:
continue
vectorvalues = line.strip().split()
word = vectorvalues[0]
coefs = np.asarray(vectorvalues[1:], dtype='float32')
embeddings_index[word] = coefs
embed = []
with open('vocab.txt', 'r', encoding='utf-8') as vf:
for line in vf:
if line.strip() in embeddings_index.keys():
embed.append(embeddings_index[line.strip()])
embedding = np.asarray(embed)
return embedding
2.把向量表示潜入到模型训练的过程中,使用的方法是以前写过博客的对于tf.nn.embedding_lookup()的使用,使用方法请大家自行查看,我把怎么把embedding送进cnn网络的代码贴到下面。
class TextCNN(object):
"""CNNmodel"""def __init__(self, config):
'''定义输入'''
self.config = config
self.input_x = tf.placeholder(tf.int32, [None, self.config.seq_length], name='x')
self.input_y = tf.placeholder(tf.float32, [None, self.config.num_classes], name='y')
self.embedding_placeholder = tf.placeholder(tf.float32, [13315, 768])
self.cnn()def cnn(self):
with tf.device('/gpu:0'):
'''词向量映射'''
W = tf.Variable(tf.constant(0.0, shape=[13315, 768]),
trainable=False, name="W")
embedding_init = W.assign(self.embedding_placeholder)
'''embedding_inputs可以开始接下面的模型结构'''
embedding_inputs = tf.nn.embedding_lookup(embedding_init, self.input_x)
3.写成http服务测试一下,速度确实提升了,我这个还是在本地测试的没放到服务上,准确率和原来的模型相比不相上下。
文章图片
最后,好久不写博客了,以后会多多更新最近做得工作,把项目整理起来,可以和大家一起学习。这个任务可以处理成很多任务,后面可以接blstm,可以做命名实体,关系抽取,阅读理解,等等一些nlp的相关任务。模型结构不用特别复杂,只需要微调就好。速度上提升的不是一点,可能大家会有更好的解决方案,但是上述也是其中一种,我觉得万变不离其宗,能提升模型效果的方法就是好办法。就写到这里把,欢迎大家来沟通。
【使用Bert语义向量处理下游任务(分类/实体识别/阅读理解等等)】有问题不能及时回复请联系我邮箱:13100980468@163.com