玩手机游戏,享快乐生活!
应用
超级视力表1.1.7官方下载_最新超级视力表app免费下载 体教联盟4.8.5官方下载_最新体教联盟app免费下载 医护之家2.4.9官方下载_最新医护之家app免费下载 BBIN电子1.0官方下载_最新BBIN电子app免费下载 美付宝4.0.0官方下载_最新美付宝app免费下载 心悦俱乐部4.9.5.31官方下载_最新心悦俱乐部app免费下载 慧眼识图1.17官方下载_最新慧眼识图app免费下载 堆糖7.2.5官方下载_最新堆糖app免费下载 青芒果订酒店9.3.3官方下载_最新青芒果订酒店app免费下载 小蚜虫风控1.2.2官方下载_最新小蚜虫风控app免费下载 七彩鲜花4.4.3官方下载_最新七彩鲜花app免费下载 拿货商城1.35官方下载_最新拿货商城app免费下载 红货0.1.2官方下载_最新红货app免费下载 六点喇叭1.0.4官方下载_最新六点喇叭app免费下载 育之有道1.0.2官方下载_最新育之有道app免费下载 和心理咨询4.0.3官方下载_最新和心理咨询app免费下载 麦店1.0.0官方下载_最新麦店app免费下载 A8体育直播-NBA英超4.12.2官方下载_最新A8体育直播-NBA英超app免费下载 热门全本免费小说1.0.6官方下载_最新热门全本免费小说app免费下载 秀健身1.4.0官方下载_最新秀健身app免费下载 今日智投1.0.2官方下载_最新今日智投app免费下载 念念有词2.3.0官方下载_最新念念有词app免费下载 彩云天气5.0.1官方下载_最新彩云天气app免费下载 更多
游戏
放开那三国6.2.9官方下载_最新放开那三国app免费下载 奥特曼联盟之百变超人3.8.0官方下载_最新奥特曼联盟之百变超人app免费下载 叶罗丽公主水晶鞋2.3.0官方下载_最新叶罗丽公主水晶鞋app免费下载 米诺怪兽2:进化4.0.104官方下载_最新米诺怪兽2:进化app免费下载 奥特曼疯狂跑酷1.5.0官方下载_最新奥特曼疯狂跑酷app免费下载 铠甲勇士4之捕将5.6.0官方下载_最新铠甲勇士4之捕将app免费下载 全民捕鱼季1.0官方下载_最新全民捕鱼季app免费下载 废土行动2.10.1官方下载_最新废土行动app免费下载 菲狐倚天情缘1.0.0官方下载_最新菲狐倚天情缘app免费下载 一统天下10.1.8官方下载_最新一统天下app免费下载 神之物语1.0.16官方下载_最新神之物语app免费下载 天仙月1.0.3.3官方下载_最新天仙月app免费下载 天龙八部1.50.2.2官方下载_最新天龙八部app免费下载 口水三国(网游)1.6.0官方下载_最新口水三国(网游)app免费下载 剑与轮回-红包雨2.6.2官方下载_最新剑与轮回-红包雨app免费下载 三国演义:吞噬无界3.8.04官方下载_最新三国演义:吞噬无界app免费下载 真龙霸业1.5.0官方下载_最新真龙霸业app免费下载 三生三世十里桃花1.0.9官方下载_最新三生三世十里桃花app免费下载 游戏王座5.20.40官方下载_最新游戏王座app免费下载 华夏2.1.2官方下载_最新华夏app免费下载 兵人大战2.95.0官方下载_最新兵人大战app免费下载 大天使之剑H52.5.15官方下载_最新大天使之剑H5app免费下载 帝王时代V1.2.45官方下载_最新帝王时代app免费下载 更多
资讯
陈述点评我国城市群营商环境 吁注重城市竞合机制 语音版deepfake呈现:从文本到传神人声,被仿照者高呼真得可怕 优先处理较重患者 北京大医院看急诊能“插队”了 电动车职业怎么改变?选用锂电池或导致成本上升 热销保健品洗脑经:变身“功能性食物” 晋级为“疗法” “五一”假日首日广铁发送旅客243万人次 默克尔:可通过汉堡港事例讨论更好执行“一带一路”建议 “五一”假日首日铁路杭州站发客37.7万人次 加开列车47列 电信“运营不良名单”,为何频现三大运营商 中国移动被查询都是定制机惹的祸?已暂停出售行为 VIP陪练教师请假最少扣一倍课时费 被指压榨薪资 “她需求”走强:我国一二线城市女人购房者快速添加 “脱欧”迷局反致英国经济在短期内反常提速 巴西本年4月通胀率为0.57% 山西动车初次驰出雁门关 朔州名景不再路遥 广交会三期开幕 我国农产品出口量稳质升 “技艺我国”露脸2019伦敦手工艺周 尼泊尔出书人:亚洲文明对话大会是沟通互鉴的优质渠道 美国会民主党人给财长发传票 三要特朗普交税表 对话“立异破壁者”黄渊普:青年人的力气在于立异 不必50万,也能科创板?但这些危险怎样防? 鼓舞个人租借住宅 姑苏5月1日起答应租借房打间隔 新闻分析:韩国三星电子经营赢利缘何锐减 更多
联系我们
版权说明
当前位置: 首页 > 资讯 > 科技

搞定NLP范畴的“变形金刚”!手把手教你用BERT进行多标签文本分类

来源:第七纬度下载吧 发布时间:2019-02-19 20:30:20 点击数:

曩昔的一年,深度神经网络的运用敞开了自然言语处理的新时代。预练习模型在研讨范畴的运用现已令许多NLP项目的最新效果产生了巨大的腾跃,例如文本分类,自然言语推理和问答。

ELMo,ULMFiT 和OpenAI Transformer是其间几个要害的里程碑。一切这些算法都答应咱们在大型数据库(例如一切维基百科文章)上预先练习无监督言语模型,然后在下流使命上对这些预先练习的模型进行微调。

这一年里,在这一范畴中最激动人心的事情恐怕要数BERT的发布,这是一种依据多言语转换器的模型,它现已在各种NLP项目中取得了令人瞩目的效果。BERT是一种依据transformer架构的双向模型,它以一种速度更快的依据Attention的办法替代了RNN(LSTM和GRU)的sequential特点。

该模型还在两个无监督使命(“遮盖言语模型”和“下一句猜测”)进步行了预练习。这让咱们可以经过对下流特定使命(例如心情分类,目的检测,问答等)进行微调来运用预先练习的BERT模型。

本文将手把手教你,用BERT完结一个Kaggle竞赛。

在本文中,咱们将要点介绍BERT在多标签文本分类问题中的运用。传统的分类问题假定每个文档都分配给一个且只分配给一个类别,即标签。这有时也被称为多元分类,比方类别数量是2的话,就叫做二元分类。

而多标签分类假定文档可以一起独登时分配给多个标签或类别。多标签分类具有许多实践运用,例如事务分类或为电影分配多个类型。在客户效劳范畴,此技能可用于辨认客户电子邮件的多种目的。

咱们将运用Kaggle的“歹意谈论分类应战”来衡量BERT在多标签文本分类中的体现。

在本次竞赛中,咱们将测验构建一个可以将给文本片段分配给同恶评类别的模型。咱们设定了歹意谈论类别作为模型的方针标签,它们包括一般恶评、严峻恶评、污言秽语、要挟、凌辱和身份敌视。

竞赛链接:https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge

从哪开端?

Google Research最近揭露了BERT 的tensorflow布置代码,并发布了以下预练习模型:

  • BERT-Base, Uncased: 12层,768个躲藏单元,自注意力的 head数为12,110M参数

  • BERT-Large, Uncased:24层,1024个躲藏单元,自注意力的 head数为16,340M参数

  • BERT-Base, Cased:12层,768个躲藏单元,自注意力的 head数为12,110M参数

  • BERT-Large, Cased:24层,1024个躲藏单元,自注意力的 head数为16,340M参数

  • BERT-Base, Multilingual Cased (最新引荐):104种言语,12层,768个躲藏单元,自注意力的 head数为12,110M参数

  • BERT-Base, Chinese:中文(简体和繁体),12层,768个躲藏单元,自注意力的 head数为12,110M参数

编者注:这儿cased和uncased的意思是在进行WordPiece分词之前是否区别巨细写。uncased表明全部会调整成小写,且除掉一切的重音符号;cased则表明文本的实在状况和重音符号都会保存下来。

咱们将运用较小的Bert-Base,uncased模型来完结此使命。Bert-Base模型有12个attention层,一切文本都将由符号器转换为小写。咱们在亚马逊云 p3.8xlarge EC2实例上运转此模型,该实例包括4个Tesla V100 GPU,GPU内存一共64 GB。

由于我个人更喜爱在TensorFlow上运用PyTorch,所以咱们将运用来自HuggingFace的BERT模型PyTorch端口,这可从https://github.com/huggingface/pytorch-pretrained-BERT下载。咱们现已用HuggingFace的repo脚本将预先练习的TensorFlow检查点(checkpoints)转换为PyTorch权重。

咱们的完成很大程度上是以BERT原始完成中供给的run_classifier示例为根底的。

数据展现

数据用类InputExample来表明。

  • text_a:文本谈论

  • text_b:未运用

  • 标签:来自练习数据集的谈论标签列表(很明显,测验数据集的标签将为空)

class InputExample(object):    """A single training/test example for sequence classification."""    def __init__(self, guid, text_a, text_b=None, labels=None):        """Constructs a InputExample.        Args:            guid: Unique id for the example.            text_a: string. The untokenized text of the first sequence. For single            sequence tasks, only this sequence must be specified.            text_b: (Optional) string. The untokenized text of the second sequence.            Only must be specified for sequence pair tasks.            labels: (Optional) [string]. The label of the example. This should be            specified for train and dev examples, but not for test examples.        """        self.guid = guid        self.text_a = text_a        self.text_b = text_b         self.labels = labels

class InputFeatures(object):    """A single set of features of data."""    def __init__(self, input_ids, input_mask, segment_ids, label_ids):        self.input_ids = input_ids        self.input_mask = input_mask        self.segment_ids = segment_ids         self.label_ids = label_ids

咱们将InputExample转换为BERT能了解的特征,该特征用类InputFeatures来表明。

  • input_ids:符号化文本的数字id列表

  • input_mask:关于实在符号将设置为1,关于填充符号将设置为0

  • segment_ids:关于咱们的状况,这将被设置为全1的列表

  • label_ids:文本的one-hot编码标签

符号化(Tokenisation)

BERT-Base,uncased模型运用包括30,522个单词的词汇表。符号化进程触及将输入文本拆分为词汇表中可用的符号列表。为了处理不在词汇表中的单词,BERT运用一种称为依据双字节编码(BPE,Byte-Pair Encoding)的WordPiece符号化技能。

这种办法将不在词汇表之中的词一步步分解成子词。由于子词是词汇表的一部分,模型现已学习了这些子词在上下文中的表明,而且该词的上下文仅仅是子词的上下文的组合,因而这个词就可以由一组子词表明。要了解关于此办法的更多详细信息,请参阅文章《运用子词单位的稀有单词的神经网络机器翻译》。

文章链接:https://arxiv.org/pdf/1508.07909

在我看来,这与BERT自身相同都是一种打破。

模型架构

咱们将改写BertForSequenceClassification类以使其满意多标签分类的要求。

class BertForMultiLabelSequenceClassification(PreTrainedBertModel):    """BERT model for classification.    This module is composed of the BERT model with a linear layer on top of    the pooled output.    """    def __init__(self, config, num_labels=2):        super(BertForMultiLabelSequenceClassification, self).__init__(config)        self.num_labels = num_labels        self.bert = BertModel(config)        self.dropout = torch.nn.Dropout(config.hidden_dropout_prob)        self.classifier = torch.nn.Linear(config.hidden_size, num_labels)        self.apply(self.init_bert_weights)    def forward(self, input_ids, token_type_ids=None, attention_mask=None, labels=None):        _, pooled_output = self.bert(input_ids, token_type_ids, attention_mask, output_all_encoded_layers=False)        pooled_output = self.dropout(pooled_output)        logits = self.classifier(pooled_output)        if labels is not None:            loss_fct = BCEWithLogitsLoss()            loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1, self.num_labels))            return loss        else:            return logits            def freeze_bert_encoder(self):        for param in self.bert.parameters():            param.requires_grad = False        def unfreeze_bert_encoder(self):        for param in self.bert.parameters():             param.requires_grad = True

这儿首要的改动是用logits作为二进制穿插熵的丢失函数(BCEWithLogitsLoss),替代用于多元分类的vanilla穿插熵丢失函数(CrossEntropyLoss)。二进制穿插熵丢失可以让咱们的模型为标签分配独立的概率。

下面的模型摘要说明晰模型的各个层及其维度。

BertForMultiLabelSequenceClassification(  (bert): BertModel(    (embeddings): BertEmbeddings(      (word_embeddings): Embedding(28996, 768)      (position_embeddings): Embedding(512, 768)      (token_type_embeddings): Embedding(2, 768)      (LayerNorm): FusedLayerNorm(torch.Size([768]), eps=1e-12, elementwise_affine=True)      (dropout): Dropout(p=0.1)    )    (encoder): BertEncoder(      (layer): ModuleList( #       12 BertLayers        (11): BertLayer(          (attention): BertAttention(            (self): BertSelfAttention(              (query): Linear(in_features=768, out_features=768, bias=True)              (key): Linear(in_features=768, out_features=768, bias=True)              (value): Linear(in_features=768, out_features=768, bias=True)              (dropout): Dropout(p=0.1)            )            (output): BertSelfOutput(              (dense): Linear(in_features=768, out_features=768, bias=True)              (LayerNorm): FusedLayerNorm(torch.Size([768]), eps=1e-12, elementwise_affine=True)              (dropout): Dropout(p=0.1)            )          )          (intermediate): BertIntermediate(            (dense): Linear(in_features=768, out_features=3072, bias=True)          )          (output): BertOutput(            (dense): Linear(in_features=3072, out_features=768, bias=True)            (LayerNorm): FusedLayerNorm(torch.Size([768]), eps=1e-12, elementwise_affine=True)            (dropout): Dropout(p=0.1)          )        )      )    )    (pooler): BertPooler(      (dense): Linear(in_features=768, out_features=768, bias=True)      (activation): Tanh()    )  )  (dropout): Dropout(p=0.1)  (classifier): Linear(in_features=768, out_features=6, bias=True) )

  • BertEmbeddings:输入嵌入层

  • BertEncoder: 12个BERT模型attention层

  • 分类器:咱们的多标签分类器,out_features = 6,每个分类符对应6个标签

模型练习

练习循环与原始BERT完成中供给的run_classifier.py里的循环相同。咱们的模型练习了4个epoch(一个完好的数据集经过了神经网络一次而且返回了一次,这个进程称为一个 epoch),每批数据巨细为32,序列长度为512,即预练习模型的最大可能性。依据原始论文的主张,学习率保持在3e-5。

由于有时机运用多个GPU,所以咱们将Pytorch模型封装在DataParallel模块中,这使咱们可以在一切可用的GPU进步行练习。

咱们没有运用半精度FP16技能,由于运用logits 丢失函数的二进制穿插熵不支持FP16处理。但这并不会影响终究成果,仅仅需求更长的时刻练习。

评价目标

def accuracy_thresh(y_pred:Tensor, y_true:Tensor, thresh:float=0.5, sigmoid:bool=True):    "Compute accuracy when `y_pred` and `y_true` are the same size."    if sigmoid: y_pred = y_pred.sigmoid()    return np.mean(((y_pred>thresh)==y_true.byte()).float().cpu().numpy(), axis=1).sum()

from sklearn.metrics import roc_curve, auc # Compute ROC curve and ROC area for each class fpr = dict() tpr = dict() roc_auc = dict() for i in range(num_labels):    fpr[i], tpr[i], _ = roc_curve(all_labels[:, i], all_logits[:, i])    roc_auc[i] = auc(fpr[i], tpr[i]) # Compute micro-average ROC curve and ROC area fpr["micro"], tpr["micro"], _ = roc_curve(all_labels.ravel(), all_logits.ravel()) roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

咱们为精度衡量函数增加了一个阈值,默认设置为0.5。

关于多标签分类,更重要的目标是ROC-AUC曲线。这也是Kaggle竞赛的评分目标。咱们别离核算每个标签的ROC-AUC,并对单个标签的roc-auc分数进行微均匀。

假如想深化了解roc-auc曲线,这儿有一篇很不错的博客。

博客链接:https://towardsdatascience.com/understanding-auc-roc-curve-68b2303cc9c5

评价分数

咱们重复进行了几回试验,每次都有一些输入上的改变,但都得到了相似的成果,如下所示:

练习丢失:0.022,验证丢失:0.018,验证准确度:99.31%。

各个标签的ROC-AUC分数:

  • 一般恶评:0.9988

  • 严峻恶评:0.9935

  • 污言秽语:0.9988

  • 要挟:0.9989

  • 凌辱:0.9975

  • 身份敌视:0.9988

  • 微观均匀ROC-AUC得分:0.9987

这样的成果好像十分令人鼓舞,由于咱们看上去现已创建了一个近乎完美的模型来检测文本谈论的狠毒程度。现在看看咱们在Kaggle排行榜上的得分。

Kaggle竞赛成果

咱们在Kaggle供给的测验数据集上运转推理逻辑,并将成果提交给竞赛。以下是成果:




咱们的roc-auc评分达到了0.9863,在一切竞争者中排名前10%。为了使竞赛成果更具说服力,这次Kaggle竞赛的奖金为35000美元,而一等奖得分为0.9885。

最高分的团队由专业的高技能数据科学家和从业者组成。除了咱们所做的作业之外,他们还运用各种技能来进行数据集成,数据增强(data augmentation)和测验时增强(test-time augmentation)。

定论和后续

咱们运用强壮的BERT预练习模型完成了多标签分类模型。正如咱们所展现的那样,模型在已熟知的揭露数据集上得到了适当不错的成果。咱们可以树立一个世界级的模型出产运用于各行业,尤其是客户效劳范畴。

关于咱们来说,下一步将是运用“遮盖言语模型”和“下一句猜测”对下流使命的文本语料库来微调预练习的言语模型。这将是一项无监督的使命,期望该模型可以学习一些咱们自定义的上下文和术语,这和ULMFiT运用的技能相似。

材料链接: 

原始BERT论文:https://arxiv.org/pdf/1810.04805

相关报导:https://medium.com/huggingface/multi-label-text-classification-using-bert-the-mighty-transformer-69714fa3fb3d

秉承“遍及数据思想,传达数据文明,助⼒工业开展”的企业⽂化,咱们专心于数据范畴的资讯、事例、技能,构成了“媒体+教育+⼈才效劳”的良性⽣态,致⼒于打造精准数据科学社区。

应用 | 游戏 | 资讯 | 联系我们 | 版权说明 |

浙公网安备 33060202000544号
Copyright©第七纬度下载吧 All Rights Reserved.