統一框架:兩步走,三問題
兩步
第一步:訓練
- 尋找一個函數 \(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)\)?
例子:目標檢測
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)\))最大,那么需要一個演算法有效的做這件事情。
以目標檢測為例,就要窮舉所有可能的bounding box,對每個bounding box都要算一個分數(\(w\cdot \phi()\))。比如上圖右邊中間的bounding box得到的分數最大,那就把這個bounding box作為結果\(\large \hat y\)。你可能覺得窮舉聽起來是一個很花時間的東西,事實上我們有比較有效率的方法去做窮舉(需要自己去想)。
比如在目標檢測的文獻上,Q2的方法有:
- Branch and Bound algorithm(分支定界法)
- Selective Search(選擇性搜尋)
在sequence labeling(序列標記)上有:
- Viterbi Algorithm(維特比算法)
使用什么算法取決於你的task,如果你有不同的task,就要想不同的算法。甚至同一個task,特征\(\phi(x,y)\)定義不同,也需要不同的算法。
你可以想象這個統一框架是有用的,雖然沒有教你問題具體怎么解決,給你一個結構化學習的問題,如果你不知道這個統一框架,那你就不知道從何解起,而統一框架給了你一個思路。
如果你不知道Q2怎么解,可以使用經典算法,可以解決很多的問題,不過有時候找到的不一定是准確的結果。
開放問題:如果我們沒有辦法找到一個准確的結果,也就是\(arg max\)只能有一個近似的結果,那么這對我們的結果影響有多大?
在以下課程里,我們都假設Q2已經解決了。
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\) 。
可分離情形
假設現在有兩筆數據,紅色代表是正確的,藍色代表錯誤的。所謂可分離的意思是,我們找得到一個權值向量\(\hat w\),把所有點的\(\phi()\)都和\(\hat w\)做內積,可以讓紅色點的值比所有藍色點的值都大一個\(\delta\),同理可以讓紅色星星的值比所有藍色星星的值都大一個\(\delta\) ,寫成數學式就如上圖左邊所示。
如果我們能夠找一個上述說的特征函數\(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\)就是我們要的。
這個算法很簡單,問題就是我們不知道到底要花多久才會收斂。
在\(arg max\)中的\(y\)非常多,真的能很輕易的找到紅點,跟藍色點分開嗎?
結論是可以的,在可分情形下,最多只需要更新\((R/\delta)^2\)次,就可以找到我們要的\(w\)
- \(\delta\)是間隔(我們之前講過正確的答案至少比錯誤的答案大一個\(\delta\))
- \(R\)是不同特征向量(不同\(y\)有不同\(\phi(x,y)\))距離的最大值
所以算法需要的信息,跟\(y\)的空間大小是無關的。不管藍色的點有多少個,都不會影響我們需要更新的次數。
證明只需要更新\((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,還是一樣可以讓數據可分離。
正式開始證明:
首先看一件事情,看\(\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\)(這個是我們的定義,讓數據可分離)
- 一開始\(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\)越來越長。
應該要再算下\(\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\)
現在得到兩個結論:
-
\(\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\)次。
從\(\large k\leq (\frac{R}{\delta})^2\)我們發現,如果\(\delta\)越大,那么更新次數越少,你可能為了讓訓練快一點,會想個方法讓\(\delta\)增加。你會想說找一組好的特征,可以讓紅色的圈圈跟藍色的圈圈分得比較開,你讓所有的特征*2,相當於上圖最下方的圖放大2倍,這樣\(\delta\)就直接增加了2倍。但是這樣並不會讓學習變快,因為\(R\)同時也增加了2倍。所以單純放大是沒用的,要真的去挪動點的位置。
不可分情形
不可分情形要考慮的是,雖然沒有任何一個向量可以讓正確答案和錯誤答案被正確分開,但是在這些向量里面,我們還是可以區分出好壞,鑒別出高下。
比如有一個\(w'\),可以把正確答案排在第二名,有另外一個\(w''\),把正確答案排在最后一名。雖然\(w',w''\)都沒有辦法讓正確答案高過所有其他答案,但是\(w'\)明顯更好。所以在不可分情形下, 還是可以定義一些評估方法來看\(w\)是好是壞。
定義成本函數
定義一個 損失函數\(C\),尋找\(w\)去最小化\(C\),雖然\(w\)不能讓數據可分離,但是是我們手上最好的。
怎么定義成本函數?
可以有自己定義的方式,這里提供一個方式:
第\(n\)筆數據的損失寫成\(C^n\),是全部\(y\)里面最大的內積值-正確的內積值,如上圖綠色線(第一名內積值-正確的內積值),這件事情是很直觀的。對每一筆數據都有\(C^n\),最后summarization就是所有的損失。
\(C^n\)的最小值應該是多少?
\(C^n\)的值不可能是負的,如果第一名就是正確的,相減最小為0。
隨機梯度下降
怎么找\(w\)?
用梯度下降就可以解決,但是你可能會想,\(C\)有辦法做梯度下降嗎,可以找到一個\(w\)去最小化\(C\)嗎?\(C^n\)里面可是有max的,那要怎么做梯度下降呢?
雖然\(C^n\)有max,還是可以算對\(w\)的微分。
如上圖最上方藍色線標出的公式,你為什么覺得難算是因為有一個max,因為\(w\)不同時,max的\(y\)是不同的。
想象上圖最下方是\(w\)形成的空間,被max切割成好幾塊。這里是二維平面,那么\(w\)就是二維的向量。當\(w\)落在不同的范圍里時,max出來的\(y\)分別為\(y',y'',y'''\)。在每一個區域里面,損失函數是可以很容易算出來的,因為如果你知道在這個區域里面max的結果是\(y'\)的話,那\(C^n\)就是內積相減(如上圖左下方灰色框框所示),或者\(y''\)部分(上圖中間灰色框框所示),\(y'''\)部分(上圖右下方灰色框框所示)。在邊界的地方是沒辦法微分的,但是避開邊界的地方,在每個區域里面,都只是一個很簡單的函數,都是可以微分的。
隨機梯度下降
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,就是結構化感知機
考慮誤差
定義誤差函數
要修改下我們的誤差函數,在之前的誤差函數里,對我們來說所有錯誤都是一視同仁的,事實上錯誤並不是同等地位的。在結構化學習的例子里面,output有很多的可能,有一些output跟正確的很接近。比如上圖右邊,正確的是紅色框框,如果output是第二個框框(也是框在涼宮春日臉上),你對這個結果也是可以接受的,但是框在下面兩個框框上你就不能接受了。所以不同的錯誤之間還是有差別的(錯誤有不同的等級),我們應該把這件事考慮進去。比如框在櫻花樹上,那結果是非常差的,我會希望它的分數特別低,而框在涼宮春日臉上(有些地方沒框好),其實結果也是可以接受的,希望跟正確的分數比較接近。如果有另外一個\(w\),不僅能把正確的放在第一位,還可以讓那些可以接受的結果分數比較高,錯的很離譜的結果分數很低,那顯然這個\(w\)更好。這樣的\(w\)還有一個好處,得到的結果是比較安全的,假如testing跟trainging數據是有一些差距的,就算第一名不是正確的,也可以保證和正確的不會有太大偏差。
怎么把不同誤差不同等級考慮到誤差函數里呢?
一個可能的想法說,如上圖紅色框框是正確的,兩個黃色框框是錯誤的,但是第二個錯誤的框框和正確的很像,會希望分數差距比較小。反之有個框框(上圖第三個)錯得很離譜,會希望分數和正確的分數差距比較大。
怎么評估框框是好的還是不好的?
這件事情其實也是取決task的,不同task你要想辦法自己定義。
我們的定義\(\Delta(\hat y,y)\)為誤差的函數,至於到底什么樣子要自己定義。以下討論我們假設\(\Delta\)是一個正值,如果是自己對自己,那么\(\Delta\)就是0,常見的做法把\(\Delta\)定義成上圖右下方所示。
\(A(y)\)代表\(y\)框框的面積,如果兩個框框的面積交集很小,那么\(\Delta\)就接近1,交集很大,\(\Delta\)接近0。
其他成本函數
有了\(\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變得很難解。
梯度下降
本來是找\(y\)讓內積值最大,現在變為內積+\(\Delta\)最大,兩個式子找出的\(y\)不一定會是同一個。
其他的觀點
之前的成本函數有另外一個觀點用來解釋。之前的成本函數\(C^n\)是你在訓練數據上的誤差的上界,當你去最小化有間隔的成本函數時,你是在最小化訓練數據的誤差上界,雖然最小化訓練誤差上界不代表誤差一定會減小,但是也是有可能會跟着變小的。
假設不正確的函數如上圖右上方所示,拿\(\widetilde{y}\)當做output,希望最小化的成本函數是\(C'\)(\(\hat y ,\widetilde y\)差距之和),那我們希望找到一個\(w\),讓\(C'\)越小越好。但是最小化\(C'\)並沒有那么容易,因為\(\Delta\)可以是任何函數,想想看就算一個函數在某些地方不可微,總體上也還是可以使用梯度下降的,但是如果\(\Delta\)比那些某些地方不可微的函數還要復雜,比如階梯狀函數,那么梯度下降就完全沒用了。
這樣\(C^n\)就派上用場了,\(C^n\)是\(C'\)的上界,那么就找\(w\)來最小化\(C^n\),進而間接去最小化\(C'\)。
證明:\(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。
可以有別的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,這樣其中某一項就沒用了。所以說不用加的,用乘的,可能結果好一點。
正則化
訓練數據和測試數據可能有不同的分布。如果\(w\)接近於0,就可以最小化mismatch造成的影響。我們把\(w\)接近於0這件事加到成本函數里。也就是說在原來的成本函數里加上\(w\)的L2正則。
這個怎么做梯度下降呢?
跟之前一樣,沒有什么不同。
- 在每個迭代中找一個數據\(\{x^n,\hat y^n\}\)
- 找到一個\(\bar y^n\)
- 計算梯度(還要加上正則化項)
- 更新\(w\)
結構化支持向量機
最后使用的成本函數\(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\)更小)。
綠色框框內要最小化\(C\)等價於黃色框框內的敘述,最小化的對象是一樣。本來\(C^n\)等於max-內積,變成\(C^n\)滿足黃色框最下方的不等式。\(w\)跟\(C^n\)在最小化\(C\)的前提下,同時滿足最下方的不等式。
習慣上不會寫為\(C^n\),會寫成\(\large \epsilon^n\)(松弛變量)。
本來我們說,是找一個\(w\),去最小化\(C\),因為我們只要定好\(w\)后\(C^n\)就直接決定了,但是在黃色框最下方的不等式里,定好\(w\)后,\(\large \epsilon ^n\)的值並沒有直接決定。所以我們說,找\(w\)和\(\large \epsilon ^1...\epsilon ^n\)去最小化黃色框里的\(C\),並滿足黃色框里的不等式約束。
對黃色框里的不等式做一下改變,因為\(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\)。
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\)都會有一個不等式。
這邊會有一個問題
你可能找不到\(w\) 讓所有的不等式都滿足。所以我們不要用\(\Delta\)當做margin,把margin改得小一點(都減去一個\(\large \epsilon\)),要讓margin變小,\(\epsilon\)要大於0,這樣\(w\)的限制就被放寬了。因為\(\epsilon\)的作用是放寬限制,所以我們叫它松弛變量。當然我們希望限制不能太寬,如何太寬了,就失去了margin的意義,如果\(\large \epsilon\)無窮大,那所有的margin都變成負值,這樣隨便一個\(w\)都會讓不等式滿足,那么這就不是我們要的東西了。所以我們希望放寬結果,但是幅度必須是最小的,即我們希望\(\large \epsilon\)的值越小越好。
假設有兩筆訓練數據,對\(x^1\)來說,我們希望(正確的-錯誤的)要大於(\(\Delta\)-\(\large \epsilon^1\)),對所有可能的\(y\)都要有這個式子。因為是為了放寬限制,所以\(\epsilon^1 \geq 0\)。
對\(x^2\)來說也是一樣的。
在滿足這些不等式下,我希望\(\large \epsilon^n\)之和加上正則化是最小的。
那么最后的式子和之前的是一樣的。
現在要做的事情是找一個\(w\)和\(\large \epsilon^n\),去最小化\(C\),同時要滿足上圖的不等式。
這個跟SVM有什么關系呢?
跟SVM的式子是大同小異的。現在唯一的問題是,約束太多,\(y\)可能有上萬個(每個\(y\)一個約束)。
切割平面算法
我們先無視約束很多這件事,來看一下解的是什么樣的問題。
我們只看要最小化的部分,有\(w\)和\(\large \epsilon\) ,現在假設\(w\)只有一維,訓練數據只有一筆。在沒有約束條件下,最小化就很容易,看起來就像上圖右下方圖示。
問題是這里有些約束,這些約束是做什么事情?
這里的每個約束都是在\(w,\large \epsilon\)平面上畫一條直線,然后告訴你只有某一邊方向是可以的,約束合起來告訴你只有橙色區域是可以選擇的。這邊困難的事情就是線條很多,很難找出它們的交集。
我們有個算法叫做切割平面算法,可以幫助我們找出可選擇的區域。
現在問題是,有一個參數空間(\(w,\epsilon^1,...,\epsilon^N\),本來是高維的,這邊用二維代表),參數空間上的顏色代表\(C\)的數值大小,在沒有約束下,青色點是\(C\)的最小值。不幸的是我們有一大堆的約束,然后只有上圖陰影部分的區域是符合這些約束的。在陰影部分找最小值,得到的結果就是藍色線那一點。現在的問題就是怎么找出陰影部分。
大部分的約束都是冗余的,對我們找陰影部分是沒有影響的。比如上圖兩條紅色的約束,只要有這兩條紅線,就可以決定我們的參數(青色點,兩條紅線交點),所以綠色這種線就是冗余的。
本來要窮舉所有\(y\)(\(y \neq \hat y)\),每個\(y\)都有一個約束,現在要移除一些不起作用的線條,保留有影響的線條,這個有影響的線條集稱為Working Set,用\(A^n\)表示。
怎么找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\)......不斷循環下去。
用圖的方式來解釋一下怎么運作。
首先假設\(x^n\)的Working set \(A^n\)在初始的時候是空集合(沒有任何約束),在沒有約束的情況下,得到的\(w\)結果就是藍色這個點。
找出藍色這個點之后,看看那些約束是沒有被滿足的,比如紅色線的都沒有滿足,這樣沒有滿足的約束有很多,但是我們只挑沒有滿足的最嚴重的。
假如最嚴重的的如上圖所示的紅線(離藍色的點是最遠的),那就把紅色這條線加到Working set 里。
得到的新的參數在上圖藍色點位置,然后再看有哪些約束沒有被滿足。
比如上圖另一根紅線沒有被滿足,余數告訴我們說,可以接受的范圍在右上角,而藍色點在左下角。這個約束沒有被滿足,再加到Working set里。
又得到一個新的參數值,最小值是藍色點處。
繼續檢查哪些余數沒有被滿足,再加到Working set里,現在Working set里就有三條線了。
最后根據Working set,找到我們要的解。
怎么找到最嚴重的約束?
看約束,內積$\geq \(等於\)\Delta - \epsilon\(。當一個約束被不滿足時,說明內積<\)\Delta-\epsilon\(,被不滿足的約束可能有很多個。定義一個violation的程度,右邊這一項\)-\(左邊這一項的程度。但是這個定義,你會發現,對所有的\)y\(來說,\)\epsilon ’\(跟\)y\(沒有關系(是一個固定的值),\)\phi(x,\hat y )\(也是一個固定值,那就可以拿掉,最后變成\)\large \Delta(\hat y,y)+w'\cdot \phi(x,y)$來計算violation的程度。
整個算法就是:
有一堆數據\(\{(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\)
用目標檢測舉個例子。假設有兩個訓練數據,
一開始的Working set是\(A^1=\{\},A^2=\{\}\)
一開始沒有約束條件下去找\(w,\epsilon^1,\epsilon^2\)(\(\epsilon^1 > 0,\epsilon^2 > 0\))
解出來\(w=0\)
在\(w=0\)時去解violated約束,去計算每個可能的框框的(\(\Delta+0\cdot \phi()\))。
結果如上圖下方所示,因為\(w=0\),所以只考慮\(\Delta\),右邊都等於1,那么就隨機選擇一個。把violated約束加到Working set里面。
\(A^1,A^2\)都各有一個成員了。
\(A^1\)里有個左下角的框框,我們希望
(正確框框的值\(-\)左下角框框的值)\(\geq\)(\(\Delta(左下角框框,正確框框)-\epsilon^1\))
同理\(A^2\)有個成員,也有一個約束,如上圖最下方所示。
最后得到\(w^1\)
用\(w^1\)再計算會算出一個不一樣的值。把最violated約束加入Working set。
解最violated約束和\(w\)不斷迭代。
多類別與二元支持向量機
用結構化學習的思想做多分類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)\)。
Q2:推理
窮舉所有可能的\(y\),看誰的\(F(x,y)\)最大。這邊窮舉很容易,因為\(K\)沒幾個。
Q3:訓練
這里約束是很有限的,假設有N筆訓練數據,那約束的數量就是N(K-1)個。
多分裂SVM的K=2時的情況。
超越結構化svm
結構化SVM有個很大的問題是線性的,線性的就做不出什么厲害的東西。要讓結構化SVM有效,那特征就要定的很好,那定義特征讓DNN來。
本來是先訓練好一個DNN,再接一個結構化SVM。但是可以把DNN和結構化SVM一起學習。