在开始探索ModelScope上的零样本分类之前,我们先来看看预测结果:
它竟然知道我想去旅游?难道这个样本已经被训练过了?我们再来试试,你能知道我啥心情吗?
难道这样本也被训练过了?不可能吧。
接下来,让我们一起探索一下ModelScope的零样本分类。
实验环境准备
依据ModelScope的介绍,实验环境可分为两种情况。笔者在此推荐使用第2种方式,点开就能用,省去本地安装环境的麻烦,直接体验ModelScope。
1 本地环境安装
可参考ModelScope环境安装。
2 Notebook
ModelScope直接集成了线上开发环境,用户可以直接在线训练、调用模型。
打开零样本分类模型,点击右上角“在Notebook中打开”,选择机器型号后,即可进入线上开发环境。
实验测试
进入Notebook或本地安装好开发环境后,开始我们的零样本分类之旅吧。
加载模型
使用以下两行命令即可进行零样本分类的模型加载。
frommodelscope.pipelinesimportpipelineclassifier=pipeline('zero-shot-classification', 'damo/nlp_structbert_zero-shot-classification_chinese-base')
运行后,ModelScope自动将指定的模型下载至缓存目录中。此处不得不说,依托于阿里云的ModelScope的模型下载速度令人十分舒畅。
设置标签
与一般的文本分类模型不同,零样本分类模型可以自己设定对应的标签,模型将根据给定的标签进行分类。此处我们先将文本标签设置如下。
labels= ['家居', '旅游', '科技', '军事', '游戏', '故事']
进行分类
接着,输入文本进行分类。这里输入的文本当然是“世界那么大,我想去看看”了!
sentence='世界那么大,我想去看看'classifier(sentence, candidate_labels=labels)
最后,我们得到了以下结果:
按照这返回格式判断,labels是我们设定的标签,scores则是每个标签的概率分布。从返回的结果中,可以发现样本属于旅游的概率远大于其他类别。
多标签分类
在上述分类中,我们还有一个参数没有用到,即multi_label。从零样本分类模型的介绍中可以发现,这个参数是用于设置分类任务是否为多标签分类的。接着,我们也来尝试一下多标签分类任务。
首先,设置标签如下:
labels= ["不开心", "不高心", "高兴", "开心"]
接着,输入文本进行分类,并设置multi_label=True。
sentence='世界那么大,我想去看看'result=classifier(sentence, candidate_labels=labels, multi_label=True)
最后我们得到了以下结果。
其中scores代表的是每个标签的概率,预测结果可以认为是开心和高兴,因他们的概率大于0.5。
原理分析
体验完零样本分类的神奇之后,我们来分析分析它的工作原理。
在零样本分类模型介绍中有提到,这是一个基于自然语言推理任务实现的零样本分类模型。因此,我们先来看看什么是自然语言推理任务。
自然语言推理
自然语言推理主要是判断两个句子(前提和假设,Premise and Hypothesis)之间的语义关系,一般定义有(Entailment, Contradiction, Neutral)三个类别,可以当成是一个三分类任务。下面举了3个例子让大家切实感受一下自然语言推理任务。
自然语言推理举例 前提:中间坐着的修鞋匠,就是张永红的父亲 假设:修鞋匠是女的 语义关系:Contradiction(矛盾) 解释:张永红的父亲,当然是男的! 前提:中间坐着的修鞋匠,就是张永红的父亲 假设:修鞋匠是男的 语义关系:Entailment(蕴含) 解释:张永红的父亲是男的,所以前提句子中已经包含了假设句的语义。 前提:中间坐着的修鞋匠,就是张永红的父亲 假设:张永红是男的 语义关系:Neutral(中立) 解释:前提和假设并没有关系。
零样本分类
那么如何基于自然语言推理进行零样本分类任务呢?
通过研读模型零样本分类模型中给出的论文,再结合对ModelScope源码的调试,我们可以发现,答案其实很简单。只要依次将每个的标签当成假设,输入的文本当成前提,进行自然语言推理任务之后,再对所有标签的预测结果进行处理,即可实现零样本分类。
设置三个标签:家居,旅游,科技 输入文本:世界那么大,我想去看看 对以上输入进行零样本分类的时候,将生成以下三个自然语言推理任务的样本: 1. 前提:世界那么大,我想去看看,假设:家居 2. 前提:世界那么大,我想去看看,假设:旅游 3. 前提:世界那么大,我想去看看,假设:科技
对三个样本进行自然语言推理的预测之后,最后将预测结果进行整合,即可实现零样本分类任务。例如多分类任务中,可以将“前提句”蕴含“假设句”概率最大的那个假设作为最后的标签。
写在最后
今天初步探索了ModelScope开源社区,整体体验非常顺畅。集成notebook的开发方式十分便捷,排除了开发环境安装的困扰,非常适合深度学习开发者直接对各类模型进行学习研究。另外,ModelScope上的模型种类十分丰富,大家也可以多多尝试学习,毕竟现在CPU机器免费使用~