尋找邊界

開學不久老師給看了arxiv上的一篇文章,Adversarial Active Learning for Deep Networks: a Margin Based Approach,看了一下思路和以前想的一個想法類似。這篇論文里先考慮了網路攻擊中的樣本生成方法,選了一種比較合適的DeepFool,然後從數據集中隨機選取一部分點生成標記變化且距離最短的樣本,從這些生成的樣本(距離升序後)選擇一部分查詢。文章沒有公式,思路也比較直接。還有一篇IJCAI17,這個方法也類似,不過目標公式比較直接,優化方法也是作者在AAAI_2016里提出的優化方法。這裡記一下去年做的一些相似的小事情。

Active Learning(AL)查詢對當前模型改進最有作用的數據點(對當前模型信息量最大),顯然當前模型的分類界面附近的點對於改善模型最有利。結合GAN的思想,可以建立一個生成模

圖1:獲得距離邊界最近的數據點

型使得生成的數據點能比較好的分布在當前模型的分類界面。

圖2:GAN里的圖

類似GAN里造假幣和警察的比喻,這裡可以用老師和學生比喻。老師即生成模型(此處也是用神經網路),判別模型是學生,老師針對學生的知識盲區(知識薄弱的地方)出考試題目訓練學生(生成模型生成位於當前模型分類邊界上的數據點),學生補習這一區域的知識變得更強(查詢這一區域的真實標記重新訓練模型)。

在分類邊界上的數據點有什麼特點:根據AL中uncertainty選擇標準有:

  • x_{LC}^{*}=	ext{argmax}_x	ext{ }1-P_{	heta}(hat y|x) :二分類時也就是: p_1=p_2=0.5 ,生成模型的目標函數可以是 (1-p_1)^2
  • x_H^*=	ext{argmax}_x-sum_iP_{	heta}(y_i|x)	ext{log}P_{	heta}(y_i|x) :這裡可以取其相反數來作為目標函數,取相反數是應為要梯度下降。
  • x_M^*=	ext{argmin}_xP_{	heta}(hat y_1|x)-P_{	heta}(hat y_2|x) 這個就不行了,函數不可導

下面可以看一個例子,這裡生成模型簡單結構如下,採用生成two_moon數據,

圖3

這是一個二分類問題,

不知怎麼這個插圖調不小。。。圖4

這裡 P_1=frac{	ext{exp}(wx)}{1+	ext{exp}(wx)},P_2=frac{1}{1+	ext{exp}(wx)},wx=w_1x_1+w_2x_2 ,即logistics回歸。我們選取不確定度的第二種方式,畫出loss(即)的散點圖如下,如果可以的話,生成模型產

圖5:下面的山谷即圖1模型的分界線

生的數據點會落在「山谷」中。下圖為實驗結果。

圖6

一開始隨機初始化網路權值,可以看到很快生成模型的數據點收斂到模型邊界那裡。選取不確

圖7

定度的第一種方式結果如圖5所示,也達到預期。但也存在一些問題,比如生成的數據點不能比較均勻分布在邊界上,如何界定數據點在邊界上的範圍,如果用大權值來初始化網路,那麼生成的點分布較廣,收斂後分布範圍也很大,因為從loss的三維結構來看山谷無限長。


這裡我們試試MMD的作用。

如圖6所示,這裡我們構造三個二維高斯分布數據,如前面所說:當網路初始權值較小時初始

圖8

數據分布比較密集,初始權值大的時候分布分散,收斂範圍也更廣。其實裡面有些點幾乎重合了,因為設置生成了300個點,但看收斂後顯然沒有那麼多。

也想了一些辦法,後來想試一下MMD能否可行,這裡我們使用MMD平方的無偏估計(有偏無偏差別不大當數據點多時): 	ext{MMD}_u^2[mathcal F,X,Y]=frac{1}{m(m-1)}sum_{i=1}^{m}sum_{j
eq i}^{m}k(x_i,x_j)+frac{1}{n(n-1)}sum_{i=1}^{n}sum_{j
eq i}^{n}k(y_i,y_j)-frac{2}{mn}sum_{i=1}^msum_{j=1}^nk(x_i,y_j)

於是總的損失函數變成了 	ext{loss} =Uncertainty+lambda MMD ,我們希望數據點在收斂到邊界的同時能改善分布情況,實驗結果如下圖,

圖9

可以看到數據點完全沒有收斂到邊界上,至於收斂到原有數據集上好像有一丟丟效果幾乎沒有,我以為是程序寫錯了,就單獨測試MMD部分程序的效果如何,構建一個二維高斯分布數據,最小化生成模型生成的數據和高斯分布數據之間的MMD,結果如圖10所示:說明MMD

圖10:單獨MMD的效果

圖11:MMD變化曲線,有兩個快速下降階段

單獨作用時的效果還可以,可以看到最終兩個分布完全融為一體,程序沒有錯。從MMD變化曲線可以看出一開始生成分布綠色數據點急劇擴散降低了MMD,但在和目標分布解出之前MMD變化緩慢,曲線的第二次急劇下降對應兩分布開始接觸時的情況。圖9失敗的情況到底是什麼原因呢?圖9中有三個分布,接下來做了用一個生成模型生成的數據去近似兩個二維分布的情況如下圖所示,

圖12

可以看到也有效果,但不論怎樣兩分布中間總會散布一些數據點。後來想到原因可能是網路初始權值太大的原因,於是重新做了圖9的試驗,分別調整了 lambda 的大小, lambda=0.1 的情況如下圖:

圖13

可以看到同樣300個點稍微散開了分布也均勻一些。再看一下 lambda=1 的情況:

圖14

從左到右從上到下為代數一次增加,可以看到隨著 lambda 增加分不在邊界上的數據點變得更加離散了,且隨著代數的增加沿著邊界向兩端擴張。再看一下 lambda=10 的情況:

圖15

可一看到,更加寬了,且一部分數據點和現有數據集接觸被「吸引」過去一部分。


問題是生成的點不是真實的數據點,這裡想試一下ANN(近似最近鄰)的辦法,尋找這些偽數據點的鄰居來查詢。一開始想到的是LSH(局部敏感哈希)的方法,因為在大規模主動學習上有一篇文章PAMI_2014,最初投在了NIPS2010上,後來改寫為期刊,有人用來檢索圖像投了一篇CVPR_2011。這裡不在作詳細介紹。我們採用的是基於p穩定分布的位置敏感哈希,如圖16所示

圖16:p穩定分布的局部敏感哈希

相關程序在這裡。

簡要說明一下:主要是利用p穩定分布的性質: n 個獨立同分布的變數 X_1,X_2,...,X_n 和任意 n 個實數 v_1,v_2,...,v_n ,隨機變數 sum_iv_iX_i(sum_i|v_i|^p)^{1/p}X 具有相同的分布。p=1時為柯西分布,p=2時為高斯分布。

隨機生成一個d維隨機向量 old a ,向量里的每一項都是獨立來自於一個p穩定分布。給定一個d維向量 old v ,點積 old{a}cdotold v 是一個隨機變數,服從分布為 (sum_i|v_i|^p)^{1/p}X (也是: ||old v||_pX ),X也是服從p穩定分布的一個隨機變數。不是用點積 old{a}cdotold v 估計 l_p 範數,而是給每個向量 v 分配一個哈希值。直觀上,哈希函數族應該有局部敏感性,也就是兩個向量 (old v_1,old v_2) 很近 (||old v_1-old v_2||_p) 很小那麼它們應該有較高的概率碰撞(哈希到相同的值上)。點積 old acdot old v 相當於把每個向量映射到一個實數軸上;根據p穩定分布的性質對於兩向量 (old v_1,old v_2) ,它們映射後的距離 (old{acdot v_1-acdot v_2}) 的分布為 ||old{v_1-v_2}||_pX 。如果我們把這個實軸分割為等長度的若干段,每段長度為 r ,根據向量映射後的值落到那一段賦予哈希值。

我們設每個哈希函數為 h_{old a,b}(old v):mathcal R^d
ightarrow mathcal N 將一個d維向量 old v 映射到整數集合(哈希值集合)上。 h_{old a,b}(old v)=llcornerfrac{old{acdot v}+b}{r}lrcorner ,其中 b 服從 [0,r] 上均勻分布。

但查找最近鄰的效果好像並不是太好還要調參。如圖17所示

圖17

藍色為數據集的點,從藍色點中查詢綠色點的最近鄰,結果為紅色,可以看到雖然也查到了很近的點但也有一些候選點距離綠色點很遠。接下來我們考慮了BallTree,結果如圖18所示

圖18

當查詢的綠色點不在數據集中時,BallTree(圖18右側)仍然可以選擇比較接近的,但LSH就不行了。因此採用BallTree和MMD之後的結果如圖19所示

圖19

綠色點為生成模型生成的數據點,黃色為查詢到的真實數據,效果上看還可以。


前面是基於邏輯斯蒂回歸和生成的幾個高斯分布,這裡我們把分類模型更換為MLP和SVM,用circle作為數據。先看一下分類模型為SVM時只用uncertainty作為loss不採用MMD,我們可以畫出三維結構如圖20所示

圖20:loss

由圖20可以看出生成模型收斂後生成的數據點應該落在環形「山谷」中,也可以看出生成模型的初始權值應該小一些,不然會落在外面梯度不大的地方。實驗結果如圖21

圖21

可以看到生成的數據很快收斂到了「環形谷」中,但分布不能覆蓋整個「山谷」,所以施加MMD後可以看到生成數據點的分布變化如圖22,

圖22

變化也比較有意思,先是收斂到「山谷」中然後伸長然後被「掰彎」符合環形分布。感覺MMD確實有些作用。接下來看一下分類模型為SVM時的情形,這時loss只為uncertainty的三維結構如圖23所示

圖23

從左到右是一次擴大繪製範圍的loss圖,可以看到雖然最低的地方也是環形谷,但跳出來之後經過下降一段外面全是低一截的平面。當網路權值很大時生成的數據點在平面上就不能通過梯度下降進入「山谷」了。數據收斂圖如圖24所示,和圖22所示過程類似。

圖23


AL里選擇模型不能確定的點,用SVM的時候一般採用概率輸出,二分類時選擇預測最接近0.5的數據點查詢,但這裡對比一下到超平面的距離最小的(利用sklearn里輸出的係數來實現)。SVM中 y = 	ext{sign}(sum_{i=1}^ny_ialpha_iK(x_i,x)+
ho) ,選擇 	ext{argmin}_xsum_{i=1}^ny_ialpha_iK(x_i,x)+
ho 。對比結果如圖24

圖24

左圖(藍色)為根據間隔距離選擇的應當查詢的點(紅色,被邊界線蓋住了),中圖(綠色)為概率預測(看sklearn有概率預測的說明,好像有些缺點,沒有看原文獻)選擇的應當查詢點,被被蓋住的部分較少說明沒有在邊界下面,不太好。右圖Wie準確率變化,運行了多次發現採用最接近超平面的效果要快一丟丟。

下面試一下two_moon,結果如圖25

圖26

如圖27即使採用MMD生成分布也不理想

圖27

看來前面環形的分布理想是MMD對於環形數據集的特殊情況所致。前面圖23和圖20都是針對用全部數據訓練的模型所繪,當選擇一些點查詢更新模型這樣迭代運行時結果卻不行,如圖28所示

圖28

可以看到當模型不完善時當前的參數不合適當前模型。需要小心調才可以如圖29為針對這個中間某代的模型調好的情況:

圖29

後來嘗試了對每個點構建一個rbf核,其它點距離這個點關於高斯核的值加起來些值融合進損失函數中。實驗結果如圖30:

圖30

上下兩排是兩次的試驗結果,可以看到也有些效果但還是不盡人意。


第一次做的問題是大規模主動學習,因為生成模型生成的數據點到收斂到當前模型的邊界上需要的時間可以認為是固定的,不隨實際數據集規模增加而增加。但在真實數據集上做的試驗效果不行,這裡不在放上。於是無疾而終。 完。

推薦閱讀:

SVM的核函數如何選取?
多標籤(multi-label)數據的學習問題,常用的分類器或者分類策略有哪些?
BAT機器學習面試1000題系列(181-185題)

TAG:機器學習 | SVM | 主動學習 |