本系列是臺灣大學資訊工程系林軒田(Hsuan-Tien Lin)教授開設的《機器學習基石》課程的梳理。重在梳理,而非詳細的筆記,所以可能會略去一些細節。算法
該課程共16講,分爲4個部分:安全
本文是第3部分,對應原課程中的9-12講。app
本部分的主要內容:dom
在第一部分中講過機器學習的分類,當\(\mathcal{Y}=\mathbb{R}\)時,就是迴歸。機器學習
線性迴歸的假設集十分簡單,\(h(\mathbf{x})=\mathbf{w}^T\mathbf{x}\),其實就是感知機模型去除了符號函數。函數
它的逐點偏差度量可設爲\(\text{err}(\hat{y}, y)=(\hat{y}-y)^2\),那麼樣本內外的偏差分別爲學習
和大數據
要最小化\(E_{\text{in}}\)很簡單,當它取到最小時必有梯度爲\(0\),所以可先計算出它的梯度:ui
令它爲\(0\)便可。如圖所示:spa
若\(X^T X\)可逆(當\(N\gg d+1\)時基本上會知足),則可直接得出
若是\(X^T X\)是奇異的呢?可先定義「僞逆」(pseudo-inverse)\(X^\dagger\),在定義完後有
在實踐中,建議直接使用\(X^\dagger\),一方面可避免判斷\(X^T X\)是否可逆,另外一方面就算在幾乎不可逆的狀況下,它也是在數值上穩定的。
線性迴歸看起來沒有「學習」過程,是一步到位的,那麼它算機器學習嗎?
事實上,只要能夠保證\(E_{\text{out}}(\mathbf{w}_\text{LIN})\)足夠小,那麼就能夠說「發生了」學習。
在這裏,咱們不從VC維理論出發,而從另外一個角度說明爲何\(E_{\text{out}}(\mathbf{w}_\text{LIN})\)會足夠小。
咱們先來看平均的\(E_{\text{in}}\)有多大:
其中
可將\(H=XX^\dagger\)稱爲hat matrix,由於它可將\(\mathbf{y}\)映射到\(\hat{\mathbf{y}}\)。由下圖可知,若\(\mathbf{y}\)由理想的\(f(X)\in \text{span}\)加上噪聲\(\mathbf{noise}\)生成,那麼\(I-H\)也可將\(\mathbf{noise}\)映射爲\(\mathbf{y}-\hat{\mathbf{y}}\):
而\(\text{trace}(I-H)=N-(d+1)\),跡能夠理解爲「能量」,所以有
若是對\(E_{\text{in}}\)取平均,大概能夠理解爲
相似地有
(證實過程略)。
所以\(\overline{E_{\text{in}}}\)和\(\overline{E_{\text{out}}}\)的關係如圖:
若\(N\to\infty\),則兩者都收斂於\(\sigma^2\)(\(\mathbf{noise}\text{ level}\)),泛化偏差的指望爲\(\dfrac{2(d+1)}{N}\)。所以,學習是會「發生」的!
VC維理論說明的是\(E_{\text{in}}\)和\(E_{\text{out}}\)相差較遠的機率有上限,而這裏說明的是它們的平均差距會收斂。角度不一樣,但兩種方式都說明了泛化的能力。
在線性分類中,\(\mathcal{Y}=\{+1,-1\}\),\(h(\mathbf{x})=\text{sign}({\mathbf{w}^T\mathbf{x}})\),\(\text{err}(\hat{y},y)=\mathbf{1}_{[\hat{y}\ne y]}\),找它的最優解是個NP-hard問題。
因爲\(\{+1,-1\}\subset \mathbb{R}\),即樣本的正負類別也能用實數表示,而在線性迴歸中\(\mathcal{Y}=\mathbb{R}\),那麼,直接來一發線性迴歸,獲得\(\mathbf{w}_\text{LIN}\),而後讓\(g(\mathbf{x})=\text{sign}(\mathbf{w}_\text{LIN}^T\mathbf{x})\),這是否可行呢?
把線性分類和線性迴歸的偏差度量分別記爲\(\text{err}_{0/1}=\mathbf{1}_{[\text{sign}(\mathbf{w}^T\mathbf{x})\ne y]}\)和\(\text{err}_\text{sqr}=({\mathbf{w}^T\mathbf{x}- y})^2\),它們的關係以下圖:
從中可直觀地看出,\(\text{err}_{0/1} \le \text{err}_\text{sqr}\)必定成立。由此,有
也就是說,讓迴歸的\(E_{\text{in}}\)作得足夠好,也可使得分類的\(E_{\text{out}}\)足夠小,只不過上限更寬鬆一些而已。這樣作就是用邊界的緊度(bound tightness)換取計算效率(efficiency)。
通常\(\mathbf{w}_\text{LIN}\)可用來做爲PLA或pocket算法的初始向量。
二分類中,咱們感興趣的是
但在不少場景下,咱們想要作的是「軟」(soft)分類,即獲得某個分類的機率,此時感興趣的是
問題在於,咱們獲得的數據標籤是樣本的類別,而非樣本被分到某個類的機率。
對於一個樣本的全部特徵\(\mathbf{x}=(x_0, x_1, x_2, \cdots,x_d)\),令\(s=\sum\limits_{i=0}^{d} w_i x_i\)。咱們可用邏輯函數(logistic function)\(\theta(s)\)將它轉換成估計的機率。也就是說,邏輯迴歸(logistic regression)的假設爲\(h(\mathbf{x})=\theta(\mathbf{w}^T\mathbf{x})\)。
最經常使用的邏輯函數是
函數圖像以下:
可見,它是個光滑的、單調的、「S」形的(sigmoid)函數。
接下來,要定義邏輯迴歸的\(E_\text{in}(\mathbf{w})\)。先將目標函數\(f(\mathbf{x})=P(+1|\mathbf{x})\)反表示爲
假設手中的數據集爲
那麼,由\(f\)生成\(\mathcal{D}\)的機率爲
由咱們的假設\(h\)生成\(\mathcal{D}\)的似然(likelihood)爲
若是\(h\approx f\),那麼\(h\)生成\(\mathcal{D}\)的似然也應該接近於由\(f\)生成\(\mathcal{D}\)的機率,而且由\(f\)生成\(\mathcal{D}\)的機率應該是較大的(正好被咱們抽樣抽到)。因此,機器學習算法能夠取
若\(h(\mathbf{x})=\theta(\mathbf{w}^T\mathbf{x})\),由函數的性質可知,\(1-h(\mathbf{x})=h(-\mathbf{x})\),因此
而\(P(\mathbf{x}_1)\)、\(P(\mathbf{x}_2)\)、……、\(P(\mathbf{x}_N)\)都與\(h\)無關,所以有
如今要將它最大化,以找出最終的\(h\)。可先把\(\theta(s)\)代入,再取對數(對數函數單調,不改變最大化取值的點),變爲
再取相反數(最大化變爲最小化)、除\(N\)(不改變最值點)後,又可變爲
將\(\theta(s)\)展開獲得
令
這就是交叉熵偏差(cross-entropy error),而\(\sum\limits_{n=1}^N \text{err}(\mathbf{w},\mathbf{x}_n,y_n)\)就是\(E_\text{in}(\mathbf{w})\)。
接下來就要最小化\(E_\text{in}(\mathbf{w})\),它是連續的、可微的、二次可微的、凸的,所以能夠試着讓它梯度爲\(0\)。求出它的梯度
它的梯度能夠當作是以\(\theta(\cdot)\)爲權重的\(-y_n\mathbf{x}_n\)的加權平均。要讓它爲0,有兩種方式:
可用與PLA中相似的方法進行迭代,即\(\mathbf{w}_{t+1}\leftarrow\mathbf{w}_t+\eta\mathbf{v}\),其中\(\mathbf{v}\)肯定了更新的方向,\(\eta\)肯定了更新的步長,如圖:
怎麼迭代呢?可用貪心算法,一步步讓\(E_\text{in}\)變小。假設已經給定某個\(\eta\),要肯定\(\mathbf{v}\)的方向,每一步的更新問題就轉換成了
看起來彷彿更難解了。但若是\(\eta\)足夠小,咱們能夠用局部線性近似展開它(泰勒展開,Taylor expansion):
式中\(E_\text{in}(\mathbf{w}_t)\)和\(\nabla E_\text{in}(\mathbf{w}_t)\)已知,\(\eta\)給定,只需肯定\(\mathbf{v}\)便可,注意到上式第二項本質上是兩個向量內積,當兩個向量方向相反時值最小,所以要最小化上式,可取
梯度降低的迭代更新就變成了:對於給定的較小\(\eta\),
\(\eta\)過小會致使很是慢,太大會致使不穩定,最好用變化的\(\eta\),以下圖所示:
那麼,\(\eta\)怎麼變比較好?可以讓它與\(\Vert\nabla E_\text{in}(\mathbf{w}_t)\Vert\)正相關,將原來固定的\(\eta\)乘上\(\Vert\nabla E_\text{in}(\mathbf{w}_t)\Vert\)便可。這樣,更新規則也就變成了
這個新的\(\eta\)可叫做固定的學習率(learning rate)。
記\(s=\mathbf{w}^T\mathbf{x}\),如下是總結三種模型(線性分類、線性迴歸、邏輯迴歸):
這裏的\(ys\)可稱爲分類正確度分數(classification correctness score),即度量分類有多正確,該值越大,說明分類越「正確」。
若將交叉熵偏差函數\(\text{err}_\text{CE}(s,y)\)作scale(除\(\ln 2\)),獲得
把它們的偏差函數都畫出來,可得下圖:
從圖中可知,必定有
由此能夠用VC維理論證實,使用\(\text{err}_\text{CE}\)也能夠作好分類任務,有兩種思路:
無論用哪一種方式,只要保證\(E_\text{in}^\text{CE}\)足夠小,均可以保證\(E_\text{out}^{0/1}(\mathbf{w})\)也足夠小,也就是說,使用邏輯迴歸或線性迴歸均可以作線性分類。
用PLA、線性迴歸、邏輯迴歸作分類,三種方法的優缺點以下:
PLA每次迭代的時間複雜度爲\(O(1)\),但邏輯迴歸(或pocket算法)每次迭代都須要對\(\mathcal{D}\)中的全部樣本進行一次運算,時間複雜度爲\(O(N)\),能不能讓每次迭代的時間複雜度也變成\(O(1)\)?
咱們在作更新\(\mathbf{w}_{t+1}\leftarrow\mathbf{w}_t+\eta\mathbf{v}\)時,取了
能夠看到,計算梯度須要遍歷全部樣本,複雜度實在過高了。可將它裏面的\(\dfrac{1}{N}\sum\limits_{n=1}^{N}\)看做是指望\(\mathcal{E}\),至關於不斷隨機抽一個樣本計算出來的結果的平均。若將隨機抽一個樣本\(n\)算出來的梯度稱爲隨機梯度\(\nabla_\mathbf{w}\text{err}(\mathbf{w},\mathbf{x}_n,y_n)\),那麼真正的梯度可看做是它的指望:
這樣,就能夠用隨機梯度降低(Stochastic Gradient Descent,SGD)進行迭代。它的好處是很是簡單,計算的成本低,很是適用於大數據或在線學習的狀況,缺點是不夠穩定。
在邏輯迴歸中,用SGD更新的步驟就變成了
這與PLA中的更新步驟十分類似,PLA中是這樣的:
所以用SGD的邏輯迴歸,能夠看做是「軟」的PLA。而反過來,若取\(\eta=1\),則PLA在\(\mathbf{w}_t^T \mathbf{x}_n\)很大的時候也能夠看做是用SGD的邏輯迴歸。
在用SGD時,有兩個經驗法則:
假設\(\mathcal{Y}=\{\square, \diamondsuit,\triangle,\star\}\),數據分佈以下圖:
可對每一個類別分別作一次分類,以下圖:
但這樣作,在最後要把它們結合起來時,會出現問題,有些區域沒法斷定屬於哪一類:
怎麼解決呢?能夠用邏輯迴歸作「軟」分類器,依舊是對每一個類別\(k\),用數據集
作一次邏輯迴歸,獲得一個分類器\(\mathbf{w}_{[k]}\):
作完後要將它們結合起來,可取\(g(\mathbf{x})=\arg\max_{k\in\mathcal{Y}}\theta(\mathbf{w}_{[k]}^T\mathbf{x})\),這樣就獲得某個點應該屬於哪一類了:
這樣作稱爲OVA(One-Versus-All) Decomposition,好處是有效率,能夠和相似邏輯迴歸的方法結合起來,但缺點在於當\(K\)很大時,每每會使\(\mathcal{D}_{[k]}\)很是不平衡,好比有100類,而且分佈比較均勻,OVA每次用於訓練的樣本的兩類數據的個數就會很是懸殊。
能夠再進行擴展,如multinomial ('coupled') logistic regression,加入一些如「屬於不一樣類的機率加起來應該爲1」之類的限制,讓它更適合用於多分類。
爲了克服不平衡問題,能夠對兩兩類別進行訓練,即用數據集
進行線性二分類:
最後,取
便可:
這樣的方法叫做OVO(One-Versus-One)Decomposition,好處在於有效率(由於每次訓練用的數據量較少),而且是穩定的,能夠和任何二分類方法相結合,但缺點在於不斷計算\(\mathbf{w}_{[k,\ell]}\)的操做總共的複雜度是\(O(K^2)\),須要更多運算空間。當\(K\)不是很是大時,OVO很經常使用。
對於某些數據集來講,無論怎麼使用線性模型,\(E_{in}\)都很大:
咱們發現,若是用一個圓來作它的分類界線,它實際上是可分的:
因此咱們要從新設計圓形PLA、圓形迴歸、……嗎?固然不是。咱們能夠將\(\mathbf{x}\in\mathcal{X}\)用變換\(\Phi\)映射到\(\mathbf{z}\in\mathcal{Z}\),使得在\(\mathcal{X}\)中圓形可分的數據在\(\mathcal{Z}\)中線性可分。
經過由\(\Phi_2(\mathbf{x})=(1,x_1,x_2,x_1^2,x_1x_2,x^2_2)\)映射而來的\(\mathcal{Z}\)空間,可構成通常的二次假設集:
固然也能夠用更高次的非線性變換,用非線性變換的流程以下圖:
具體步驟以下:
假設用\(Q\)次的非線性變換:
式中的項數\(1+\tilde d\)是多少呢?如有\(d\)個特徵,能夠在補上1後認爲上面式子後邊的每一項都是\(Q\)次的,也就是說要對\(d+1\)項每項都賦予一個次數,而且全部次數之和必須爲\(Q\)。能夠用隔板法:想象共有\(Q+d+1\)個小球,要在它們的空隙中放入\(d\)個隔板,隔成\(d+1\)段,每一段的小球個數減去1表明了對應位置的項的次數,因爲要求每段中至少有1個小球,所以兩端不能放隔板,共有\(Q+d\)個位置可放隔板,共有\(\binom{Q+d}{d}\)种放法,也就是說,上式等號右邊的項數
當\(Q\)較大時,一方面計算或存儲的成本很是高,另外一方面\(1+\tilde d\)是\(d_\text{VC}(\mathcal{H}_{\Phi_Q})\)的上界,\(Q\)太大會致使\(d_\text{VC}\)過大,模型損失了泛化能力。
如何選擇\(Q\)?假設\(\Phi_0(\mathbf{x})=(1)\),\(\Phi_1(\mathbf{x})=\left(\Phi_0(\mathbf{x}),x_1,x_2,\ldots,x_d,\right)\),……,\(\Phi_Q(\mathbf{x})=\left(\Phi_{Q-1}(\mathbf{x}),x_1^Q,x_1^{Q-1}x_2,\ldots,x_d^Q,\right)\),將它們的假設集分別記爲\(\mathcal{H}_0\),\(\mathcal{H}_1\),……,\(\mathcal{H}_Q\),它們存在嵌套關係
如圖所示:
而且,它們的VC維知足
若取\(g_i=\arg\min_{h\in \mathcal{H}_i} E_\text{in}(h)\),則它們的\(E_\text{in}\)知足
如何選擇\(Q\)?安全的作法是,先看\(E_\text{in}(g_1)\)是否已經足夠小,若是足夠小,就能夠了,不然,就用再稍微複雜一些的模型,也就是在下圖中向右移動: