这两天事情比较少,这里再分享一个简单好用的ZSL算法
Semantic Autoencoder for Zero Shot Learning
之前也写过几篇博客简单描述了几种基本的ZSL算法
DeepLearning | Relational Knowledge Transfer for Zero Shot Learning(论文、算法、数据集、代码)
DeepLearning | Zero Shot Learning 零样本学习(扩展内容、模型、数据集)
DeepLearning | Zero Shot Learning 零样本学习
这篇博客会描述SAE方法的思想和理论解释,在文章的最后会给出算法复现的python代码
一、 Introduction
我们先明确一下符号标记 X X X表示数据, S S S表示数据的属性标签, Y Y Y表示数据的标签。
在之前的几篇博客中,我们反复提到了直接属性预测(DAP)这一经典的ZSL方法,今天我们还是用它来引出SAE。DAP先用 X X X训练多个学习器预测 S S S,在测试阶段,用训练好的学习器预测测试样本,再对着属性表进行近邻搜索确定标签 Y Y Y。
DAP存在着一些缺点,如没有办法克服域偏移的问题,训练很多学习器也是一件费时的事。
那么我们为什么不直接预测所有的属性呢?这是因为如果直接用1个网络同时预测所有的属性,会造成该网络学习得到已知类别属性的固有模式,而不具体的细分属性,这样一来,使用属性嵌入的意义就不大了,还是没有办法预测未知类别。
Semantic autoencoder(SAE)则为我们提供了另一种思路,它在普通的自编码网络上加上了一个约束,这个约束使得编码后得到的属性包含了更多数据样本本身的特点,从而使得模型可以识别未知类别
二、Approach
我们先来看一下普通的自编码器模型
m i n W ∗ , W ∥ X − W ∗ W X ∥ 2 min_{W^{*},W}\left \| X- W^{*}WX\right \|^{2} minW∗,W∥X−W∗WX∥2
这一模型很好理解,即 X X X经过两次映射 W W W和 W ∗ W^{*} W∗后输出 X X X本身,即通过一次映射 W W W编码,第二次映射 W ∗ W^{*} W∗解码
我们再来看一下SAE的自编码模型
m
i
n
W
∥
X
−
W
T
W
X
∥
2
min_{W}\left \| X- W^{T}WX\right \|^{2}
minW∥∥X−WTWX∥∥2
s
.
t
.
W
X
=
S
s.t. WX=S
s.t.WX=S
相比于普通的自编码器,SAE做出了两点变化,一是要求 W ∗ W^{*} W∗= W T W^{T} WT,这是为了方便后面的优化求解,二是增加了线性约束,即 s . t . W X = S s.t. WX=S s.t.WX=S
该模型可以图解如下:
仔细研究该模型,可以发现,SAE其实要求所求得的
W
W
W具有两重性质
- X X X在经过 W W W映射之后可以通过 W T W^{T} WT还原,即 W X WX WX还包含 X X X的所有信息
- W X WX WX应当尽可能的逼近 S S S
这两条性质,使得映射后得到的
W
X
WX
WX具有较好的类别区分性质,这是普通的自编码器做不到的。
该模型的求解也十分简单,通过拉格朗日乘子法,并求导可以但模型转化为Sylvester等式的形式
A W + W B = C AW+WB=C AW+WB=C
其中 A = S S T A=SS^{T} A=SST, B = λ X X T B=\lambda XX^{T} B=λXXT, C = ( 1 + λ ) S X T C=(1+\lambda)SX^{T} C=(1+λ)SXT
该等式可以通过python 库里的Sylvester求解器直接求解, 要注意,SAE最后用于判断属性和类别远近的距离是cos距离而不是欧式距离,这会很大程度上影响模型精度
三、算法复现
AwA2的数据链接在这里:DeepLearning | AWA2 图像数据集预处理
AwA和其他数据链接在这里:https://blog.csdn.net/qq_38451119/article/details/81624468
python源代码在这里:https://github.com/LiangjunFeng/Implement-of-ZSL-algorithms
四、资源下载
微信搜索“老和山算法指南”获取更多下载链接与技术交流群
有问题可以私信博主,点赞关注的一般都会回复,一起努力,谢谢支持。