使用Bert语义向量处理下游任务(分类/实体识别/阅读理解等等)

开场白:好久不写博客,以后会多多记录工程中的问题及其解决方案,今天来分享一下Bert的应用。
在工程应用中使用Bert来进行对下游任务的处理过程中,一开始采用Bert-as-service这个服务,但是在实际应用中发现即使采用这个开源的服务资源,仍然对机器的性能有一定的要求,在没有GPU显卡的机器上运行经常会出现并发问题。在1080ti的机器上运行调用一次服务大概花费的时候一秒左右。这样对于在线需要实时率的应用来说仍然达不到使用标准,当然离线应用的话可以当我没说过。对于上面的问题我目前的解决办法就是抽取Bert的语义向量。
具体怎么从Bert的模型中抽取的语义向量就不在此过多展示了,我已经抽取好了向量放在百度网盘,请大家自行下载,当然在使用语义向量的同时也需要使用词表,一并放在百度网盘,向量文件一共不到200M,维度21128*768。这个向量是Bert最后一层得词典语义表征,下面我将给出我在后续分类任务中向量得使用详情。
链接:https://pan.baidu.com/s/1d0FEamUR_1afxC2QJW26XQ,提取码:5su7。
下面是Bert文件的语义向量表示文件,在notepad上截了图,就是Bert的词表维度*每个词的向量表示维度。
使用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服务测试一下,速度确实提升了,我这个还是在本地测试的没放到服务上,准确率和原来的模型相比不相上下。
使用Bert语义向量处理下游任务(分类/实体识别/阅读理解等等)
文章图片

最后,好久不写博客了,以后会多多更新最近做得工作,把项目整理起来,可以和大家一起学习。这个任务可以处理成很多任务,后面可以接blstm,可以做命名实体,关系抽取,阅读理解,等等一些nlp的相关任务。模型结构不用特别复杂,只需要微调就好。速度上提升的不是一点,可能大家会有更好的解决方案,但是上述也是其中一种,我觉得万变不离其宗,能提升模型效果的方法就是好办法。就写到这里把,欢迎大家来沟通。
【使用Bert语义向量处理下游任务(分类/实体识别/阅读理解等等)】有问题不能及时回复请联系我邮箱:13100980468@163.com

    推荐阅读