在看图卷积的时候,碰到了范数的问题(其实之前也遇到过,但是没有仔细的整理,主要是懒),然后,这次决定查阅一波资料整理一下。
向量的1-范数: ∣ ∣ X ∣ ∣ 1 = ∑ i = 0 n ∣ x i ∣ ||X||_1 = \sum_{i=0}^n |x_i| ∣∣X∣∣1=i=0∑n∣xi∣它表示的就是各个元素的绝对值之和。
向量的2-范数: ∣ ∣ X ∣ ∣ 2 = ( ∑ i = 0 n x i 2 ) 1 / 2 = ∑ i = 1 n x i 2 ||X||_2 = (\sum_{i=0}^{n} x_i^2)^{1/2} = \sqrt{\sum_{i=1}^n x_i^2} ∣∣X∣∣2=(i=0∑nxi2)1/2=i=1∑nxi2表示的就是元素的开方和再开平方根。
向量的无穷范数: ∣ ∣ X ∣ ∣ ∞ = max 1 ≤ i ≤ n ∣ x i ∣ ||X||_{\infty} = \max_{1\le i\le n} |x_i| ∣∣X∣∣∞=1≤i≤nmax∣xi∣
p-范数: ∣ ∣ X ∣ ∣ p = ( ∑ i = 1 n ∣ x i ∣ p ) ||X||_p = (\sum_{i=1}^n |x_i|^p) ∣∣X∣∣p=(i=1∑n∣xi∣p)
其中正整数 p ≥ 1 p \ge 1 p≥1,并且有 lim p → ∞ = max 1 ≤ i ≤ n ∣ x i ∣ \lim_{p\to \infty} = \max_{1 \le i\le n}|x_i| p→∞lim=1≤i≤nmax∣xi∣
假设 向量X=【2,3,-5,-7】,求向量的1-范数、2-范数和无穷范数。
向量的1-范数:各个元素的绝对值之和; ∥ X ∥ 1 = 2 + 3 + 5 + 7 = 17 {\left\| X \right\|_1}=2+3+5+7=17 ∥X∥1=2+3+5+7=17
向量的2-范数:每个元素的平方和再开平方根
∣ ∣ X ∣ ∣ 2 = ( 2 × 2 + 3 × 3 + 5 × 5 + 7 × 7 ) 1 2 = 9.3274 ||X||_2 = (2\times2+3\times3+5\times5+7\times7)^{\frac{1}{2}}=9.3274 ∣∣X∣∣2=(2×2+3×3+5×5+7×7)21=9.3274
向量的无穷范数:
设向量 X ∈ R n X \in R^n X∈Rn,矩阵 A ∈ R m × n A \in R^{m\times n} A∈Rm×n,例如矩阵A为:
A = [ 2 , 3 , − 5 , − 7 ; 4 , 6 , 8 , − 4 ; 6 , − 11 , − 3 , 16 ] A=[2,3,-5,-7; 4,6,8,-4; 6,-11,-3,16] A=[2,3,−5,−7;4,6,8,−4;6,−11,−3,16];
在机器学习中,我们的目标函数一般可以表示为(监督学习):
w ∗ = arg min w ∑ i L ( y i , f ( x i ; w ) ) + λ Ω ( w ) w^* = \argmin_{w}\sum_i L(y_i,f(x_i;w))+\lambdaΩ(w) w∗=wargmini∑L(yi,f(xi;w))+λΩ(w)
第一项的 L ( y i , f ( x i ; w ) ) L(y_i,f(x_i;w)) L(yi,f(xi;w))衡量的是我们的模型(分类或者回归)对第i个样本的预测值 f ( x i ; w ) f(x_i;w) f(xi;w)和真实的标签 y i y_i yi之间的误差。因为我们的模型是要拟合我们的训练样本的嘛,所以我们要求这一项最小,也就是要求我们的模型尽量的拟合我们的训练数据。但是我们不仅要保证训练误差最小,我们更希望我们的模型测试误差小,所以我们需要加上第二项,也就是对参数w的规则化函数Ω(w)去约束我们的模型尽量的简单。
规则化函数Ω(w)也有很多种选择,一般是模型复杂度的单调递增函数,模型越复杂,规则化值就越大。比如,规则化项可以是模型参数向量的范数。然而,不同的选择对参数w的约束不同,取得的效果也不同,但我们在论文中常见的都聚集在:零范数、一范数、二范数、迹范数、Frobenius范数和核范数等等。
在这里再啰嗦的插播两次实况,希望不要被打(懂的客官请直接跳过,都懂了就顺手点个赞),我们要我们的参数稀疏有什么用处呢?
1)特征选择(Feature Selection)
一般来说, x i x_i xi的大部分元素(也就是特征)都是和最终的输出 y i y_i yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑 x i x_i xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确 y i y_i yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。
2)可解释性(Interpretability)
模型更容易解释。例如患某种病的概率是y,然后我们收集到的数据x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型: y = w 1 ∗ x 1 + w 2 ∗ x 2 + … + w 1000 ∗ x 1000 + b y=w_1*x_1+w_2*x_2+…+w_{1000}*x_{1000}+b y=w1∗x1+w2∗x2+…+w1000∗x1000+b(当然了,为了让y限定在[0,1]的范围,一般还得加个Logistic函数)。通过学习,如果最后学习到的w*就只有很少的非零元素,例如只有5个非零的 w i w_i wi,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。但如果1000个 w i w_i wi都非0,医生面对这1000种因素,那就可能自己也会患病的吧(累觉不爱)。
核范数的应用
1)矩阵填充(Matrix Completion):
矩阵填充用在哪个地方呢?一个主流的应用是在推荐系统里面。我们知道,推荐系统有一种方法是通过分析用户的历史记录来给用户推荐的。例如我们在看一部电影的时候,如果喜欢看,就会给它打个分,例如3颗星。然后系统就会分析这些数据,看看到底每部影片的题材到底是怎样的?针对每个人,喜欢怎样的电影,然后会给对应的用户推荐相似题材的电影。但有一个问题是:我们的网站上面有非常多的用户,也有非常多的影片,不是所有的用户都看过说有的电影,不是所有看过某电影的用户都会给它评分。假设我们用一个"用户-影片"的矩阵来描述这些记录,例如下图,可以看到,会有很多空白的地方。如果这些空白的地方存在,我们是很难对这个矩阵进行分析的,所以在分析之前,一般需要先对其进行补全。也叫矩阵填充。 2)鲁棒性PCA: 主成分分析:可以有效的找出数据中最"主要"的元素和结构,去除噪音和冗余,将原有的复杂数据降维,揭示隐藏在复杂数据背后的简单结构。我们知道,最简单的主成分分析方法就是PCA了。从线性代数的角度看,PCA的目标就是使用另一组基去重新描述得到的数据空间。希望在这组新的基下,能尽量揭示原有的数据间的关系。这个维度即最重要的"主元"。PCA的目标就是找到这样的"主元",最大程度的去除冗余和噪音的干扰。 鲁棒主成分分析(Robust PCA)考虑的是这样一个问题:一般我们的数据矩阵X会包含结构信息,也包含噪声。那么我们可以将这个矩阵分解为两个矩阵相加,一个是低秩的(由于内部有一定的结构信息,造成各行或列间是线性相关的),另一个是稀疏的(由于含有噪声,而噪声是稀疏的),则鲁棒主成分分析可以写成以下的优化问题: 与经典PCA问题一样,Robust PCA本质上也是寻找数据在低维空间上的最佳投影问题。对于低秩数据观测矩阵X,假如X受到随机(稀疏)噪声的影响,则X的低秩性就会破坏,使X变成满秩的。所以我们就需要将X分解成包含其真实结构的低秩矩阵和稀疏噪声矩阵之和。找到了低秩矩阵,实际上就找到了数据的本质低维空间。那有了PCA,为什么还有这个Robust PCA呢?Robust在哪?因为PCA假设我们的数据的噪声是高斯的,对于大的噪声或者严重的离群点,PCA会被它影响,导致无法正常工作。而Robust PCA则不存在这个假设。它只是假设它的噪声是稀疏的,而不管噪声的强弱如何。 背景建模的最简单情形是从固定摄相机拍摄的视频中分离背景和前景。我们将视频图像序列的每一帧图像像素值拉成一个列向量,那么多个帧也就是多个列向量就组成了一个观测矩阵。由于背景比较稳定,图像序列帧与帧之间具有极大的相似性,所以仅由背景像素组成的矩阵具有低秩特性;同时由于前景是移动的物体,占据像素比例较低,故前景像素组成的矩阵具有稀疏特性。视频观测矩阵就是这两种特性矩阵的叠加,因此,可以说视频背景建模实现的过程就是低秩矩阵恢复的过程。 复制自大佬,怕以后找不到了,会自己给哭死的。 L0、L1与L2范数、核范数
嗯,之前在毕业设计的时候,做的图书推荐模块的时候,就用到了这个矩阵填充的东西,嗯…但是,好像当时也不知道什么核函数,就是拿起键盘一顿emmm。
但是是怎么填的呢,其实也简单,每一个空白的地方的信息,针对于电影来说,空白地方就是你没有看过的电影。
它可以用如下的模型表述:已知数据是一个给定的m*n矩阵A,如果其中一些元素因为某种原因丢失了,我们能否根据其他行和列的元素,将这些元素恢复?当然,如果没有其他的参考条件,想要确定这些数据很困难。但如果我们已知A的秩rank(A)<
min A , E r a n k ( A ) + λ ∣ ∣ E ∣ ∣ 0 s . t X = A + E \min_{A,E}rank(A)+\lambda||E||_{0}s.tX=A+E A,Eminrank(A)+λ∣∣E∣∣0s.tX=A+E
min A , E ∣ ∣ A ∣ ∣ ∗ + λ ∣ ∣ E ∣ ∣ 1 s . t X = A + E \min_{A,E} ||A||_* + \lambda||E||_{1} s.t X=A+E A,Emin∣∣A∣∣∗+λ∣∣E∣∣1s.tX=A+E
说个应用。考虑同一副人脸的多幅图像,如果将每一副人脸图像看成是一个行向量,并将这些向量组成一个矩阵的话,那么可以肯定,理论上,这个矩阵应当是低秩的。但是,由于在实际操作中,每幅图像会受到一定程度的影响,例如遮挡,噪声,光照变化,平移等。这些干扰因素的作用可以看做是一个噪声矩阵的作用。所以我们可以把我们的同一个人脸的多个不同情况下的图片各自拉长一列,然后摆成一个矩阵,对这个矩阵进行低秩和稀疏的分解,就可以得到干净的人脸图像(低秩矩阵)和噪声的矩阵了(稀疏矩阵),例如光照,遮挡等等
3)背景建模:
4.规则化参数的选择
w ∗ = arg min w ∑ i L ( y i , f ( x i ; w ) ) + λ Ω ( w ) w^* = \argmin_{w}\sum_i L(y_i,f(x_i;w))+\lambdaΩ(w) w∗=wargmini∑L(yi,f(xi;w))+λΩ(w)
里面除了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、多核、集群等来进行模型训练、为什么具有强大计算机资源的工业界能做很多学术界也做不了的事情(当然了,大数据也是一个原因)的原因了。Reference