作者 | Javaid Nabi
来源 | Medium
编辑 | 代码医生团队
在多标签分类问题中,训练集由实例组成,每个实例可以被分配有表示为一组目标标签的多个类别,并且任务是预测测试数据的标签集。例如:
它与多类分类问题有什么不同?
在多级分类中,每个样本被分配给一个且仅一个标签:水果可以是苹果或梨,但不能同时是两者。让我们考虑一个三个类的例子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)进行预训练。
预先训练的陈述可以是上下文无关的或上下文
基于双向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:
以下预训练模型可供选择。
将使用基本型号:'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()用来获取概率。
因此为了计算概率,进行以下更改:
### 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/