前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用BERT和TensorFlow构建多标签文本分类器

使用BERT和TensorFlow构建多标签文本分类器

作者头像
代码医生工作室
发布2019-06-21 18:01:32
10.4K0
发布2019-06-21 18:01:32
举报
文章被收录于专栏:相约机器人相约机器人

作者 | Javaid Nabi

来源 | Medium

编辑 | 代码医生团队

在多标签分类问题中,训练集由实例组成,每个实例可以被分配有表示为一组目标标签的多个类别,并且任务是预测测试数据的标签集。例如:

  • 文本可能同时涉及任何宗教,政治,金融或教育,也可能不属于任何一种。
  • 电影可以根据其摘要内容分为动作,喜剧和浪漫类型。有可能电影属于romcoms [浪漫与喜剧]等多种类型。

它与多类分类问题有什么不同?

在多级分类中,每个样本被分配给一个且仅一个标签:水果可以是苹果或梨,但不能同时是两者。让我们考虑一个三个类的例子C = [“Sun,”Moon,Cloud“]。在多类中,每个样本只能属于一个C类。在多标签情况下,每个样本可以属于一个或多个类。

数据集

将使用Kaggle的Toxic Comment Classification Challenge数据集,该数据集由大量维基百科评论组成,这些评论已被人类评估者标记为有毒行为。毒性的类型是:

https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge

toxic, severe_toxic, obscene, threat, insult, identity_hate

例:

“Hi! I am back again! Last warning! Stop undoing my edits or die!”

标记为[1,0,0,1,0,0]。意思是它是toxic 和threat。

简要讨论一下BERT

在2018年10月,谷歌发布了一种名为BERT的新语言表示模型,它代表变形金刚的双向编码器表示。BERT建立在预训练上下文表示的最近工作的基础上 - 包括半监督序列学习,生成预训练,ELMo和ULMFit。然而,与以前的模型不同,BERT是第一个深度双向,无监督的语言表示,仅使用纯文本语料库(Wikipedia)进行预训练。

预先训练的陈述可以是上下文无关的或上下文

  1. 诸如word2vec或GloVe之类的无上下文模型为词汇表中的每个单词生成单个单词嵌入表示。例如,“ bank ” 一词在“ bank account ”和“ bank of the river.”中具有相同的无上下文表示。”
  2. 相反,上下文模型生成基于句子中其他单词的每个单词的表示。上下文表示可以进一步是单向的或双向的。例如,在句子“I accessed the bank account,”单向情境模式将是“ bank ”的基础上“ I accessed the ”,而不是“ account账户 ”。然而,BERT表示“ bank ”同时使用它的前面和后面的背景- “ I accessed the … account ” - 从深层神经网络的最底层开始,使其成为双向的。

基于双向LSTM的语言模型训练标准的从左到右的语言模型,并且还训练从右到左(反向)语言模型,该模型预测来自ELMO中的后续单词的先前单词。在ELMo中,前向语言模型和后向语言模型都有一个LSTM。关键的区别在于,LSTM都不会同时考虑前一个和后一个令牌。

为什么BERT优于其他双向型号?

直观地说,深度双向模型比从左到右模型或从左到右和从右到左模型的串联更严格。遗憾的是,标准条件语言模型只能从左到右或从右到左进行训练,因为双向调节将允许每个单词在多层上下文中间接地“看到自己”。

为了解决这个问题,BERT使用“MASKING”技术来屏蔽输入中的一些单词,然后双向调节每个单词以预测被屏蔽的单词。例如:

前向,后向和蒙面语言建模

BERT还学习通过预训练来模拟句子之间的关系,这可以从任何文本语料库中生成:给定两个句子A和B,B是在语料库中A之后出现的实际下一个句子,或者只是一个随意的句子?例如:

这只是BERT的基本概述。

好消息: Google已将BERT上传到TensorFlow Hub,这意味着可以直接使用预训练模型来解决我们的NLP问题,包括文本分类或句子相似性等。

预测电影评论的示例,二进制分类问题作为存储库中的示例代码提供。在本文中将重点介绍BERT在多标签文本分类问题中的应用。因此将基本上修改示例代码并应用必要的更改以使其适用于多标签方案。

建立

使用安装BERT

!pip install bert-tensorflow

下载预先训练的BERT模型:这些是权重和其他必要文件,用于表示BERT在预训练中学到的信息。需要选择想要的BERT预训练重量。有两种方法可以下载和使用预先训练的BERT模型:

1.直接使用tensorflow-hub:

以下预训练模型可供选择。

  • BERT-Base, Uncased:12层,768隐藏,12头,110M参数
  • BERT-Large, Uncased:24层,1024个隐藏,16个头,340M参数
  • BERT-Base, Cased:12层,768隐藏,12头,110M参数
  • BERT-Large, Cased:24层,1024个隐藏,16个头,340M参数
  • BERT-Base, Multilingual Case:104种语言,12层,768隐藏,12头,110M参数
  • BERT-Base, Chinese:中文简体和繁体,12层,768隐藏,12头,110M参数

将使用基本型号:'uncased_L-12_H-768_A-12'

BERT_MODEL_HUB = “https://tfhub.dev/google/bert_uncased_L-12_H-768_A-12/1"

2.手动下载BERT模型文件:下载并保存到目录中并解压缩。以下是英文文件的链接:

BERT-Base, Uncased, BERT-Base, Cased,

https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip

BERT-Large, Cased, BERT-Large, Uncased

https://storage.googleapis.com/bert_models/2018_10_18/cased_L-24_H-1024_A-16.zip

可以使用任何一种方式,看看预训练模型中的实际文件是什么。当下载BERT-Base, Uncased,这些是3个重要文件,如下所示:

BERT_VOCAB= ‘uncased-l12-h768-a12/vocab.txt'
BERT_INIT_CHKPNT = ‘uncased-l12-h768-a12/bert_model.ckpt’
BERT_CONFIG = ‘uncased-l12-h768-a12/bert_config.json’

BERT_VOCAB :包含模型词汇[索引映射的单词]

BERT_INIT_CHKPNT : 包含预训练模型的权重

BERT_CONFIG : 包含BERT模型架构。

标记化

标记化涉及将输入文本分解为单个单词。为此,第一步是创建tokenizer对象。可以采取两种方式:

1.直接来自tensorflow-hub

2.从手动下载的文件:

运用 BERT_INIT_CHKPNT & BERT_VOCAB files

创建标记生成器后,就可以使用它了。将句子标记为:“This here’s an example of using the BERT tokenizer”

词汇量:~30K

数据预处理:

先来看看提供的数据集:

train.head()

需要将数据转换为BERT理解的格式。提供了一些实用功能来实现这一点。

create_examples(),读取数据框并将输入文本和相应的目标标签加载到InputExample 对象中。

使用tokenizer,将convert_examples_to_features 在示例上调用方法将它们转换为BERT理解的功能。此方法添加了BERT用于识别句子开始和结束的特殊“CLS”和“SEP”标记。它还为每个输入添加“index”和“segment”标记。因此根据BERT格式化输入的所有工作都由此函数完成。

BERT输入表示。输入嵌入是令牌嵌入,分段嵌入和位置嵌入的总和。

创建模型

在这里使用预先训练的BERT模型并对其进行微调以进行分类任务。基本上加载预先训练的模型,然后训练最后一层用于分类任务。

在多标签分类中softmax(),sigmoid()用来获取概率。

  • 在简单的二进制分类中,两者之间没有太大的区别,但是在多国分类的情况下,sigmoid允许处理非独占标签(也称为多标签),而softmax处理独占类。
  • 甲分对数(也称为得分)是一个与一个类别相关联的原始未缩放的值计算所述概率之前,。就神经网络架构而言,这意味着logit是密集(完全连接)层的输出[3]。

因此为了计算概率,进行以下更改:

### multi-class case: probabilities = tf.nn.softmax(logits) 
 ### multi-label case: probabilities = tf.nn.sigmoid(logits)

为计算每个示例损失,tensorflow提供了另一种方法:

tf.nn.sigmoid_cross_entropy_with_logits测量离散分类任务中的概率误差,其中每个类是独立的而不是互斥的。这适用于多标签分类问题[4]。

其余代码主要来自BERT参考[5]。完整的代码可以在github上找到。

https://github.com/javaidnabi31/Multi-Label-Text-classification-Using-BERT/blob/master/multi-label-classification-bert.ipynb

Kaggle提交分数:

只需运行2个时代,就可以获得非常好的效果。这是迁移学习的力量:使用预先训练的模型,该模型已经在大型数据集上进行了训练,然后针对特定任务进行微调。

https://www.kaggle.com/javaidnabi/toxic-comment-classification-using-bert/

所以在其他一些数据集上尝试一下并运行几个时期[3-4]并查看结果。

参考

https://ai.googleblog.com/2018/11/open-sourcing-bert-state-of-art-pre.html

https://mlexplained.com/2019/01/07/paper-dissected-bert-pre-training-of-deep-bidirectional-transformers-for-language-understanding-explained/

https://stackoverflow.com/questions/47034888/how-to-choose-cross-entropy-loss-in-tensorflow

https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

https://github.com/google-research/bert/blob/master/run_classifier.py

https://www.depends-on-the-definition.com/guide-to-multi-label-classification-with-neural-networks/

https://towardsdatascience.com/journey-to-the-center-of-multi-label-classification-384c40229bff

https://gombru.github.io/2018/05/23/cross_entropy_loss/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档