這篇總結繼續復習分類問題。本文簡單整理了以下內容:
(一)線性判別函數與廣義線性判別函數
(二)感知器
(三)松弛算法
(四)Ho-Kashyap算法
閑話:本篇是本系列[機器學習基礎整理]在timeline上最新的,但實際上還有(七)、(八)都發布的比這個早,因為這個系列的博客是之前早就寫好的,不過會抽空在后台修改,感覺自己看不出錯誤(當然因為水平有限肯定還是會有些錯誤)了之后再發出來。后面還有SVM、聚類、tree-based和boosting,但現在的情況是前八篇結束后,本系列無限期停更……
(一)線性判別函數與廣義線性判別函數
一、線性判別函數
現假設判別函數(Discriminant function)的參數形式已知,用訓練的方法直接根據樣本估計判別函數的參數。例如,線性判別函數的形式為:
$$g(\textbf x)=\textbf w^{\top}\textbf x+w_0$$
$\textbf x\in \mathbb R^d$ 是給定的樣本,$\textbf w=(w_1,w_2,\cdots,w_d)$ 是權重向量,$w_0$ 是偏置。對於多類分類問題,如果有 $c$ 個類,那么有 $c$ 個判別函數,將樣本的類別判定為各判別函數取值最大的一個(實際上這是一種one-vs-all的方式,因為一個判別函數只可以解決二類的分類問題。下面會簡單介紹)。
二分類問題的線性判別函數
如果是二分類問題,則可以只有一個判別函數,當 $g(\textbf x)>0$ 時判為正類,$g(\textbf x)<0$ 時判為負類,$g(\textbf x)=0$ 時任意。因此,$g(\textbf x)=0$ 就是決策面,對於線性判別函數來說,這是一個超平面(hyperplane,直線的高維推廣)。對於一組來源於兩類的樣本來說,如果存在一個超平面可以將它們完全正確地分開,則稱它們是線性可分的。
就這個描述來說,之前總結過的二項Logistic回歸模型(如果只考慮線性決策面)和這里的描述是一致的,本質上都是需要學習出 $\textbf w$ 、$w_0$ ,二項Logistic回歸模型還更進一步,將判別函數的值通過logistic函數 $\sigma(\cdot)$ 映射到了 $(0,1)$ 區間,進而給出了樣本屬於正類的概率。
根據幾何關系,對於任一樣本 $\textbf x$ 來說,設它到決策面的投影點為 $\textbf x_p$ ,到決策面的距離為 $r$ (有正負,如果大於零則表示樣本屬於正類,處在決策面的正側),那么如下關系成立:
$$\textbf x=\textbf x_p+r\frac{\textbf w}{||\textbf w||}$$
由於 $g(\textbf x_p)=0$ ,所以可得到 $r=g(\textbf x)/||\textbf w||$ 。如果決策面過原點,就表明 $w_0=0$ (原點到決策面的距離為 $w_0/||\textbf w||$ ),這時稱判別函數是齊次(homogeneous)的。
圖片來源:[1]
one-vs-rest
這里多提一句,如果是二分類器想用於多分類問題( $c$ 類),一般采用的策略是 one-vs-all(one-vs-rest),就是說訓練 $c$ 個二分類器,其中分類器 $i$ 給出樣本屬於 $i$ 類的后驗概率( $i=1,2,\cdots, c$ ),從而將樣本的類別判定為后驗概率最大的那個類。
二、廣義線性判別函數
既然可以有線性判別函數,那么同理可以有二次判別函數(quadratic),其決策面是超二次曲面;進一步可以有多項式判別函數(polynomial)。所謂廣義線性判別函數(generalized linear),就是指
$$g(\textbf x)=\sum_{i=1}^{\hat d}a_iy_i(\textbf x)=\textbf a^{\top}\textbf y$$
這里 $\textbf y=(y_1(\textbf x),y_2(\textbf x),\cdots,y_{\hat d}(\textbf x))^{\top}\in \mathbb R^{\hat d}$ ,將 $\textbf x$ 映射到 $\hat d$ 維空間。齊次的形式標明了該判別函數所決定的決策面通過新空間的原點,新空間中的任一點到決策面的距離為 $\textbf a^{\top}\textbf y/||\textbf a||$ (根據上面 $r$ 的表達式可類似得到)。如果 $\hat d$ 足夠大,那么 $g(\textbf x)$ 可以逼近任意判別函數,但是如果新空間的維數遠高於原始空間的維數則會帶來維數災難(因為隨着維數增多,需要的樣本量指數級增長,之前的總結中提到過)。
舉個例子:設一維空間下的樣本,希望 $x<-1$ 或 $x>0.5$ 為正類,那么可以得到符合要求的判別函數為 $g(x)=(x-0.5)(x+1)=-0.5+0.5x+x^2$ ,所以這里就將一維樣本映射到了三維空間:$\textbf y=(y_1,y_2,y_3)^{\top}=(1,x,x^2)^{\top}$ 。從圖里可以看出,映射后的概率密度其實是退化的,在曲線上無窮大,曲線外為0,這是映射到高維空間時的一個普遍問題。
圖片來源:[1]
借着這個討論,規定一下記號:在后面的討論中,假設樣本 $\textbf x$ 都將轉換為規范化增廣表示形式 $\textbf y$ :增廣就是說先把 $\textbf x$ 加一個維度 $x_0$ 且 $x_0=1$ ,規范化就是說當樣本屬於負類時,將樣本的每個維度(包括 $x_0$ )取負號。並且權重向量 $\textbf w$ 和偏置 $w_0$ 合為一個向量 $\textbf a=(w_0,w_1,\cdots,w_d)^{\top}$ 。
三、解區
在這樣的表示下,目標就成了:求出使 $\textbf a^{\top}\textbf y_i>0$ 對所有樣本 $\textbf y_i$( $i=1,2,\cdots,N$)都成立的權向量 $\textbf a$。在線性可分的情況下,滿足該要求的權向量被稱為解向量(Solution vector) $\textbf a$ 。
權向量 $\textbf a$ 可認為是權空間中的一點,任一樣本 $\textbf y_i$ 對解向量的位置都起限制作用。由於任一樣本 $\textbf y_i$ 都可以確定一個以 $\textbf y_i$ 為法向量的超平面 $\textbf a^{\top}\textbf y_i=0$ ,所以如果解向量存在,則它必處在超平面的正側,因為只有處在正側才滿足 $\textbf a^{\top}\textbf y_i>0$ 。
那么,如果解向量存在,則它必處在所有超平面 $\textbf a^{\top}\textbf y_i=0$ 的正側區域的交集內,這個交集稱為解區(Solution region)。如下圖所示,陰影部分的區域內都是解向量。
圖片來源:[1]
其實還可以對解區進行限制,比如說將目標變得嚴苛一些: $\textbf a^{\top}\textbf y_i\geq b>0$ ,$b$ 被稱為margin(譯為“間隔”、“邊沿裕量”,SVM的一個核心概念)。限制解區后的情形如下圖所示。
圖片來源:[1]
四、准則函數
從上面可以知道,對於線性可分的情況,解向量有無數個。所以要引入准則函數(Criterion function),通過迭代的方式進行訓練,求取准則函數的最小值,來得到唯一一個解向量。並且盡量不收斂到解區邊界,因為解區中間的解向量往往泛化性更好。
准則函數有點像之前介紹的經驗風險(刻畫模型在訓練樣本上的平均損失),都是訓練模型時的優化目標。
下面就開始介紹各種用來訓練線性判別函數的准則。
(二)感知器Perceptron
零、歷史
既然說到感知器了,那就跑題說點歷史好了。
1890年,美國生物學家W. James出版了《Physiology》(生理學)一書,講述有關人腦結構和功能,以及學習、記憶等基本規律,指出當兩個基本處理單元同時活動,或兩個單元靠得很近時,一個單元的興奮狀態會傳遞給另一單元,並且一個單元的活動程度與其周圍的活動數量和密度成正比。
1943年,Warren McCulloach, Walter Pitts提出了著名的MP神經元模型,認為單元的輸入存在興奮邊、抑制邊兩種,如果沒有抑制邊輸入並且興奮邊的數量超過一個閾值,則神經元處於興奮,否則處於抑制——這個模型給出了神經元的結構,使用閾值函數來輸出,但所有輸入邊的權重都為1,並且只要有一條抑制邊輸入那么就不可能興奮。
1949年,心理學家Hebb提出用於確定輸入邊權重的Hebb規則,該規則認為兩個具有相同狀態的神經元之間的權重要大。
1957年,Frank Rosenblatt提出感知器(Perceptron),隨后在IBM704計算機上進行模擬從而證明了該模型有能力通過調整權重的學習達到正確分類的效果,第一次把神經網絡從純理論推到工程實踐,掀起了研究高潮;在1962年感知器算法被證明是收斂的。
1960年,Bernard Widrow和Ted Hoff提出自適應線性單元(Adaptive linear neuron,ADALINE),學習規則也由Hebb規則轉向Delta規則:利用實際輸出與期望輸出的誤差來指導學習,即LMS filter(上篇總結的線性回歸部分提到過)。
1969年,Minsky出版《Perceptron》,但同時指出感知器的兩個問題:一個就是著名的“單層感知器無法解決異或(XOR,相異取真,相同取假)這樣的線性不可分問題”,另外一個是這種局限在復雜結構中依然存在。不只是神經網絡,整個AI都迎來寒冬。那時候晶體管還沒有普及,大多是電子管(真空管),支持不了大規模計算。
1974年,Paul Werbos的博士論文里提出了BP算法(后被稱為廣義Delta規則),但是沒有引起重視。
在70年代,據說全球只有幾十個人在研究,但還是有一些成果:1976年Stephen Crossberg的共振自適應理論(Adaptive resonance theory,ART網絡)、1979年日本Fukusima的神經認知機(Neocognitron,將感受野應用到NN)、80年代芬蘭Kohonen的自組織競爭神經網絡等。
1982年,物理學家John Hopfield提出Hopfield網絡,基本思路是對於一個給定的神經網絡,設計一個正比於每個神經元的活性和權重的能量函數,活性的改變算法向能量函數減小的方向進行,直到達到極小值。神經網絡開始復興。
1986年,Rumelhart、Hinton、Williams將BP應用到神經網絡;1987年,第一屆世界神經網絡大會在美國召開,千人參會。
1989年,使用sigmoid激活的單隱層神經網絡被證明可以逼近任意非線性函數;LeCun的CNN用在文本識別;1990年,RNN;1997年,LSTM;2006年,DBN,深度學習的概念被提出;2011年,語音識別領域首先取得突破;2012年,AlexNet在ImageNet奪冠,引爆這個領域,之后……
一、感知器
首先說明:感知器算法(以及接下來介紹的松弛算法)對於線性不可分的數據是不收斂的。對於線性可分的數據,可以在有限步內找到解向量。收斂速度取決於權向量的初始值和學習率。
感知器(Perceptron)屬於判別模型(Discriminative model),從樣本中直接學習判別函數,所有類別的樣本放在一起學習。它是神經網絡和SVM的基礎。
感知器准則函數被定義為
$$J_p(\textbf a)=\sum_{\textbf y\in \mathcal Y(\textbf a)}(-\textbf a^{\top}\textbf y)$$
式中的 $\mathcal Y(\textbf a)$ 是被當前 $\textbf a$ 錯分的樣本(即滿足 $\textbf a^{\top}\textbf y\leq 0$ 的全部 $\textbf y$ )構成的集合。
也就是說,感知器算法是錯誤驅動(error-correcting procedure)的:被正確分類的樣本對准則函數沒有貢獻,不產生誤差;又因為對於被錯分的樣本 $\textbf y$ ,$\textbf a^{\top}\textbf y\leq 0$ ,那么可以知道 $J_p(\textbf a)\geq 0$ 。如果不存在錯分樣本,那么准則函數的值就為0。因此,優化目標就是最小化 $J_p(\textbf a)$ :
$$\min_{\textbf a}J_p(\textbf a)$$
使用梯度下降法,迭代求取解向量。准則函數的梯度以及更新規則為
$$\nabla_{\textbf a}J_p=\frac{\partial J_p}{\partial\textbf a}=\sum_{\textbf y\in \mathcal Y(\textbf a)}(-\textbf y)$$
$$\textbf a_{k+1}=\textbf a_{k}-\eta_k\nabla_{\textbf a}J_p$$
式中的下標 $k$ 表示第 $k$ 次迭代。停機條件可以是全部樣本都被權向量所決定的超平面正確分類,也可以放松一點,例如 $J_p(\textbf a)$ 小於某個很小的值,或達到了最大的迭代次數時強制停機。
得到解向量 $\textbf a$ 后,就唯一確定了判別函數 $g(\textbf x)$ ,進而可以對樣本 $\textbf x$ 進行分類。
這種更新方式被稱為批處理(batch)梯度下降,因為在一次迭代過程中求取了全部訓練樣本的梯度,這種方式在樣本量很大且特征維數很高的時候效率比較低。
與之相對應的一種方式是隨機梯度下降(Stochastic gradient descent),一次迭代中隨機選取一個被錯分的樣本求梯度然后更新權向量。隨機梯度下降的方式可以有非常顯而易見的解釋:當前的權向量會把一個樣本錯誤分類,那么就把此時的超平面向這個樣本移動,使新的權向量有可能將其正確分類。設在一次迭代中挑選出的被錯分的樣本為 $\textbf y^k$ ,那么更新規則為
$$\textbf a_{k+1}=\textbf a_{k}-\eta_k(-\textbf y^k)$$
一種折中的方式是mini-batch梯度下降,這正是目前采用最廣泛的一種方式。
學習率是非常關鍵的,太大會導致震盪,太小則會使收斂過程很慢。現在有不少策略使學習率自適應調整,例如AdaGead、Adam、AdaDelta、RMSprop等;另外,還有加動量的方式,在當前迭代中加入上一次的梯度進行加速。這里就不展開了,具體哪種方式更好是取決於具體任務的。
將感知器的更新准則和神經網絡的BP算法進行比較可知,后者主要是多出來了一項激活函數的導函數。
二、帶margin的感知器
感知器可以帶margin,也就是說進一步要求解向量必須滿足 $\textbf a^{\top}\textbf y_i\geq b>0$ 。相比於不帶margin的感知器,梯度是沒有變的所以更新規則的表達式是一樣的,但變化的是 $\mathcal Y(\textbf a)$ 以及停機條件。
三、多類感知器
原始的感知器只能處理兩類問題,不提供概率形式的輸出,所以不能處理多類分類問題。通過引入特征函數 $\phi(x,y)$ 將輸入輸出對映射到向量空間中,可以得到多類感知器。在特征函數的作用下,感知器不僅可以處理多類問題,也能處理結構化輸出任務(這類任務也有專門的算法,比如structured-SVM等)。這里不展開了,因為沒有在實戰中用過,所以也沒有太多理解,具體講解可以參考[3]。
(三)松弛算法Relaxation procedure
一、平方准則函數
在介紹松弛算法之前,先介紹平方准則函數。
上面所提到的感知器准則函數可以被稱為線性准則函數。所謂平方准則函數是下面的形式:
$$J_q(\textbf a)=\sum_{\textbf y\in \mathcal Y(\textbf a)}(\textbf a^{\top}\textbf y)^2$$
可以看出二者之間的共同點是都只關注被錯分的樣本,區別在於 $J_p$ 的梯度是不連續的(因為 $J_p$ 分段線性),$J_q$ 的梯度是連續的。但是即便如此,$J_q$ 依然存在兩個問題:首先, $J_q$ 過於平滑導致收斂很慢,而且其在解區邊界很光滑導致可能收斂到解區邊界,對泛化性不利;其次,其得到的解向量可能依賴於模值最大的樣本向量。由於上面兩個問題,引出下面的松弛准則函數。
二、松弛准則函數
與感知器相同,松弛算法(Relaxation procedure)也是錯誤驅動的。松弛准則函數的形式如下
$$J_r(\textbf a)=\frac12\sum_{\textbf y\in \mathcal Y(\textbf a)}\frac{(\textbf a^{\top}\textbf y-b)^2}{||\textbf y||^2}$$
式中的 $\mathcal Y(\textbf a)$ 是滿足 $\textbf a^{\top}\textbf y\leq b$ 的全部 $\textbf y$ 構成的集合。同樣地,可以用批處理的方式更新權向量,梯度和更新規則為
$$\nabla_{\textbf a}J_r=\sum_{\textbf y\in \mathcal Y(\textbf a)}\frac{\textbf a^{\top}\textbf y-b}{||\textbf y||^2}\textbf y$$
$$\textbf a_{k+1}=\textbf a_{k}-\eta_k\nabla_{\textbf a}J_r$$
類似於感知器,可得隨機梯度下降方式下松弛算法的更新規則:
$$\textbf a_{k+1}=\textbf a_{k}-\eta_k\frac{\textbf a_k^{\top}\textbf y^k-b}{||\textbf y^k||^2}\textbf y^k$$
下面討論一下學習率 $\eta_k$ 取值不同時,$\textbf a_{k+1}$ 是否可以把被 $\textbf a_{k}$ 錯分的樣本 $\textbf y^k$ 正確分類。根據這個式子,稍加計算就可以得到
$$\frac{\textbf a_{k+1}^{\top}\textbf y^k-b}{1-\eta_k}=\textbf a_k^{\top}\textbf y^k-b\leq 0$$
所以如果想要 $\textbf a_{k+1}$ 將樣本 $\textbf y^k$ 正確分類(即 $\textbf a_{k+1}^{\top}\textbf y^k-b\geq 0$ ),就必須有
$$\eta_k>1$$
這種情況被稱為超松弛(過松弛)。類似地,$\eta_k<1$ 被稱為軟松弛(欠松弛)。
實際使用中,通常限定 $0<\eta_k<2$ ,做了這樣的限定之后,對於線性可分的數據來說松弛算法可以收斂到解向量。與感知器相同,松弛算法對於線性不可分數據是不收斂的。
圖片來源:[1]
我簡單實現了松弛算法(批處理和SGD),在不能更toy的線性可分數據(二維特征,每類10個點。。。)上運行,畫出了准則函數的值隨迭代次數的變化趨勢圖:第一張圖是批處理梯度下降,初始向量為全零,margin分別取0.1和0.5,固定增量 $\eta_k=1$ ;第二張圖是隨機梯度下降,初始向量為全零,margin分別取0.1和0.5,固定增量 $\eta_k=1$ 。可以看出,批處理梯度下降方法會讓准則函數值的變化趨勢平滑一些。
(四)Ho-Kashyap算法
一、MSE准則函數
在介紹Ho-Kashyap算法之前,先介紹最小誤差平方和准則函數。在上一篇總結中,線性回歸就是用的平方損失函數來求取權重向量,這里的思路和線性回歸是一致的。
剛才的准則函數都是關注於錯分樣本,而對正確分類的樣本則沒有考慮在內。MSE准則函數把求解目標從不等式形式變成了等式形式:求取滿足 $\textbf a^{\top}\textbf y_i=b_i$ 的權向量。在這里,$b_i$ 是任取的正常數。
如果記矩陣 $Y\in\mathbb R^{N\times \hat d}$ 且其每行都是一個樣本 $\textbf y^{\top}$ ,向量 $\textbf b=(b_1,b_2,\cdots,b_N)^{\top}$ ,那么就可以表述為求方程 $Y\textbf a=\textbf b$ 的解。為了求解這個問題,使用MSE准則函數:
$$J_s(\textbf a)=||Y\textbf a-\textbf b||^2=\sum_{i=1}^N(\textbf a^{\top}\textbf y_i-b_i)^2$$
到這里其實就沒必要繼續說下去了,因為上篇剛整理過——這不就是線性回歸嗎?只不過在這里求出來的解向量被用來定義決策面。最小化上述准則函數有兩種方法,一種是直接求一階導數等於零這個方程(正規方程組),一種是LMS規則迭代求解。MSE准則函數的梯度以及LMS規則(batch和SGD)為
$$\nabla_{\textbf a}J_s=2Y^{\top}(Y\textbf a-\textbf b)$$
$$\textbf a_{k+1}=\textbf a_{k}-\eta_k\nabla_{\textbf a}J_s$$
$$\textbf a_{k+1}=\textbf a_{k}-\eta_k(\textbf a_k^{\top}\textbf y^k-b)\textbf y^k$$
乍一看好像和松弛算法一樣,其實有兩個區別——第一個區別是停機條件不同:松弛算法要求對於全部的樣本都有 $\textbf a^{\top}\textbf y_i>b$ ,而MSE則要求 $\textbf a^{\top}\textbf y_i=b_i$ ,所以后者必須令學習率隨迭代次數的增加而減少才能保證收斂(實際中這種精確相等關系幾乎是不可能的),例如取 $\eta_k=\eta_1/k$ ;第二個區別是松弛算法對於不可分的樣本不收斂,而MSE總能收斂到一個權向量。
那么問題就來了,MSE方法得到的解向量所決定的超平面實際上未必是分類面,因為它的本質是最小化樣本到超平面的距離的平方和,而不是分類。
圖片來源:[1]
二、Ho-Kashyap算法
為了保證算法可以收斂到分類超平面,必須做出改進。我們知道,對於線性可分的數據一定可以找到解向量 $\textbf a$ 使 $\textbf a^{\top}\textbf y_i>0$ 對所有樣本 $\textbf y_i$( $i=1,2,\cdots,N$)都成立。那么換句話說,一定存在一個 $\textbf a$ 和 $\textbf b$ ,使下式成立
$$Y\textbf a=\textbf b>0$$
接下來要做的就是調整MSE的准則函數,做法就是讓 $\textbf b$ 也是需要學習的參數,而不是事先指定好的,這就引出了Ho-Kashyap算法:
$$J_s(\textbf a,\textbf b)=||Y\textbf a-\textbf b||^2$$
直接優化上式將導致平凡解,所以需要給 $\textbf b$ 加一個約束條件,要求其每個分量都大於零,進而可以解釋成margin
$$\textbf b>\textbf 0$$
梯度如下
$$\nabla_{\textbf a}J_s=2Y^{\top}(Y\textbf a-\textbf b)$$
$$\nabla_{\textbf b}J_s=-2(Y\textbf a-\textbf b)$$
先看 $\textbf a$ :對於任一 $\textbf b$ ,可令
$$\textbf a=Y^{\dagger}\textbf b$$
這樣的話就使得 $\nabla_{\textbf a}J_s=\textbf 0$ 且 $J_s$ 關於 $\textbf a$ 是極小的。
再看 $\textbf b$ :由於需要滿足分量全正,所以必須避免收斂到 $\textbf b=\textbf 0$ 。因此可以將初值的分量全部置為正值,並要求梯度必須為負,這樣每個分量的值只會增加而不會減小。
這樣以來,可以給出如下更新規則:
$$\textbf a_k=Y^{\dagger}\textbf b_k$$
$$\textbf b_1>\textbf 0,\quad\textbf b_{k+1}=\textbf b_k-\eta_k\frac12(\nabla_{\textbf b}J_s-|\nabla_{\textbf b}J_s|)$$
第二個式子的做法使得 $\nabla_{\textbf b}J_s$ 中原先為負的變量保持不變,而原先為正的分量變為零,從而實現了負梯度。停機條件可以設置為 $|Y\textbf a_k-\textbf b_k|<b_{\min}$( $b_{\min}$ 是一個很小的正數)。
下面看一下這個算法與眾不同的地方——收斂性。記為 $\textbf e_k=Y\textbf a_k-\textbf b_k$ ,那么停機條件就是 $|\textbf e_k|<b_{\min}$ 。當 $\textbf e_k=Y\textbf a_k-\textbf b_k=\textbf 0$ 時,由於 $\textbf b_k$ 不再更新,因此得到一個解。
1. 對於線性可分的情況,若 $0<\eta<1$ ,則該算法在有限步內收斂;
2. 如果 $\textbf e_k$ 有小於零的元素,就證明數據是線性不可分的,算法終止。
我簡單實現了這個算法,在圖示的toy不可分數據上運行,margin向量初始值為 $\textbf b_1=\textbf 1$ ,收斂准則 $b_{\min}=0.1$ ,固定增量 $\eta_k=0.8$ 時,迭代131步后算法判斷出樣本線性不可分,此時准則函數的值為 $J_s(\textbf a,\textbf b)=8.451$ ,並給出如下圖所示的決策面:
參考資料:
[1] 《模式分類》及slides
[2] 《統計學習方法》
[3] 《神經網絡與深度學習講義》
[4] 《人工智能理論與實踐》課程slides