《機器學習(周志華)》學習筆記(一)

Q:什么是機器學習?

機器學習最初被定義為“不顯式編程地賦予計算機能力的研究領域”。很明顯,這里的“機器”是指計算機。通常我們給計算機編程都會使用if-else這些流程控制:

if(今天是周末){
  在家睡覺
}
else{
  好好工作
}

這就是直接地、明顯地(顯式地)告訴了計算機什么時候應該做什么。

機器學習則不是直接告訴計算機什么時候做什么,而是提供一些案例(訓練數據),讓計算機通過案例自己學習,自己摸索什么時候應該做什么。一個著名的例子是給計算機輸入一大堆“房價-房屋面積”數據,讓計算機自己發現房價和房屋面積的規律,然后我們輸入一個新的房屋面積數據,計算機就可以根據學習到的規律輸出相應的房價。

機器學習的根本任務是預測

“機器學習”同時也是一門學科,研究怎樣使得計算機更好地學習,亦即,是一門研究“學習算法”的學科,主要任務是評估“學習算法”的好壞以及開發新的“學習算法”。這里的“學習算法”是計算機的學習方法,本質上是一種基于現有的數據產生預測模型的算法。

Q:學習一門學科需要先掌握其基本概念,“機器學習”領域有哪些需要掌握的重要概念?

人類觀察事物時,是通過觀察事物的本質特征來認識事物的。比如觀察西瓜,會觀察西瓜的色澤、根蒂、敲聲等特征。假設我們收集了一批關于西瓜的數據:

(色澤=青綠;根蒂=蜷縮;敲聲=濁響)
(色澤=墨綠;根蒂=稍蜷;敲聲=沉悶)
(色澤=淺白;根蒂=硬挺;敲聲=清脆)
······

假設我們希望用這一批數據來讓計算機學習
1、樣本、示例、記錄——這批數據里的每對括號。
2、數據集——這組樣本(示例、記錄)的集合。
3、特征、屬性——色澤、根蒂、敲聲等反映一個事物的本質的可觀察方面。
4、屬性值——青旅、墨綠、蜷縮、濁響等,是屬性的取值。
5、屬性空間、樣本空間、輸入空間——屬性張成的空間。這似乎是線性代數的語言,亦即把屬性當作坐標軸,形成一個空間,那么樣本就是這個空間中一個個的點。例如,吧“色澤”、“根蒂”、“敲聲”作為坐標軸,則長生了一個三維空間,每個西瓜都是這個空間里的一個點。
6、維數——樣本空間的坐標軸數,也就是數據集的特征數量。本例中的維數是3。
7、假設——也稱假設函數,指計算機通過學習后得到的一個函數(預測模型)。
8、標記——關于樣本結果的信息,比如一個(色澤=青綠;根蒂=蜷縮;敲聲=濁響)的西瓜是好瓜,那么“好瓜”就是(色澤=青綠;根蒂=蜷縮;敲聲=濁響)這個樣本的標記。
9、樣例——帶有標記的樣本,比如((色澤=青綠;根蒂=蜷縮;敲聲=濁響),好瓜)
10、標記空間、輸出空間——所有標記的集合。本例中就是指{好瓜、壞瓜}。
11、泛化——如果用某個數據集的樣本訓練出的一個模型(假設函數),能夠適用于新的樣本數據,就說這個模型具有泛化能力。模型能適用于越多的新數據,則說明其泛化能力越強。

Q:《機器學習》為“假設空間”這個概念另起一節說明,那么什么是“假設空間”?

“假設空間”里的“假設”指的是假設函數,也就是機器學習的成果。例如我們做分類學習,那么通過數據訓練后得到的分類模型就是我們得到的假設。

假設空間是指所有可能假設組成的空間。也可以說是所有在表達形式上符合任務要求的假設函數的集合。

對于西瓜分類任務,我們要獲得的假設函數的形式是

好瓜→(色澤=*)^(根蒂=*)^(敲聲=*)

假設“色澤”、“根蒂”、“敲聲”3個特征都有3種可能取值,那就有444+1=65種可能假設,亦即假設空間的大小為65。
對于根據房屋大小預測房價的問題,我們要后的的假設函數的形式則是

y = a*x + b

這個問題的假設空間是無窮大。

因此,學習過程可以看作在假設空間中尋找符合訓練數據集的假設的過程。

Q:什么是“歸納偏好”?

A:
在西瓜分類問題中,可能由于數據集的原因,我們會得到多個符合數據集的假設函數,比如:

好瓜→(色澤=墨綠)^(根蒂=蜷縮)^(敲聲=沉悶)
好瓜→(色澤=青綠)^(根蒂=*)^(敲聲=沉悶)

這所有訓練后得到的假設組成的空間稱為“版本空間”。

那么版本空間中哪一個假設 比較好?
如果我們認為越精細越好,則選擇

好瓜→(色澤=墨綠)^(根蒂=蜷縮)^(敲聲=沉悶)

如果我們認為越粗略越好,則選擇

好瓜→(色澤=青綠)^(根蒂=*)^(敲聲=沉悶)

像上面那樣,計算機的學習算法基于某種偏好認為某個假設比其他假設好,那么我們說這個學習算法有“歸納偏好”。事實上所有“學習算法”都有歸納偏好,而且一般來說會偏好那些形式簡單的假設。

Q:什么是NFL定理?其推導如何?

A:
NFL(No Free Lunch)定理,翻譯過來就是“沒有免費午餐”定理,收的是在機器學習中,沒有給定具體問題的情況下,或者說面對的是所有問題的情況下,沒有一種算法能說得上比另一種算法好。換成我們的俗話講,就是“不存在放之四海而皆準的方法”。只有在給定某一問題,比如說給“用特定的數據集給西瓜進行分類”,才能分析并指出某一算法比另一算法好。這就要求我們具體問題具體分析,而不能指望找到某個算法后,就一直指望著這個“萬能”的算法。這大概也是no free lunch名字的由來吧。

這個定理怎么得出的?西瓜書里有這樣一段文字:


似乎說的是我?

好吧,仔細讀一下推導過程,其實不難,連我這種數學渣渣都能讀懂絕大部分。只要別被一長串推導嚇到就行。

首先,定理推導的思路是證明對于某個算法a,它在訓練集以外的所有樣本的誤差,與a本身無關。

讓我們一步一步來探索。

首先,誤差是怎樣表示,或者說怎樣計算出來的?簡單起見,只考慮二分類問題。那么誤差就是分類器錯判的個數與樣本總數的比

E=誤判數/總數。

其次我們要明確,一個算法,會產生很多不同的假設。更詳細得說,一個算法的結果就是一個函數h,但是h的參數不同,那么就會有h1,h2等不同的假設函數。最典型的是h=kx+b。只要參數k、b不同,那么函數h就不同了。

那么,對于某個算法a,它在訓練集以外的所有樣本的誤差,就是它所能產生的所有假設h,在訓練集以外的所有樣本上的誤判率的和

對于某個假設h,“h在某個數據集上的誤差”“在某個數據集中抽取一個能讓h誤判的樣本的概率”是等價的問題。設P(x)為“在某個數據集中抽取一個能讓h誤判的樣本的概率”,那就可以用P(x)來替代h的誤差。

綜上所述,對于某個算法a,它在訓練集以外的所有樣本的誤差就可以這樣表示:


某個算法a,它在訓練集以外的所有樣本的誤差

對于二分類問題,設f為真正的分類函數,可能f有多個。假設其均勻分布,那么對于某個算法a,它在訓練集以外的所有樣本的誤差就可以表示成:


二分類問題中算法a在訓練集外所有樣本的誤差

由乘法分配率可以化為
Paste_Image.png

又由于


Paste_Image.png

上式中最后意象可以被化簡:
Paste_Image.png

又由全概率公式,或者說概率的可列可加性,下面這一項(上式中間那一項)其實等于1
這一塊其實等于1,所有h的概率加起來嘛

如此一來,a就在公式中消失了,于是最后的結果就是
與a無關

所以說無論是什么算法,它在訓練集以外所有樣本上的誤差都是上式表示的結果。

這就是NFL定理的推導。


這篇文章發表的五年里,大多數的評論都是圍繞NFL的。五年前我對機器學習和NFL都知之甚少。現在我有了更多理解,便嘗試一下再解釋解釋周志華老師這個簡單版的論證。

我們對于數學的恐懼,在理解數學內容時感到困難,原因大多是我們沒有搞清楚數學符號對應的意思。我們往往都是匆匆掃一眼對于符號的定義,然后就忙不迭地透入公式之中。但是,連基本地單詞都沒掌握,怎么能指望理解一句話地內容呢?所以首先我們解釋清楚上面所用到的數學符號的含義。

  • \mathcal{X}是樣本空間,指的就是所有可能的樣本組成的集合。比如說我們要判斷一批西瓜中的好瓜壞瓜,那么這一批西瓜就是樣本空間。假設這一批西瓜有1000個,那么|\mathcal{X}|就是樣本空間的規模,也就是所有可能西瓜的數量,1000。
  • X則是我們所有用的訓練集,x代表其中的一個訓練樣本。比如我們從這批1000個西瓜中采樣50個來做分析,那這50個西瓜就是訓練集。
  • h代表使用學習算法在訓練集中學習出來的假設。在我們這個例子中也就是一個判別函數,用來判斷一個樣本的類別h: \mathcal{X} \rightarrow \{0,1\}。使用這個判別函數h,輸入某個西瓜的特征信息,就這個函數就會告訴我們這個瓜是好是壞。我們用f來代表真正的判別函數。
  • \mathfrak{L}代表一個訓練算法,比如\mathfrak{L}_{a}可能代表邏輯回歸\mathfrak{L}_{b}可能代表決策樹。我們可以把\mathfrak{L}也看作一個函數,輸入是一個訓練集,輸出是一個判別函數\mathfrak{L}: \mathcal{X} \rightarrow H。這里H是指假設空間,也就是所有可能的判別函數的集合。
  • 前文已經說過,在假設空間H中,可以有多個假設h_1, h_2,..符合同一個訓練集X,那么學習算法\mathfrak{L}應該挑選哪一個假設呢?我們目前不知道,但可以假設某個算法\mathfrak{L}和某個數據集X,它挑選某個假設h的概率是P(h|X,\mathfrak{L}).

對于某個算法\mathfrak{L}_a,設它在訓練集以外的所有樣本,也就是剩下的950個瓜x \in \mathcal{X} - X期望誤差(Expected Out of Training Error)E_{ote}(\mathfrak{L}_a|X, f)。按照數學期望的定義,它可以表達成:
E_{ote}(\mathfrak{L}_a|X, f) = \sum_{h\in \mathfrak{L}(X)} P(h|X, \mathfrak{L}_a)E_{ote}(h|X, \mathfrak{L}_a)

其中P(h|X, \mathfrak{L}_a)是指學習算法\mathfrak{L}_a根據給定的訓練集X,選擇了假設h的概率;而E_{ote}(h|X, \mathfrak{L}_a)是指假設h在訓練集以外的所有樣本的期望誤差。再次按照數學期望的定義,它可以表達成:
E_{ote}(h|X, \mathfrak{L}_a) = \sum_{x \in \mathcal{X} - X}P(x)\mathbb{I}\big(f(x) \neq h(x)\big)

其中\mathbb{I}(b) 是一個輔助函數,用來表示x是不是被誤判了,定義為
\mathbb{I}(b) \left\{ \begin{aligned} &0 \quad b=True \\ &1 \quad b=False \\ \end{aligned} \right .

那么整個E_{ote}(\mathfrak{L}_a|X, f)的定義就可以寫成
E_{ote}(\mathfrak{L}_a|X, f) = \sum_{h\in \mathfrak{L}(X)} P(h|X, \mathfrak{L}_a) \sum_{x \in \mathcal{X} - X}P(x)\mathbb{I}\big(f(x) \neq h(x)\big)

學習算法生成的假設h可能有多個,真判別函數f也可能有多個。于是我們對所有可能的f的誤差求和:
\sum_f E_{ote}(\mathfrak{L}_a|X, f) = \sum_f \sum_{h\in \mathfrak{L}(X)} P(h|X, \mathfrak{L}_a) \sum_{x \in \mathcal{X} - X}P(x)\mathbb{I}\big(f(x) \neq h(x)\big)

由乘法分配率可以化為
\sum_f E_{ote}(\mathfrak{L}_a|X, f) = \sum_{h\in \mathfrak{L}(X)} P(h|X, \mathfrak{L}_a) \sum_{x \in \mathcal{X} - X} P(x) \sum_f \mathbb{I}\big(f(x) \neq h(x)\big)

怎樣化簡上式的最后一項\sum_f \mathbb{I}\big(f(x) \neq h(x)\big)呢?我們不知道真正的判別函數f是怎樣的,只知道它存在于假設空間H中,那我們姑且認為每一個假設h是真判別函數f的概率相等,也就是假設f在空間H中的概率是均勻分布。若fH中均勻分布,則有一半fx的預測是0,另一半的預測是1。無論如何,對于一個給定的h,總有一半fx的預測與h不一致,也就是說\sum_f \mathbb{I}\big(f(x) \neq h(x)\big)=\frac{|H|}{2},也就是說:
\begin{aligned} \sum_f E_{ote}(\mathfrak{L}_a|X, f) &= \sum_{h\in \mathfrak{L}(X)} P(h|X, \mathfrak{L}_a) \sum_{x \in \mathcal{X} - X} P(x) \frac{1}{2}|H| \\ &=\frac{1}{2}|H| \sum_{h\in \mathfrak{L}(X)} P(h|X, \mathfrak{L}_a) \sum_{x \in \mathcal{X} - X} P(x) \\ &=\frac{1}{2}|H| \sum_{x \in \mathcal{X} - X} P(x) \sum_{h\in \mathfrak{L}(X)} P(h|X, \mathfrak{L}_a) \\ &=\frac{1}{2}|H| \sum_{x \in \mathcal{X} - X} P(x) \end{aligned}
到了這一步,我們已經可以看出,學習算法(\mathfrak{L}_a在訓練集外的總誤差與(\mathfrak{L}_a自身無關,無論它是邏輯回歸,還是決策樹,還是別的什么,理論上其訓練集外的總誤差都是\frac{1}{2} |H| \sum_{x \in \mathcal{X} - X} P(x).

最后提一嘴,|H|是指假設空間的規模,也就是所有可能的判別函數h的數量。那么,一共可能有多少個h呢?一個h要做的事情是給樣本空間里的樣本打上0或1的標簽,有多少種打標簽的組合,相當于問1000個西瓜中每個西瓜都可能是好瓜壞瓜,那么1000個西瓜一共有多少種可能的好壞組合?答案是2^{1000}種。所以理論上其訓練集外的總誤差都是
\sum_f E_{ote}(\mathfrak{L}_a|X, f) = 2^{|\mathcal{X}|-1} \sum_{x \in \mathcal{X} - X} P(x)

好家伙,我自己寫完,看到這么多符號,也下了一跳。擔心細一看每一步都不難,其實都是高中數學而已。


本作品首發于簡書博客園平臺,采用知識共享署名 4.0 國際許可協議進行許可。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容