ZSL就是希望我们的模型能够对其从没见过的类别进行分类,让机器具有推理能力,实现真正的智能。其中零次(Zero-shot)是指对于要分类的类别对象,一次也不学习。这样的能力听上去很具有吸引力,那么到底是怎么实现的呢?
假设我们的模型已经能够识别马,老虎和熊猫了,现在需要该模型也识别斑马,那么我们需要像爸爸一样告诉模型,怎样的对象才是斑马,但是并不能直接让模型看见斑马。所以模型需要知道的信息是马的样本、老虎的样本、熊猫的样本和样本的标签,以及关于前三种动物和斑马的描述。假设我们的模型已经能够识别马,老虎和熊猫了,现在需要该模型也识别斑马,那么我们需要像爸爸一样告诉模型,怎样的对象才是斑马,但是并不能直接让模型看见斑马。所以模型需要知道的信息是马的样本、老虎的样本、熊猫的样本和样本的标签,以及关于前三种动物和斑马的描述。,以一般的图片分类问题为例:
(1)训练集数据X1及其标签Y1,包含了模型需要学习的类别(马、老虎和熊猫),这里和传统的监督学习中的定义一致;
(2)测试集数据 X2及其标签 Y2,包含了模型需要辨识的类别(斑马),这里和传统的监督学习中也定义一致;
(3)训练集类别的描述 A1,以及测试集类别的描述 A2;我们将每一个类别 Yi,都表示成一个语义向量ai的形式,而这个语义向量的每一个维度都表示一种高级的属性,比如“黑白色”、“有尾巴”、“有羽毛”等等,当这个类别包含这种属性时,那在其维度上被设置为非零值。对于一个数据集来说,语义向量的维度是固定的,它包含了能够较充分描述数据集中类别的属性。
在ZSL中,我们希望利用X1和Y1来训练模型,而模型能够具有识别X2的能力,因此模型需要知道所有类别的描述A1和A2。ZSL这样的设置其实就是上文中识别斑马的过程中,已知的条件。
实际上zero-shot就可以被定义为:利用训练集数据训练模型,使得模型能够对测试集的对象进行分类,但是训练集类别和测试集类别之间没有交集;期间需要借助类别的描述,来建立训练集和测试集之间的联系,从而使得模型有效。
以下是一个简化的版本的ZSL的一般过程:
类别嵌入:首先,我们需要一个能够表示类别语义信息的向量。这可以通过一组预定义的属性(例如,“有羽毛”、“能飞”等)实现,也可以通过其他方式实现,比如将类别名称输入一个预训练的词嵌入模型(如Word2Vec或GloVe)得到的向量。
特征抽取:然后,我们需要从输入数据(例如,图像或文本)中抽取特征。这通常可以通过一个预训练的深度神经网络实现。
映射学习:接着,我们需要学习一个映射,将输入数据的特征空间映射到类别嵌入空间。这可以通过多种方式实现,例如,可以训练一个神经网络,使得同一类别的样本的特征在类别嵌入空间中尽可能接近,而不同类别的样本的特征在类别嵌入空间中尽可能远离,使得特征向量和词向量尽可能匹配。这个过程可以通过最小化某种距离或损失函数实现,例如,可以使用余弦距离或者交叉熵损失。
下面是这篇文章的总体框架:
下面是WMLoss的示意图:
我目前还没看懂Cu是怎么得来的。