DeepLearning | Semantic Autoencoder for Zero Shot Learning(论文、算法、数据集、代码)

这两天事情比较少,这里再分享一个简单好用的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 表示数据, S S 表示数据的属性标签, Y Y 表示数据的标签。

在之前的几篇博客中,我们反复提到了直接属性预测(DAP)这一经典的ZSL方法,今天我们还是用它来引出SAE。DAP先用 X X 训练多个学习器预测 S S ,在测试阶段,用训练好的学习器预测测试样本,再对着属性表进行近邻搜索确定标签 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}

这一模型很好理解,即 X X 经过两次映射 W W W W^{*} 后输出 X X 本身,即通过一次映射 W W 编码,第二次映射 W W^{*} 解码

我们再来看一下SAE的自编码模型

m i n W X W T W X 2 min_{W}\left \| X- W^{T}WX\right \|^{2}
s . t . W X = S s.t. WX=S

相比于普通的自编码器,SAE做出了两点变化,一是要求 W W^{*} = W T W^{T} ,这是为了方便后面的优化求解,二是增加了线性约束,即 s . t . W X = S s.t. WX=S

该模型可以图解如下:
在这里插入图片描述
仔细研究该模型,可以发现,SAE其实要求所求得的 W W 具有两重性质

  1. X X 在经过 W W 映射之后可以通过 W T W^{T} 还原,即 W X WX 还包含 X X 的所有信息
  2. W X WX 应当尽可能的逼近 S S

这两条性质,使得映射后得到的 W X WX 具有较好的类别区分性质,这是普通的自编码器做不到的。
该模型的求解也十分简单,通过拉格朗日乘子法,并求导可以但模型转化为Sylvester等式的形式

A W + W B = C AW+WB=C

其中 A = S S T A=SS^{T} , B = λ X X T B=\lambda XX^{T} , C = ( 1 + λ ) S X T C=(1+\lambda)SX^{T}

该等式可以通过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

发布了74 篇原创文章 · 获赞 269 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Liangjun_Feng/article/details/88076699