XLNet实现超长文本分类
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实现超长文本分类相关推荐
- 15 分钟搭建一个基于XLNET的文本分类模型——keras实战
今天笔者将简要介绍一下后bert 时代中一个又一比较重要的预训练的语言模型--XLNET ,下图是XLNET在中文问答数据集CMRC 2018数据集(哈工大讯飞联合实验室发布的中文机器阅读理解数据,形 ...
- Bert超长文本分类、文本摘要
Bert大规模超长文本分类 长文本分类 文本摘要算法Textrank介绍 句子相似度计算 训练全部代码 分类结果 总结 长文本分类 文本分类是把文本打上对应的类别标签,在互联网中的应用场景很多,如评论 ...
- 【NLP】6种用于文本分类的开源预训练模型
来源 | PURVA HUILGOL 编译 | VK 作者 | Analytics Vidhya [导读]我们正站在语言和机器的交汇处,这个话题我很感兴趣.机器能像莎士比亚一样写作吗?机器能提高我自己 ...
- 六种用于文本分类的开源预训练模型
作者|PURVA HUILGOL 编译|VK 来源|Analytics Vidhya 介绍 我们正站在语言和机器的交汇处,这个话题我很感兴趣.机器能像莎士比亚一样写作吗?机器能提高我自己的写作能力吗? ...
- Macadam自然语言处理(NLP)工具包(TextClassification, SequenceLabeling, RelationExtraction)
Macadam Macadam是一个以Tensorflow(Keras)和bert4keras为基础,专注于文本分类.序列标注和关系抽取的自然语言处理工具包.支持RANDOM.WORD2VEC.FAS ...
- Simple Transformer:用BERT、RoBERTa、XLNet、XLM和DistilBERT进行多类文本分类
作者 | Thilina Rajapakse 译者 | Raku 编辑 | 夕颜 出品 | AI科技大本营(ID: rgznai100) [导读]本文将介绍一个简单易操作的Transformers库- ...
- XLNet:公平PK,BERT你已经被超过!
作者 | XLNet Team 译者 | 孙薇 责编 | Jane 出品 | AI科技大本营(ID: rgznai100) [导语]几周前,XLNet 团队发布了新型预训练语言模型 XLNet,这个新 ...
- 追溯XLNet的前世今生:从Transformer到XLNet
作者丨李格映 来源 | 转载自CSDN博客 导读:2019 年 6 月,CMU 与谷歌大脑提出全新 XLNet,基于 BERT 的优缺点,XLNet 提出一种泛化自回归预训练方法,在 20 个任务上超 ...
- NLP重大突破?一文读懂XLNet“屠榜”背后的原理
作者 | 李理 原文链接:https://fancyerii.github.io/2019/06/30/xlnet-theory/ 本文介绍XLNet的基本原理,读者阅读前需要了解BERT等相关模型, ...
最新文章
- p3c插件 离线安装_IntelliJ IDEA18个常用插件,动图演示,让你效率翻倍!
- Mongodb 数据模型概念
- python显示控制台行情_python命令行查看股票基本行情数据
- ios:CGContextRef 渲染中文问题
- CSS之Multi-columns的跨列
- Qt文档阅读笔记-Q_INVOKABLE官方解析及Qt中反射的使用
- video标签详解(转载)
- java统计文本中英文单词个数split_Java实现单词统计
- 基于JAVA教务排课系统计算机毕业设计源码+数据库+lw文档+系统+部署
- ftp常用命令使用方法
- 计算机路径共享,如何访问共享文件夹路径
- 一道求极值的三角函数题
- 将一个数组划分成总和相等的两部分(分割数组)
- 见丰知夏|国漫鼻祖丰子恺,数字藏品独家发售
- 重要性采样和多重重要性采样在路径追踪中的应用
- Nginx简单配置转发
- python大赛对名_用100行Python爬虫代码抓取公开的足球数据玩(一)
- ​内嵌物理知识神经网络(PINN)是个坑吗?
- Effective C++ 条款43
- 苏教版四年级下册计算机说课稿,苏教版四年级下册语文《古诗两首》的说课稿4篇...
热门文章
- mysql dba 认证 有效期_ocp 证书有有效期吗?
- 技术满满的开源盛宴—OceanBase开发者大会参会体验
- java-jna使用
- 汤姆大叔的深入理解JavaScript读后感四(完结篇)
- 关于个人开发者上线Android-App步骤浅谈
- 亿智AI SoC-SA226,专业4K相机和6-8路DVR解决方案
- 知己知彼百战不殆(希望能有更多的人看到并使你们有所收获)
- 什么是Nagle算法
- 跨境卖家运营亚马逊、eBay、wish、速卖通、Shopee、Lazada、乐天、煤炉有哪些技巧?如何做测评自养号?
- 基于Java毕业设计校园疫情防控管理软件源码+系统+mysql+lw文档+部署软件