使用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的词表维度*每个词的向量表示维度。

  1. 下面开始处理向量。这段代码用来处理Bert的向量文件,把向量处理成array能够送进网络的形式。

import numpy as np

def 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的相关任务。模型结构不用特别复杂,只需要微调就好。速度上提升的不是一点,可能大家会有更好的解决方案,但是上述也是其中一种,我觉得万变不离其宗,能提升模型效果的方法就是好办法。就写到这里把,欢迎大家来沟通。

有问题不能及时回复请联系我邮箱:13100980468@163.com

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liu_sir_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值