內容來自於台大李宏毅老師的機器學習課程(2016)影片
前言:
由於上一篇文章的結尾提到要看兩篇Semi-supervised的論文,但發現沒點扎實的基礎真的看不懂在寫甚麼鬼😅(我對於Semi-supervised的了解只有最粗淺的「可使用labeled data & unlabeled data訓練模型」🥺),還是乖乖從頭學起吧~
1. Semi-supervised簡介:
- 能使用unlabeled data和labeled data訓練模型
- 通常用在unlabeled data數量 >> labeled data的情況
- Semi-supervised分為2種: Transductive learning & Inductive learning
- Transductive learning: unlabeled data=testing set(用testing set的feature不算作弊~用label才是)
- Inductive learning: unlabeled data=/=testing set
2. Semi-supervised的功用
這裡以二元分類任務為例:
圖一為貓狗二元分類,unlabeled data可能影響最終的decision boundary
但有些unlabeled data可能是狗,只因背景跟labeled data的貓一樣都是綠的
因此若要使用unlabeled data訓練出更精確的decision boundary,則unlabeled data的分布應遵從某些假設。
3. Semi-supervised Learning for Generative Model
3-1. Supervised Learning for Generative Model
對於給予的labeled training set會去估計其:
- Prior probability,表示Ci在所有class中出現的機率: P(Ci)
- Class-conditional density function(影片中稱class-dependent probability),表示Ci出現x的機率: P(x|Ci)
若P(x|Ci)為高斯分布,則可用μ(mean), Σ(covariance matrix)參數化表示(模型也是估測此2個參數) - Posterior probability,表示x是Ci的機率(其實就是分類): P(Ci|x)
詳細理論可以參考以下文章:
貝氏決策法則(Bayesian decision rule): 最大後驗機率法(Maximum a posterior, MAP)
3-2. Semi-supervised Learning for Generative Model
unlabeled data會影響prior, class-dependent probability的估計,並影響posterior。
3-3. 重要理論(與下面實作流程有關)
如上圖所示,若資料只有labeled data,則訓練目標為最大化每個training example的likelihood/log likelihood,非常直觀。
若資料包含labeled data & unlabeled data,前半部維持不變(這裡影片寫錯了),但我們不知道unlabeled data屬於哪個class,要怎麼估計likelihood?
如圖六所示,就當作unlabeled data都有可能屬於每個class:
「unlabeled data對於Ci的class-dependent probability P(x|Ci) 」* 「Ci的prior P(Ci)」的總和
3-4. 實作流程(影片以二元分類為例)
先初始化模型參數θ(e.g. P(C), μ, Σ),可透過random initialize或用labeled data先訓練產生
Step 1. 對每一筆unlabeled data xu計算對於每個類別的後驗機率Pθ(Ci|xu)
Step 2. 更新θ,方法如下(影片只有P(Ci)和μi,但其他參數更新方式也一樣):
先驗機率P(Ci)的計算很直觀,就是:
「所有屬於Ci的labeled data數 + 每個unlabeled data與Ci的後驗機率總和」除以「樣本總數」
Ci的μi的計算也是一樣直觀,就是:
「所有屬於Ci的labeled data平均」 + 「每個unlabeled data與Ci的後驗機率與自己的乘積總和(weighted sum) 除以 每個unlabeled data與Ci的後驗機率總和」
會一直疊代Step1, 2,直到模型收斂
到這邊先消化一下吧,沒想到統計還蠻多的😅,因為之前並沒有熟讀統計,因此這地方花了蠻多時間的,接下來就是半監督式學習的資料分布假設~
4. Low-density Separation
照圖八來看,就是decision boundary會出現在data比較稀疏的地方,其中最代表性的方法就是self-training:
4-1. Self-training
概念很簡單,一開始也會有labeled data & unlabeled data
先用labeled data訓練一個model f*,再把unlabeled data丟給f*預測結果,結果就當作unlabeled data的label(此label稱pseudo-label)。
再從這些pseudo-labeled data挑一些進labeled data set,至於該怎麼加就得自己想辦法了(啟發式方法之類的)。
最後再用混合後的labeled data set回去訓練model f*。
這裡老師問了有趣的問題,這方法能用在迴歸上嗎?
其實不行,因為迴歸的預測資料完全取自迴歸線上,就算加多了這些pseudo-labeled data也不會改變訓練結果。
另一個問題:所以self-training跟Low-Density關聯在哪?
Low-Density的特色就是非黑即白(boundary只在稀疏的地方就是希望把data分的很徹底),也就是只允許資料完全屬於某個class,而不是70%屬於class 1,30%屬於class 2之類的,可參考下面的Hard label vs Soft label概念~
4–2. Hard label vs Soft label
Self-training方法使用的是hard label,因為它會強制將unlabeled data歸類為某個class
但第3節提到的半監督式生成模型屬於Soft label,它同時都屬於各個class(依照其posterioi probability分配)
如果使用的模型是NN,一定要使用hard label,因為soft label結果完全跟一開始參數一樣
4-3. Entropy-based Regularization
在圖十三就可知道為何此方法稱作Regularization,就是在Loss function後加上一個專屬unlabeled data的Entropy,來讓模型避免overfitting。
Entropy-based Regularization為self-training進階版,不像hard label這麼強硬(大概會讓unlabeled data高機率屬於某class,但不會100%屬於),如圖十一所示:
以下為衡量output distribution的方法:
用Entropy表示distribution是集中還是分散,Entropy越小越好表示distribution越集中,如圖十二所示:
所以它必須在labeled data上分類正確,在unlabeled data上Entropy越小越好,重新設計過的loss function如圖十三:
5. Smoothness Assumption
簡單來說就是相似的x,y會相同,但更精確的假設是:
- x的分布是不均勻的(某些地方很集中,某些地方很分散)
- 2資料x¹, x²彼此在input space中的high density區域中很接近
所以x¹, x²兩者的label y¹, y²可能會相同,更直觀可以參考圖十四:
真實例子的smooth assumption中,兩資料中間可能有很多連續變化(過渡型態),e.g.手寫數字2的兩種寫法(圖十五)或眼睛朝左、朝右的人臉(圖十六)
Smoothness assumption應用在文件分類(影片為分類天文和旅遊文章)可能有用,但需要收集到很多unlabeled data,因為word非常多,任意兩文件間重複的word是很少的(圖十七),圖十八為有重複word的文章分類:
5-1. 實踐Smoothness Assumption: Cluster後再label(但cluster要很強,其實不容易,做出來效果不好很正常)
5-2. 實踐Smoothness Assumption: Graph-based Approach
以graph來表示high-density區域的path connection:
也就是把所有x建立成類似演算法中的無向圖(圖二十),只要任意兩點中有path連接,兩點就屬於同個class
5-3. 如何建立graph?
- 先定義2資料點的相似度怎麼算(老師這裡建議可以用Radial Basis Function來定義相似度)
- 加入edge,可以用KNN, e-Neighborhood
- 加入edge weight(就用相似度就可以了)
5-4. labeled data不只影響相連的unlabeled data
labeled data會賦予相連的unlabeled data相同的class,且得到class的unlabeled data還會去影響與它相連的unlabeled data(像傳染病那樣)。但data必須夠多,否則graph會斷掉(圖二十二):
5-5. Label smoothness
主要是衡量graph上的label有多smooth(圖二十三):
「graph上任意兩點的label差方」*「兩點的edge weight」的總和(影片中還要再乘0.5只是方便計算,無特別意義)
公式S可改為更簡潔的表示: yTLy(T是上標,轉置矩陣的意思,但medium的上標好像只能打數字==)
- y:(R+U)維向量,包含所有labeled data+unlabeled data的label
- L(Graph Laplacian): (R+U)*(R+U)維矩陣,為矩陣D — 矩陣W
- 矩陣W很像演算法中的Graph matrix,entry為任兩點的edge weight
- 矩陣D為對角矩陣,就是把W的row做sum,比如(1,1)的值就是點x¹的edge weight總和,(2,2)的值就是點x²的edge weight總和…….以此類推。
最後可以這樣更改Loss function(圖二十五):
結語:
老師雖然提到了3個method(generative model, low-density, graph-based)和2個假設,但其實還有個manifold假設,而且光看這些method而沒有實作還挺抽象的。
而且老師介紹的完全是機器學習的領域,有點太舊了,現在的半監督式在深度學習已經進展蠻快了,而我的論文研究也是有關半監督式深度學習,之後會找時間統整一下。
結果已經連續5天沒發新文章了,我真的混...😰