1. 对属性进行学习
典型文章:Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer
对属性进行学习:缺点
- 对属性的进行预测并不是ZSL任务的直接目标,这是间接地解决问题,这样可能会导致一种情况:模型可能对属性的预测是最优的,但对类别的预测未必是最优的。
- 无法利用unseen类的样本提供的先验知识。
- 无法利用属性间的关系等额外的信息,因为每个分类器只是针对一个属性进行学习的。
- 无法利用其他的辅助信息,例如词向量、语义等级层次等其他对类别的描述信息源。
Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer
训练样本: X为任意的特征空间
K个离散的类别
学习一个映射关系: Z是一个标签集合,与Y集合相近
这个任务不能用一个普通的多类分类器来解决。典型的分类器为每个训练类Y学习一个参数向量αk。因为类Z在训练步骤中无法为它们推导出参数向量,也无法对未来的样本对这些类进行预测。
由于没有unseen的训练数据可用,因此无法从样本中学习这种“耦合”,而必须通过人工方式将其插入模型。
这就对什么样的“耦合”是可行的引入了两个严格的约束:
- 指定新类的人工描述应该是最少的,因为否则收集和标记训练样本将是一个更简单的解决方案;
- 耦合只需要普通知识的数据比专门的专家知识更可取,因为后者通常很难获得,而且代价昂贵。
为每个类别引入一个高阶的语义特征信息,例如:任意一个目标的颜色、形状,或者动物栖息地等。人能够为这些属性提供更高好的先验知识,因此不需要很大的开销就能收集到更必要的信息。
由于属性是赋予每个类别的而非每个图片,因此手动添加一个新对象类的工作量是最小的。
Attribute-Based Classification:
假设每个类别都有一个属性描述:
通过Y和Z之间关于A的迁移信息可以学习到一个分类器:
Direct attribute prediction (DAP)
在训练过程中,每个样本的输出类别标签都对应属性层的某些确定性标记ai。任何监督学习方法都可以用来学习属性参数βm。在测试时,这些允许对每个测试样本的属性值进行预测,测试类别由此推断。请注意,测试期间的类别可以不同于用于训练的类别,只要耦合属性层是以不需要训练阶段的方式确定的。
Indirect attribute prediction (IAP)
IAP也是使用了属性层去建立不同类别Y和Z之间的关系,只不过属性层连接是Y(训练阶段类别已知)和Z(训练阶段类别未知)的标签层。训练阶段,IAP为多类别分类器,测试阶段,所有训练类别Y的预测引入了一个属性层a,通过属性层可以得到测试类别Z。
这两种方法的主要区别在于训练类Y和测试类Z之间的关系。 DAP会产生一个所有类都被平等对待的网络。当在测试时,所有类的决策仅基于属性层。因此,我们可以期望它也能处理训练类和测试类不脱节的情况。与此相反,当间接预测属性值(IAP)时,训练类也产生一个测试时间作为中间特征层,一方面,如果训练类在测试期间也是潜在的输出类,那么这可能会引入偏差。另一方面,可以认为,从标签层而不是从样本中派生属性层,作为一个正则化步骤,只创建有意义的属性组合,因此使系统更加健壮。
Implementation
假设所有的属性都是0和1取值,对于Y,其长度固定:
连续的属性同上,只不过一个是用于回归,一个用于分类。
DAP
对于属性am,使用所有训练类的所有图像作为训练样本,其标签由与样本标签对应的属性向量确定。
训练器提供了一个条件概率估计:p(am|x)
属性层可以表示为:
在测试时,假设每个类z以指定的方式确定其属性向量az:,若其中语句为真则为1,否则为0
根据贝叶斯公式:
给定图像的测试类的后验值:
在没有更多信息的条件下,假设类的先验是相同的,因此可以忽略p(z)
假设p(az)之间是相互独立的:
训练类别的属性先验采用一个经验均值:
求出后验后,对于输入x,测试不可见标签集z1,z2……zL,分类器为:
f(x)的输出即为对于输入x的预测标签。
IAP
首先,我们为y1,…,yK学习一个多类别的分类器估计:p(yk|x)
假定决策依赖于属性和类别,令:
得到这个后验后,再求出z的后验,即可如同DAP中一样应用MAP即可
似乎是DAP比IAP用的更多,两者主要的区别为训练标签集和测试标签集的关系。论文中用提出的新数据集训练后,DAP(40.5%)的识别准确率显著高于IAP(27.8%),而DAP的缺点显而易见,假设所有属性相互独立的假设过强,且对输出的预测值信赖度没有度量保证
2. 学习从视觉特征空间到语义空间的线性映射
典型文章:Label-Embedding for Attribute-Based Classification(ALE)
直接解决对类别的预测问题,而不是简单地对属性进行预测。
第一,由于属性分类器是独立于最终任务学习的,它们在预测属性方面可能是最佳的,但在预测类方面不一定是最佳的。
第二,我们希望有一种方法,可以随着新的训练样本的提供而逐步改进,即,如果无标签样本对于某些类是可用的,那么就可以执行ZSL预测,当这些类可用时,还可以影响新标记的样本。尽管DAP对于零机会学习是有意义的,但要将它扩展到这样的增量学习场景并不是一件简单的事情。
第三,虽然属性是有用的先验信息来源,但其他信息来源也可以用于ZSL,例如语义结构,如Wordnet。在语义层次上相近的类的图像通常远比在类别上相似的图像更相似。设计一种有效的方法将这些额外的信息源整合到DAP中并不是一件简单的事情。
属性标签嵌入(Attribute Label Embedding , ALE)
问题描述:
将128维的SIFT向量和96维的颜色向量用PCA降维成一个64维向量,然后将其用FV(Fisher Vector)聚合成图像级表示,然后产生SIFT的FV和颜色的FV,然后用高斯混合模型把他们连接成65535维FV,这些FV就是映射到特征空间上的
预测函数 f 定义为:
其中,w 为F中待训练的参数,假设F在某些输入/输出组合特征嵌入中是线性的:
用来衡量视觉特征空间x嵌入语义空间的兼容度(compatibility),这是一个双线性函数
φ是嵌入输入输出后tensor的乘积,W是一个DE维的向量,并reshape为D*W的矩阵。
F(x,y;w)可以表示为:
还可以考虑其他兼容性函数,例如: 广泛应用于回归问题中。
如果D和E很大,考虑将其进行低秩分解:
Attribute label embedding(ALE)
给定C个类别的Y,以及属性A
ρy,i为属性 ai 和每个类别 y 之间的关联性度量,可能是个二值或者是个实数值,本文中,我们定义为二值格式,则:
ΦA为E × C的属性嵌入矩阵(语义空间),是单个φA(y) 的叠加。
根据公式,图像和标签的嵌入是对称的,我们将输出的φA(y)规范化 (均值归一化或者l2规范化)。
此外,在属性是冗余的情况下,解除它们之间的关联可能是有利的,因此我们采用下式:
矩阵V可以和U一起从标记数据中学习,为了简化,可能首先学习去相关性。即:上述过程为:
首先将Φ A进行奇异值分解,映射过去后进行归一化,归一到{0,1}中。那么待学习的参数仅为U。(V和φ当作整体)
WSABIE算法:
令:
WSABIE考虑以下排名目标:
γk 是关于k的递减函数
上式最大化代表了强制正确的标签排名高于错误的标签,即给定一组数据(xn,yn),Fyn是固定的,当取不同的y值时,可以得到一系列的 Fy 值,若Fyn> Fy ,即y排名落后于yn,则损失为 l= -(Fyn- Fy) ,排名越靠后,l值为负数,损失取值为0。反之,若Fyn< Fy ,即y排名领先于yn,则损失为 l= (Fy- Fyn) ,排名越靠前,l值越大。
Zero-shot learning
我们采用WABSIE算法进行ZSL,在这种情况下,我们不能从标记数据(与WSABIE相反)中学习Φ,而只能依靠边缘信息。我们将Φ固定为ΦA,因此,仅需要学习参数W,此时,目标函数不带非正则化的SVM损失函数(hinge loss)类似:
SSVM 采用多类别目标函数,仅考虑了rank为1的情况,而WSABIE以一种加权的方式考虑rank
在WSABIE中的loss是考虑了所有类别的,但在ALE中取了max,即在所有类别中找出 l 最大的,然后逐样本累加。
Few-shots learning
最后为了能利用额外的增量信息,ALE还增加了一项,变成:
其中 Φ表示可学习的语义空间, ΦA是关于标签的先验知识。
为了预测新类别的数据,能逐步利用新的训练样本来改善模型。文中借鉴WSABIE算法,使目标函数在ZSL目标函数的基础上加上欧氏距离。其中参数Φ为在一定维度随机初始化的参数。在使用SGD等方法进行参数更新的时候,为使该损失函数的值尽可能得小,显然Φ要尽可能得接近ΦA,同时也利用了训练样本中存在的部分信息。从而使得ALE模型达到可以逐步利用新的训练样本(之前的训练样本中不存在的类别)的信息来改善模型。
def update_W(self, W, idx, train_classes, beta):
# train_classes: 训练集的类别id,共27个
for j in idx:
X_n = self.X_train[:, j]
y_n = self.labels_train[j]
y_ = train_classes[train_classes!=y_n] # 标签!=y_n的标签
XW = np.dot(X_n, W)
gt_class_score = np.dot(XW, self.train_sig[:, y_n]) # F(xn,yn,w)
for i in range(len(y_)):
label = random.choice(y_)
# 损失:l=delta+F(xn,y,w)-F(xn,yn,w)
score = 1+np.dot(XW, self.train_sig[:, label])-gt_class_score # acc. to original paper, margin shd always be 1.
# beta 代表了权重更新的大小,如果第一次选择的错误标签计算的score>0,代表预测的类别得分很小,因此权重beta就大;
# 若很多次以后才找到score>0的y_,即score>0的概率很小,代表预测的类别得分很大,因此权重beta就小
# beta 相当于WSABIE算法公式中的γ
# 损失对W求导,进行SGD优化
if score>0:
Y = np.expand_dims(self.train_sig[:, y_n]-self.train_sig[:, label], axis=0)
W += self.args.lr*beta[int(y_.shape[0]/(i+1))]*np.dot(np.expand_dims(X_n, axis=1), Y)
break
return W
首先来看它的loss里的兼容度评别函数是直接与类别相关的,而不是解决中间问题;其次,ALE增加了可学习的语义空间,可以使用额外的增量信息,并且这种可学习的语义空间,很容易引入其他的辅助信息源,例如词向量、等级标签嵌入(HLE)等;最后,ALE直接对类别进行预测,类别会用属性得来的语义向量表示,这样的训练使得属性间是有联系的而不是单独训练预测属性最优。
典型文章: Evaluation of output embeddings for fine-grained image classification (SJE) - 2015 CVPR
使用了多种辅助语义信息源,致力于取代ZSL的人工标注属性。
Structured Joint Embeddings(SJE)
模型描述:
预测模型:
F为兼容性函数:
参数W可以表示为D×E 的矩阵,D是输入嵌入后的维度,E为输出嵌入后维度。最后生成一个双线性的兼容性函数:
矩阵W是通过强制使正确的标签排列得比任何其他标签都高来学习得到。
对于标签的嵌入,ALE and DeViSe*使用pairwise目标排序,WSABIE通过排序学习φ(y)和W,我们使用多类别目标。
目标函数(非正则结构化SVM损失):
多类别损失 l 表示为:
对于ZSL,训练的类别和测试的类别不相关,因此,我们固定φ,学习参数W。预测时,将测试图像通过W相乘,搜索最邻近的嵌入空间向量(点乘相似度)进行预测。
训练时,采用SGD进行迭代,每输入一组(xn, yn),搜索排序最大的y值,若:
则更新W参数:
def update_W(self, W, idx):
for j in idx:
X_n = self.X_train[:, j]
y_n = self.labels_train[j]
y = self.find_compatible_y(X_n, W, y_n)
if y!=y_n:
Y = np.expand_dims(self.train_sig[:, y_n]-self.train_sig[:, y], axis=0)
W += self.args.lr*np.dot(np.expand_dims(X_n, axis=1), Y)
return W
对于某些分类任务,可能有多个输出嵌入可用,每个嵌入对应输出空间结构的不同方面。每一个嵌入也可能有不同的信噪比。由于每个输出嵌入都可能提供关于输出空间的非冗余信息,如[45,2]所示,我们可以将它们组合在一起学习更好的联合嵌入。线性兼容性函数:
Wk是对应于不同φk(y)的权重。实验中,每个Wk单独进行训练,然后在验证集上进行αk的网格搜索。实验发现,可见类的αk和不可见类的αk通常是不同的。因此,ZSL中的αk取值采用交叉验证。
如果 ,上式等价于φ的直接连接。相当于将Wk组合单个矩阵W,与前序的公式一致。然而,这样的堆叠学习一个大的W,其中高维的φ会偏差最终的预测。因此,αk可以认为是φk相关的置信度。
Output Embeddings
Embedding by Human Annotation: Attributes
ρy,i 为{0, 1}或者是一个与类别相关的实数值,y为类别,E为属性个数。φA比φ0,1可能包含更多的信息。例如,老鼠、猴子和鲸鱼,对于“大”这个属性,φ0,1 = [0, 0, 1]代表了老鼠=猴子<鲸鱼,而φA = [2, 10, 90],代表老鼠<猴子<鲸鱼 。 实验中,输出的嵌入为每个类别都生成了一个向量形式,但维度E可能不同。
Learning Label Embeddings from Text
从文本中挖掘出的无监督和弱监督标签嵌入
1. Word2Vec (φW):训练一个两层神经网络从一组上下文词中预测一组目标词。词汇表中的单词被赋值为one-shot编码,因此第一层充当查找表,以检索词汇表中任何单词的嵌入。第二层通过softmax预测目标词。其中,有两个重要的预测公式:skip-gram (SG) 和continuous bag-of-words (CBOW)。在SG中,局部上下文窗口中的单词从中心单词预测。 CBOW中,上下文窗口的中心由邻近单词预测。
2. GloVe (φG):包含了在文档中经常一起出现的单词的频数统计。从直观上看,频次统计数据对含义进行了编码,因为语义相似的词(如“ice”和“water”)出现在一起的频率高于语义不同的词(如“ice”和“fashion”)。训练目标是学习单词向量,使它们的点积等于这两个单词的共现概率。这种方法最近被证明在单词类比预测任务上优于Word2Vec。
3. Weakly-supervised Word2Vec (φWws ):标准的Word2Vec[35]使用示例窗口中的每个单词扫描整个文档作为预测目标。但是,如果我们知道全局上下文,即文档的主题,我们就可以使用该主题作为目标。例如,在维基百科中,整篇文章都与同一个主题相关。因此,我们可以从文章中的任何位置取样上下文窗口,只要主题显式的出现在文本中的上下文窗口中。我们认为这种方法是一种软监督形式。
在实验中使用我们的新变种的CBOW取得了最好的结果 。在这里,我们使用维基百科上的标准Word2Vec对第一层权值进行预训练,并采用细粒度文本语料库上的负样本目标微调第二层的权重,这些权重对应于最终的输出嵌入。负采样目标制定如下:
vw 和 vw′ 是待学习的标签嵌入,vc 是词汇嵌入vi 的均值,这些词汇是单词w 上下文窗口内的的词汇。D+是上下文vc 和对应的 w 的组合,D-是vc 和不匹配 vw’ 的组合。为了找到 vi (第一层网络权重的每一列),我们采用了标准非监督Word2Vec模型,该模型在Wikipedia上训练得到。
训练时,vi固定不更新,只更新vw 和 vw′
4. Bag-of-Words (φB):BoW建立了一个词频包,不考虑单词在文档中出现的顺序,因此忽略了语法信息。我们收集与每个对象类对应的维基百科文章,并构建一个最经常出现的词汇表。然后构建这些单词的直方图来向量化类别。
分级嵌入( Hierarchical Embeddings ):语义相似度是指两个词的意义之间的关系有多密切,这种相似性可以通过测量本体中术语之间的距离来估计。WordNet是一个包含超过10万个英语单词的大型分层数据库,为我们提供了一种构建类层次结构的方法。为了衡量相似性,采用 Jiang-Conrath [24] (φjcn), Lin [32] (φlin) 和path (φpath) 相似性公式,我们将整个的层次嵌入表示为φH。
典型文章:DeViSE: A Deep Visual-Semantic Embedding Model-(2013 NIPS)
词嵌入具体相关性作为视觉神经网络监督信号训练网络
Language Model Pre-training
Mikolov等人[13,14] 已经证明了skip-gram文字模型对于无标注信息文字的语义信息浮点表示的有效性,该模型通过文档中的邻近项来学习 如何将一个文本表示为一个固定长度的嵌入向量(图1a右图)。由于同义词往往出现在相似的上下文中,所以这个简单的目标函数驱动模型学习语义相关单词的 相似嵌入向量。
我们学习了一个skip-gram 文字模型,数据为维基语料库中的5.7million文档(5.4billion单词)。该网页的文本被标记为一个由大约155,000个单字和多字术语组成的词典,这些术语包括常见的英语单词和短语,以及来自常用的视觉对象识别数据集的术语。我们的skip-gram模型使用了一个分层的softmax层来预测相邻的词,并使用一个20个词的窗口进行训练。其中,我们将隐藏层的神经元个数从100变化到2000,发现500和1000在训练速度和语义质量上效果最好,ImageNet标签子集上的语言嵌入空间的可视化表明,该语言模型学习了丰富的语义结构,可用于视觉任务。
Visual Model Pre-training
AlexNet作为视觉模型的预训练模型。
Deep Visual-Semantic Embedding Model
模型初始化采用上述两个网络训练好的模型。语言模型学习到的嵌入向量被归一化,并用于将标签项映射到目标向量表示。
Visual网络移除了softmax分类层,投影层和相似性度量用于为每个图片输出特征向量,投影层将4096维压缩到500维。
损失函数:相似性度量和hinge rank loss的点乘,产生一个高阶点乘相似性(图像模型的输出和正确标签的向量表示,在图像输出和其他随机选择的文本术语的向量表示)。
hinge rank loss:
我们发现,通过(1)限制错误文本项的集合到可能的图像标签中,以及(2)在遇到第一个margin-violating的错误项后截断总和,可以方便地对算法进行随机化。t向量通过单位标准化进行限制,实验中采用0.1的边界进行限制。之所以采用这样的损失函数,而没有采用L2 loss,是因为最近邻评估基本上是一个排名问题,最好通过排名损失来解决,而L2损失仅旨在使向量彼此接近,但对于更接近目标图像的错误标签仍然是未知的。
def update_W(self, W, idx, train_classes):
for j in idx:
X_n = self.X_train[:, j]
y_n = self.labels_train[j]
y_ = train_classes[train_classes!=y_n]
XW = np.dot(X_n, W)
gt_class_score = np.dot(XW, self.train_sig[:, y_n])
for i, label in enumerate(y_):
score = self.args.margin+np.dot(XW, self.train_sig[:, label])-gt_class_score
if score>0:
Y = np.expand_dims(self.train_sig[:, y_n]-self.train_sig[:, label], axis=0)
W += self.args.lr*np.dot(np.expand_dims(X_n, axis=1), Y)
break # acc. to the authors, it was practical to stop after first margin violating term was found
return W
典型文章: An embarrassingly simple approach to zero-shot learning(EZSL) -2015 ICML
假设,训练阶段有 z 个类别,每个类别有 a 个属性,用矩阵符号 S 表示:S=[0, 1]a×z
当类别的描述可以用一系列的属性描述时,或者,属性和类别之间建立一个软连接,属性值为[0,1]。
训练阶段,样本表示为: X∈Rd×m,其中,d为数据的维度,m为样本个数。
样本的真值表示为: Y∈{-1,1}m×z
线性分类器的最优化问题可以描述为:
W为待训练的参数,L为损失函数,Ω为正则项
L和Ω的类型可以表述为很多类别的问题,例如,L为hinge loss, Ω为范数,则是SVM分类器。L可以为逻辑回归损失,Ω为其他正则项,例如trace norm,
上述问题不涉及从一个类别到另外一个类别的迁移问题。
引入属性的信息S,W可以表示为:
在inference阶段,为了识别新的类别z’,给定其属性矩阵S’∈[0,1]a×z’,对于给定的实例x,预测问题可以描述为:
与其他ZSL不同的是,上述求解公式并非显示的最小化分类错误,相反,相反,它最大限度地减少了多类错误,既学习如何识别属性,也考虑每个属性在类决策中的重要性。
若正则化Ω为:
可以直接考虑这个问题的kernel版本,即只使用实例之间的内部乘积:
, φ(x)为x在给定特征空间的表示。
上述问题是凸问题,全局最优解能够求出。
我们设计的正则化函数应满足以下要求:
1.其中应该有对 V•S的约束,V•S代表属性空间中的向量在特征空间中的投影,对 V•S加以约束,理想上保证了所有signature在特征空间里有相似的欧几里得范数,能够更公平的比较不同的signature,同时能够防止由于高度不平衡数据集引发的问题
2.其中应该有对 transpose(V)X的约束,原因: transpose(V)X是所有训练实例 X在属性空间中的表征,对 transpose(V)X的约束能够限制其方差,使其在训练特征分布中拥有足够的不变性,如同传统的ridge/lasso一样,提高模型在不同的测试特征分布中的泛化性
令:
则模型的求解可以表示为:
求解过程如下:
由Frobenius范数定义,
def find_W(self, X, y, sig, alpha, gamma):
part_0 = np.linalg.pinv(np.matmul(X, X.T) + (10**alpha)*np.eye(X.shape[0])) # 求伪逆
part_1 = np.matmul(np.matmul(X, y), sig.T)
part_2 = np.linalg.pinv(np.matmul(sig, sig.T) + (10**gamma)*np.eye(sig.shape[0]))
W = np.matmul(np.matmul(part_0, part_1), part_2) # Feature Dimension x Number of Attributes
return W
上述提及的ZSL方法,基本上都是使用线性的兼容度评判函数,这是一个全局的线性函数,这对于更复杂的任务来说,例如细粒度任务,表达能力可能有限,自然会有人提出更复杂的非线性模型。
未完,待续。。。。。
翻译很辛苦!!!
参考:
https://zhuanlan.zhihu.com/p/61305815
[1] C. H. Lampert, H. Nickisch, and S. Harmeling. "Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer". In CVPR, 2009
[2] Akata Z, Perronnin F, Harchaoui Z, et al. Label-Embedding for Attribute-Based Classification[C]. computer vision and pattern recognition, 2013: 819-826.
[3] Akata Z, Reed S, Walter D, et al. Evaluation of output embeddings for fine-grained image classification[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 2927-2936.
[4] Frome A, Corrado G S, Shlens J, et al. DeViSE: A Deep Visual-Semantic Embedding Model[C]. neural information processing systems, 2013: 2121-2129.
[5] Romera-Paredes B , Torr P H S . An embarrassingly simple approach to zero-shot learning[C]// Proceedings of the 32nd international conference on Machine learning (ICML '15). Springer International Publishing, 2015.