机器学习中的范数规则化之(二)核范数与规则项参数选择

http://blog.csdn.net/zouxy09/article/details/24972869算法

 

上一篇博文,咱们聊到了L0,L1和L2范数,这篇咱们絮叨絮叨下核范数和规则项参数选择。知识有限,如下都是我一些浅显的见解,若是理解存在错误,但愿你们不吝指正。谢谢。数据库

 

3、核范数ide

       核范数||W||*是指矩阵奇异值的和,英文称呼叫Nuclear Norm。这个相对于上面火热的L1和L2来讲,可能你们就会陌生点。那它是干吗用的呢?霸气登场:约束Low-Rank(低秩)。OK,OK,那咱们得知道Low-Rank是啥?用来干啥的?函数

       咱们先来回忆下线性代数里面“秩”究竟是啥?举个简单的例子吧:性能

       对上面的线性方程组,第一个方程和第二个方程有不一样的解,而第2个方程和第3个方程的解彻底相同。从这个意义上说,第3个方程是“多余”的,由于它没有带来任何的信息量,把它去掉,所得的方程组与原来的方程组同解。为了从方程组中去掉多余的方程,天然就导出了“矩阵的秩”这一律念。学习

       还记得咱们怎么手工求矩阵的秩吗?为了求矩阵A的秩,咱们是经过矩阵初等变换把A化为阶梯型矩阵,若该阶梯型矩阵有r个非零行,那A的秩rank(A)就等于r。从物理意义上讲,矩阵的秩度量的就是矩阵的行列之间的相关性。若是矩阵的各行或列是线性无关的,矩阵就是满秩的,也就是秩等于行数。回到上面线性方程组来讲吧,由于线性方程组能够用矩阵描述嘛。秩就表示了有多少个有用的方程了。上面的方程组有3个方程,实际上只有2个是有用的,一个是多余的,因此对应的矩阵的秩就是2了。测试

       OK。既然秩能够度量相关性,而矩阵的相关性实际上有带有了矩阵的结构信息。若是矩阵之间各行的相关性很强,那么就表示这个矩阵实际能够投影到更低维的线性子空间,也就是用几个向量就能够彻底表达了,它就是低秩的。因此咱们总结的一点就是:若是矩阵表达的是结构性信息,例如图像、用户-推荐表等等,那么这个矩阵各行之间存在这必定的相关性,那这个矩阵通常就是低秩的。大数据

       若是X是一个m行n列的数值矩阵,rank(X)是X的秩,假如rank (X)远小于m和n,则咱们称X是低秩矩阵。低秩矩阵每行或每列均可以用其余的行或列线性表出,可见它包含大量的冗余信息。利用这种冗余信息,能够对缺失数据进行恢复,也能够对数据进行特征提取。优化

       好了,低秩有了,那约束低秩只是约束rank(w)呀,和咱们这节的核范数有什么关系呢?他们的关系和L0与L1的关系同样。由于rank()是非凸的,在优化问题里面很难求解,那么就须要寻找它的凸近似来近似它了。对,你没猜错,rank(w)的凸近似就是核范数||W||*网站

       好了,到这里,我也没什么好说的了,由于我也是稍微翻看了下这个东西,因此也尚未深刻去看它。但我发现了这玩意还有不少颇有意思的应用,下面咱们举几个典型的吧。

1)矩阵填充(Matrix Completion):

       咱们首先说说矩阵填充用在哪。一个主流的应用是在推荐系统里面。咱们知道,推荐系统有一种方法是经过分析用户的历史记录来给用户推荐的。例如咱们在看一部电影的时候,若是喜欢看,就会给它打个分,例如3颗星。而后系统,例如Netflix等知名网站就会分析这些数据,看看到底每部影片的题材究竟是怎样的?针对每一个人,喜欢怎样的电影,而后会给对应的用户推荐类似题材的电影。但有一个问题是:咱们的网站上面有很是多的用户,也有很是多的影片,不是全部的用户都看过说有的电影,不是全部看过某电影的用户都会给它评分。假设咱们用一个“用户-影片”的矩阵来描述这些记录,例以下图,能够看到,会有不少空白的地方。若是这些空白的地方存在,咱们是很难对这个矩阵进行分析的,因此在分析以前,通常须要先对其进行补全。也叫矩阵填充。

       那到底怎么填呢?如何才能无中生有呢?每一个空白的地方的信息是否蕴含在其余已有的信息之上了呢?若是有,怎么提取出来呢?Yeah,这就是低秩生效的地方了。这叫低秩矩阵重构问题,它能够用以下的模型表述:已知数据是一个给定的m*n矩阵A,若是其中一些元素由于某种缘由丢失了,咱们可否根据其余行和列的元素,将这些元素恢复?固然,若是没有其余的参考条件,想要肯定这些数据很困难。但若是咱们已知A的秩rank(A)<<m且rank(A)<<n,那么咱们能够经过矩阵各行(列)之间的线性相关将丢失的元素求出。你会问,这种假定咱们要恢复的矩阵是低秩的,合理吗?其实是十分合理的,好比一个用户对某电影评分是其余用户对这部电影评分的线性组合。因此,经过低秩重构就能够预测用户对其未评价过的视频的喜爱程度。从而对矩阵进行填充。

2)鲁棒PCA:

       主成分分析,这种方法能够有效的找出数据中最“主要"的元素和结构,去除噪音和冗余,将原有的复杂数据降维,揭示隐藏在复杂数据背后的简单结构。咱们知道,最简单的主成分分析方法就是PCA了。从线性代数的角度看,PCA的目标就是使用另外一组基去从新描述获得的数据空间。但愿在这组新的基下,能尽可能揭示原有的数据间的关系。这个维度即最重要的“主元"。PCA的目标就是找到这样的“主元”,最大程度的去除冗余和噪音的干扰。

       鲁棒主成分分析(Robust PCA)考虑的是这样一个问题:通常咱们的数据矩阵X会包含结构信息,也包含噪声。那么咱们能够将这个矩阵分解为两个矩阵相加,一个是低秩的(因为内部有必定的结构信息,形成各行或列间是线性相关的),另外一个是稀疏的(因为含有噪声,而噪声是稀疏的),则鲁棒主成分分析能够写成如下的优化问题:

       与经典PCA问题同样,鲁棒PCA本质上也是寻找数据在低维空间上的最佳投影问题。对于低秩数据观测矩阵X,假如X受到随机(稀疏)噪声的影响,则X的低秩性就会破坏,使X变成满秩的。因此咱们就须要将X分解成包含其真实结构的低秩矩阵和稀疏噪声矩阵之和。找到了低秩矩阵,实际上就找到了数据的本质低维空间。那有了PCA,为何还有这个Robust PCA呢?Robust在哪?由于PCA假设咱们的数据的噪声是高斯的,对于大的噪声或者严重的离群点,PCA会被它影响,致使没法正常工做。而Robust PCA则不存在这个假设。它只是假设它的噪声是稀疏的,而无论噪声的强弱如何。

       因为rank和L0范数在优化上存在非凸和非光滑特性,因此咱们通常将它转换成求解如下一个松弛的凸优化问题:

       说个应用吧。考虑同一副人脸的多幅图像,若是将每一副人脸图像当作是一个行向量,并将这些向量组成一个矩阵的话,那么能够确定,理论上,这个矩阵应当是低秩的。可是,因为在实际操做中,每幅图像会受到必定程度的影响,例如遮挡,噪声,光照变化,平移等。这些干扰因素的做用能够看作是一个噪声矩阵的做用。因此咱们能够把咱们的同一我的脸的多个不一样状况下的图片各自拉长一列,而后摆成一个矩阵,对这个矩阵进行低秩和稀疏的分解,就能够获得干净的人脸图像(低秩矩阵)和噪声的矩阵了(稀疏矩阵),例如光照,遮挡等等。至于这个的用途,你懂得。

 

3)背景建模:

       背景建模的最简单情形是从固定摄相机拍摄的视频中分离背景和前景。咱们将视频图像序列的每一帧图像像素值拉成一个列向量,那么多个帧也就是多个列向量就组成了一个观测矩阵。因为背景比较稳定,图像序列帧与帧之间具备极大的类似性,因此仅由背景像素组成的矩阵具备低秩特性;同时因为前景是移动的物体,占据像素比例较低,故前景像素组成的矩阵具备稀疏特性。视频观测矩阵就是这两种特性矩阵的叠加,所以,能够说视频背景建模实现的过程就是低秩矩阵恢复的过程。

 

4)变换不变低秩纹理(TILT):

       以上章节所介绍的针对图像的低秩逼近算法,仅仅考虑图像样本之间像素的类似性,却没有考虑到图像做为二维的像素集合,其自己所具备的规律性。事实上,对于未加旋转的图像,因为图像的对称性与自类似性,咱们能够将其看作是一个带噪声的低秩矩阵。当图像由端正发生旋转时,图像的对称性和规律性就会被破坏,也就是说各行像素间的线性相关性被破坏,所以矩阵的秩就会增长。

       低秩纹理映射算法(TransformInvariant Low-rank Textures,TILT)是一种用低秩性与噪声的稀疏性进行低秩纹理恢复的算法。它的思想是经过几何变换τ把D所表明的图像区域校订成正则的区域,如具备横平竖直、对称等特性,这些特性能够经过低秩性来进行刻画。

       低秩的应用很是多,你们有兴趣的能够去找些资料深刻了解下。

 

4、规则化参数的选择

       如今咱们回过头来看看咱们的目标函数:

       里面除了loss和规则项两块外,还有一个参数λ。它也有个霸气的名字,叫hyper-parameters(超参)。你不要看它势单力薄的,它很是重要。它的取值很大时候会决定咱们的模型的性能,事关模型生死。它主要是平衡loss和规则项这两项的,λ越大,就表示规则项要比模型训练偏差更重要,也就是相比于要模型拟合咱们的数据,咱们更但愿咱们的模型能知足咱们约束的Ω(w)的特性。反之亦然。举个极端状况,例如λ=0时,就没有后面那一项,代价函数的最小化所有取决于第一项,也就是集全力使得输出和期待输出差异最小,那何时差异最小啊,固然是咱们的函数或者曲线能够通过全部的点了,这时候偏差就接近0,也就是过拟合了。它能够复杂的表明或者记忆全部这些样本,但对于一个新来的样本泛化能力就不行了。毕竟新的样本会和训练样本有差异的嘛。

       那咱们真正须要什么呢?咱们但愿咱们的模型既能够拟合咱们的数据,又具备咱们约束它的特性。只有它们二者的完美结合,才能让咱们的模型在咱们的任务上发挥强大的性能。因此如何讨好它,是很是重要。在这点上,你们可能深有体会。还记得你复现了不少论文,而后复现出来的代码跑出来的准确率没有论文说的那么高,甚至还差之万里。这时候,你就会怀疑,究竟是论文的问题,仍是你实现的问题?实际上,除了这两个问题,咱们还须要深刻思考另外一个问题:论文提出的模型是否具备hyper-parameters?论文给出了它们的实验取值了吗?经验取值仍是通过交叉验证的取值?这个问题是逃不掉的,由于几乎任何一个问题或者模型都会具备hyper-parameters,只是有时候它是隐藏着的,你看不到而已,但一旦你发现了,证实你俩有缘,那请试着去修改下它吧,有可能有“奇迹”发生哦。

       OK,回到问题自己。咱们选择参数λ的目标是什么?咱们但愿模型的训练偏差和泛化能力都很强。这时候,你有可能还反映过来,这不是说咱们的泛化性能是咱们的参数λ的函数吗?那咱们为何按优化那一套,选择能最大化泛化性能的λ呢?Oh,sorry to tell you that,由于泛化性能并非λ的简单的函数!它具备不少的局部最大值!并且它的搜索空间很大。因此你们肯定参数的时候,一是尝试不少的经验值,这和那些在这个领域摸爬打滚的大师是没得比的。固然了,对于某些模型,大师们也整理了些调参经验给咱们。例如Hinton大哥的那篇A Practical Guide to Training RestrictedBoltzmann Machines等等。还有一种方法是经过分析咱们的模型来选择。怎么作呢?就是在训练以前,咱们大概计算下这时候的loss项的值是多少?Ω(w)的值是多少?而后针对他们的比例来肯定咱们的λ,这种启发式的方法会缩小咱们的搜索空间。另一种最多见的方法就是交叉验证Cross validation了。先把咱们的训练数据库分红几份,而后取一部分作训练集,一部分作测试集,而后选择不一样的λ用这个训练集来训练N个模型,而后用这个测试集来测试咱们的模型,取N模型里面的测试偏差最小对应的λ来做为咱们最终的λ。若是咱们的模型一次训练时间就很长了,那么很明显在有限的时间内,咱们只能测试很是少的λ。例如假设咱们的模型须要训练1天,这在深度学习里面是屡见不鲜了,而后咱们有一个星期,那咱们只能测试7个不一样的λ。这就让你遇到最好的λ那是上辈子积下来的福气了。那有什么方法呢?两种:一是尽可能测试7个比较靠谱的λ,或者说λ的搜索空间咱们尽可能广点,因此通常对λ的搜索空间的选择通常就是2的多少次方了,从-10到10啊什么的。但这种方法仍是不大靠谱,最好的方法仍是尽可能让咱们的模型训练的时间减小。例如假设咱们优化了咱们的模型训练,使得咱们的训练时间减小到2个小时。那么一个星期咱们就能够对模型训练7*24/2=84次,也就是说,咱们能够在84个λ里面寻找最好的λ。这让你碰见最好的λ的几率就大多了吧。这就是为何咱们要选择优化也就是收敛速度快的算法,为何要用GPU、多核、集群等来进行模型训练、为何具备强大计算机资源的工业界能作不少学术界也作不了的事情(固然了,大数据也是一个缘由)的缘由了。

       努力作个“调参”高手吧!祝愿你们都能“调得一手好参”!

 

5、参考资料

[1] http://fastml.com/large-scale-l1-feature-selection-with-vowpal-wabbit/

[2] http://www.stat.purdue.edu/~vishy/introml/notes/Optimization.pdf

[3] http://www.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf

[4] GradientDescent, Wolfe's Condition and Logistic Regression

[5] http://nm.mathforcollege.com/mws/gen/04sle/mws_gen_sle_spe_adequacy.pdf

相关文章
相关标签/搜索