XLNET中文文本分类

一.Xlnet概述

        Xlnet,自BERT预训练-微调模式开创以来,这个自然语言处理NLP中的又一重大进展。Xlnet融合了自回归(AR,单向语言模型)、自编码(AE,双向语言模型)等语言模型特征,采用最先进的transformer特征提取器(transformer-xl,利用分割循环机制和相对位置编码进行高并发-超长文本处理),开创性地提出了排列语言模型(Permutation Language Modeling)。

        PLM,这种语言模型机制既能保留自回归(AR)语言模型模型地优点(利用自回归(AR)模型估计文本语料库的概率分布,即有利于文本生成NLG任务),又巧妙地引入自编码(AE)语言模型(因式分解文本,表现为固定预测mask的时候打乱句子顺序,这样可以有效捕获上下文文本特征,对于文本理解NLU任务有利)。

        同时,这种类BERT中mask机制(Masked LM)的预测被遮挡字/词的过程,发生于Xlnet预训练模型中的multi-head-attention内,从而克服了BERT预训练(输入被mask)、微调(输入不需要mask)时候输入不同的问题。

        虽然现在(20190829)中文Xlnet谷歌版还没有训练好,但是涅,哈工大版中文Xlnet预训练模型已经开放出来了(哈工大牛批),不过这个讯飞云什么鬼。。。

        预训练模型已经有啦,那么当然是进行微调的各种实验啦,句向量embedding,分类,相似度,阅读理解,文本生成......

        xlnet-embedding地址:https://github.com/yongzhuo/nlp_xiaojiang/tree/master/FeatureProject/xlnet

        xlnet-chinese-text-classification地址:https://github.com/yongzhuo/Keras-TextClassification            

二.Xlnet分类实例

        和bert微调大同小异,不过,还是有一些细微的差别。

        以keras-xlnet为例,预加载模型设置可以设置target_len长度(目标,即当前输入文本最大长度),attention类型('uni'或者'bi'),memory_len长度(分段长文本最长依赖,Tranformer-XL)。

        也可以引用不同的层,各种组合。这里中文xlnet哈工大版-初版是有24个层246个layer,包括6层输入与embedding,其他的是每10个layer为一个block,即一层,有的layer输出还是两个tensor的,这里需要注意。

        简单xlnet-fineture代码如下,具体embedding请看github:https://github.com/yongzhuo/Keras-TextClassification/blob/master/keras_textclassification/base/embedding.py

        

# -*- coding: UTF-8 -*-
# !/usr/bin/python
# @time     :2019/8/28 23:06
# @author   :Mo
# @function :graph of xlnet fineture, 后面不接什么网络结构, 只有一个激活层
# @paper    :XLNet: Generalized Autoregressive Pretraining for Language Understanding

from __future__ import print_function, division

from keras.layers import SpatialDropout1D, Conv1D, GlobalMaxPooling1D, Dense
from keras.layers import Dropout, Reshape, Concatenate, Lambda
from keras.layers import LSTM, GRU
from keras.layers import Flatten
from keras.models import Model
from keras import backend as K
from keras import regularizers

from keras_textclassification.base.graph import graph

import numpy as np


class XlnetGraph(graph):
    def __init__(self, hyper_parameters):
        """
            初始化
        :param hyper_parameters: json,超参
        """
        super().__init__(hyper_parameters)

    def create_model(self, hyper_parameters):
        """
            构建神经网络
        :param hyper_parameters:json,  hyper parameters of network
        :return: tensor, moedl
        """
        super().create_model(hyper_parameters)
        embedding_output = self.word_embedding.output
        x = embedding_output
        # x = Lambda(lambda x : x[:, 0:1, :])(embedding_output) # 获取CLS
        # # text cnn
        # bert_output_emmbed = SpatialDropout1D(rate=self.dropout)(embedding_output)
        # concat_out = []
        # for index, filter_size in enumerate(self.filters):
        #     x = Conv1D(name='TextCNN_Conv1D_{}'.format(index),
        #                filters= self.filters_num, # int(K.int_shape(embedding_output)[-1]/self.len_max),
        #                strides=1,
        #                kernel_size=self.filters[index],
        #                padding='valid',
        #                kernel_initializer='normal',
        #                activation='relu')(bert_output_emmbed)
        #     x = GlobalMaxPooling1D(name='TextCNN_MaxPool1D_{}'.format(index))(x)
        #     concat_out.append(x)
        # x = Concatenate(axis=1)(concat_out)
        # x = Dropout(self.dropout)(x)
        x = Flatten()(x)
        # 最后就是softmax
        dense_layer = Dense(self.label, activation=self.activate_classify)(x)
        output_layers = [dense_layer]
        self.model = Model(self.word_embedding.input, output_layers)
        self.model.summary(120)

希望对你有所帮助!

不足之处还望指出,谢谢!

发布了96 篇原创文章 · 获赞 72 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/rensihui/article/details/100148351