@零本学习(Zero Shot Learning)
前言
之前在看故障诊断论文中,偶尔看到了关于零样本学习(Zero Shot Learning)的内容,一直就对零样本学习这个主题很感兴趣。然而,一直对零样本的数据设置与相关算法感到一知半解,直到最近看到了Liangjun_Feng(CSDN)大佬的博客,结合Relational Knowledge Transfer for Zero-Shot Learning论文,以及Liangjun_Feng复现的代码,才算初探了零样本学习的门径。因此,发表这一篇CSDN博客。
零样本算法之我见
零样本学习的数据集
一般我们讲机器学习算法时不会特别强调数据集,但是对于零样本学习,我觉得有必要强调一下数据集,因为其中有许多概念,如果一开始搞不清楚,后面就都乱掉了。
对于零样本学习,每个类别都有对应的属性, 因此相比于传统的分类学习,零样本额外多出了一个属性矩阵。
以数据集AWA2为例, 它是动物分类的数据集, 共50种, 每一种动物的85种属性特征, 于是AWA2的属性矩阵维度是(50,85)\left(50,85\right)(50,85)。 AWA2的属性矩阵有离散值和连续值两种,在RTK实验中仅采用了连续的属性值。
在实验设置中, 训练集Xs,ys\boldsymbol{X}_s, \boldsymbol{y}_sXs,ys, 包含40个类, 共30337个样本; 测试集Xu,yu\boldsymbol{X}_u, \boldsymbol{y}_uXu,yu, 包含剩余的10个类, 共6985个样本, 其中s表示seen, u表示unseen。在零样本学习中, 很多情况下, 我们不会直接使用图片本身, 而是使用预训练的resnet101提取的2048维图片特征.
以AWA2为例对符号进行说明
代码 | 公式 | 维度 |
---|---|---|
trainfeatures | Xs\boldsymbol{X}_sXs | (30337,2048)\ \left(30337, 2048\right) (30337,2048) |
testfeatures | Xu\boldsymbol{X}_uXu | (6985,2048)\ \left(6985, 2048\right) (6985,2048) |
trainlabel | ys\boldsymbol{y}_sys | (30337,)\ \left(30337, \right) (30337,) |
testlabel | yu\boldsymbol{y}_uyu | (6985,)\ \left(6985, \right) (6985,) |
train−_{-}−attributetable | Φs\boldsymbol{\Phi}_{s}Φs | (40,85)\ \left(40, 85\right) (40,85) |
test−_{-}−attributetable | Φu\boldsymbol{\Phi}_{u}Φu | (10,85)\ \left(10, 85\right) (10,85) |
train−_{-}−attributelabel | As\boldsymbol{A}_{s}As | (30337,85)\ \left(30337, 85\right) (30337,85) |
训练样本集对应的标记 ys\boldsymbol{y}_sys和属性标记As\boldsymbol{A}_{s}As是已知的As\boldsymbol{A}_{s}As的取值都来自于Φs\boldsymbol{\Phi}_{s}Φs。但在模型训练过程中我们连甚至连测试样本Xu\boldsymbol{X}_uXu的信息都不知道。
Remak: 标记用类别值即可不用OneHot编码。
零样本学习算法之基本想法
由于ys∩yu=∅\boldsymbol{y}_s\cap \boldsymbol{y}_u=\emptysetys∩yu=∅,因此无法建立一个从样本空间X\cal{X}X到标记空间Y\cal{Y}Y的映射。
但是属性矩阵A\boldsymbol{A}A是已知的,于是可以尝试建立一个从样本空间X\cal{X}X到属性空间A\cal{A}A的映射f:X→Af:\cal{X}\rightarrow\cal{A}f:X→A。特别的是想要通过Xs\boldsymbol{X}_sXs和As\boldsymbol{A}_{s}As,建立出Xu\boldsymbol{X}_uXu与Φu\boldsymbol{\Phi}_{u}Φu间的映射关系。这就回到了传统的回归算法和分类算法,通过训练集训练模型,并将模型应用至测试样本集。
将Xu\boldsymbol{X}_uXu输入可以得到test_attributelabel Au\boldsymbol{A}_{u}Au的预测值A^u\hat{\boldsymbol{A}}_{u}A^u。对于一个测试样本xui\boldsymbol{x}_u^ixui,就可以得到其对应的属性预测值a^ui\hat{\boldsymbol{a}}_{u}^ia^ui, 将a^ui\hat{\boldsymbol{a}}_{u}^ia^ui与属性表Φu\boldsymbol{\Phi}_{u}Φu比照即可确定其标记值。(公式化)
Remark: 这里说建立出Xu\boldsymbol{X}_uXu与Φu\boldsymbol{\Phi}_{u}Φu间的映射关系其实就是指 f:Xu↦A^uf:\boldsymbol{X}_u\mapsto\hat{\boldsymbol{A}}_{u}f:Xu↦A^u,之所以没有这么写是因为建立映射之前A^u\hat{\boldsymbol{A}}_{u}A^u还没有;同时其真实值Au\boldsymbol{A}_{u}Au在训练过程中也是不知道(如果知道问题就没必要做了)。
一些经典的算法
Semantic Autoencoder for Zero-Shot Learning
该算法直接建立X\boldsymbol{X}X与A\boldsymbol{A}A之间的线性映射关系
minW∥X−W⊤WX∥F2s.t.WX=A \min_{\boldsymbol{W}} \left\|\boldsymbol{X}-\boldsymbol{W}^\top\boldsymbol{W}\boldsymbol{X}\right\|_F^2 \quad s.t. \quad\boldsymbol{W}\boldsymbol{X} = \boldsymbol{A} WminX−W⊤WXF2s.t.WX=A
Relational Knowledge Transfer for Zero-Shot Learning
该算法没有直接建立X\boldsymbol{X}X与A\boldsymbol{A}A之间的映射关系。而是建立了Φu\boldsymbol{\Phi}_{u}Φu与Φs\boldsymbol{\Phi}_{s}Φs间的映射, i.e.,
minW∥(Φu)⊤−(Φs)⊤W∥F2+λΩ(W) \min_{\boldsymbol{W}} \left\|(\boldsymbol{\Phi}_{u})^\top - (\boldsymbol{\Phi}_{s})^\top \boldsymbol{W} \right\|_F^2 + \lambda\Omega\left(\boldsymbol{W}\right) Wmin(Φu)⊤−(Φs)⊤WF2+λΩ(W)
其实将上式改写一下
minW∥WΦs−Φu∥F2+λΩ(W) \min_{\boldsymbol{W}} \left\|\boldsymbol{W} \boldsymbol{\Phi}_{s} - \boldsymbol{\Phi}_{u} \right\|_F^2 + \lambda\Omega\left(\boldsymbol{W}\right) Wmin∥WΦs−Φu∥F2+λΩ(W)
Φs\boldsymbol{\Phi}_{s}Φs每一行表示一类的属性,左乘矩阵就是进行行变换,意思不就是用已知的属性的线性组合去表示未知的属性。
计算出每一类的样本均值,记为μsi(2048,),i=1,2,⋯ ,40\boldsymbol{\mu}_{s}^{i} (2048,), i=1,2, \cdots, 40μsi(2048,),i=1,2,⋯,40
然后就可以通过W(40,10)\boldsymbol{W}(40,10)W(40,10)去对 testfeature_meanμuj(2048,),j=1,2,⋯ ,10\boldsymbol{\mu}_{u}^{j} (2048,), j=1,2, \cdots, 10μuj(2048,),j=1,2,⋯,10进行预测,i.e., virtual_testfeature_mean为μ^uj=∑iWi,jμsi\hat{\boldsymbol{\mu}}_{u}^{j} =\sum_{i} W_{i,j}\boldsymbol{\mu}_{s}^{i}μ^uj=∑iWi,jμsi。
设置每一个未见类服从一个高斯分布
N=(μ^uj,σI){\cal{N}}=\left( \hat{\boldsymbol{\mu}}_{u}^{j}, \sigma I\right)N=(μ^uj,σI)
其中σ\sigmaσ是一个预设的参数。
这样就可以生成未见类的虚拟样本X~u\tilde{\boldsymbol{X}}_{u}X~u了。
由于X~u\tilde{\boldsymbol{X}}_{u}X~u是根据每个类的均值和方差生成的,所以很容易为其对应上相应的属性标记A~u\tilde{\boldsymbol{A}}_{u}A~u。
这样就可以根据虚拟的输入X~u\tilde{\boldsymbol{X}}_{u}X~u和输出A~u\tilde{\boldsymbol{A}}_{u}A~u建立每一个属性值的回归模型(共85个)。
然后将Xu(6985,2048)\boldsymbol{X}_u \left(6985, 2048\right)Xu(6985,2048)输入这85个回归模型预测得到输出值,
test_pre_attribute A^u(6985,85)\hat{\boldsymbol{A}}_{u} \left(6985, 85\right)A^u(6985,85)。
根据A^u(6985,85)\hat{\boldsymbol{A}}_{u} \left(6985, 85\right)A^u(6985,85)结合 Φu\boldsymbol{\Phi}_{u}Φu就可以得到标记y^u(6985,)\hat{\boldsymbol{y}}_u \left(6985, \right)y^u(6985,)。具体地
y^ui=arg minkdis(a^ui,ϕuk)\hat{y}_u^i=\argmin_{k}dis\left(\hat{\boldsymbol{a}}_{u}^{i} ,\boldsymbol{\phi}_{u}^{k}\right)y^ui=kargmindis(a^ui,ϕuk)
Fault Description Based Attribute Transfer for Zero-Sample Industrial Fault Diagnosis
该算法首先通过Supervised Principal Component Analysis对[Xs,Au][\boldsymbol{X}_{s},\boldsymbol{A}_{u}][Xs,Au]进行特征提取。由于故障属性矩阵是离散值,因此建立了特征SPCA(Xs)SPCA\left(\boldsymbol{X}_{s}\right)SPCA(Xs)到每个属性值auk\boldsymbol{a}_{u}^kauk之间的分类模型。
Transfer Increment for Generalized Zero-Shot Learning
该算法的目标而是建立了Φu\boldsymbol{\Phi}_{u}Φu与Φs\boldsymbol{\Phi}_{s}Φs间的映射, 该映射以W\boldsymbol{W}W为参数,并通过增量学习的方式优化W\boldsymbol{W}W。
算法实现
至于算法实现我参考了文献中的github,在其基础上删除了一些不必要的代码,并做了一些细微的改动,跑通了三个模型。这是我编写的程序链接https://github.com/ArtistVcc/Zero-Shot-Learning。
参考文献
- https://blog.csdn.net/Liangjun_Feng/article/details/85225574?spm=1001.2014.3001.5501
- https://blog.csdn.net/Liangjun_Feng/article/details/105612206?spm=1001.2014.3001.5501
- Donghui Wang, Yanan Li, Yuetan Lin, and Yueting Zhuang. 2016. Relational knowledge
transfer for zero-shot learning. In Proceedings of the Thirtieth AAAI Conference on Artificial Intelligence (AAAI’16). AAAI Press, 2145–2151. - E. Kodirov, T. Xiang and S. Gong, “Semantic Autoencoder for Zero-Shot Learning,” 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Honolulu, HI, USA, 2017, pp. 4447-4456, doi: 10.1109/CVPR.2017.473.
- L. Feng and C. Zhao, “Fault Description Based Attribute Transfer for Zero-Sample Industrial Fault Diagnosis,” in IEEE Transactions on Industrial Informatics, vol. 17, no. 3, pp. 1852-1862, March 2021, doi: 10.1109/TII.2020.2988208.
- L. Feng and C. Zhao, “Transfer Increment for Generalized Zero-Shot Learning,” in IEEE Transactions on Neural Networks and Learning Systems, vol. 32, no. 6, pp. 2506-2520, June 2021, doi: 10.1109/TNNLS.2020.3006322.
- https://github.com/LiangjunFeng/Implement-of-ZSL-algorithms
- https://github.com/LiangjunFeng/Industrial_ZSL
有问题可以私信博主,欢迎大家一起讨论交流,一起努力进步,谢谢支持。