李宏毅深度学习笔记-结构化支持向量机


统一框架:两步走,三问题

两步

第一步:训练

  • 寻找一个函数 \(F:X \times Y \to R\)
  • \(F(x,y)\)用来评估对象x和y的兼容性 or 合理性

第二步:推理 or 测试

  • 给定一个对象 \(x\),求\(\large \widetilde{y}=arg \max\limits_{y\in Y}F(x,y)\)
  • 给定任意一个\(x\),穷举所有\(y\),找出能让\(F(x,y)\)最大的\(\widetilde{y}\)

三问题

Q1:评估

  • What: F(x, y) 的形式是什么

Q2:推理

  • How: 如何解决 “arg max” 问题,即转换为最优化的求解问题。

Q3:训练

  • 给定训练数据,如何求解 \(F(x, y)\)

例子:目标检测

image-20200702091719518

Q1:评估

  • \(F(x,y)\)做一些假设,可以让之后的任务变得容易一点,这里假设\(F(x,y)\)是线性的。

\(x\)是一张图片,\(y\)是一个bounding box。也就是\(F(x,y)\)可以写成一个weight(\(w\)),跟一个特征向量\(\phi()\)的内积。\(w\)是Q3里通过训练数据学习出来的,而\(\phi()\)是人工定的。

开放问题:\(F(x,y)\)可以是非线性的吗?

你可能知道说\(F(x,y)\)如果是线性的话,其实是很弱的,做不了什么太厉害的事情,必须要依赖一个复杂的抽特征的方式来得到一个好的结果。但这可能不是我们想要的,我们希望机器能做更复杂的事而不是有太多人的知识介入在里面。关于\(F(x,y)\)非线性的研究还很少,因为\(F(x,y)\)不是线性的话,等会要讨论的都不成立了。所以我们之后,多数情况都是假设\(F(x,y)\)是线性的。

Q2:推理

给你一个\(x\),你要去穷举所有可能的\(y\),看哪一个\(y\)可以让你的评估函数(\(w \cdot \phi(x,y)\))最大,那么需要一个演算法有效的做这件事情。

image-20200702102705137

以目标检测为例,就要穷举所有可能的bounding box,对每个bounding box都要算一个分数(\(w\cdot \phi()\))。比如上图右边中间的bounding box得到的分数最大,那就把这个bounding box作为结果\(\large \hat y\)。你可能觉得穷举听起来是一个很花时间的东西,事实上我们有比较有效率的方法去做穷举(需要自己去想)。

image-20200702103023558

比如在目标检测的文献上,Q2的方法有:

  • Branch and Bound algorithm(分支定界法)
  • Selective Search(选择性搜寻)

在sequence labeling(序列标记)上有:

  • Viterbi Algorithm(维特比算法)

使用什么算法取决于你的task,如果你有不同的task,就要想不同的算法。甚至同一个task,特征\(\phi(x,y)\)定义不同,也需要不同的算法。

你可以想象这个统一框架是有用的,虽然没有教你问题具体怎么解决,给你一个结构化学习的问题,如果你不知道这个统一框架,那你就不知道从何解起,而统一框架给了你一个思路。

如果你不知道Q2怎么解,可以使用经典算法,可以解决很多的问题,不过有时候找到的不一定是准确的结果。

开放问题:如果我们没有办法找到一个准确的结果,也就是\(arg max\)只能有一个近似的结果,那么这对我们的结果影响有多大?

在以下课程里,我们都假设Q2已经解决了。

image-20200702105317388

Q3:训练

有一堆训练数据\(\{(x,\hat y)\}\),我们希望找到一个\(F(x,y)\) ,使得\(F(x^1,\hat y^1)\)必须比其他所有的\(F(x^1,y)\)的值大,同理\(F(x^2,\hat y^2)\)必须比其他所有的\(F(x^2,y)\)的值大,以此类推......。

在之后的课程里面,我们集中在Q3,假设已经知道怎么抽\(\phi(x,y)\),Q2里已经解决了如何算\(\widetilde y\)

可分离情形

image-20200702110916026

image-20200702130232769

假设现在有两笔数据,红色代表是正确的,蓝色代表错误的。所谓可分离的意思是,我们找得到一个权值向量\(\hat w\),把所有点的\(\phi()\)都和\(\hat w\)做内积,可以让红色点的值比所有蓝色点的值都大一个\(\delta\),同理可以让红色星星的值比所有蓝色星星的值都大一个\(\delta\) ,写成数学式就如上图左边所示。

image-20200702131642088

如果我们能够找一个上述说的特征函数\(F(x,y)\),就能用结构化感知机算法找到我们要的\(w\)。如果你知道什么是感知机的话,就不难理解它为什么叫做结构化感知机,感知机稍微改一下就是结构化感知机。

input:是一组训练数据集\(\{(x,\hat y) \}\)

output:权值向量\(w\)(可以让数据点可分离)

algorithm:初始化\(w=0\)

​do

 取一个数据样本\((x^n,\hat y^n)\)(按照顺序或者随便取都可以)

  找一个\(\widetilde{y}^n\)\(w\cdot \phi(x^n,y)\)的值最大(Q2,假设已经解决)

 如果\(\widetilde{y}^n\)和正确的值\(\hat y^n\)不一样,那就更新\(w\)

  更新方式为\(w\)+正确\(\hat y^n\)形成的特征向量\(\large \phi(x^n,\hat y^n)\)-当前最大的特征向量\(\large \phi(x^n,\widetilde{y}^n)\) ,就是让\(w\)跟正确的
  向量靠近得近一点,跟错误的向量远离一点

看完所有数据之后,\(w\)都没有更新的话,也就是说对所有数据来说,\(arg \ max\)得到的结果都是各自的\(\hat y\)的话,这个\(w\)就是我们要的。

这个算法很简单,问题就是我们不知道到底要花多久才会收敛。

image-20200702135258284

\(arg max\)中的\(y\)非常多,真的能很轻易的找到红点,跟蓝色点分开吗?

结论是可以的,在可分情形下,最多只需要更新\((R/\delta)^2\)次,就可以找到我们要的\(w\)

  • \(\delta\)是间隔(我们之前讲过正确的答案至少比错误的答案大一个\(\delta\)
  • \(R\)是不同特征向量(不同\(y\)有不同\(\phi(x,y)\))距离的最大值

所以算法需要的信息,跟\(y\)的空间大小是无关的。不管蓝色的点有多少个,都不会影响我们需要更新的次数。

image-20200702140608514

证明只需要更新\((R/\delta)^2\)

每次发现一笔错误的时候,就会更新一次\(w\)。如果你找出来的\(arg max\)\(\hat y\) 就不会被更新,只有\(\widetilde{y} \neq \hat y\)时才会被更新。

上图\(w^0=0\to w^1\to w^2......\)\(w\)更新的演进过程,我们检查\(w^k,w^{k-1}\)之间的关系,一定会有\(\large w^k=w^{k-1}+\phi(x^n,\hat y^n)-\phi(x^n,\widetilde y^n)\)

提醒一下

​ 这里考虑的是可分情形。

  • 也就是说存在\(\hat w\)
  • 在所有的数据(任意\(n\))上
  • 使得正确的\(\hat y\)的值\(\geq\) 所有非正确\(y\)的值 +\(\delta\)
  • 如上图最下方所示

不失一般性的可以假设\(\hat w\)的长度为1,如果我们可以找到一个\(w\)让我们的数据可分离,那么对\(w\)做标准化,让它的长度变为1,还是一样可以让数据可分离。

image-20200702150925527

正式开始证明:

首先看一件事情,看\(\large \hat w\)\(\large w^k\)之间的关系,如果去计算它们之间的夹角\(\large \rho_k\),会发现当\(k\)越来越大时,夹角\(\large \rho_k\)越来越小。可以算\(\large cos\rho_k\)来观察夹角大小

  • \(\Large cos \ \rho_k=\frac{\hat w}{||\hat w||}\cdot \frac{w^k}{||w^k||}\)

  • \(\large \hat{w} \cdot w^{k}=\hat{w} \cdot\left(w^{k-1}+\phi\left(x^{n}, \hat{y}^{n}\right)-\phi\left(x^{n}, \widetilde{y}^{n}\right)\right)\)

\(\large =\hat{w} \cdot w^{k-1}+\hat{w} \cdot \phi\left(x^{n}, \hat{y}^{n}\right)-\hat{w} \cdot \phi\left(x^{n}, \widetilde{y}^{n}\right) \geq \hat w \cdot w^{k-1}+\delta\)

其中\(\large \hat{w} \cdot \phi\left(x^{n}, \hat{y}^{n}\right)-\hat{w} \cdot \phi\left(x^{n}, \widetilde{y}^{n}\right) \geq \delta\)(这个是我们的定义,让数据可分离)

image-20200702153424853

  • 一开始\(w^0=0\)
  • 那么\(\large \hat w\cdot w^1 \geq \hat w\cdot w^0 +\delta \geq \delta\)
  • 接下来\(\large \hat w\cdot w^2 \geq \hat w\cdot w^1+\delta \cdots \cdots \geq \delta+\delta =2\delta\)
  • \(\cdots\)
  • 可以推出\(\large \hat w \cdot w^k \geq k\delta\)

所以\(\large cos \rho_k\)中的分子是不断增加的,但是内积增加不一定保证两个向量越来越接近,有可能只是\(w^k\)越来越长。

image-20200702154621302

应该要再算下\(\large cos \rho_k\)中的分母,我们要考虑\(w^k\)的长度(之前已经不失一般性的假设\(\hat w\)的长度为1)。如果\(w^k\)的长度并没有很快的增加,而分子的内积又增加的话,我们就可以知道随着\(k\)增加,\(w^k\)\(\hat w\)越来越接近。

\(w^k\)长度计算如上图,其中:

  • \(\large ||\phi(x^n,\hat y^n)-\phi(x^n,\widetilde{y}^n)||^2 >0\)

  • \(\large 2w^{k-1}\cdot (\phi(x^n,\hat y^n)-\phi(x^n,\widetilde{y}^n))<0\),因为找到的\(w^{k-1}\)犯了错,\(w^{k-1}\)才会被更新,它找出来的\(arg \ max\)\(\widetilde{y}\)而不是\(\hat y\) ,是错误的,这说明在\(w^{k-1}\)时,\(\large w^{k-1} \cdot \phi(x^n,\widetilde{y}^n)>w^{k-1}\cdot \phi(x^n,\hat y^n)\)

  • 假设特征向量之间的距离最大值是\(R\),那么可以得到\(\leq ||w^{k-1}||^2+R^2\)

计算下\(w^n\)距离,如上图右下方所示

  • \(w^0=0\),所以\(||w^1||^2 \leq R^2\)
  • \(\cdots\)
  • \(||w^k||^2\leq kR^2\)

image-20200702161003564

现在得到两个结论:

  • \(\hat w \cdot w^k \geq k\delta\)

  • \(||w^k||^2 \leq kR^2\)

也就是说随着k增加,内积不断增加,但是\(w^k\)的长度并没有增加很快。

把两个结论合起来如上图左边所示。随着\(k\)不断增加,\(cos \rho_k\)可能会逐渐增加(不一定增加,因为还有等于),可能增加幅度越来越小,最后到1。

最后可以看到\(\large k\leq (\frac{R}{\delta})^2\),就得到我们的结论最多更新\((\frac{R}{\delta})^2\)次。

image-20200702163131387

\(\large k\leq (\frac{R}{\delta})^2\)我们发现,如果\(\delta\)越大,那么更新次数越少,你可能为了让训练快一点,会想个方法让\(\delta\)增加。你会想说找一组好的特征,可以让红色的圈圈跟蓝色的圈圈分得比较开,你让所有的特征*2,相当于上图最下方的图放大2倍,这样\(\delta\)就直接增加了2倍。但是这样并不会让学习变快,因为\(R\)同时也增加了2倍。所以单纯放大是没用的,要真的去挪动点的位置。

不可分情形

image-20200702163945754

不可分情形要考虑的是,虽然没有任何一个向量可以让正确答案和错误答案被正确分开,但是在这些向量里面,我们还是可以区分出好坏,鉴别出高下。

比如有一个\(w'\),可以把正确答案排在第二名,有另外一个\(w''\),把正确答案排在最后一名。虽然\(w',w''\)都没有办法让正确答案高过所有其他答案,但是\(w'\)明显更好。所以在不可分情形下, 还是可以定义一些评估方法来看\(w\)是好是坏。

定义成本函数

image-20200703085549652

定义一个 损失函数\(C\),寻找\(w\)去最小化\(C\),虽然\(w\)不能让数据可分离,但是是我们手上最好的。

怎么定义成本函数?

可以有自己定义的方式,这里提供一个方式:

\(n\)笔数据的损失写成\(C^n\),是全部\(y\)里面最大的内积值-正确的内积值,如上图绿色线(第一名内积值-正确的内积值),这件事情是很直观的。对每一笔数据都有\(C^n\),最后summarization就是所有的损失。

\(C^n\)的最小值应该是多少?

\(C^n\)的值不可能是负的,如果第一名就是正确的,相减最小为0。

随机梯度下降

image-20200703090814276

怎么找\(w\)

用梯度下降就可以解决,但是你可能会想,\(C\)有办法做梯度下降吗,可以找到一个\(w\)去最小化\(C\)吗?\(C^n\)里面可是有max的,那要怎么做梯度下降呢?

image-20200703091040808

虽然\(C^n\)有max,还是可以算对\(w\)的微分。

如上图最上方蓝色线标出的公式,你为什么觉得难算是因为有一个max,因为\(w\)不同时,max的\(y\)是不同的。

想象上图最下方是\(w\)形成的空间,被max切割成好几块。这里是二维平面,那么\(w\)就是二维的向量。当\(w\)落在不同的范围里时,max出来的\(y\)分别为\(y',y'',y'''\)。在每一个区域里面,损失函数是可以很容易算出来的,因为如果你知道在这个区域里面max的结果是\(y'\)的话,那\(C^n\)就是内积相减(如上图左下方灰色框框所示),或者\(y''\)部分(上图中间灰色框框所示),\(y'''\)部分(上图右下方灰色框框所示)。在边界的地方是没办法微分的,但是避开边界的地方,在每个区域里面,都只是一个很简单的函数,都是可以微分的。

image-20200703093427099

随机梯度下降

for t=1 to T:

 每次都随机抽取一个样本\(\{x^n,\hat y^n\}\)

  首先要知道落在哪个区域里面(当前\(w\)下),算出来是在\(\widetilde{y}^n\)区域里面

  计算梯度,就是\(\phi(x^n,\widetilde{y}^n)-\phi(x^n,\hat y^n)\)

  更新\(w\),如果把\(\eta\)设置为1,就是结构化感知机

考虑误差

定义误差函数

image-20200703124520517

要修改下我们的误差函数,在之前的误差函数里,对我们来说所有错误都是一视同仁的,事实上错误并不是同等地位的。在结构化学习的例子里面,output有很多的可能,有一些output跟正确的很接近。比如上图右边,正确的是红色框框,如果output是第二个框框(也是框在凉宫春日脸上),你对这个结果也是可以接受的,但是框在下面两个框框上你就不能接受了。所以不同的错误之间还是有差别的(错误有不同的等级),我们应该把这件事考虑进去。比如框在樱花树上,那结果是非常差的,我会希望它的分数特别低,而框在凉宫春日脸上(有些地方没框好),其实结果也是可以接受的,希望跟正确的分数比较接近。如果有另外一个\(w\),不仅能把正确的放在第一位,还可以让那些可以接受的结果分数比较高,错的很离谱的结果分数很低,那显然这个\(w\)更好。这样的\(w\)还有一个好处,得到的结果是比较安全的,假如testing跟trainging数据是有一些差距的,就算第一名不是正确的,也可以保证和正确的不会有太大偏差。

image-20200703135505593

怎么把不同误差不同等级考虑到误差函数里呢?

一个可能的想法说,如上图红色框框是正确的,两个黄色框框是错误的,但是第二个错误的框框和正确的很像,会希望分数差距比较小。反之有个框框(上图第三个)错得很离谱,会希望分数和正确的分数差距比较大。

image-20200703135800962

怎么评估框框是好的还是不好的?

这件事情其实也是取决task的,不同task你要想办法自己定义。

我们的定义\(\Delta(\hat y,y)\)为误差的函数,至于到底什么样子要自己定义。以下讨论我们假设\(\Delta\)是一个正值,如果是自己对自己,那么\(\Delta\)就是0,常见的做法把\(\Delta\)定义成上图右下方所示。

\(A(y)\)代表\(y\)框框的面积,如果两个框框的面积交集很小,那么\(\Delta\)就接近1,交集很大,\(\Delta\)接近0。

其他成本函数

image-20200703141439929

有了\(\Delta\)之后,怎么修改成本函数?

本来的成本函数\(C^n\)计算时,是取分数最高的\(y\)

现在不是取分数最大,而是要分数+\(\Delta\) 最大。

精神就是,如果max中找出来的\(y\)\(\Delta\)值很大,那么为了使\(C^n\)越小,就会希望\(w\cdot \phi(x^n,y)\)越小(跟正确答案的分数差的越远),反之如果有个\(y\)跟正确框框很像的话(\(\Delta\)值很小),分数就会更接近正确的分数。加上\(\Delta\)让错误的框框分数离正确的越远,而让可以接受的框框分数变化比错误的远小,这样就拉大了两者之间跟正确分数的差距,就让错误的更错,稍微正确的没有那么错。

想想\(C^n\)什么时候会最小?

当正确的\(\hat y\) 的分数不只是比其他的\(y\)的分数大,而且大的幅度超过一个\(\Delta\) 的时候(因为\(\hat y\)\(\Delta=0\),要让\(\max \limits_{y} \Delta(\hat y^n,y)+w\cdot \phi(x^n,y)\)得到\(\hat y\),必须保证\(\hat y\)的分数比其他\(y\)的分数大过一个\(\Delta\))。

我们把\(\Delta\)称为间隔,如果\(y\)是一个很差的\(y\),那么间隔就要很大(保证max取到的是这个差的\(y\)

现在出现了一个问题

现在max里,多了一个\(\Delta\),又添了一个麻烦。所以定义\(\Delta\)的时候要很小心,有的\(\Delta\)会让max变得很难解。

梯度下降

image-20200703151436467

本来是找\(y\)让内积值最大,现在变为内积+\(\Delta\)最大,两个式子找出的\(y\)不一定会是同一个。

其他的观点

image-20200703153816625

之前的成本函数有另外一个观点用来解释。之前的成本函数\(C^n\)是你在训练数据上的误差的上界,当你去最小化有间隔的成本函数时,你是在最小化训练数据的误差上界,虽然最小化训练误差上界不代表误差一定会减小,但是也是有可能会跟着变小的。

假设不正确的函数如上图右上方所示,拿\(\widetilde{y}\)当做output,希望最小化的成本函数是\(C'\)(\(\hat y ,\widetilde y\)差距之和),那我们希望找到一个\(w\),让\(C'\)越小越好。但是最小化\(C'\)并没有那么容易,因为\(\Delta\)可以是任何函数,想想看就算一个函数在某些地方不可微,总体上也还是可以使用梯度下降的,但是如果\(\Delta\)比那些某些地方不可微的函数还要复杂,比如阶梯状函数,那么梯度下降就完全没用了。

这样\(C^n\)就派上用场了,\(C^n\)\(C'\)的上界,那么就找\(w\)来最小化\(C^n\),进而间接去最小化\(C'\)

image-20200703155013810

证明:\(C^n\)是误差函数之和的上界

因为\(\large \widetilde y^n=arg \max \limits_y w\cdot \phi(x^n,y)\),所以\(\large w \cdot \phi\left(x^{n}, \tilde{y}^{n}\right)-w \cdot \phi\left(x^{n}, \hat{y}^{n}\right) \geq 0\)

想让\(\Delta\)< \(C^n\)也不只这个solution。

image-20200703160057921

可以有别的solution

Margin rescaling(间隔调整)

Slack Variable Rescaling(松弛变量调整),精神是,先算某个\(y\)\(\hat y\)的差距,然后差距再乘上\(\Delta\) ,也就是说如果差距很大且\(y\)是一个很差的\(y\),那么\(\Delta\)也会很大,这样差距就会放大,反之如果\(y\)是一个,很好的\(y\)\(\Delta\)就会很小,差距就会被缩小。当初为什么会提这个函数,想想看本来是\(\Delta\)+内积 ,这两项有可能就不在同一个scale里,\(\Delta\)是自己随便定的,\(w\)是学习出来的。比如一个值是0到0.001,另一个值是0-10000,这样其中某一项就没用了。所以说不用加的,用乘的,可能结果好一点。

正则化

image-20200703162245024

训练数据和测试数据可能有不同的分布。如果\(w\)接近于0,就可以最小化mismatch造成的影响。我们把\(w\)接近于0这件事加到成本函数里。也就是说在原来的成本函数里加上\(w\)的L2正则。

image-20200703201202389

这个怎么做梯度下降呢?

跟之前一样,没有什么不同。

  • 在每个迭代中找一个数据\(\{x^n,\hat y^n\}\)
  • 找到一个\(\bar y^n\)
  • 计算梯度(还要加上正则化项)
  • 更新\(w\)

结构化支持向量机

image-20200703212030984

最后使用的成本函数\(C\) 如上图。

\(w \cdot \phi(x^n,\hat y^n)\)移到左边,改成如上图中间所示的公式。

再看蓝色框内的第一个不等式,和我们中间的式子是一样的吗?

有可能不一样的,因为\(C^n\)是随便取的,那我们取\(C^n=C^n+1\),满足不等式,但是得到的结果和中间式子不一样。

那为什么我们可以得到第一个不等式的转换?

因为要最小化\(C\),所以\(C^n\)也是要最小化的,取\(C^n=C^n+1\)就不是最小化了(因为\(C^n\)更小)。

image-20200704085228983

绿色框框内要最小化\(C\)等价于黄色框框内的叙述,最小化的对象是一样。本来\(C^n\)等于max-内积,变成\(C^n\)满足黄色框最下方的不等式。\(w\)\(C^n\)在最小化\(C\)的前提下,同时满足最下方的不等式。

image-20200704085651131

习惯上不会写为\(C^n\),会写成\(\large \epsilon^n\)(松弛变量)。

本来我们说,是找一个\(w\),去最小化\(C\),因为我们只要定好\(w\)\(C^n\)就直接决定了,但是在黄色框最下方的不等式里,定好\(w\)后,\(\large \epsilon ^n\)的值并没有直接决定。所以我们说,找\(w\)\(\large \epsilon ^1...\epsilon ^n\)去最小化黄色框里的\(C\),并满足黄色框里的不等式约束。

image-20200704093400547

对黄色框里的不等式做一下改变,因为\(y\)有很多,所以不等式约束也有很多(每一个\(y\)一个约束)。比如做目标检测时,\(y\)是所有可能的框框,假设有10000个,那这里就有10000个不等式。当\(y=\hat y\)时,这个不等式是比较无聊的,把不等式里的\(y\)\(\hat y\)替换掉,不等式左边就是0,右边\(\Delta(\hat y^n,\hat y^n)=0\),那么可以得到\(\large \epsilon ^n \geq 0\)

image-20200704100023801

for 任意\(y \neq \hat y^n\):

\(\large w \cdot\left(\phi\left(x^{n}, \hat{y}^{n}\right)-\phi\left(x^{n}, y\right)\right) \geq \Delta\left(\hat{y}^{n}, y\right)-\varepsilon^{n}, \varepsilon^{n} \geq 0\)

我们从直觉上来看看这个式子是怎么来的。刚才说希望正确的框框得到的分数跟错误的框框得到的分数中间有一个margin,如果\(\Delta\)越大,那么margin越大。所以我们可以列出一个约束,我们要找的weight,应该要满足上图最下方的条件。我们有很多黄色的框框,所以不等式有很多个,所有\(y \neq \hat y\)都会有一个不等式。

image-20200704130655429

这边会有一个问题

你可能找不到\(w\) 让所有的不等式都满足。所以我们不要用\(\Delta\)当做margin,把margin改得小一点(都减去一个\(\large \epsilon\)),要让margin变小,\(\epsilon\)要大于0,这样\(w\)的限制就被放宽了。因为\(\epsilon\)的作用是放宽限制,所以我们叫它松弛变量。当然我们希望限制不能太宽,如何太宽了,就失去了margin的意义,如果\(\large \epsilon\)无穷大,那所有的margin都变成负值,这样随便一个\(w\)都会让不等式满足,那么这就不是我们要的东西了。所以我们希望放宽结果,但是幅度必须是最小的,即我们希望\(\large \epsilon\)的值越小越好。

image-20200704193005001

假设有两笔训练数据,对\(x^1\)来说,我们希望(正确的-错误的)要大于(\(\Delta\)-\(\large \epsilon^1\)),对所有可能的\(y\)都要有这个式子。因为是为了放宽限制,所以\(\epsilon^1 \geq 0\)

\(x^2\)来说也是一样的。

在满足这些不等式下,我希望\(\large \epsilon^n\)之和加上正则化是最小的。

image-20200704194941185

那么最后的式子和之前的是一样的。

现在要做的事情是找一个\(w\)\(\large \epsilon^n\),去最小化\(C\),同时要满足上图的不等式。

这个跟SVM有什么关系呢?

跟SVM的式子是大同小异的。现在唯一的问题是,约束太多,\(y\)可能有上万个(每个\(y\)一个约束)。

切割平面算法

image-20200704195327275

我们先无视约束很多这件事,来看一下解的是什么样的问题。

我们只看要最小化的部分,有\(w\)\(\large \epsilon\) ,现在假设\(w\)只有一维,训练数据只有一笔。在没有约束条件下,最小化就很容易,看起来就像上图右下方图示。

问题是这里有些约束,这些约束是做什么事情?

这里的每个约束都是在\(w,\large \epsilon\)平面上画一条直线,然后告诉你只有某一边方向是可以的,约束合起来告诉你只有橙色区域是可以选择的。这边困难的事情就是线条很多,很难找出它们的交集。

image-20200704195943254

image-20200704202114211

我们有个算法叫做切割平面算法,可以帮助我们找出可选择的区域。

现在问题是,有一个参数空间(\(w,\epsilon^1,...,\epsilon^N\),本来是高维的,这边用二维代表),参数空间上的颜色代表\(C\)的数值大小,在没有约束下,青色点是\(C\)的最小值。不幸的是我们有一大堆的约束,然后只有上图阴影部分的区域是符合这些约束的。在阴影部分找最小值,得到的结果就是蓝色线那一点。现在的问题就是怎么找出阴影部分。

image-20200704202336181

大部分的约束都是冗余的,对我们找阴影部分是没有影响的。比如上图两条红色的约束,只要有这两条红线,就可以决定我们的参数(青色点,两条红线交点),所以绿色这种线就是冗余的。

本来要穷举所有\(y\)\(y \neq \hat y)\),每个\(y\)都有一个约束,现在要移除一些不起作用的线条,保留有影响的线条,这个有影响的线条集称为Working Set,用\(A^n\)表示。

image-20200704202846287

怎么找Working Set?

用迭代的方法找,每次找到一个元素加到Working Set里。它的精神是:

一开始初始化\(A^1,...,A^N\)(都是空的)

接下来根据初始化的Working Set,去解这个project programming,本来要考虑所有的\(y\),但是给定一组Working Set后,只要考虑Working Set中的\(y\)就可以了。

假设根据Working Set解出一个\(w\)后,再用这个\(w\)去找一些新的成员加到Working Set里,Working Set变化后再去接project programming,又得到一个不一样的\(w\)......不断循环下去。

image-20200704203607132

用图的方式来解释一下怎么运作。

首先假设\(x^n\)的Working set \(A^n\)在初始的时候是空集合(没有任何约束),在没有约束的情况下,得到的\(w\)结果就是蓝色这个点。

image-20200704203811224

找出蓝色这个点之后,看看那些约束是没有被满足的,比如红色线的都没有满足,这样没有满足的约束有很多,但是我们只挑没有满足的最严重的。

image-20200704205517789

假如最严重的的如上图所示的红线(离蓝色的点是最远的),那就把红色这条线加到Working set 里。

image-20200704205710447

得到的新的参数在上图蓝色点位置,然后再看有哪些约束没有被满足。

image-20200704205759797

比如上图另一根红线没有被满足,余数告诉我们说,可以接受的范围在右上角,而蓝色点在左下角。这个约束没有被满足,再加到Working set里。

image-20200704205933392

又得到一个新的参数值,最小值是蓝色点处。

image-20200704210007590

继续检查哪些余数没有被满足,再加到Working set里,现在Working set里就有三条线了。

image-20200704210059134

最后根据Working set,找到我们要的解。

image-20200704210129534

怎么找到最严重的约束?

看约束,内积$\geq \(等于\)\Delta - \epsilon\(。当一个约束被不满足时,说明内积<\)\Delta-\epsilon\(,被不满足的约束可能有很多个。定义一个violation的程度,右边这一项\)-\(左边这一项的程度。但是这个定义,你会发现,对所有的\)y\(来说,\)\epsilon ’\(跟\)y\(没有关系(是一个固定的值),\)\phi(x,\hat y )\(也是一个固定值,那就可以拿掉,最后变成\)\large \Delta(\hat y,y)+w'\cdot \phi(x,y)$来计算violation的程度。

image-20200704211004503

image-20200704211310408

整个算法就是:

有一堆数据\(\{(x^1,\hat y)\}\)

每一个\(x\)都有一个Working set(\(A^1,....,A^N\)),每个Working set都给一个初始值

repeat

​ 根据已经有的Working set,解一个\(w\)

​ 根据现在的\(w\),对每一个训练数据

​ 找出不满足最严重的的约束,用\(\bar y\)表示

​ 把\(\bar y\)加进Working set

​ 再根据更新后的Working set,得到一个\(w\),再去找\(\bar y\)加进Working set

直到\(A^1,....,A^N\)不再改变

返回\(w\)

image-20200704211633478

用目标检测举个例子。假设有两个训练数据,

一开始的Working set是\(A^1=\{\},A^2=\{\}\)

一开始没有约束条件下去找\(w,\epsilon^1,\epsilon^2\)\(\epsilon^1 > 0,\epsilon^2 > 0\)

解出来\(w=0\)

image-20200704211924532

\(w=0\)时去解violated约束,去计算每个可能的框框的(\(\Delta+0\cdot \phi()\))。

结果如上图下方所示,因为\(w=0\),所以只考虑\(\Delta\),右边都等于1,那么就随机选择一个。把violated约束加到Working set里面。

image-20200704212255337

\(A^1,A^2\)都各有一个成员了。

\(A^1\)里有个左下角的框框,我们希望

(正确框框的值\(-\)左下角框框的值)\(\geq\)\(\Delta(左下角框框,正确框框)-\epsilon^1\)

同理\(A^2\)有个成员,也有一个约束,如上图最下方所示。

最后得到\(w^1\)

image-20200704214054620

\(w^1\)再计算会算出一个不一样的值。把最violated约束加入Working set。

image-20200704214206382

解最violated约束和\(w\)不断迭代。

多类别与二元支持向量机

image-20200704214541092

用结构化学习的思想做多分类SVM。

Q1:评估

  • \(K\)个类,然后有\(K\)个权值向量\(\{w^1,w^2,...,w^K\}\)

  • \(F(x,y)=w^y\cdot \overrightarrow{x}\)

\(F(x,y)\)里不是\(w\cdot \phi()\)吗?

\(w\)排成一个向量,\(\phi(x,y)\)也是一个向量,如上图右边所示。那么\(w^y\cdot \overrightarrow{x}\)就是\(w\cdot \phi(x,y)\)

image-20200704215119451

Q2:推理

穷举所有可能的\(y\),看谁的\(F(x,y)\)最大。这边穷举很容易,因为\(K\)没几个。

image-20200704215228936

Q3:训练

这里约束是很有限的,假设有N笔训练数据,那约束的数量就是N(K-1)个。

image-20200704215350610

多分裂SVM的K=2时的情况。

超越结构化svm

image-20200704215808063

结构化SVM有个很大的问题是线性的,线性的就做不出什么厉害的东西。要让结构化SVM有效,那特征就要定的很好,那定义特征让DNN来。

image-20200704220023139

本来是先训练好一个DNN,再接一个结构化SVM。但是可以把DNN和结构化SVM一起学习。

image-20200704220207958


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM