最近发现一个简单好用的ZSL算法Relational Knowledge Transfer for Zero Shot Learning,这里写篇博客分享一下
之前也写过两篇博客简单描述了几种基本的ZSL算法
DeepLearning | Zero Shot Learning 零样本学习(扩展内容、模型、数据集)
DeepLearning | Zero Shot Learning 零样本学习
这篇博客会描述RKT方法的思想和理论解释,在文章的最后会给出算法复现的python代码
一、Introduction
对于通常的识别问题,我们需要学习一个映射 f : X → Y \mathit{f}:X\rightarrow Y f:X→Y。 但是很明显,在零样本识别任务中,由于缺乏未知类别的数据,我们无法直接为未知类别得到 f u \mathit{f}_{u} fu。
在我们之前提到过的ZSL最经典的方法,直接属性预测(DAP),中,引入了人工标注的属性标签 Z Z Z,从而将对未知类别的识别问题转化为了一个两阶段模型 f u = l ( g u ( x , z ) , y ) \mathit{f}_{u}=l(g_{u}(x,z),y) fu=l(gu(x,z),y). 这里的 g u ( x , z ) g_{u}(x,z) gu(x,z)是指使用一些机器学习算法学习从数据特征到类别属性的映射, l l l是指属性标签到类别标签的映射。同样的,尽管DAP引入了属性标签,可是由于缺乏数据的原因,我们还是无法直接得到 g u g_{u} gu。于是DAP使用 g s g_{s} gs代替 g u g_{u} gu,从而实现对未知类别的预测 f u = l ( g s ( x , z ) , y ) \mathit{f}_{u}=l(g_{s}(x,z),y) fu=l(gs(x,z),y)
引入属性标签的本质目的是增强学习器的泛化性能,从而实现令已知类别的数据训练出的学习器预测未知类别。但是已知类别的数据和未知类别的数据还是会存在域偏移的问题,从而导致DAP的性能并不优异。
而我们这里要介绍的RKT是一种生成模型,他的目的是直接生成虚拟类别的数据,从而将ZSL问题转化为一个普通的识别问题
二、Approach
我们先定义已知类别的数据均值矩阵为 E s E_{s} Es,它的元素为每一类数据特征的均值向量,同样的我们记未知类别的数据均值矩阵为 E u E_{u} Eu。这样,我们可以假设存在A,B,使得 E u = E s A E_{u}=E_{s}A Eu=EsA, Z u = Z s B Z_{u}=Z_{s}B Zu=ZsB。 那么,我们称 A , B A, B A,B 为相关知识(relational knowledge)。
原论文证明了如下定理:
当
A
=
B
A=B
A=B 时,线性映射
g
s
g_{s}
gs可以直接作为
g
u
g_{u}
gu的替代,对未知类别进行预测
在实际中 A A A和 B B B是很难相同的,同时,在ZSL的设定下,我们也无法得到 A A A. 于是,在RKT中,作者令A=B,直接从 E s E_{s} Es生成了 E u E_{u} Eu。而这里的B,即属性表从已知类别到未知类别的映射,是通过Lasso,也就是一范数正则来进行学习的。
更进一步的,假设每一类别的数据都服从高斯分布,那么 E u E_{u} Eu,就成为了未知类别的数据均值,再指定每一类别的方差,便可以根据高斯分布在均值的基础上添加噪声产生指定数量的数据样本。
三、算法复现
我使用resnet101的特征复现了算法,并取得了比原文更好的结果
使用的数据链接在这里:DeepLearning | AWA2 图像数据集预处理
python源代码在这里:https://github.com/LiangjunFeng/Relational-knowledge-transfer-for-ZSL
四、资源下载
微信搜索“老和山算法指南”获取更多下载链接与技术交流群
有问题可以私信博主,点赞关注的一般都会回复,一起努力,谢谢支持。