Self-taught learning是Honglak Lee等开发的一个matlab框架,能够实现他们在论文Self-taught Learning Transfer Learningfrom Unlabeled Data和Efficient sparse coding algorithms中提出的快速实现图像稀疏编码的算法。
先看第一篇论文《Self-taught Learning:Transfer Learning from Unlabeled Data》
主要思想:
在监督分类算法的数据中,加入部分unlabel的数据,未标数据不一定和训练集数据从属同一类类别,在建模过程中,首先根据未标数据训练出一组基,然后对训练集的数据用该空间的基表示,最后使用SVM或其他分类算法进行分类。
PS.
这种方法不同于semi-supervised learning,后者需要加入的未标数据,必须跟训练集具有相同类型的类别,例如想要对大象和犀牛的图像集分类,就必须加入大象和犀牛的未标图像,而self-taught learning可以加入任意图像比如自然景色等。
加入未标数据是为了使图像的特征变得稀疏,能够加速训练的计算速度。
符号约定:
算法介绍
第一步:根据未标数据学习一组表示图像的基。
对于未标数据,提出如下的优化公式:
优化的目标是基向量组b和稀疏系数a。k是输入数据的个数,s是新空间的维度,n是原始输入空间的维度。所以,b是s*n的矩阵,a是k*s的矩阵。上面的公式有两项需要优化,左边项的目的是用一组基来表示输入数据,并且使得误差最小,右边项引入了L1规则作为惩罚项,使得学习出来的系数a大部分是零。
保持a不变求b,或者保持b不变求a,都是凸优化问题,可以用梯度下降等方法求得。
这里补充一下L1/L2规则化。(在第二篇论文里提到过)
常用的规则化函数有下面三种:
第一种是L1规则化,即1范数。第二种是加上参数的L1规则化。第三种是log规则化。前两种作为稀疏函数求解都是凸优化的问题,所以比较常用,而且L1规则化通常用于产生稀疏,对不相关特征也有很好的鲁棒性。
第二步:根据上步的基,表示已标数据。
对每个已标数据,根据第一步中得到的一组基,通过优化下面的公式得到其稀疏系数a:
这就变成了L1规则化最小二乘问题,可以优化出稀疏向量来表示输入。
第三步:将得到的数据特征输入分类器进行分类。
将上步得到的训练数据的特征输入分类器(例如SVM)中进行分类。
完整算法伪代码:
论文中还涉及到了与其他算法(PCA)的对比,以及实验,这里略过不提。
再看第二篇论文《Efficient sparse coding algorithms》
有了上面的基础,如何快速稀疏编码就会更容易理解,大体思路是一样的,不同之处在于优化公式有所改变,如下:
生成模型的误差服从(mean=0, cov=σ2I)的高斯分布,上式用矩阵表示如下:
当B固定求S,或者S固定求B的时候,都是凸优化问题。在这篇论文里,交替的求B和S(保持另一个固定)。当学习B时,问题变成了最小二乘优化问题,解决方法有QCQP、梯度下降,问题是QCQP求解速度慢,梯度下降收敛慢,论文提出使用“Lagrange dual”求解。当学习S时,问题变成了规则化最小二乘问题,论文里使用“generic QP”方法解决。
这篇论文我还没有看完,现在存在这样的问题:
1、我还不太明白最小二乘、规则化最小二乘是啥意思。
2、Lagrange dual方法还没看具体是怎样推导的。
3、generic QP也没看怎么推导的。
Matlab代码的使用方法
作者提供了self-taught learning框架的matlab代码,下载。
使用方法:
1. download IMAGES.mat from http://redwood.berkeley.edu/bruno/sparsenet/
2. copy IMAGES.mat to ./data directory
3. move to ./code
4. run matlab and execute:
"demo_fast_sc(1)": epsilon-L1 sparsity penalty
"demo_fast_sc(2)": L1 sparsity penalty
Note: You can apply sparse coding to any type of general data. See sparse_coding.m for details.