深度學習基礎-機器學習基本原理

語言: CN / TW / HK

開啟掘金成長之旅!這是我參與「掘金日新計劃 · 2 月更文挑戰」的第 6 天,點擊查看活動詳情

本文大部分內容參考《深度學習》第五章機器學習基礎,但從中抽取重要的知識點,並對部分概念和原理加以自己的總結,適合當作原書的補充資料閲讀,也可當作快速閲覽機器學習原理基礎知識的參考資料。

前言

深度學習是機器學習的一個特定分支。我們要想充分理解深度學習,必須對機器學習的基本原理有深刻的理解。

大部分機器學習算法都有超參數(必須在學習算法外手動設定)。機器學習本質上屬於應用統計學,其更加強調使用計算機對複雜函數進行統計估計,而較少強調圍繞這些函數證明置信區間;因此我們會探討兩種統計學的主要方法: 頻率派估計和貝葉斯推斷。同時,大部分機器學習算法又可以分成監督學習無監督學習兩類;本文會介紹這兩類算法定義,並給出每個類別中一些算法示例。

本章內容還會介紹如何組合不同的算法部分,例如優化算法、代價函數、模型和數據 集,來建立一個機器學習算法。最後,在 5.11 節中,我們描述了一些限制傳統機器學習泛化能力的因素。正是這些挑戰推動了克服這些障礙的深度學習算法的發展。

大部分深度學習算法都是基於隨機梯度下降算法進行求解的。

5.1 學習算法

機器學習算法是一種能夠從數據中學習的算法。這裏所謂的“學習“是指:“如果計算機程序在任務 $T$ 中的性能(以 $P$ 衡量)隨着經驗 $E$ 而提高,則可以説計算機程序從經驗 $E$ 中學習某類任務 $T$ 和性能度量 $P$。”-來自 Mitchell (1997)

經驗 $E$,任務 $T$ 和性能度量 $P$ 的定義範圍非常寬廣,本文不做詳細解釋。

5.1.1 任務 T

從 “任務” 的相對正式的定義上説,學習過程本身不能算是任務。學習是我們所謂的獲取完成任務的能力。機器學習可以解決很多類型的任務,一些非常常見的機器學習任務列舉如下: 1. 分類:在這類任務中,計算機程序需要指定某些輸入屬於 $k$ 類中的哪一類,例如圖像分類中的二分類問題,多分類、單標籤問題、多分類多標籤問題。 2. 迴歸:在這類任務中,計算機程序需要對給定輸入預測數值。為了解決這個任務,學習算法需要輸出函數 $f : \mathbb{R}^n \to \mathbb{R}$。除了返回結果的形式不一樣外,這類 問題和分類問題是很像的。 3. 機器翻譯 4. 結構化輸出 5. 異常檢測 6. 合成和採樣 7. 去噪 8. 密度估計或概率質量函數估計 9. 輸入缺失分類 10. 轉錄 11. 缺失值填補

5.1.2 性能度量 P

為了評估機器學習算法的能力,我們必須設計其性能的定量度量,即算法的精度指標。通常,性能度量 $P$ 特定於系統正在執行的任務 $T$。

可以理解為不同的任務有不同的性能度量。

對於諸如分類、缺失輸入分類和轉錄任務,我們通常度量模型的準確率(accu- racy)。準確率是指該模型輸出正確結果的樣本比率。我們也可以通過錯誤率(error rate)得到相同的信息。錯誤率是指該模型輸出錯誤結果的樣本比率。

我們使用測試集(test set)數據來評估系統性能,將其與訓練機器學習系統的訓練集數據分開。

值得注意的是,性能度量的選擇或許看上去簡單且客觀,但是選擇一個與系統理想表現能對應上的性能度量通常是很難的。

5.1.3 經驗 E

根據學習過程中的不同經驗,機器學習算法可以大致分類為兩類

  • 無監督(unsuper-vised)算法
  • 監督(supervised)算法

無監督學習算法(unsupervised learning algorithm)訓練含有很多特徵的數據集,然後學習出這個數據集上有用的結構性質。在深度學習中,我們通常要學習生成數據集的整個概率分佈,顯式地,比如密度估計,或是隱式地,比如合成或去噪。 還有一些其他類型的無監督學習任務,例如聚類,將數據集分成相似樣本的集合。

監督學習算法(supervised learning algorithm)也訓練含有很多特徵的數據集,但與無監督學習算法不同的是數據集中的樣本都有一個標籤(label)或目標(target)。例如,Iris 數據集註明瞭每個鳶尾花卉樣本屬於什麼品種。監督學習算法通過研究 Iris 數據集,學習如何根據測量結果將樣本劃分為三個不同品種。

半監督學習算法中,一部分樣本有監督目標,另外一部分樣本則沒有。在多實例學習中,樣本的整個集合被標記為含有或者不含有該類的樣本,但是集合中單獨的樣本是沒有標記的。

大致説來,無監督學習涉及到觀察隨機向量 $x$ 的好幾個樣本,試圖顯式或隱式地學習出概率分佈 $p(x)$,或者是該分佈一些有意思的性質; 而監督學習包含觀察隨機向量 $x$ 及其相關聯的值或向量 $y$,然後從 $x$ 預測 $y$,通常是估計 $p(y | x)$。術語監督學習(supervised learning)源自這樣一個視角,教員或者老師提供目標 $y$ 給機器學習系統,指導其應該做什麼。在無監督學習中,沒有教員或者老師,算法必須學會在沒有指導的情況下理解數據。

無監督學習和監督學習並不是嚴格定義的術語。它們之間界線通常是模糊的。很多機器學習技術可以用於這兩個任務。

儘管無監督學習和監督學習並非完全沒有交集的正式概念,它們確實有助於粗略分類我們研究機器學習算法時遇到的問題。傳統地,人們將回歸、分類或者結構化輸出問題稱為監督學習。支持其他任務的密度估計通常被稱為無監督學習。

表示數據集的常用方法是設計矩陣(design matrix)。

5.1.4 示例: 線性迴歸

我們將機器學習算法定義為,通過經驗以提高計算機程序在某些任務上性能的算法。這個定義有點抽象。為了使這個定義更具體點,我們展示一個簡單的機器學習示例: 線性迴歸(linear regression)。

顧名思義,線性迴歸解決迴歸問題。 換句話説,目標是構建一個系統,該系統可以將向量 $x \in \mathbb{R}$ 作為輸入,並預測標量 $y \in \mathbb{R}$ 作為輸出。在線性迴歸的情況下,輸出是輸入的線性函數。令 $\hat{y}$ 表示模型預測值。我們定義輸出為

$$ \hat{y} = w^{⊤}x \tag{5.3} $$

其中 $w \in \mathbb{R}^{n}$ 是參數(parameter)向量。

參數是控制系統行為的值。在這種情況下,$w_i$ 是係數,會和特徵 $x_i$ 相乘之 後全部相加起來。我們可以將 $w$ 看作是一組決定每個特徵如何影響預測的權重 (weight)。

通過上述描述,我們可以定義任務 $T$ : 通過輸出 $\hat{y} = w^{⊤}x$ 從 $x$ 預測 $y$。

我們使用測試集test set)來評估模型性能如何,將輸入的設計矩 陣記作 $\textit{X}$(test),迴歸目標向量記作 $y$(test)。

迴歸任務常用的一種模型性能度量方法是計算模型在測試集上的 均方誤差(mean squared error)。如果 $\hat{y}$(test) 表示模型在測試集上的預測值,那麼均方誤差表示為:

$$ MSE_{test} = \frac{1}{m} \sum_{i}(\hat{y}^{(test)}-y^{(test)})_{i}^{2} \tag{5.4} $$

直觀上,當 $\hat{y}^{(test)}$ = $y^{(test)}$ 時,我們會發現誤差降為 0。

圖 5.1 展示了線性迴歸算法的使用示例。

圖5.1-一個線性迴歸的例子

5.2 容量、過擬合和欠擬合

機器學習的挑戰主要在於算法如何在測試集(先前未觀測的新輸入數據)上表現良好,而不只是在訓練集上表現良好,即訓練誤差和泛化誤差讀比較小,也可理解為算法泛化性比較好。所謂泛化性(generalized)好指的是,算法在在測試集(以前未觀察到的輸入)上表現良好。

機器學習算法的兩個主要挑戰是: 欠擬合underfitting)和過擬合overfitting)。 - 欠擬合是指模型不能在訓練集上獲得足夠低的誤差。 - 而過擬合是指訓練誤差和和測試誤差之間的差距太大。

通過調整模型的容量capacity),我們可以控制模型是否偏向於過擬合或者欠擬合。通俗地講,模型的容量是指其擬合各種函數的能力。容量低的模型可能很難擬合訓練集,容量高的模型可能會過擬合,因為記住了不適用於測試集的訓練集性質。

一種控制訓練算法容量的方法是選擇假設空間(hypothesis space),即學習算法可以選擇作為解決方案的函數集。例如,線性迴歸算法將其輸入的所有線性函數的集合作為其假設空間。我們可以推廣線性迴歸以在其假設空間中包含多項式,而不僅僅是線性函數。這樣做就增加模型的容量。

注意,學習算法的效果不僅很大程度上受影響於假設空間的函數數量,也取決於這些函數的具體形式。

當機器學習算法的容量適合於所執行任務的複雜度和所提供訓練數據的數量時,算法效果通常會最佳。容量不足的模型不能解決複雜任務。容量高的模型能夠解決複雜的任務,但是當其容量高於任務所需時,有可能會過擬合。

圖 5.2 展示了上述原理的使用情況。我們比較了線性,二次和 9 次預測器擬合真實二次函數的效果。

圖5-2三個模型擬合二次函數

提高機器學習模型泛化性的早期思想是奧卡姆剃刀原則,即選擇“最簡單”的那一個模型。

統計學習理論提供了量化模型容量的不同方法。在這些中,最有名的是 Vapnik- Chervonenkis 維度(Vapnik-Chervonenkis dimension, VC)。VC 維度量二元分類 器的容量。VC 維定義為該分類器能夠分類的訓練樣本的最大數目。假設存在 $m$ 個 不同 $x$ 點的訓練集,分類器可以任意地標記該 $m$ 個不同的 $x$ 點,VC 維被定義為 $m$ 的最大可能值。

因為可以量化模型的容量,所以使得統計學習理論可以進行量化預測。統計學習理論中最重要的結論闡述了訓練誤差和泛化誤差之間差異的上界隨着模型容量增長而增長,但隨着訓練樣本增多而下降 (Vapnik and Chervonenkis, 1971; Vapnik, 1982; Blumer et al., 1989; Vapnik, 1995)。這些邊界為機器學習算法可以有效解決問題提供了理論 驗證,但是它們很少應用於實際中的深度學習算法。一部分原因是邊界太鬆,另一部分原因是很難確定深度學習算法的容量。由於有效容量受限於優化算法的能力,所以確定深度學習模型容量的問題特別困難。而且我們對深度學習中涉及的非常普遍的非凸優化問題的理論瞭解很少。

雖然更簡單的函數更可能泛化(訓練誤差和測試誤差的差距小),但我們仍然必須選擇一個足夠複雜的假設來實現低訓練誤差。通常,隨着模型容量的增加,訓練誤差會減小,直到它逐漸接近最小可能的誤差值(假設誤差度量具有最小值)。通常,泛化誤差是一個關於模型容量的 U 形曲線函數。如下圖 5.3 所示。

容量和誤差之間的典型關係

5.2.1 沒有免費午餐定理

機器學習的沒有免費午餐定理Wolpert,1996)指出,對所有可能的數據生成分佈進行平均,每個分類算法在對以前未觀察到的點進行分類時具有相同的錯誤率。換句話説,在某種意義上,沒有任何機器學習算法普遍優於其他任何算法

上述這個結論聽着真的讓人傷感,但慶幸的是,這些結論僅在我們考慮所有可能的數據生成分佈時才成立。如果我們對實際應用中遇到的概率分佈類型做出假設,那麼我們可以設計出在這些分佈上表現良好的學習算法

這意味着機器學習研究的目標不是找一個通用學習算法或是絕對最好的學習算法。反之,我們的目標是理解什麼樣的分佈與人工智能獲取經驗的 “真實世界” 相關,什麼樣的學習算法在我們關注的數據生成分佈上效果最好

總結:沒有免費午餐定理清楚地闡述了沒有最優的學習算法,即暗示我們必須在特定任務上設計性能良好的機器學習算法。

5.2.2 正則化

所謂正則化,是指我們通過修改學習算法,使其降低泛化誤差而非訓練誤差的方法。

正則化是一種思想(策略),它是機器學習領域的中心問題之一,其重要性只有優化能與其相媲美。

一般地,正則化一個學習函數 $f(x;\theta)$ 的模型,我們可以給代價函數添加被稱為正則化項(regularizer)的懲罰。如果正則化項是 $\Omega(w) = w^{\top}w$,則稱為權重衰減(weight decay)。

例如,我們可以加入權重衰減(weight decay)來修改線性迴歸的目標函數,如偏好於平方 $L^2$ 範數較小權重的目標函數形式:

$$ J(w) = MSE_{train} + \lambda w^{⊤}w \tag{5.18} $$

其中 $J(w)$ 是目標函數,$w$ 是權重參數。$\lambda$ 是超參數,需提前設置,其控制我們對較小權重的偏好強度。當 $\lambda = 0$,我們沒有任何偏好。$\lambda$ 越大,則權重越小。最小化 $J(w)$ 會導致權重的選擇在擬合訓練數據和較小權重之間進行權衡

和上一節沒有最優的學習算法一樣,一樣的,也沒有最優的正則化形式。反之,我們必須挑選一個非常適合於我們所要解決的任務的正則形式。

5.3 超參數和驗證集

超參數的值不是通過學習算法本身學習出來的,而是需要算法定義者手動指定的

5.3.1 驗證集的作用

通常,80% 的訓練數據用於訓練,20% 用於驗證。驗證集是用於估計訓練中或訓練後的泛化誤差,從而更新超參數

5.3.2 交叉驗證

一個小規模的測試集意味着平均測試誤差估計的統計不確定性,使得很難判斷算法 A 是否比算法 B 在給定的任務上做得更好。解決辦法是基於在原始數據上隨機採樣或分離出的不同數據集上重複訓練和測試,最常見的就是 $k$-折交叉驗證,即將數據集分成 $k$ 個 不重合的子集。測試誤差可以估計為 $k$ 次計算後的平均測試誤差。在第 $i$ 次測試時, 數據的第 $i$ 個子集用於測試集,其他的數據用於訓練集。算法過程如下所示。

k 折交叉驗證雖然一定程度上可以解決小數據集上測試誤差的不確定性問題,但代價則是增加了計算量。

k-折交叉驗證算法

5.4 估計、偏差和方差

統計領域為我們提供了很多工具來實現機器學習目標,不僅可以解決訓練集上 的任務,還可以泛化。基本的概念,例如參數估計、偏差和方差,對於正式地刻畫泛化、欠擬合和過擬合都非常有幫助。

5.4.1 點估計

這裏的點估計、估計量實質上就是模型參數最優預測值。

點估計試圖為一些感興趣的量提供單個 ‘‘最優’’ 預測。一般地,感興趣的量可以是單個參數也可以是一個向量參數,例如第 5.1.4 節線性迴歸中的權重,但是也有可能是整個函數。

為了區分參數估計和真實值,我們習慣將參數 $\theta$ 的點估計表示為 $\hat{\theta}$。

令 ${x^{(1)}, . . . , x^{(m)}}$ 是 $m$ 個獨立同分布(i.i.d.)的數據點。 點估計(point esti-mator)或統計量(statistics)是這些數據的任意函數: $$ \hat{\theta_m} =g(x^{(1)},...,x^{(m)}). \tag{5.19} $$

5.4.2 偏差

估計的偏差定義如下: $$ bias(\hat{\theta_m}) = E(\hat{\theta_m}) − \theta, \tag{5.19} $$ 其中期望作用在所有數據(看作是從隨機變量採樣得到的)上,$\hat{\theta}$ 是用於定義數據生成分佈的 $\theta$ 的真實值。如果 $bias(\hat{\theta_m}) = 0$,那麼估計量 $\hat{\theta_m}$ 則被稱為是無偏 (unbiased),同時意味着 $E(\hat{\theta_m}) = \theta$。

5.4.3 方差和標準差

方差記為 $Var(\hat{\theta})$ 或 $\sigma^{2}$,方差的平方根被稱為標準差。

5.4.4 權衡偏差和方差以最小化均方誤差

偏差和方差度量着估計量的兩個不同誤差來源。偏差度量着偏離真實函數或參數的誤差期望。而方差度量着數據上任意特定採樣可能導致的估計期望的偏差。

偏差和方差的關係和機器學習容量、欠擬合和過擬合的概念緊密相聯。用 MSE 度量泛化誤差(偏差和方差對於泛化誤差都是有意義的)時,增加容量會增加方差,降低偏差。如圖 5.6 所示,我們再次在關於容量的函數中,看到泛化誤差的 U 形曲線。

偏差方差泛化誤差和模型容量的關係

5.5,最大似然估計

與其猜測某個函數可能是一個好的估計器,然後分析它的偏差和方差,我們更希望有一些原則,我們可以從中推導出特定的函數,這些函數是不同模型的良好估計器。最大似然估計就是其中最為常用的準則。

5.6 貝葉斯統計

到目前為止,我們已經描述了頻率統計(frequentist statistics)和基於估計單一 $\theta$ 值的方法,然後基於該估計作所有的預測。 另一種方法是在進行預測時考慮所有可能的 $\theta$ 值。 後者屬於貝葉斯統計(Bayesian statistics)的範疇。

如 5.4.1 節中討論的,頻率派的視角是真實參數 $\theta$ 是未知的定值,而點估計 $\hat{\theta}$ 是考慮數據集上函數(可以看作是隨機的)的隨機變量。

貝葉斯統計的視角完全不同。貝葉斯用概率反映知識狀態的確定性程度。數據集能夠被直接觀測到,因此不是隨機的。另一方面,真實參數 $\theta$ 是未知或不確定的, 因此可以表示成隨機變量。

5.7 監督學習算法

回顧 5.1.3 節內容,簡單來説,監督學習算法是給定一組輸入 $x$ 和輸出 $y$ 的訓練 集,學習如何關聯輸入和輸出。在許多情況下,輸出 $y$ 可能難以自動收集,必須由人類“監督者”提供,但即使訓練集目標是自動收集的,該術語仍然適用。

5.8 無監督學習算法

回顧第5.1.3節,無監督算法只處理 “特徵’’,不操作監督信號。監督和無監督算法之間的區別沒有規範嚴格的定義,因為沒有客觀的測試來區分一個值是特徵還是監督者提供的目標。通俗地説,無監督學習的大多數嘗試是指從不需要人為註釋的樣本的分佈中提取信息。該術語通常與密度估計相關,學習從分佈中採樣、學習從分佈中去噪、尋找數據分佈的流形或是將數據中相關的樣本聚類。

5.8.1 PCA 降維

PCA(Principal Component Analysis)是學習數據表示的無監督學習算法,常用於高維數據的降維,可用於提取數據的主要特徵分量。

PCA 的數學推導可以從最大可分型和最近重構性兩方面進行,前者的優化條件為劃分後方差最大,後者的優化條件為點到劃分平面距離最小。

5.8.2 k-均值聚類

另外一個簡單的表示學習算法是 $k$-均值聚類。$k$-均值聚類算法將訓練集分成 $k$ 個靠近彼此的不同樣本聚類。因此我們可以認為該算法提供了 $k$-維的 one-hot 編碼向量 $h$ 以表示輸入 $x$。當 $x$ 屬於聚類 $i$ 時,有 $h_i = 1$,$h$ 的其他項為零。

$k$-均值聚類初始化 k 個不同的中心點 ${μ^{(1)}, . . . , μ^{(k)}}$,然後迭代交換以下兩個不同的步驟直到算法收斂。

  1. 步驟一,每個訓練樣本分配到最近的中心點 $μ^{(i) }$ 所代表的聚類 $i$。
  2. 步驟二,每一箇中心點 $μ^{(i) }$ 更新為聚類 $i$ 中所有訓練樣本 $x^{(j)}$ 的均值。

關於聚類的一個問題是聚類問題本身是病態的。這是説沒有單一的標準去度量聚類的數據在真實世界中效果如何。我們可以度量聚類的性質,例如類中元素到類中心點的歐幾里得距離的均值。這使我們可以判斷從聚類分配中重建訓練數據的效果如何。然而我們不知道聚類的性質是否很好地對應到真實世界的性質。此外,可能有許多不同的聚類都能很好地對應到現實世界的某些屬性。我們可能希望找到和 一個特徵相關的聚類,但是得到了一個和任務無關的,同樣是合理的不同聚類。

例如,假設我們在包含紅色卡車圖片、紅色汽車圖片、灰色卡車圖片和灰色汽車圖片的數據集上運行兩個聚類算法。如果每個聚類算法聚兩類,那麼可能一個算法將汽車和卡車各聚一類,另一個根據紅色和灰色各聚一類。假設我們還運行了第三個聚類算法,用來決定類別的數目。這有可能聚成了四類,紅色卡車、紅色汽車、灰色卡 車和灰色汽車。現在這個新的聚類至少抓住了屬性的信息,但是丟失了相似性信息。 紅色汽車和灰色汽車在不同的類中,正如紅色汽車和灰色卡車也在不同的類中。該聚類算法沒有告訴我們灰色汽車和紅色汽車的相似度比灰色卡車和紅色汽車的相似度更高,我們只知道它們是不同的。

5.9 隨機梯度下降

幾乎所有的深度學習算法都用到了一個非常重要的優化算法: 隨機梯度下降 (stochastic gradient descent, SGD)。

機器學習中反覆出現的一個問題是好的泛化需要大的訓練集,但大的訓練集的 計算代價也更大。

機器學習算法中的代價函數通常可以分解成每個樣本的代價函數的總和。

sgd

隨機梯度下降的核心是,梯度是期望,而期望可使用小規模的樣本近似估計。具體來説,在算法的每一步,我們從訓練集中均勻抽出一小批量(minibatch)樣本 $B={x^{(1)},...,x^{(m′)}}$。小批量的數目 $m′$ 通常是一個相對較小的數,一般為 $2^n$(取決於顯卡顯卡)。重要的是,當訓練集大小 m 增長時,$m′$ 通常是固定的。我們可能在擬合幾十億的樣本時,但每次更新計算只用到幾百個樣本。

sgd2

梯度下降往往被認為很慢或不可靠。以前,將梯度下降應用到非凸優化問題被認為很魯莽或沒有原則。但現在,我們知道梯度下降用於深度神經網絡模型的訓練時效果是不錯的。優化算法不一定能保證在合理的時間內達到一個局部最小值,但它通常能及時地找到代價函數一個很小的值,並且是有用的。

隨機梯度下降在深度學習之外有很多重要的應用。它是在大規模數據上訓練大型線性模型的主要方法。對於固定大小的模型,每一步隨機梯度下降更新的計算量 不取決於訓練集的大小 m。在實踐中,當訓練集大小增長時,我們通常會使用一個更大的模型,但這並非是必須的。達到收斂所需的更新次數通常會隨訓練集規模增大而增加。然而,當 m 趨向於無窮大時,該模型最終會在隨機梯度下降抽樣完訓練 集上的所有樣本之前收斂到可能的最優測試誤差。繼續增加 m 不會延長達到模型可能的最優測試誤差的時間。從這點來看,我們可以認為用 SGD 訓練模型的漸近代價是關於 m 的函數的 $O(1)$ 級別。

5.10 構建機器學習算法 pipeline

幾乎所有的深度學習算法都可以被描述為一個相當簡單的 pipeline:

  1. 特定的數據集
  2. 代價函數
  3. 優化過程
  4. 神經網絡模型。

參考資料