Bert只能处理长度小于512的序列,算上一些[CLS],[SEP],实际的长度要小于512。因此对于超长文本来说,Bert的效果可能一般,尤其是那些更加依赖于文档中后部分内容的下游任务。因此本文尝试使用transformers的XLNet提升超长文本多标签分类的效果。关于XLNet的介绍略。

预训练模型下载与加载

在官网搜索自己想要的模型并下载对应pytorch版本的文件:

使用的时候可以参照官方文档给出的范例:

from transformers import XLNetTokenizer, XLNetModel
import torch
tokenizer = XLNetTokenizer.from_pretrained('xlnet-base-cased-path')
model = XLNetModel.from_pretrained('xlnet-base-cased-path')

其中参数是刚刚下载的文件夹所在的路径。

数据预处理

同Bert数据预处理一样,XLNet同样采样tokenize+convert to id的形式,并且对于我自己的数据,需要人为地补全<pad><csl><sep>。注意,在Bert里,这几位仁兄写作[PAD],[CLS],[SEP]。在官方文档里,是这样解释的:

注意在使用预训练模型并微调的时候,这几个字符是非常有必要的,尤其是<cls>,在数据预处理的时候不添加这个会导致模型性能有明显地下降。数据预处理的代码很简单:

def load_data():with open('../data/data.txt', 'r', encoding='utf-8') as rf:datas = [each.strip().split('\t') for each in rf.readlines()]# process data to Bert inputDatas = []for data in datas:labels = sorted([int(a) for a in data[0].split('-')])labels = trans_label2n_hot(labels, 35)# notice there some differences from Bert:# <sep> for XLNet but [SEP] for Bert; <cls> for XLNet but [CLS] for Bert and <pad> for [PAD]sentence = '<cls>' + data[1].replace(' ','').replace('<SEP>','<sep>')tokens = tokenizer.tokenize(sentence)[:xlnet_cfg.max_len]if len(tokens) < xlnet_cfg.max_len:        # padding for max lengthtokens.extend(['<pad>'] * (xlnet_cfg.max_len - len(tokens)))ids = np.array(tokenizer.convert_tokens_to_ids(tokens))labels = torch.from_numpy(labels)ids = torch.from_numpy(ids)Datas.append([ids, labels])split = int(len(Datas) * xlnet_cfg.train_test_split)Trains = Datas[:split]Tests = Datas[split:]   # split+193train_loader = DataLoader(Trains, xlnet_cfg.batch_size, shuffle=True)test_loader = DataLoader(Tests, xlnet_cfg.batch_size, shuffle=True)print('data load finished! {}\t{}'.format(len(Trains), len(Tests)))return train_loader, test_loader

注意这里,因为是多标签的分类,所以data.txt中文件存储的方式如下:

前边的数字表示的是后边长本文所属的标签。

微调XLNet

微调的过程也和Bert的一样,稍有不同的是XLNet的输出与Bert输出不同。同样,官方文档给出了输出的内容:

具体的代码如下:

class MyXLNet(nn.Module):def __init__(self, num_classes=35, alpha=0.5):self.alpha = alphasuper(MyXLNet, self).__init__()self.net = XLNetModel.from_pretrained(xlnet_cfg.xlnet_path).cuda()for name, param in self.net.named_parameters():if 'layer.11' in name or 'layer.10' in name or 'layer.9' in name or 'layer.8' in name or 'pooler.dense' in name:param.requires_grad = Trueelse:param.requires_grad = Falseself.MLP = nn.Sequential(nn.Linear(768, num_classes, bias=True),).cuda()def forward(self, x):x = x.long()x = self.net(x, output_all_encoded_layers=False).last_hidden_statex = F.dropout(x, self.alpha, training=self.training)x = torch.max(x, dim=1)[0]x = self.MLP(x)return torch.sigmoid(x)

通过param.requires_grad = False锁定前8层的参数,不进行反向更新,微调后四层。进一步地调参可能使得效果更好,具体就不做啦。

实验结果

基于Bert(最大程度设置为512)的召回结果达到38.74%,而基于XLNet(最大长度设置为1024)的召回率达到了47.30%。不过,后者的训练时间几乎是前者的10倍。这对于只有几百条的测试文本几乎是不可接受的。

具体的代码很简单,连接如下:
https://github.com/songruiecho/BertMulti-LabelTextClassification
其中也包含了Bert的简单实现。

XLNet实现超长文本分类相关推荐

  1. 15 分钟搭建一个基于XLNET的文本分类模型——keras实战

    今天笔者将简要介绍一下后bert 时代中一个又一比较重要的预训练的语言模型--XLNET ,下图是XLNET在中文问答数据集CMRC 2018数据集(哈工大讯飞联合实验室发布的中文机器阅读理解数据,形 ...

  2. Bert超长文本分类、文本摘要

    Bert大规模超长文本分类 长文本分类 文本摘要算法Textrank介绍 句子相似度计算 训练全部代码 分类结果 总结 长文本分类 文本分类是把文本打上对应的类别标签,在互联网中的应用场景很多,如评论 ...

  3. 【NLP】6种用于文本分类的开源预训练模型

    来源 | PURVA HUILGOL 编译 | VK 作者 | Analytics Vidhya [导读]我们正站在语言和机器的交汇处,这个话题我很感兴趣.机器能像莎士比亚一样写作吗?机器能提高我自己 ...

  4. 六种用于文本分类的开源预训练模型

    作者|PURVA HUILGOL 编译|VK 来源|Analytics Vidhya 介绍 我们正站在语言和机器的交汇处,这个话题我很感兴趣.机器能像莎士比亚一样写作吗?机器能提高我自己的写作能力吗? ...

  5. Macadam自然语言处理(NLP)工具包(TextClassification, SequenceLabeling, RelationExtraction)

    Macadam Macadam是一个以Tensorflow(Keras)和bert4keras为基础,专注于文本分类.序列标注和关系抽取的自然语言处理工具包.支持RANDOM.WORD2VEC.FAS ...

  6. Simple Transformer:用BERT、RoBERTa、XLNet、XLM和DistilBERT进行多类文本分类

    作者 | Thilina Rajapakse 译者 | Raku 编辑 | 夕颜 出品 | AI科技大本营(ID: rgznai100) [导读]本文将介绍一个简单易操作的Transformers库- ...

  7. XLNet:公平PK,BERT你已经被超过!

    作者 | XLNet Team 译者 | 孙薇 责编 | Jane 出品 | AI科技大本营(ID: rgznai100) [导语]几周前,XLNet 团队发布了新型预训练语言模型 XLNet,这个新 ...

  8. 追溯XLNet的前世今生:从Transformer到XLNet

    作者丨李格映 来源 | 转载自CSDN博客 导读:2019 年 6 月,CMU 与谷歌大脑提出全新 XLNet,基于 BERT 的优缺点,XLNet 提出一种泛化自回归预训练方法,在 20 个任务上超 ...

  9. NLP重大突破?一文读懂XLNet“屠榜”背后的原理

    作者 | 李理 原文链接:https://fancyerii.github.io/2019/06/30/xlnet-theory/ 本文介绍XLNet的基本原理,读者阅读前需要了解BERT等相关模型, ...

最新文章

  1. p3c插件 离线安装_IntelliJ IDEA18个常用插件,动图演示,让你效率翻倍!
  2. Mongodb 数据模型概念
  3. python显示控制台行情_python命令行查看股票基本行情数据
  4. ios:CGContextRef 渲染中文问题
  5. CSS之Multi-columns的跨列
  6. Qt文档阅读笔记-Q_INVOKABLE官方解析及Qt中反射的使用
  7. video标签详解(转载)
  8. java统计文本中英文单词个数split_Java实现单词统计
  9. 基于JAVA教务排课系统计算机毕业设计源码+数据库+lw文档+系统+部署
  10. ftp常用命令使用方法
  11. 计算机路径共享,如何访问共享文件夹路径
  12. 一道求极值的三角函数题
  13. 将一个数组划分成总和相等的两部分(分割数组)
  14. 见丰知夏|国漫鼻祖丰子恺,数字藏品独家发售
  15. 重要性采样和多重重要性采样在路径追踪中的应用
  16. Nginx简单配置转发
  17. python大赛对名_用100行Python爬虫代码抓取公开的足球数据玩(一)
  18. ​内嵌物理知识神经网络(PINN)是个坑吗?
  19. Effective C++ 条款43
  20. 苏教版四年级下册计算机说课稿,苏教版四年级下册语文《古诗两首》的说课稿4篇...

热门文章

  1. mysql dba 认证 有效期_ocp 证书有有效期吗?
  2. 技术满满的开源盛宴—OceanBase开发者大会参会体验
  3. java-jna使用
  4. 汤姆大叔的深入理解JavaScript读后感四(完结篇)
  5. 关于个人开发者上线Android-App步骤浅谈
  6. 亿智AI SoC-SA226,专业4K相机和6-8路DVR解决方案
  7. 知己知彼百战不殆(希望能有更多的人看到并使你们有所收获)
  8. 什么是Nagle算法
  9. 跨境卖家运营亚马逊、eBay、wish、速卖通、Shopee、Lazada、乐天、煤炉有哪些技巧?如何做测评自养号?
  10. 基于Java毕业设计校园疫情防控管理软件源码+系统+mysql+lw文档+部署软件