半監督深度學習小結

進入機器學習領域已經半年(原來我已如此滄桑),對半監督學習以及深度學習的結合比較感冒,特來做一下總結,不,小結!

啥是半監督學習(Semi-supervised Learning)

目前知道最科學的定義是來自《Introduction to Semi-supervised Learning》,這裡只給出一個自我感覺良好的說法,大概就是,在有標籤數據+無標籤數據混合成的訓練數據中使用的機器學習演算法吧。一般假設,無標籤數據比有標籤數據多,甚至多得多。

雖然訓練數據中含有大量無標籤數據,但其實在很多半監督學習演算法中用的訓練數據還有挺多要求的,一般默認的有:無標籤數據一般是有標籤數據中的某一個類別的(不要不屬於的,也不要屬於多個類別的);有標籤數據的標籤應該都是對的;無標籤數據一般是類別平衡的(即每一類的樣本數差不多);無標籤數據的分布應該和有標籤的相同或類似 等等。

事實上,某些要求在實際應用中挺強人所難的,所以明明感覺半監督好像很厲害,但應用就是不多啊。但在學術上,這些要求還是可以有滴。

一般,半監督學習演算法可分為:self-training(自訓練演算法)、Graph-based Semi-supervised Learning(基於圖的半監督演算法)、Semi-supervised supported vector machine(半監督支持向量機,S3VM)。簡單介紹如下:

1.簡單自訓練(simple self-training):用有標籤數據訓練一個分類器,然後用這個分類器對無標籤數據進行分類,這樣就會產生偽標籤(pseudo label)或軟標籤(soft label),挑選你認為分類正確的無標籤樣本(此處應該有一個挑選準則),把選出來的無標籤樣本用來訓練分類器。

2.協同訓練(co-training):其實也是 self-training 的一種,但其思想是好的。假設每個數據可以從不同的角度(view)進行分類,不同角度可以訓練出不同的分類器,然後用這些從不同角度訓練出來的分類器對無標籤樣本進行分類,再選出認為可信的無標籤樣本加入訓練集中。由於這些分類器從不同角度訓練出來的,可以形成一種互補,而提高分類精度;就如同從不同角度可以更好地理解事物一樣。

3.半監督字典學習:其實也是 self-training 的一種,先是用有標籤數據作為字典,對無標籤數據進行分類,挑選出你認為分類正確的無標籤樣本,加入字典中(此時的字典就變成了半監督字典了)

4.標籤傳播演算法(Label Propagation Algorithm):是一種基於圖的半監督演算法,通過構造圖結構(數據點為頂點,點之間的相似性為邊)來尋找訓練數據中有標籤數據和無標籤數據的關係。是的,只是訓練數據中,這是一種直推式的半監督演算法,即只對訓練集中的無標籤數據進行分類,這其實感覺很像一個有監督分類演算法...,但其實並不是,因為其標籤傳播的過程,會流經無標籤數據,即有些無標籤數據的標籤的信息,是從另一些無標籤數據中流過來的,這就用到了無標籤數據之間的聯繫

5.半監督支持向量機:監督支持向量機是利用了結構風險最小化來分類的,半監督支持向量機還用上了無標籤數據的空間分布信息,即決策超平面應該與無標籤數據的分布一致(應該經過無標籤數據密度低的地方)(這其實是一種假設,不滿足的話這種無標籤數據的空間分布信息會誤導決策超平面,導致性能比只用有標籤數據時還差)

其實,半監督學習的方法大都建立在對數據的某種假設上,只有滿足這些假設,半監督演算法才能有性能的保證,這也是限制了半監督學習應用的一大障礙。

半監督深度學習

終於來到正題——半監督深度學習,深度學習需要用到大量有標籤數據,即使在大數據時代,乾淨能用的有標籤數據也是不多的,由此引發深度學習與半監督學習的結合。

如果要給半監督深度學習下個定義,大概就是,在有標籤數據+無標籤數據混合成的訓練數據中使用的深度學習演算法吧...orz.

半監督深度學習演算法個人總結為三類:無標籤數據預訓練網路後有標籤數據微調(fine-tune);有標籤數據訓練網路,利用從網路中得到的深度特徵來做半監督演算法;讓網路 work in semi-supervised fashion。

1.無標籤數據預訓練,有標籤數據微調

對於神經網路來說,一個好的初始化可以使得結果更穩定,迭代次數更少。因此如何利用無標籤數據讓網路有一個好的初始化就成為一個研究點了。

目前我見過的初始化方式有兩種:無監督預訓練,和偽有監督預訓練

無監督預訓練:一是用所有數據逐層重構預訓練,對網路的每一層,都做重構自編碼,得到參數後用有標籤數據微調;二是用所有數據訓練重構自編碼網路,然後把自編碼網路的參數,作為初始參數,用有標籤數據微調。

偽有監督預訓練:通過某種方式/演算法(如半監督演算法,聚類演算法等),給無標籤數據附上偽標籤信息,先用這些偽標籤信息來預訓練網路,然後在用有標籤數據來微調。

2.利用從網路得到的深度特徵來做半監督演算法

神經網路不是需要有標籤數據嗎?我給你造一些有標籤數據出來!這就是第二類的思想了,相當於一種間接的 self-training 吧。一般流程是:

先用有標籤數據訓練網路(此時網路一般過擬合...),從該網路中提取所有數據的特徵,以這些特徵來用某種分類演算法對無標籤數據進行分類,挑選你認為分類正確的無標籤數據加入到訓練集,再訓練網路;如此循環。

由於網路得到新的數據(挑選出來分類後的無標籤數據)會更新提升,使得後續提出來的特徵更好,後面對無標籤數據分類就更精確,挑選後加入到訓練集中又繼續提升網路,感覺想法很好,但總有哪裡不對...orz

個人猜測這個想法不能很好地 work 的原因可能是雜訊,你挑選加入到訓練無標籤數據一般都帶有標籤雜訊(就是某些無標籤數據被分類錯誤),這種雜訊會誤導網路且被網路學習記憶。

3.讓網路 work in semi-supervised fashion

前面的1.和2.雖然是都用了有標籤數據和無標籤數據,但就神經網路本身而言,其實還是運行在一種有監督的方式上。

哪能不能讓深度學習真正地成為一種半監督演算法呢,當然是可以啊。譬如下面這些方法:

Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks

這是一篇發表在 ICML 2013 的文章,是一個相當簡單的讓網路 work in semi-supervised fashion 的方法。就是把網路對無標籤數據的預測,作為無標籤數據的標籤(即 Pseudo label),用來對網路進行訓練,其思想就是一種簡單自訓練。但方法雖然簡單,但是效果很好,比單純用有標籤數據有不少的提升,我做了一個實現code@github

網路使用的代價函數如下:

L = sum_{m=1}^n sum_{i=1}^C L(y_i^m, f_i^m) + alpha(t) sum_{m=1}^{n} sum_{i=1}^C L({y}_i^m, {f}_i^m)

代價函數的前面是有標籤數據的代價,後面的無標籤數據的代價,在無標籤數據的代價中, y 無標籤數據的 pseudo label,是直接取網路對無標籤數據的預測的最大值為標籤。

雖然思想簡單,但是還是有些東西需要注意的,就是這個 alpha(t),其決定著無標籤數據的代價在網路更新的作用,選擇合適的 alpha(t) 很重要,太大性能退化,太小提升有限。在網路初始時,網路的預測時不太準確的,因此生成的 pseudo label 的準確性也不高。在初始訓練時, alpha(t) 要設為 0,然後再慢慢增加,論文中給出其增長函數。在後面的介紹中,有兩篇論文都使用了一種高斯型的爬升函數。

感覺這種無標籤數據代價達到一種正則化的效果,其減少了網路在有限有標籤數據下的過擬合,使得網路泛化地更好。

PS:安利一下我的github代碼 code@github

Semi-Supervised Learning with Ladder Networks

2015年誕生半監督 ladderNet,ladderNet是其他文章中先提出來的想法,但這篇文章使它 work in semi-supervised fashion,而且效果非常好,達到了當時的 state-of-the-art 性能。

ladderNet 是有監督演算法和無監督演算法的有機結合。前面提到,很多半監督深度學習演算法是用無監督預訓練這種方式對無標籤數據進行利用的,但事實上,這種把無監督學習強加在有監督學習上的方式有缺點:兩種學習的目的不一致,其實並不能很好兼容。

無監督預訓練一般是用重構樣本進行訓練,其編碼(學習特徵)的目的是儘可能地保留樣本的信息;而有監督學習是用於分類,希望只保留其本質特徵,去除不必要的特徵。

ladderNet 通過 skip connection 解決這個問題,通過在每層的編碼器和解碼器之間添加跳躍連接(skip connection),減輕模型較高層表示細節的壓力,使得無監督學習和有監督學習能結合在一起,並在最高層添加分類器,ladderNet 就變身成一個半監督模型。

ladderNet 有機地結合了無監督學習和有監督學習,解決兼容性問題,發展出一個端對端的半監督深度模型。

PS:論文有給出代碼

Temporal Ensembling for Semi-supervised Learning

Temporal ensembling 是 Pseudo label 的發展,目的是構造更好的 pseudo label(文中稱為 target,我認為是一致的)。

多個獨立訓練的網路的集成可取得更好的預測,論文擴展了這個觀點,提出自集成(self-ensembling),通過同一個模型在不同的迭代期,不同的數據增強和正則化的條件下進行集成,來構造更好的 target。

論文提出了兩種不同的實現: Pi model 和 temporal ensembling

兩個模型的代價函數都是一樣的,與 Pseudo Label 的代價函數類似,一個有監督 loss,一個無監督 loss,中間有個權係數函數,與 Pseudo Label 的區別在於,Pseudo Label 的第二項是無標籤 loss,是只針對無標籤數據的(如果我沒理解錯..orz),而 Temporal ensembling 的第二項是 無監督 loss,是面向全部數據的。

Pi model 的無監督代價是對同一個輸入在不同的正則和數據增強條件下的一致性。即要求在不同的條件下,模型的估計要一致,以鼓勵網路學習數據內在的不變性。

缺點也是相當明顯,每個迭代期要對同一個輸入在不同的正則和數據增強的條件下預測兩次,相對耗時。還好不同的正則可以使用 dropout 來實現,不然也很麻煩。

temporal ensembling 模型是對每一次迭代期的預測進行移動平均來構造更好的 target,然後用這個 target 來計算無監督 loss,繼而更新網路。

缺點也有,記錄移動平均的 target 需要較多空間。但 temporal ensembling 的潛力也更大,可以收集更多的信息,如二階原始矩,可基於這些信息對不同的預測加權等。

Temporal ensembling 還對標籤雜訊具有魯棒性,即使有標籤數據的標籤有誤的話,無監督 loss 可以平滑這種錯誤標籤的影響。

PS:好消息,github上也有這篇文章的代碼哦

Mean teachers are better role models: Weight-averaged consistency targets improve semi-supervised deep learning results

Mean Teacher 這篇文章一上來就說「模型成功的關鍵在於 target 的質量」,一語道破天機啊。而提高 target 的質量的方法目前有兩:1.精心選擇樣本雜訊;2. 找到一個更好的 Teacher model。而論文採用了第二種方法。

Mean teacher 也是堅信「平均得就是最好的」(不知道是不是平均可以去噪的原因...orz),但是時序上的平均已經被 temporal ensembling 做了,因此 Mean teacher 提出了一個大膽的想法,我們對模型的參數進行移動平均(weight-averaged),使用這個移動平均模型參數的就是 teacher model 了,然後用 teacher model 來構造高質量 target。

一思索就覺得這想法好,對模型的參數進行平均,每次更新的網路的時候就能更新 teacher model,就能得到 target,不用像 temporal ensembling 那樣等一個迭代期這麼久,這對 online model 是致命的。

然後一做實現,效果特別好,一篇 state-of-the-art paper 就出來了。

PS:我找的文章都有代碼

小結就告一段落了,感覺都好厲害啊...orz


推薦閱讀:

TAG:深度學習DeepLearning | 半監督學習 |