《Scikit-Learn與TensorFlow機(jī)器學(xué)習(xí)實(shí)用指南》 第04章 訓(xùn)練模型


(第一部分 機(jī)器學(xué)習(xí)基礎(chǔ))
第01章 機(jī)器學(xué)習(xí)概覽
第02章 一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(上)
第02章 一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(下)
第03章 分類
第04章 訓(xùn)練模型
第05章 支持向量機(jī)
第06章 決策樹
第07章 集成學(xué)習(xí)和隨機(jī)森林
第08章 降維
(第二部分 神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí))
第9章 啟動(dòng)和運(yùn)行TensorFlow
第10章 人工神經(jīng)網(wǎng)絡(luò)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(上)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(下)
第12章 設(shè)備和服務(wù)器上的分布式 TensorFlow
第13章 卷積神經(jīng)網(wǎng)絡(luò)
第14章 循環(huán)神經(jīng)網(wǎng)絡(luò)
第15章 自編碼器
第16章 強(qiáng)化學(xué)習(xí)(上)
第16章 強(qiáng)化學(xué)習(xí)(下)


在之前的描述中船响,我們通常把機(jī)器學(xué)習(xí)模型和訓(xùn)練算法當(dāng)作黑箱來處理。如果你動(dòng)手練習(xí)過前幾章的一些示例裙犹,就能驚奇地發(fā)現(xiàn)優(yōu)化回歸系統(tǒng)萍聊、改進(jìn)數(shù)字圖像的分類器削葱、甚至可以零基礎(chǔ)搭建一個(gè)垃圾郵件的分類器仔粥,但是卻對(duì)它們內(nèi)部的工作流程一無所知蚓挤。事實(shí)上萨驶,許多場(chǎng)合你都不需要知道這些黑箱子的內(nèi)部有什么,干了什么进肯。

然而激蹲,如果你對(duì)其內(nèi)部的工作流程有一定了解的話,當(dāng)面對(duì)一個(gè)機(jī)器學(xué)習(xí)任務(wù)時(shí)候江掩,這些理論可以幫助你快速的找到恰當(dāng)?shù)臋C(jī)器學(xué)習(xí)模型学辱,合適的訓(xùn)練算法、以及一個(gè)好的假設(shè)集环形。同時(shí)策泣,了解黑箱子內(nèi)部的構(gòu)成,有助于你更好地調(diào)試參數(shù)以及更有效地分析誤差抬吟。本章討論的大部分話題對(duì)于機(jī)器學(xué)習(xí)模型的理解萨咕,構(gòu)建,以及神經(jīng)網(wǎng)絡(luò)(詳細(xì)參考本書的第二部分)的訓(xùn)練都是非常重要的火本。

首先我們將以一個(gè)簡單的線性回歸模型為例危队,討論兩種不同的訓(xùn)練方法來得到模型的最優(yōu)解:

  • 直接使用封閉方程進(jìn)行求根運(yùn)算,得到模型在當(dāng)前訓(xùn)練集上的最優(yōu)參數(shù)(即在訓(xùn)練集上使損失函數(shù)達(dá)到最小值的模型參數(shù))

  • 使用迭代優(yōu)化方法:梯度下降(GD)钙畔,在訓(xùn)練集上茫陆,它可以逐漸調(diào)整模型參數(shù)以獲得最小的損失函數(shù),最終擎析,參數(shù)會(huì)收斂到和第一種方法相同的的值簿盅。同時(shí),我們也會(huì)介紹一些梯度下降的變體形式:批量梯度下降(Batch GD)、小批量梯度下降(Mini-batch GD)挪鹏、隨機(jī)梯度下降(Stochastic GD)见秽,在第二部分的神經(jīng)網(wǎng)絡(luò)部分,我們會(huì)多次使用它們讨盒。

接下來,我們將研究一個(gè)更復(fù)雜的模型:多項(xiàng)式回歸步责,它可以擬合非線性數(shù)據(jù)集返顺,由于它比線性模型擁有更多的參數(shù),更容易出現(xiàn)模型的過擬合蔓肯。因此遂鹊,我們將介紹如何通過學(xué)習(xí)曲線去判斷模型是否出現(xiàn)了過擬合,并介紹幾種正則化方法以減少模型出現(xiàn)過擬合的風(fēng)險(xiǎn)蔗包。

最后秉扑,我們將介紹兩個(gè)常用于分類的模型:Logistic回歸和Softmax回歸。

提示

本章包含許多數(shù)學(xué)公式调限,以及一些線性代數(shù)和微積分基本概念舟陆。為了理解這些公式,你需要知道什么是向量耻矮,什么是矩陣秦躯,以及它們直接是如何轉(zhuǎn)化的,以及什么是點(diǎn)積裆装,什么是矩陣的逆踱承,什么是偏導(dǎo)數(shù)。如果你對(duì)這些不是很熟悉的話哨免,你可以閱讀本書提供的 Jupyter 在線筆記茎活,它包括了線性代數(shù)和微積分的入門指導(dǎo)。對(duì)于那些不喜歡數(shù)學(xué)的人琢唾,你也應(yīng)該快速簡單的瀏覽這些公式载荔。希望它足以幫助你理解大多數(shù)的概念。

線性回歸

在第一章慧耍,我們介紹了一個(gè)簡單的生活滿意度回歸模型:life_satisfaction = θ0 + θ1 x GDP_per_capita

這個(gè)模型僅僅是輸入量GDP_per_capita的線性函數(shù)身辨,θ0 和θ1是這個(gè)模型的參數(shù),線性模型更一般化的描述指通過計(jì)算輸入變量的加權(quán)和芍碧,并加上一個(gè)常數(shù)偏置項(xiàng)(截距項(xiàng))來得到一個(gè)預(yù)測(cè)值煌珊。如公式 4-1:

公式 4-1:線性回歸預(yù)測(cè)模型

\hat{y} = \theta _{0} + \theta _{1}x _{1}+\theta _{2}x _{2}+\dots+\theta _{n}x _{n}

  • ?表示預(yù)測(cè)結(jié)果
  • n表示特征的個(gè)數(shù)
  • xi 表示第ith 個(gè)特征的值
  • θj表示第jth個(gè)參數(shù)(包括偏置項(xiàng) θ0和特征權(quán)重值θ0

上述公式可以寫成更為簡潔的向量形式,如公式 4-2:

公式 4-2:線性回歸預(yù)測(cè)模型(向量形式)

\hat{y} = h _{\theta} (\mathbf{x})= \theta^T \cdot \mathbf{x}

  • θ表示模型的參數(shù)向量泌豆,包括偏置項(xiàng)θ0和特征權(quán)重值θ1到θn定庵;
  • θT表示向量θ的轉(zhuǎn)置(行向量變?yōu)榱肆邢蛄浚?/li>
  • x為每個(gè)樣本實(shí)例的特征值向量,包括x0到xn,x0恒為 1蔬浙;
  • θT· x表示θT和x的點(diǎn)積猪落;
  • hθ表示參數(shù)為θ的假設(shè)函數(shù)。

怎么樣去訓(xùn)練一個(gè)線性回歸模型呢畴博?好吧笨忌,回想一下俱病,訓(xùn)練一個(gè)模型指的是設(shè)置模型的參數(shù)使得這個(gè)模型在訓(xùn)練集的表現(xiàn)較好官疲。為此,我們首先需要找到一個(gè)衡量模型好壞的評(píng)定方法亮隙。在第二章途凫,我們介紹到在回歸模型上,最常見的評(píng)定標(biāo)準(zhǔn)是均方根誤差(RMSE溢吻,詳見公式 2-1)维费。因此,為了訓(xùn)練一個(gè)線性回歸模型促王,你需要找到一個(gè)θ值犀盟,可使均方根誤差(標(biāo)準(zhǔn)誤差)最小。實(shí)踐過程中硼砰,最小化均方誤差比最小化均方根誤差更加簡單且蓬,這兩個(gè)過程會(huì)得到相同的θ,因?yàn)楹瘮?shù)在最小值時(shí)候的自變量题翰,同樣能使函數(shù)的方根運(yùn)算得到最小值恶阴。

在訓(xùn)練集X上使用公式 4-3 來計(jì)算線性回歸假設(shè)hθ的均方差MSE。

公式 4-3:線性回歸模型的 MSE 損失函數(shù)

MSE (\mathbf{X},h_{\theta}) = \frac{1}{m} \sum\limits_{i=1}^m{\left(\theta^T \cdot \mathbf{x}^{(i)}-y^{(i)}\right)}^2

公式中符號(hào)的含義大多數(shù)都在第二章(詳見“符號(hào)”)進(jìn)行了說明豹障,不同的是:為了突出模型的參數(shù)向量θ冯事,使用hθ來代替h。以后的使用中為了公式的簡潔血公,使用MSE(θ)來代替MSE(X,hθ)昵仅。

正態(tài)方程

為了找到最小化損失函數(shù)的θ值,可以采用公式解累魔,換句話說摔笤,就是可以通過解正態(tài)方程直接得到最后的結(jié)果。

公式 4-4:正態(tài)方程

\hat{\theta} = ({\mathbf{X}}^T\cdot\mathbf{X})^{-1}\cdot{\mathbf{X}}^T\cdot\mathbf{y}

  • θ hat是最小化損失函數(shù)的θ 值
  • y是目標(biāo)值的向量垦写,目標(biāo)值包含了y(1)到y(tǒng)(m)

讓我們生成一些近似線性的數(shù)據(jù)(如圖 4-1)來測(cè)試一下這個(gè)方程:

import numpy as np 
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
圖 4-1:隨機(jī)線性數(shù)據(jù)集

現(xiàn)在讓我們使用正態(tài)方程來計(jì)算θ hat吕世,我們使用 Numpy 的線性代數(shù)模塊(np.linalg)中的inv()函數(shù)來計(jì)算矩陣的逆,以及dot()方法來計(jì)算矩陣的乘法梯投。

X_b = np.c_[np.ones((100, 1)), X] 
theta_best = np.linalg.inv(X_b.T.dot(X_B)).dot(X_b.T).dot(y)

用來生成數(shù)據(jù)的函數(shù)是y = 4 + 3x0 + 高斯噪聲命辖。讓我們看一下最后的計(jì)算結(jié)果况毅。

>>> theta_best
array([[4.21509616],[2.77011339]])

我們希望最后得到的參數(shù)為θ0 = 4,θ1 = 3而不是 θ0 = 3.865尔艇,θ1 = 3.139尔许。這已經(jīng)足夠了,由于存在噪聲终娃,參數(shù)不可能達(dá)到到原始函數(shù)的值味廊。

現(xiàn)在我們能夠使用θ hat來進(jìn)行預(yù)測(cè):

>>> X_new = np.array([[0],[2]])
>>> X_new_b = np.c_[np.ones((2, 1)), X_new]
>>> y_predict = X_new_b.dot(theta.best)
>>> y_predict
array([[4.21509616],[9.75532293]])

畫出這個(gè)模型的圖像,如圖 4-2:

plt.plot(X_new,y_predict,"r-")
plt.plot(X,y,"b.")
plt.axis([0,2,0,15])
plt.show()
圖4-2:線性回歸預(yù)測(cè)

使用下面的 Scikit-Learn 代碼可以達(dá)到相同的效果:

>>> form sklearn.linear_model import LinearRegression
>>> lin_reg = LinearRegression()
>>> lin_reg.fit(X,y)
>>> lin_reg.intercept_, lin_reg.coef_
(array([4.21509616]),array([2.77011339]))
>>> lin_reg.predict(X_new)
array([[4.21509616],[9.75532293]])

計(jì)算復(fù)雜度

正態(tài)方程需要計(jì)算矩陣XT的逆棠耕。X是一個(gè)n x n的矩陣(n是特征的個(gè)數(shù))毡们。這樣一個(gè)矩陣求逆的運(yùn)算復(fù)雜度大約在O(n2.4)到O(n3)之間,具體值取決于計(jì)算方式昧辽。換句話說,如果你將你的特征個(gè)數(shù)翻倍的話登颓,其計(jì)算時(shí)間大概會(huì)變?yōu)樵瓉淼?22.4 = 5.3 到 23 = 8倍搅荞。

警告
當(dāng)特征的個(gè)數(shù)較大的時(shí)候(例如:特征數(shù)量為 100000),正態(tài)方程求解將會(huì)非常慢框咙。

有利的一面是咕痛,這個(gè)方程在訓(xùn)練集上對(duì)于每一個(gè)實(shí)例來說是線性的,其復(fù)雜度為O(m)喇嘱,因此只要有能放得下它的內(nèi)存空間茉贡,它就可以對(duì)大規(guī)模數(shù)據(jù)進(jìn)行訓(xùn)練。同時(shí)者铜,一旦你得到了線性回歸模型(通過解正態(tài)方程或者其他的算法)腔丧,進(jìn)行預(yù)測(cè)是非常快的作烟。因?yàn)槟P椭杏?jì)算復(fù)雜度對(duì)于要進(jìn)行預(yù)測(cè)的實(shí)例數(shù)量和特征個(gè)數(shù)都是線性的愉粤。 換句話說,當(dāng)實(shí)例個(gè)數(shù)變?yōu)樵瓉淼膬杀抖嗟臅r(shí)候(或特征個(gè)數(shù)變?yōu)樵瓉淼膬杀抖啵┠昧茫A(yù)測(cè)時(shí)間也僅僅是原來的兩倍多衣厘。

接下來,我們將介紹另一種方法去訓(xùn)練模型压恒。這種方法適合在特征個(gè)數(shù)非常多影暴,訓(xùn)練實(shí)例非常多,內(nèi)存無法滿足要求的時(shí)候使用探赫。

梯度下降

梯度下降是一種非常通用的優(yōu)化算法型宙,它能夠很好地解決一系列問題。梯度下降的整體思路是通過的迭代來逐漸調(diào)整參數(shù)使得損失函數(shù)達(dá)到最小值期吓。

假設(shè)濃霧下早歇,你迷失在了大山中倾芝,你只能感受到自己腳下的坡度。為了最快到達(dá)山底箭跳,一個(gè)最好的方法就是沿著坡度最陡的地方下山晨另。這其實(shí)就是梯度下降所做的:它計(jì)算誤差函數(shù)關(guān)于參數(shù)向量θ的局部梯度步势,同時(shí)它沿著梯度下降的方向進(jìn)行下一次迭代家浇。當(dāng)梯度值為零的時(shí)候,就達(dá)到了誤差函數(shù)最小值 矛物。

具體來說屉来,開始時(shí)路翻,需要選定一個(gè)隨機(jī)的θ(這個(gè)值稱為隨機(jī)初始值),然后逐漸去改進(jìn)它茄靠,每一次變化一小步茂契,每一步都嘗試降低損失函數(shù)(例如:均方差損失函數(shù)),直到算法收斂到一個(gè)最小值(如圖:4-3)慨绳。

圖 4-3:梯度下降

在梯度下降中一個(gè)重要的參數(shù)是步長掉冶,超參數(shù)學(xué)習(xí)率的值決定了步長的大小。如果學(xué)習(xí)率太小脐雪,必須經(jīng)過多次迭代厌小,算法才能收斂,這是非常耗時(shí)的(如圖 4-4)战秋。

圖 4-4:學(xué)習(xí)率過小

另一方面璧亚,如果學(xué)習(xí)率太大,你將跳過最低點(diǎn)脂信,到達(dá)山谷的另一面癣蟋,可能下一次的值比上一次還要大。這可能使的算法是發(fā)散的吉嚣,函數(shù)值變得越來越大梢薪,永遠(yuǎn)不可能找到一個(gè)好的答案(如圖 4-5)。

圖 4-5:學(xué)習(xí)率過大

最后尝哆,并不是所有的損失函數(shù)看起來都像一個(gè)規(guī)則的碗秉撇。它們可能是洞,山脊秋泄,高原和各種不規(guī)則的地形琐馆,使它們收斂到最小值非常的困難。 圖 4-6 顯示了梯度下降的兩個(gè)主要挑戰(zhàn):如果隨機(jī)初始值選在了圖像的左側(cè)恒序,則它將收斂到局部最小值瘦麸,這個(gè)值要比全局最小值要大。 如果它從右側(cè)開始歧胁,那么跨越高原將需要很長時(shí)間滋饲,如果你早早地結(jié)束訓(xùn)練厉碟,你將永遠(yuǎn)到不了全局最小值。

圖 4-6:梯度下降的陷阱

幸運(yùn)的是線性回歸模型的均方差損失函數(shù)是一個(gè)凸函數(shù)屠缭,這意味著如果你選擇曲線上的任意兩點(diǎn)箍鼓,這兩個(gè)點(diǎn)的連線不會(huì)與曲線發(fā)生交叉(譯者注:該線段不會(huì)與曲線有第三個(gè)交點(diǎn))。這意味著這個(gè)損失函數(shù)沒有局部最小值呵曹,僅僅只有一個(gè)全局最小值款咖。同時(shí)它也是一個(gè)斜率不能突變的連續(xù)函數(shù)。這兩個(gè)因素導(dǎo)致了一個(gè)好的結(jié)果:梯度下降可以無限接近全局最小值奄喂。(只要你訓(xùn)練時(shí)間足夠長铐殃,同時(shí)學(xué)習(xí)率不是太大 )。

事實(shí)上跨新,損失函數(shù)的圖像呈現(xiàn)碗狀富腊,但是不同特征的取值范圍相差較大的時(shí),這個(gè)碗可能是細(xì)長的域帐。圖 4-7 展示了梯度下降在不同訓(xùn)練集上的表現(xiàn)蟹肘。在左圖中,特征 1 和特征 2 有著相同的數(shù)值尺度俯树。在右圖中,特征 1 比特征2的取值要小的多贰盗,由于特征 1 較小许饿,因此損失函數(shù)改變時(shí),θ1 會(huì)有較大的變化舵盈,于是這個(gè)圖像會(huì)在θ1軸方向變得細(xì)長陋率。

圖 4-7:有無特征縮放的梯度下降

正如你看到的,左面的梯度下降可以直接快速地到達(dá)最小值秽晚,然而在右面的梯度下降第一次前進(jìn)的方向幾乎和全局最小值的方向垂直瓦糟,并且最后到達(dá)一個(gè)幾乎平坦的山谷,在平坦的山谷走了很長時(shí)間赴蝇。它最終會(huì)達(dá)到最小值菩浙,但它需要很長時(shí)間。

警告
當(dāng)我們使用梯度下降的時(shí)候句伶,應(yīng)該確保所有的特征有著相近的尺度范圍(例如:使用 Scikit Learn 的 StandardScaler類)劲蜻,否則它將需要很長的時(shí)間才能夠收斂。

這幅圖也表明了一個(gè)事實(shí):訓(xùn)練模型意味著找到一組模型參數(shù)考余,這組參數(shù)可以在訓(xùn)練集上使得損失函數(shù)最小先嬉。這是對(duì)于模型參數(shù)空間的搜索,模型的參數(shù)越多楚堤,參數(shù)空間的維度越多疫蔓,找到合適的參數(shù)越困難含懊。例如在300維的空間找到一枚針要比在三維空間里找到一枚針復(fù)雜的多。幸運(yùn)的是線性回歸模型的損失函數(shù)是凸函數(shù)衅胀,這個(gè)最優(yōu)參數(shù)一定在碗的底部岔乔。

批量梯度下降

使用梯度下降的過程中,你需要計(jì)算對(duì)于損失函數(shù)對(duì)每一個(gè)模型參數(shù)θj的梯度拗小。換句話說重罪,你需要計(jì)算當(dāng)θj變化一點(diǎn)點(diǎn)時(shí),損失函數(shù)改變了多少哀九。這稱為偏導(dǎo)數(shù)剿配,它就像當(dāng)你面對(duì)東方的時(shí)候問:"我腳下的坡度是多少?"阅束。然后面向北方的時(shí)候問同樣的問題(如果你能想象一個(gè)超過三維的宇宙呼胚,可以對(duì)所有的方向都這樣做)。公式 4-5 計(jì)算關(guān)于θj的損失函數(shù)的偏導(dǎo)數(shù)息裸,記為:\frac{\partial }{\partial \theta_j}MSE(\theta)

公式 4-5: 損失函數(shù)的偏導(dǎo)數(shù)

\frac{\partial }{\partial \theta_j}MSE(\theta)=\frac{2}{m} \sum\limits_{i=1}^m{\left(\theta^T \cdot \mathbf{x}^{(i)}-y^{(i)}\right)}{x_j}^{(i)}

為了避免單獨(dú)計(jì)算每一個(gè)梯度蝇更,你也可以使用公式 4-6 來一起計(jì)算它們。梯度向量記為?θMSE(θ) 呼盆,其包含了損失函數(shù)所有的偏導(dǎo)數(shù)(每個(gè)模型參數(shù)只出現(xiàn)一次)年扩。

公式4-6 損失函數(shù)的梯度向量

\nabla_{\theta}MSE(\theta)= \left(\begin{matrix} \frac{\partial }{\partial \theta_0}MSE(\theta)\\ \frac{\partial }{\partial \theta_1}MSE(\theta)\\ \vdots \\ \frac{\partial }{\partial \theta_n}MSE(\theta)\\ \end{matrix}\right)=\frac{2}{m}{\mathbf{X}}^T\cdot{(\mathbf{X}\cdot\theta-y)}

提示
在這個(gè)方程中每一步計(jì)算時(shí)都包含了整個(gè)訓(xùn)練集X,這也是為什么這個(gè)算法稱為批量梯度下降:每一次訓(xùn)練過程都使用所有的的訓(xùn)練數(shù)據(jù)访圃。因此厨幻,在大數(shù)據(jù)集上,其會(huì)變得相當(dāng)?shù)穆ǖ俏覀兘酉聛韺?huì)介紹更快的梯度下降算法)腿时。然而况脆,梯度下降的運(yùn)算規(guī)模和特征的數(shù)量成正比。訓(xùn)練一個(gè)數(shù)千個(gè)特征的線性回歸模型使用梯度下降要比使用正態(tài)方程快的多批糟。

一旦求得了方向是朝上的梯度向量格了,你就可以向著相反的方向向下。這意味著從θ中減去?θMSE(θ) 徽鼎。學(xué)習(xí)率η和梯度向量的積決定了下山時(shí)每一步的大小盛末,如公式 4-7。

公式 4-7:梯度下降步長

\theta^{(next\ step)}=\theta - \eta\nabla_{\theta}MSE(\theta)

讓我們看一下這個(gè)算法的應(yīng)用:

eta = 0.1 # 學(xué)習(xí)率
n_iterations = 1000
m = 100

theta = np.random.randn(2,1) # 隨機(jī)初始值

for iteration in range(n_iterations):
    gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
    theta = theta - eta * gradiens

這不是太難否淤,讓我們看一下最后的結(jié)果theta:

>>> theta
array([[4.21509616],[2.77011339]])

看满败!正態(tài)方程的表現(xiàn)非常好。完美地求出了梯度下降的參數(shù)叹括。但是當(dāng)你換一個(gè)學(xué)習(xí)率會(huì)發(fā)生什么算墨?圖 4-8 展示了使用了三個(gè)不同的學(xué)習(xí)率進(jìn)行梯度下降的前 10 步運(yùn)算(虛線代表起始位置)。

圖 4-8:不同學(xué)習(xí)率的梯度下降

在左面的那副圖中汁雷,學(xué)習(xí)率是最小的净嘀,算法幾乎不能求出最后的結(jié)果报咳,而且還會(huì)花費(fèi)大量時(shí)間。在中間的這幅圖中挖藏,學(xué)習(xí)率的表現(xiàn)看起來不錯(cuò)暑刃,僅僅幾次迭代后,它就收斂到了最后的結(jié)果膜眠。在右面的那副圖中岩臣,學(xué)習(xí)率太大了,算法是發(fā)散的宵膨,跳過了所有的訓(xùn)練樣本架谎,同時(shí)每一步都離正確的結(jié)果越來越遠(yuǎn)。

為了找到一個(gè)好的學(xué)習(xí)率辟躏,你可以使用網(wǎng)格搜索(詳見第二章)谷扣。當(dāng)然,你一般會(huì)限制迭代的次數(shù)捎琐,以便網(wǎng)格搜索可以消除模型需要很長時(shí)間才能收斂這一個(gè)問題会涎。

你可能想知道如何選取迭代的次數(shù)。如果它太小了瑞凑,當(dāng)算法停止的時(shí)候末秃,你依然沒有找到最優(yōu)解。如果它太大了籽御,算法會(huì)非常的耗時(shí)蛔溃,同時(shí)后來的迭代參數(shù)也不會(huì)發(fā)生改變。一個(gè)簡單的解決方法是:設(shè)置一個(gè)非常大的迭代次數(shù)篱蝇,當(dāng)梯度向量變得非常小的時(shí)候,結(jié)束迭代徽曲。非常小指的是:梯度向量小于一個(gè)值?(稱為容差)。這時(shí)候可以認(rèn)為梯度下降幾乎已經(jīng)達(dá)到了最小值涧衙。

收斂速率
當(dāng)損失函數(shù)是凸函數(shù)奥此,同時(shí)它的斜率不能突變(就像均方差損失函數(shù)那樣)稚虎,那么它的批量梯度下降算法固定學(xué)習(xí)率之后撤嫩,它的收斂速率是O(1/iterations)序攘。換句話說丈牢,如果你將容差 ?縮小 10 倍后(這樣可以得到一個(gè)更精確的結(jié)果)距境,這個(gè)算法的迭代次數(shù)大約會(huì)變成原來的 10 倍晶姊。

隨機(jī)梯度下降

批量梯度下降的主要問題是計(jì)算每一步的梯度時(shí)都需要使用整個(gè)訓(xùn)練集,這導(dǎo)致在規(guī)模較大的數(shù)據(jù)集上,會(huì)變得非常的慢忆蚀。與其完全相反的隨機(jī)梯度下降馋袜,在每一步的梯度計(jì)算上只隨機(jī)選取訓(xùn)練集中的一個(gè)樣本。很明顯泽台,由于每一次的操作都使用了非常少的數(shù)據(jù),這樣使得算法變得非常快竞滓。由于每一次迭代,只需要在內(nèi)存中有一個(gè)實(shí)例茶没,這使隨機(jī)梯度算法可以在大規(guī)模訓(xùn)練集上使用。

另一方面,由于它的隨機(jī)性,與批量梯度下降相比蜂嗽,其呈現(xiàn)出更多的不規(guī)律性:它到達(dá)最小值不是平緩的下降,損失函數(shù)會(huì)忽高忽低,只是在大體上呈下降趨勢(shì)。隨著時(shí)間的推移,它會(huì)非常的靠近最小值,但是它不會(huì)停止在一個(gè)值上惰拱,它會(huì)一直在這個(gè)值附近擺動(dòng)(如圖 4-9)。因此降传,當(dāng)算法停止的時(shí)候笔链,最后的參數(shù)還不錯(cuò)赞枕,但不是最優(yōu)值。

圖4-9:隨機(jī)梯度下降

當(dāng)損失函數(shù)很不規(guī)則時(shí)(如圖 4-6),隨機(jī)梯度下降算法能夠跳過局部最小值。因此肩狂,隨機(jī)梯度下降在尋找全局最小值上比批量梯度下降表現(xiàn)要好列粪。

雖然隨機(jī)性可以很好的跳過局部最優(yōu)值态蒂,但同時(shí)它卻不能達(dá)到最小值。解決這個(gè)難題的一個(gè)辦法是逐漸降低學(xué)習(xí)率泉懦。 開始時(shí),走的每一步較大(這有助于快速前進(jìn)同時(shí)跳過局部最小值),然后變得越來越小,從而使算法到達(dá)全局最小值鲸阻。 這個(gè)過程被稱為模擬退火奖年,因?yàn)樗愃朴谌廴诮饘俾鋮s的冶金學(xué)退火過程震贵。 決定每次迭代的學(xué)習(xí)率的函數(shù)稱為learning schedule。 如果學(xué)習(xí)速度降低得過快,你可能會(huì)陷入局部最小值,甚至在到達(dá)最小值的半路就停止了。 如果學(xué)習(xí)速度降低得太慢收恢,你可能在最小值的附近長時(shí)間擺動(dòng)硼补,同時(shí)如果過早停止訓(xùn)練离钝,最終只會(huì)出現(xiàn)次優(yōu)解鲤竹。

下面的代碼使用一個(gè)簡單的learning schedule來實(shí)現(xiàn)隨機(jī)梯度下降:

n_epochs = 50 
t0, t1 = 5, 50  #learning_schedule的超參數(shù)

def learning_schedule(t):
    return t0 / (t + t1)

theta = np.random.randn(2,1)

for epoch in range(n_epochs):
    for i in range(m):
        random_index = np.random.randint(m)
        xi = X_b[random_index:random_index+1]
        yi = y[random_index:random_index+1]
        gradients = 2 * xi.T.dot(xi,dot(theta)-yi)
        eta = learning_schedule(epoch * m + i)
        theta = theta - eta * gradiens

按習(xí)慣來講,我們進(jìn)行m輪的迭代痘拆,每一輪迭代被稱為一代勇边。在整個(gè)訓(xùn)練集上识颊,隨機(jī)梯度下降迭代了 1000 次時(shí)月杉,一般在第 50 次的時(shí)候就可以達(dá)到一個(gè)比較好的結(jié)果检号。

>>> theta
array([[4.21076011],[2.748560791]])

圖 4-10 展示了前 10 次的訓(xùn)練過程(注意每一步的不規(guī)則程度)。

圖 4-10:隨機(jī)梯度下降的前10次迭代

由于每個(gè)實(shí)例的選擇是隨機(jī)的,有的實(shí)例可能在每一代中都被選到,這樣其他的實(shí)例也可能一直不被選到。如果你想保證每一代迭代過程,算法可以遍歷所有實(shí)例,一種方法是將訓(xùn)練集打亂重排同仆,然后選擇一個(gè)實(shí)例,之后再繼續(xù)打亂重排,以此類推一直進(jìn)行下去。但是這樣收斂速度會(huì)非常的慢。

通過使用 Scikit-Learn 完成線性回歸的隨機(jī)梯度下降,你需要使用SGDRegressor類浪耘,這個(gè)類默認(rèn)優(yōu)化的是均方差損失函數(shù)。下面的代碼迭代了50次状原,初始學(xué)習(xí)率為0.1(eta0=0.1),使用默認(rèn)的learning schedule(與前面的不一樣),同時(shí)也沒有添加任何正則項(xiàng)(penalty = None):

from sklearn.linear_model import SGDRegressor
sgd_reg + SGDRregressor(n_iter=50, penalty=None, eta0=0.1)
sgd_reg.fit(X,y.ravel())

你可以再一次發(fā)現(xiàn),這個(gè)結(jié)果非常的接近正態(tài)方程的解:

>>> sgd_reg.intercept_, sgd_reg.coef_
(array([4.18380366]),array([2.74205299]))

小批量梯度下降

最后一個(gè)梯度下降算法,我們將介紹小批量梯度下降算法。一旦你理解了批量梯度下降和隨機(jī)梯度下降,再去理解小批量梯度下降是非常簡單的。在迭代的每一步筹裕,批量梯度使用整個(gè)訓(xùn)練集乐埠,隨機(jī)梯度時(shí)候用僅僅一個(gè)實(shí)例龙宏,在小批量梯度下降中徒像,它則使用一個(gè)隨機(jī)的小型實(shí)例集。它比隨機(jī)梯度的主要優(yōu)點(diǎn)在于你可以通過矩陣運(yùn)算的硬件優(yōu)化得到一個(gè)較好的訓(xùn)練效果,尤其當(dāng)你使用 GPU 進(jìn)行運(yùn)算的時(shí)候。

小批量梯度下降在參數(shù)空間上的表現(xiàn)比隨機(jī)梯度下降要好的多,尤其在有大量的小型實(shí)例集時(shí)。作為結(jié)果,小批量梯度下降會(huì)比隨機(jī)梯度更靠近最小值。但是,另一方面,它有可能陷在局部最小值中(在遇到局部最小值問題的情況下扒袖,和我們之前看到的線性回歸不一樣)描沟。 圖4-11顯示了訓(xùn)練期間三種梯度下降算法在參數(shù)空間中所采用的路徑。 他們都接近最小值啡省,但批量梯度的路徑最后停在了最小值,而隨機(jī)梯度和小批量梯度最后都在最小值附近擺動(dòng)。 但是,不要忘記返敬,批次梯度需要花費(fèi)大量時(shí)間來完成每一步遂庄,但是,如果你使用了一個(gè)較好的learning schedule劲赠,隨機(jī)梯度和小批量梯度也可以得到最小值。

圖 4-11:參數(shù)空間的梯度下降路徑

讓我比較一下目前我們已經(jīng)探討過的對(duì)線性回歸的梯度下降算法凛澎。如表 4-1 所示霹肝,其中m 表示訓(xùn)練樣本的個(gè)數(shù),n表示特征的個(gè)數(shù)塑煎。

表 4-1:比較線性回歸的不同梯度下降算法

提示
上述算法在完成訓(xùn)練后沫换,得到的參數(shù)基本沒什么不同,它們會(huì)得到非常相似的模型最铁,最后會(huì)以一樣的方式進(jìn)行預(yù)測(cè)苗沧。

多項(xiàng)式回歸

如果你的數(shù)據(jù)實(shí)際上比簡單的直線更復(fù)雜呢刊棕? 令人驚訝的是,你依然可以使用線性模型來擬合非線性數(shù)據(jù)待逞。 一個(gè)簡單的方法是對(duì)每個(gè)特征進(jìn)行加權(quán)后作為新的特征甥角,然后訓(xùn)練一個(gè)線性模型在這個(gè)擴(kuò)展的特征集。 這種方法稱為多項(xiàng)式回歸识樱。

讓我們看一個(gè)例子嗤无。 首先,我們根據(jù)一個(gè)簡單的二次方程(并加上一些噪聲怜庸,如圖 4-12)來生成一些非線性數(shù)據(jù):

m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(m, 1)
圖 4-12:生產(chǎn)加入噪聲的非線性數(shù)據(jù)

很清楚的看出当犯,直線不能恰當(dāng)?shù)臄M合這些數(shù)據(jù)。于是割疾,我們使用 Scikit-Learning 的PolynomialFeatures類進(jìn)行訓(xùn)練數(shù)據(jù)集的轉(zhuǎn)換嚎卫,讓訓(xùn)練集中每個(gè)特征的平方(2 次多項(xiàng)式)作為新特征(在這種情況下,僅存在一個(gè)特征):

>>> from sklearn.preprocessing import PolynomialFeatures
>>> poly_features = PolynomialFeatures(degree=2,include_bias=False)
>>> X_poly = poly_features.fit_transform(X)
>>> X[0]
array([-0.75275929])
>>> X_poly[0]
array([-0.75275929, 0.56664654])

X_poly現(xiàn)在包含原始特征X并加上了這個(gè)特征的平方X2『觊牛現(xiàn)在你可以在這個(gè)擴(kuò)展訓(xùn)練集上使用LinearRegression模型進(jìn)行擬合拓诸,如圖 4-13:

>>> lin_reg = LinearRegression()
>>> lin_reg.fit(X_poly, y)
>>> lin_reg.intercept_, lin_reg.coef_
(array([ 1.78134581]), array([[ 0.93366893, 0.56456263]]))
圖 4-13:多項(xiàng)式回歸模型預(yù)測(cè)

還是不錯(cuò)的,模型預(yù)測(cè)函數(shù)是\hat{y}=0.56x_1^2+0.93x_1+1.78麻昼,實(shí)際的原始函數(shù)是y=0.5x_1^2+1.0x_1+2.0奠支。

請(qǐng)注意,當(dāng)存在多個(gè)特征時(shí)抚芦,多項(xiàng)式回歸能夠找出特征之間的關(guān)系(這是普通線性回歸模型無法做到的)倍谜。 這是因?yàn)?code>LinearRegression會(huì)自動(dòng)添加當(dāng)前階數(shù)下特征的所有組合。例如叉抡,如果有兩個(gè)特征a和b尔崔,使用 3 階(degree=3)的LinearRegression時(shí),不僅有會(huì)有a2褥民、a3您旁、b2、b3轴捎,還會(huì)有組合項(xiàng)ab鹤盒、a2b、ab2侦副。

提示
PolynomialFeatures(degree=d)把一個(gè)包含n個(gè)特征的數(shù)組轉(zhuǎn)換為一個(gè)包含(n+d)!/d!n!個(gè)特征的數(shù)組侦锯,n!是n的階乘,等于1 × 2 × 3 × ? × n秦驯。小心大量特征的組合爆炸尺碰!

學(xué)習(xí)曲線

如果你使用一個(gè)高階的多項(xiàng)式回歸,你可能發(fā)現(xiàn)它的擬合程度要比普通的線性回歸要好的多。例如亲桥,圖 4-14 使用一個(gè) 300 階的多項(xiàng)式模型去擬合之前的數(shù)據(jù)集洛心,并同簡單線性回歸、2 階的多項(xiàng)式回歸進(jìn)行比較题篷。注意 300 階的多項(xiàng)式模型如何擺動(dòng)以盡可能接近訓(xùn)練實(shí)例词身。

圖 4-14:高階多項(xiàng)式回歸

當(dāng)然,這種高階多項(xiàng)式回歸模型在這個(gè)訓(xùn)練集上嚴(yán)重過擬合了番枚,線性模型則欠擬合法严。在這個(gè)訓(xùn)練集上,二次模型有著較好的泛化能力葫笼。那是因?yàn)樵谏蓴?shù)據(jù)時(shí)使用了二次模型深啤,但是一般我們不知道這個(gè)數(shù)據(jù)生成函數(shù)是什么,那我們?cè)撊绾螞Q定我們模型的復(fù)雜度呢路星?你如何區(qū)分你的模型是過擬合還是欠擬合溯街?

在第二章,你可以使用交叉驗(yàn)證來估計(jì)一個(gè)模型的泛化能力洋丐。如果一個(gè)模型在訓(xùn)練集上表現(xiàn)良好侵续,通過交叉驗(yàn)證指標(biāo)卻得出其泛化能力很差绳匀,那么你的模型就是過擬合了顶吮。如果在這兩方面都表現(xiàn)不好标锄,那么它就是欠擬合了侨嘀。這種方法可以告訴我們影晓,你的模型是太復(fù)雜還是太簡單了芳室。

另一種方法是觀察學(xué)習(xí)曲線:畫出模型在訓(xùn)練集上的表現(xiàn)侥钳,同時(shí)畫出以訓(xùn)練集規(guī)模為自變量的訓(xùn)練集函數(shù)涡相。為了得到圖像哲泊,需要在訓(xùn)練集的不同規(guī)模子集上進(jìn)行多次訓(xùn)練。下面的代碼定義了一個(gè)函數(shù)催蝗,用來畫出給定訓(xùn)練集后的模型學(xué)習(xí)曲線:

from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

def plot_learning_curves(model, X, y):
    X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2)
    train_errors, val_errors = [], []
    for m in range(1, len(X_train)):
        model.fit(X_train[:m], y_train[:m])
        y_train_predict = model.predict(X_train[:m])
        y_val_predict = model.predict(X_val)
        train_errors.append(mean_squared_error(y_train_predict, y_train[:m]))
        val_errors.append(mean_squared_error(y_val_predict, y_val))
plt.plot(np.sqrt(train_errors), "r-+", linewidth=2, label="train")
plt.plot(np.sqrt(val_errors), "b-", linewidth=3, label="val")

我們一起看一下簡單線性回歸模型的學(xué)習(xí)曲線(圖 4-15):

lin_reg = LinearRegression()
plot_learning_curves(lin_reg, X, y)
圖 4-15:學(xué)習(xí)曲線

這幅圖值得我們深究切威。首先,我們觀察在訓(xùn)練集上的效果:當(dāng)訓(xùn)練集只有一兩個(gè)樣本的時(shí)候丙号,模型能夠非常好的擬合它們先朦,這也是為什么曲線是從零開始的原因。但是當(dāng)加入了一些新的樣本的時(shí)候犬缨,訓(xùn)練集上的擬合程度變得難以接受喳魏,出現(xiàn)這種情況有兩個(gè)原因,一是因?yàn)閿?shù)據(jù)中含有噪聲怀薛,另一個(gè)是數(shù)據(jù)根本不是線性的刺彩。因此隨著數(shù)據(jù)規(guī)模的增大,誤差也會(huì)一直增大,直到達(dá)到高原地帶并趨于穩(wěn)定创倔,在之后嗡害,繼續(xù)加入新的樣本,模型的平均誤差不會(huì)變得更好或者更差畦攘。我們繼續(xù)來看模型在驗(yàn)證集上的表現(xiàn)霸妹,當(dāng)以非常少的樣本去訓(xùn)練時(shí),模型不能恰當(dāng)?shù)姆夯畎幔簿褪菫槭裁打?yàn)證誤差一開始是非常大的抑堡。當(dāng)訓(xùn)練樣本變多的到時(shí)候,模型學(xué)習(xí)的東西變多朗徊,驗(yàn)證誤差開始緩慢的下降首妖。但是一條直線不可能很好的擬合這些數(shù)據(jù),因此最后誤差會(huì)到達(dá)在一個(gè)高原地帶并趨于穩(wěn)定爷恳,最后和訓(xùn)練集的曲線非常接近有缆。

上面的曲線表現(xiàn)了一個(gè)典型的欠擬合模型,兩條曲線都到達(dá)高原地帶并趨于穩(wěn)定温亲,并且最后兩條曲線非常接近棚壁,同時(shí)誤差值非常大。

提示

如果你的模型在訓(xùn)練集上是欠擬合的栈虚,添加更多的樣本是沒用的袖外。你需要使用一個(gè)更復(fù)雜的模型或者找到更好的特征。

現(xiàn)在讓我們看一個(gè)在相同數(shù)據(jù)上10階多項(xiàng)式模型擬合的學(xué)習(xí)曲線(圖 4-16):

from sklearn.pipeline import Pipeline

polynomial_regression = Pipeline((
    ("poly_features", PolynomialFeatures(degree=10, include_bias=False)),
    ("sgd_reg", LinearRegression()),
))

plot_learning_curves(polynomial_regression, X, y)

這幅圖像和之前的有一點(diǎn)點(diǎn)像魂务,但是其有兩個(gè)非常重要的不同點(diǎn):

  • 在訓(xùn)練集上曼验,誤差要比線性回歸模型低的多。
  • 圖中的兩條曲線之間有間隔粘姜,這意味模型在訓(xùn)練集上的表現(xiàn)要比驗(yàn)證集上好的多鬓照,這也是模型過擬合的顯著特點(diǎn)。當(dāng)然孤紧,如果你使用了更大的訓(xùn)練數(shù)據(jù)豺裆,這兩條曲線最后會(huì)非常的接近。
圖4-16:多項(xiàng)式模型的學(xué)習(xí)曲線

提示
改善模型過擬合的一種方法是提供更多的訓(xùn)練數(shù)據(jù)号显,直到訓(xùn)練誤差和驗(yàn)證誤差相等臭猜。

偏差和方差的權(quán)衡

在統(tǒng)計(jì)和機(jī)器學(xué)習(xí)領(lǐng)域有個(gè)重要的理論:一個(gè)模型的泛化誤差由三個(gè)不同誤差的和決定:

  • 偏差:泛化誤差的這部分誤差是由于錯(cuò)誤的假設(shè)決定的。例如實(shí)際是一個(gè)二次模型押蚤,你卻假設(shè)了一個(gè)線性模型蔑歌。一個(gè)高偏差的模型最容易出現(xiàn)欠擬合。
  • 方差:這部分誤差是由于模型對(duì)訓(xùn)練數(shù)據(jù)的微小變化較為敏感活喊,一個(gè)多自由度的模型更容易有高的方差(例如一個(gè)高階多項(xiàng)式模型)丐膝,因此會(huì)導(dǎo)致模型過擬合量愧。
  • 不可約誤差:這部分誤差是由于數(shù)據(jù)本身的噪聲決定的。降低這部分誤差的唯一方法就是進(jìn)行數(shù)據(jù)清洗(例如:修復(fù)數(shù)據(jù)源帅矗,修復(fù)壞的傳感器偎肃,識(shí)別和剔除異常值)。

線性模型的正則化

正如我們?cè)诘谝缓偷诙驴吹降哪菢踊氪耍档湍P偷倪^擬合的好方法是正則化這個(gè)模型(即限制它):模型有越少的自由度累颂,就越難以擬合數(shù)據(jù)。例如凛俱,正則化一個(gè)多項(xiàng)式模型紊馏,一個(gè)簡單的方法就是減少多項(xiàng)式的階數(shù)。

對(duì)于一個(gè)線性模型蒲犬,正則化的典型實(shí)現(xiàn)就是約束模型中參數(shù)的權(quán)重朱监。 接下來我們將介紹三種不同約束權(quán)重的方法:嶺回歸,Lasso回歸和彈性網(wǎng)絡(luò)(Elastic Net)原叮。

嶺(Ridge)回歸

嶺回歸(也稱為 Tikhonov 正則化)是線性回歸的正則化版:在損失函數(shù)上直接加上一個(gè)正則項(xiàng)\alpha\sum_{i=1}^n\theta_i^2赫编。這使得學(xué)習(xí)算法不僅能夠擬合數(shù)據(jù),而且能夠使模型的參數(shù)權(quán)重盡量的小奋隶。注意到這個(gè)正則項(xiàng)只有在訓(xùn)練過程中才會(huì)被加到損失函數(shù)擂送。當(dāng)?shù)玫酵瓿捎?xùn)練的模型后,我們應(yīng)該使用沒有正則化的測(cè)量方法去評(píng)價(jià)模型的表現(xiàn)唯欣。

筆記
一般情況下嘹吨,訓(xùn)練過程使用的損失函數(shù)和測(cè)試過程使用的評(píng)價(jià)函數(shù)是不一樣的。除了正則化境氢,還有一個(gè)不同:訓(xùn)練時(shí)的損失函數(shù)應(yīng)該在優(yōu)化過程中易于求導(dǎo)蟀拷,而在測(cè)試過程中,評(píng)價(jià)函數(shù)更應(yīng)該接近最后的客觀表現(xiàn)产还。一個(gè)好的例子:在分類訓(xùn)練中我們使用對(duì)數(shù)損失(馬上我們會(huì)討論它)作為損失函數(shù)匹厘,但是我們卻使用精確率/召回率來作為它的評(píng)價(jià)函數(shù)嘀趟。

超參數(shù)α決定了你想正則化這個(gè)模型的強(qiáng)度脐区。如果α=0那此時(shí)的嶺回歸便變?yōu)榱司€性回歸。如果α非常的大她按,所有的權(quán)重最后都接近于零牛隅,最后結(jié)果將是一條穿過數(shù)據(jù)平均值的水平直線。公式 4-8 是嶺回歸的損失函數(shù):

公式 4-8:嶺回歸損失函數(shù)

J(\theta)=MSE(\theta)+\alpha\frac{1}{2}\sum\limits_{i=1}^n\theta_i^2

值得注意的是偏差項(xiàng)\theta_0是沒有被正則化的(累加運(yùn)算的開始是i=1而不是i=0酌泰。如果定義w作為特征權(quán)重(\theta_1\theta_n)的向量媒佣,那么正則項(xiàng)可以簡寫成 \frac{1}{2}{({// \mathbf{w}//_2})}^2,其中 http:// \cdot //_2 表示權(quán)重向量的 \ell_2范數(shù)陵刹。對(duì)于梯度下降來說僅僅在均方差梯度向量(公式 4-6)加上一項(xiàng) \alpha\mathbf{w}默伍。

提示
在使用嶺回歸前,對(duì)數(shù)據(jù)進(jìn)行放縮(可以使用StandardScaler)是非常重要的,算法對(duì)于輸入特征的數(shù)值尺度(scale)非常敏感也糊。大多數(shù)的正則化模型都是這樣的炼蹦。

圖 4-17 展示了在相同線性數(shù)據(jù)上使用不同α值的嶺回歸模型最后的表現(xiàn)。左圖中狸剃,使用簡單的嶺回歸模型掐隐,最后得到了線性的預(yù)測(cè)。右圖中的數(shù)據(jù)首先使用 10 階的PolynomialFearures進(jìn)行擴(kuò)展钞馁,然后使用StandardScaler進(jìn)行縮放虑省,最后將嶺模型應(yīng)用在處理過后的特征上。這就是帶有嶺正則項(xiàng)的多項(xiàng)式回歸僧凰。注意當(dāng)α增大的時(shí)候探颈,導(dǎo)致預(yù)測(cè)曲線變得扁平(即少了極端值,多了一般值)训措,這樣減少了模型的方差膝擂,卻增加了模型的偏差。

圖 4-17:嶺回歸

對(duì)線性回歸來說隙弛,我們可以使用封閉方程去計(jì)算架馋,也可以使用梯度下降來做嶺回歸。它們的缺點(diǎn)和優(yōu)點(diǎn)是一樣的全闷。公式 4-9 表示封閉方程的解(矩陣A 是一個(gè)除了左上角有一個(gè)0的n × n 單位矩陣叉寂,這個(gè)0代表偏差項(xiàng)。譯者注:偏差 \theta_0不是正則化的)总珠。

公式 4-9:嶺回歸的封閉方程的解

\hat{\theta} = ({\mathbf{X}}^T\cdot\mathbf{X}+\alpha\mathbf{A})^{-1}\cdot{\mathbf{X}}^T\cdot\mathbf{y}

下面是如何使用 Scikit-Learn 來進(jìn)行封閉方程的求解(使用 Cholesky 法進(jìn)行矩陣分解對(duì)公式 4-9 進(jìn)行變形):

>>> from sklearn.linear_model import Ridge
>>> ridge_reg = Ridge(alpha=1, solver="cholesky")
>>> ridge_reg.fit(X, y)
>>> ridge_reg.predict([[1.5]])
array([[ 1.55071465]]

使用隨機(jī)梯度法進(jìn)行求解:

>>> sgd_reg = SGDRegressor(penalty="l2")
>>> sgd_reg.fit(X, y.ravel())
>>> sgd_reg.predict([[1.5]])
array([[ 1.13500145]])

penalty參數(shù)指的是正則項(xiàng)的懲罰類型屏鳍。指定“l(fā)2”表明你要在損失函數(shù)上添加一項(xiàng):權(quán)重向量 \ell_2范數(shù)平方的一半,這就是簡單的嶺回歸局服。

Lasso 回歸

Lasso 回歸(也稱 Least Absolute Shrinkage钓瞭,或者 Selection Operator Regression)是另一種正則化版的線性回歸:就像嶺回歸那樣,它也在損失函數(shù)上添加了一個(gè)正則化項(xiàng)淫奔,但是它使用權(quán)重向量的\ell_1范數(shù)而不是權(quán)重向量\ell_2范數(shù)平方的一半山涡。(如公式 4-10)

公式 4-10:Lasso 回歸的損失函數(shù)

J(\theta)=MSE(\theta)+\alpha\sum\limits_{i=1}^n\left|\theta_i \right|

圖 4-18 展示了和圖 4-17 相同的事情,僅僅是用 Lasso 模型代替了 Ridge 模型唆迁,同時(shí)調(diào)小了α的值鸭丛。

圖 4-18:Lasso回歸

Lasso 回歸的一個(gè)重要特征是它傾向于完全消除最不重要的特征的權(quán)重(即將它們?cè)O(shè)置為零)。例如唐责,右圖中的虛線所示(\alpha=10^{-7})鳞溉,曲線看起來像一條二次曲線,而且?guī)缀跏蔷€性的鼠哥,這是因?yàn)樗械母唠A多項(xiàng)特征都被設(shè)置為零熟菲。換句話說看政,Lasso回歸自動(dòng)的進(jìn)行特征選擇同時(shí)輸出一個(gè)稀疏模型(即,具有很少的非零權(quán)重)抄罕。

你可以從圖 4-19 知道為什么會(huì)出現(xiàn)這種情況:在左上角圖中帽衙,后背景的等高線(橢圓)表示了沒有正則化的均方差損失函數(shù)\alpha=0,白色的小圓圈表示在當(dāng)前損失函數(shù)上批量梯度下降的路徑贞绵。前背景的等高線(菱形)表示\ell_1懲罰厉萝,黃色的三角形表示了僅在這個(gè)懲罰下批量梯度下降的路徑(\alpha\rightarrow\infty)。注意路徑第一次是如何到達(dá)\theta_1=0榨崩,然后向下滾動(dòng)直到它到達(dá)\theta_2=0谴垫。在右上角圖中,等高線表示的是相同損失函數(shù)再加上一個(gè)\alpha=0.5\ell_1懲罰母蛛。這幅圖中翩剪,它的全局最小值在\theta_2=0這根軸上。批量梯度下降首先到達(dá)\theta_2=0彩郊,然后向下滾動(dòng)直到達(dá)到全局最小值前弯。 兩個(gè)底部圖顯示了相同的情況,只是使用了\ell_2懲罰秫逝。 規(guī)則化的最小值比非規(guī)范化的最小值更接近于\theta=0恕出,但權(quán)重不能完全消除。

圖 4-19:Ridge 回歸和 Lasso 回歸對(duì)比

提示
在 Lasso 損失函數(shù)中违帆,批量梯度下降的路徑趨向與在低谷有一個(gè)反彈浙巫。這是因?yàn)樵?img class="math-inline" src="https://math.jianshu.com/math?formula=%5Ctheta_2%3D0" alt="\theta_2=0" mathimg="1">時(shí)斜率會(huì)有一個(gè)突變。為了最后真正收斂到全局最小值刷后,你需要逐漸的降低學(xué)習(xí)率的畴。

Lasso 損失函數(shù)在\theta_i=0(i=1,2,\cdots,n)處無法進(jìn)行微分運(yùn)算,但是梯度下降如果你使用子梯度向量\mathbf{g}后它可以在任何\theta_i=0的情況下進(jìn)行計(jì)算尝胆。公式 4-11 是在 Lasso 損失函數(shù)上進(jìn)行梯度下降的子梯度向量公式丧裁。

公式 4-11:Lasso 回歸子梯度向量

g(\theta,J)=\nabla_{\theta}MSE(\theta)+ \alpha{\left(\begin{matrix} sign(\theta_1)\\ sign(\theta_2)\\ \vdots \\ sign(\theta_n)\\ \end{matrix}\right)}\ where\ sign(\theta_i)= \begin{cases} -1, &\theta_i<0 \\ 0, &\theta_i=0 \\ +1,&\theta_i>0 \\ \end{cases}

下面是一個(gè)使用 Scikit-Learn 的Lasso類的小例子。你也可以使用SGDRegressor(penalty="l1")來代替它含衔。

>>> from sklearn.linear_model import Lasso
>>> lasso_reg = Lasso(alpha=0.1)
>>> lasso_reg.fit(X, y)
>>> lasso_reg.predict([[1.5]])
array([ 1.53788174]

彈性網(wǎng)絡(luò)(ElasticNet)

彈性網(wǎng)絡(luò)介于 Ridge 回歸和 Lasso 回歸之間煎娇。它的正則項(xiàng)是 Ridge 回歸和 Lasso 回歸正則項(xiàng)的簡單混合,同時(shí)你可以控制它們的混合率r抱慌,當(dāng)r=0時(shí)逊桦,彈性網(wǎng)絡(luò)就是 Ridge 回歸眨猎,當(dāng)r=1時(shí)抑进,其就是 Lasso 回歸。具體表示如公式 4-12睡陪。

公式 4-12:彈性網(wǎng)絡(luò)損失函數(shù)

J(\theta)=MSE(\theta)+r\alpha\sum\limits_{i=1}^n\left|\theta_i \right|+\frac{1-r}{2}\alpha\sum\limits_{i=1}^n\theta_i^2

那么我們?cè)撊绾芜x擇線性回歸寺渗,嶺回歸匿情,Lasso 回歸,彈性網(wǎng)絡(luò)呢信殊?一般來說有一點(diǎn)正則項(xiàng)的表現(xiàn)更好炬称,因此通常你應(yīng)該避免使用簡單的線性回歸。嶺回歸是一個(gè)很好的首選項(xiàng)涡拘,但是如果你的特征僅有少數(shù)是真正有用的玲躯,你應(yīng)該選擇 Lasso 和彈性網(wǎng)絡(luò)。就像我們討論的那樣鳄乏,它兩能夠?qū)o用特征的權(quán)重降為零跷车。一般來說,彈性網(wǎng)絡(luò)的表現(xiàn)要比 Lasso 好橱野,因?yàn)楫?dāng)特征數(shù)量比樣本的數(shù)量大的時(shí)候朽缴,或者特征之間有很強(qiáng)的相關(guān)性時(shí),Lasso 可能會(huì)表現(xiàn)的不規(guī)律水援。下面是一個(gè)使用 Scikit-Learn ElasticNetl1_ratio指的就是混合率r的簡單樣本:

>>> from sklearn.linear_model import ElasticNet
>>> elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
>>> elastic_net.fit(X, y)
>>> elastic_net.predict([[1.5]])
array([ 1.54333232])

早期停止法(Early Stopping)

對(duì)于迭代學(xué)習(xí)算法密强,有一種非常特殊的正則化方法,就像梯度下降在驗(yàn)證錯(cuò)誤達(dá)到最小值時(shí)立即停止訓(xùn)練那樣蜗元。我們稱為早期停止法或渤。圖 4-20 表示使用批量梯度下降來訓(xùn)練一個(gè)非常復(fù)雜的模型(一個(gè)高階多項(xiàng)式回歸模型)。隨著訓(xùn)練的進(jìn)行奕扣,算法一直學(xué)習(xí)劳坑,它在訓(xùn)練集上的預(yù)測(cè)誤差(RMSE)自然而然的下降。然而一段時(shí)間后成畦,驗(yàn)證誤差停止下降距芬,并開始上升。這意味著模型在訓(xùn)練集上開始出現(xiàn)過擬合循帐。一旦驗(yàn)證錯(cuò)誤達(dá)到最小值框仔,便提早停止訓(xùn)練。這種簡單有效的正則化方法被 Geoffrey Hinton 稱為“完美的免費(fèi)午餐”拄养。

圖 4-20:早期停止法

提示
隨機(jī)梯度和小批量梯度下降不是平滑曲線离斩,你可能很難知道它是否達(dá)到最小值。 一種解決方案是瘪匿,只有在驗(yàn)證誤差高于最小值一段時(shí)間后(你確信該模型不會(huì)變得更好了)跛梗,才停止,之后將模型參數(shù)回滾到驗(yàn)證誤差最小值棋弥。

下面是一個(gè)早期停止法的基礎(chǔ)應(yīng)用:

from sklearn.base import clone
sgd_reg = SGDRegressor(n_iter=1, warm_start=True, penalty=None,learning_rate="constant", eta0=0.0005)

minimum_val_error = float("inf")
best_epoch = None
best_model = None
for epoch in range(1000):
    sgd_reg.fit(X_train_poly_scaled, y_train)
    y_val_predict = sgd_reg.predict(X_val_poly_scaled)
    val_error = mean_squared_error(y_val_predict, y_val)
    if val_error < minimum_val_error:
        minimum_val_error = val_error
        best_epoch = epoch
        best_model = clone(sgd_reg)

注意:當(dāng)warm_start=True時(shí)核偿,調(diào)用fit()方法后,訓(xùn)練會(huì)從停下來的地方繼續(xù)顽染,而不是從頭重新開始漾岳。

邏輯回歸

正如我們?cè)诘?章中討論的那樣轰绵,一些回歸算法也可以用于分類(反之亦然)。 Logistic 回歸(也稱為 Logit 回歸)通常用于估計(jì)一個(gè)實(shí)例屬于某個(gè)特定類別的概率(例如尼荆,這電子郵件是垃圾郵件的概率是多少左腔?)。 如果估計(jì)的概率大于 50%捅儒,那么模型預(yù)測(cè)這個(gè)實(shí)例屬于當(dāng)前類(稱為正類液样,標(biāo)記為“1”),反之預(yù)測(cè)它不屬于當(dāng)前類(即它屬于負(fù)類 巧还,標(biāo)記為“0”)蓄愁。 這樣便成為了一個(gè)二元分類器。

概率估計(jì)

那么它是怎樣工作的狞悲? 就像線性回歸模型一樣撮抓,Logistic 回歸模型計(jì)算輸入特征的加權(quán)和(加上偏差項(xiàng)),但它不像線性回歸模型那樣直接輸出結(jié)果摇锋,而是把結(jié)果輸入logistic()函數(shù)進(jìn)行二次加工后進(jìn)行輸出(詳見公式 4-13)丹拯。

公式 4-13:邏輯回歸模型的概率估計(jì)(向量形式)

\hat{p}=h_\theta(\mathbf{x})=\sigma(\theta^T \cdot \mathbf{x})

Logistic 函數(shù)(也稱為 logit),用\sigma(\·)表示荸恕,其是一個(gè) sigmoid 函數(shù)(圖像呈 S 型)乖酬,它的輸出是一個(gè)介于 0 和 1 之間的數(shù)字。其定義如公式 4-14 和圖 4-21 所示融求。

公式 4-14:邏輯函數(shù)

\sigma(t)=\frac{1}{1+exp(-t)}

圖4-21:邏輯函數(shù)

一旦 Logistic 回歸模型估計(jì)得到了\mathbf{x}屬于正類的概率\hat{p}=h_\theta(\mathbf{x})咬像,那它很容易得到預(yù)測(cè)結(jié)果\hat{y}(見公式 4-15)。

公式 4-15:邏輯回歸預(yù)測(cè)模型

\hat{y}= \begin{cases} 0, &\hat{p}<0.5 \\ 1,&\hat{p}\geq0.5 \\ \end{cases}

注意當(dāng)t<0時(shí)\sigma(t)<0.5生宛,當(dāng)t\geq0時(shí)\sigma(t)\geq0.5县昂,因此當(dāng)\theta^T \cdot \mathbf{x}是正數(shù)的話,邏輯回歸模型輸出 1陷舅,如果它是負(fù)數(shù)的話倒彰,則輸出 0。

訓(xùn)練和損失函數(shù)

好莱睁,現(xiàn)在你知道了 Logistic 回歸模型如何估計(jì)概率并進(jìn)行預(yù)測(cè)待讳。 但是它是如何訓(xùn)練的? 訓(xùn)練的目的是設(shè)置參數(shù)向量\theta仰剿,使得正例(y=1)概率增大创淡,負(fù)例(y=0)的概率減小,其通過在單個(gè)訓(xùn)練實(shí)例\mathbf{x}的損失函數(shù)來實(shí)現(xiàn)(公式 4-16)南吮。

公式 4-16:單個(gè)樣本的損失函數(shù)

c(\theta)= \begin{cases} -log(\hat{p}), &y=1 \\ -log(1-\hat{p}),&y=0 \\ \end{cases}

這個(gè)損失函數(shù)是合理的琳彩,因?yàn)楫?dāng)t接近0時(shí),-log(t)變得非常大,所以如果模型估計(jì)一個(gè)正例概率接近于 0汁针,那么損失函數(shù)將會(huì)很大术辐,同時(shí)如果模型估計(jì)一個(gè)負(fù)例的概率接近 1砚尽,那么損失函數(shù)同樣會(huì)很大施无。 另一方面,當(dāng)t接近于 1 時(shí)必孤,-log(t)接近 0猾骡,所以如果模型估計(jì)一個(gè)正例概率接近于 0,那么損失函數(shù)接近于0敷搪,同時(shí)如果模型估計(jì)一個(gè)負(fù)例的概率接近0兴想,那么損失函數(shù)同樣會(huì)接近于0, 這正是我們想的赡勘。

整個(gè)訓(xùn)練集的損失函數(shù)只是所有訓(xùn)練實(shí)例的平均值嫂便。可以用一個(gè)表達(dá)式(你可以很容易證明)來統(tǒng)一表示闸与,稱為對(duì)數(shù)損失毙替,如公式 4-17 所示。

公式 4-17:邏輯回歸的損失函數(shù)(對(duì)數(shù)損失)

J(\theta)=-\frac{1}{m}\sum\limits_{i=1}^m\left[y^{(i)}log\left(\hat{p}^{(i)}\right)+\left(1-y^{(i)}\right)log\left(1-\hat{p}^{(i)}\right)\right]

但是這個(gè)損失函數(shù)對(duì)于求解最小化損失函數(shù)的\theta是沒有公式解的(沒有等價(jià)的正態(tài)方程)践樱。 但好消息是厂画,這個(gè)損失函數(shù)是凸的,所以梯度下降(或任何其他優(yōu)化算法)一定能夠找到全局最小值(如果學(xué)習(xí)速率不是太大拷邢,并且你等待足夠長的時(shí)間)袱院。公式 4-18 給出了損失函數(shù)關(guān)于第j個(gè)模型參數(shù)\theta_j的偏導(dǎo)數(shù)。

公式 4-18:邏輯回歸損失函數(shù)的偏導(dǎo)數(shù)

\frac{\partial}{\partial \theta_j}J(\theta_j)=\frac{1}{m} \sum\limits_{i=1}^m{\left(\sigma\left(\theta^T \cdot \mathbf{x}^{(i)}\right)-y^{(i)}\right)}{x_j}^{(i)}

這個(gè)公式看起來非常像公式 4-5:首先計(jì)算每個(gè)樣本的預(yù)測(cè)誤差瞭稼,然后誤差項(xiàng)乘以第j項(xiàng)特征值忽洛,最后求出所有訓(xùn)練樣本的平均值。 一旦你有了包含所有的偏導(dǎo)數(shù)的梯度向量环肘,你便可以在梯度向量上使用批量梯度下降算法脐瑰。 也就是說:你已經(jīng)知道如何訓(xùn)練 Logistic 回歸模型。 對(duì)于隨機(jī)梯度下降廷臼,你當(dāng)然只需要每一次使用一個(gè)實(shí)例苍在,對(duì)于小批量梯度下降,你將每一次使用一個(gè)小型實(shí)例集荠商。

決策邊界

我們使用鳶尾花數(shù)據(jù)集來分析 Logistic 回歸寂恬。 這是一個(gè)著名的數(shù)據(jù)集,其中包含 150 朵三種不同的鳶尾花的萼片和花瓣的長度和寬度莱没。這三種鳶尾花為:Setosa初肉,Versicolor,Virginica(如圖 4-22)饰躲。

圖4-22:三種不同的鳶尾花

讓我們嘗試建立一個(gè)分類器牙咏,僅僅使用花瓣的寬度特征來識(shí)別 Virginica臼隔,首先讓我們加載數(shù)據(jù):

>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> list(iris.keys())
['data', 'target_names', 'feature_names', 'target', 'DESCR']
>>> X = iris["data"][:, 3:] # 花瓣寬度
>>> y = (iris["target"] == 2).astype(np.int)

接下來,我們訓(xùn)練一個(gè)邏輯回歸模型:

from sklearn.linear_model import LogisticRegression

log_reg = LogisticRegression()
log_reg.fit(X, y)

我們來看看模型估計(jì)的花瓣寬度從 0 到 3 厘米的概率估計(jì)(如圖 4-23):

X_new = np.linspace(0, 3, 1000).reshape(-1, 1)
y_proba = log_reg.predict_proba(X_new)
plt.plot(X_new, y_proba[:, 1], "g-", label="Iris-Virginica")
plt.plot(X_new, y_proba[:, 0], "b--", label="Not Iris-Virginica"
圖 4-23:概率估計(jì)和決策邊界

Virginica 花的花瓣寬度(用三角形表示)在 1.4 厘米到 2.5 厘米之間妄壶,而其他種類的花(由正方形表示)通常具有較小的花瓣寬度摔握,范圍從 0.1 厘米到 1.8 厘米。注意丁寄,它們之間會(huì)有一些重疊氨淌。在大約 2 厘米以上時(shí),分類器非骋粱牵肯定這朵花是Virginica花(分類器此時(shí)輸出一個(gè)非常高的概率值)盛正,而在1厘米以下時(shí),它非承悸瘢肯定這朵花不是 Virginica 花(不是 Virginica 花有非常高的概率)豪筝。在這兩個(gè)極端之間,分類器是不確定的摘能。但是续崖,如果你使用它進(jìn)行預(yù)測(cè)(使用predict()方法而不是predict_proba()方法),它將返回一個(gè)最可能的結(jié)果徊哑。因此袜刷,在 1.6 厘米左右存在一個(gè)決策邊界,這時(shí)兩類情況出現(xiàn)的概率都等于 50%:如果花瓣寬度大于 1.6 厘米莺丑,則分類器將預(yù)測(cè)該花是 Virginica著蟹,否則預(yù)測(cè)它不是(即使它有可能錯(cuò)了):

>>> log_reg.predict([[1.7], [1.5]])
array([1, 0])

圖 4-24 表示相同的數(shù)據(jù)集,但是這次使用了兩個(gè)特征進(jìn)行判斷:花瓣的寬度和長度梢莽。 一旦訓(xùn)練完畢萧豆,Logistic 回歸分類器就可以根據(jù)這兩個(gè)特征來估計(jì)一朵花是 Virginica 的可能性。 虛線表示這時(shí)兩類情況出現(xiàn)的概率都等于 50%:這是模型的決策邊界昏名。 請(qǐng)注意涮雷,它是一個(gè)線性邊界。每條平行線都代表一個(gè)分類標(biāo)準(zhǔn)下的兩兩個(gè)不同類的概率轻局,從 15%(左下角)到 90%(右上角)洪鸭。越過右上角分界線的點(diǎn)都有超過 90% 的概率是 Virginica 花。

圖 4-24:線性決策邊界

就像其他線性模型仑扑,邏輯回歸模型也可以\ell_1或者\ell_2懲罰使用進(jìn)行正則化览爵。Scikit-Learn 默認(rèn)添加了\ell_2懲罰。

注意

在 Scikit-Learn 的LogisticRegression模型中控制正則化強(qiáng)度的超參數(shù)不是\alpha(與其他線性模型一樣)镇饮,而是它的逆:C蜓竹。C的值越大,模型正則化強(qiáng)度越低。

Softmax 回歸

Logistic 回歸模型可以直接推廣到支持多類別分類俱济,不必組合和訓(xùn)練多個(gè)二分類器(如第 3 章所述)嘶是, 其稱為 Softmax 回歸或多類別 Logistic 回歸。

這個(gè)想法很簡單:當(dāng)給定一個(gè)實(shí)例\mathbf{x}時(shí)蛛碌,Softmax 回歸模型首先計(jì)算k類的分?jǐn)?shù)s_k(\mathbf{x})聂喇,然后將分?jǐn)?shù)應(yīng)用在Softmax函數(shù)(也稱為歸一化指數(shù))上,估計(jì)出每類的概率左医。 計(jì)算s_k(\mathbf{x})的公式看起來很熟悉授帕,因?yàn)樗拖窬€性回歸預(yù)測(cè)的公式一樣(見公式 4-19)核无。

公式 4-19:k類的 Softmax 得分

s_k(\mathbf{x})= \theta^T \cdot \mathbf{x}

注意疯坤,每個(gè)類都有自己獨(dú)一無二的參數(shù)向量\theta_k抹腿。 所有這些向量通常作為行放在參數(shù)矩陣\Theta中。

一旦你計(jì)算了樣本\mathbf{x}的每一類的得分秕硝,你便可以通過Softmax函數(shù)(公式 4-20)估計(jì)出樣本屬于第k類的概率\hat{p}_k:通過計(jì)算es_k(\mathbf{x})次方,然后對(duì)它們進(jìn)行歸一化(除以所有分子的總和)洲尊。

公式 4-20:Softmax 函數(shù)

\hat{p_k}=\sigma{(\mathbf{s}(\mathbf{x}))}k= \frac{exp\left(s_k(\mathbf{x})\right)} {\sum_{j=1}^{K}exp\left(s_j(\mathbf{x})\right)}

  • K是類的個(gè)數(shù)
  • s(x)是實(shí)例x的每個(gè)類的得分的向量
  • \sigma{(\mathbf{s}(\mathbf{x}))_k}表示給定每一類分?jǐn)?shù)之后远豺,實(shí)例\mathbf{x}屬于第k類的概率

和 Logistic 回歸分類器一樣,Softmax 回歸分類器將估計(jì)概率最高(它只是得分最高的類)的那類作為預(yù)測(cè)結(jié)果坞嘀,如公式 4-21 所示躯护。

公式 4-21:Softmax 回歸模型分類器預(yù)測(cè)結(jié)果

\hat{y}=argmax\ \sigma{(\mathbf{s}(\mathbf{x}))_k}=argmax \ s_k(\mathbf{x})=argmax \ \left( \theta_k^T \cdot \mathbf{x}\right)

  • argmax運(yùn)算返回一個(gè)函數(shù)取到最大值的變量值。 在這個(gè)等式丽涩,它返回使\sigma{(\mathbf{s}(\mathbf{x}))_k}最大時(shí)的k的值

提示
Softmax 回歸分類器一次只能預(yù)測(cè)一個(gè)類(即它是多類的棺滞,但不是多輸出的),因此它只能用于判斷互斥的類別矢渊,如不同類型的植物继准。 你不能用它來識(shí)別一張照片中的多個(gè)人。

現(xiàn)在我們知道這個(gè)模型如何估計(jì)概率并進(jìn)行預(yù)測(cè)矮男,接下來將介紹如何訓(xùn)練移必。我們的目標(biāo)是建立一個(gè)模型在目標(biāo)類別上有著較高的概率(因此其他類別的概率較低),最小化公式 4-22 可以達(dá)到這個(gè)目標(biāo)毡鉴,其表示了當(dāng)前模型的損失函數(shù)崔泵,稱為交叉熵,當(dāng)模型對(duì)目標(biāo)類得出了一個(gè)較低的概率猪瞬,其會(huì)懲罰這個(gè)模型憎瘸。 交叉熵通常用于衡量待測(cè)類別與目標(biāo)類別的匹配程度(我們將在后面的章節(jié)中多次使用它)

公式 4-22:交叉熵

J(\Theta)=-\frac{1}{m}\sum\limits_{i=1}^m\sum\limits_{k=1}^Ky_k^{(i)}log\left(\hat{p}_k^{(i)}\right)

  • 如果對(duì)于第I個(gè)實(shí)例的目標(biāo)類是k,那么y_k^{(i)}=1撑螺,反之y_k^{(i)}=0含思。

可以看出,當(dāng)只有兩個(gè)類(K=2)時(shí),此損失函數(shù)等同于 Logistic 回歸的損失函數(shù)(對(duì)數(shù)損失含潘;請(qǐng)參閱公式 4-17)饲做。

交叉熵

交叉熵源于信息論。假設(shè)你想要高效地傳輸每天的天氣信息遏弱。如果有八個(gè)選項(xiàng)(晴天盆均,雨天等),則可以使用3位對(duì)每個(gè)選項(xiàng)進(jìn)行編碼漱逸,因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=2%5E3%3D8" alt="2^3=8" mathimg="1">泪姨。但是,如果你認(rèn)為幾乎每天都是晴天饰抒,更高效的編碼“晴天”的方式是:只用一位(0)肮砾。剩下的七項(xiàng)使用四位(從 1 開始)。交叉熵度量每個(gè)選項(xiàng)實(shí)際發(fā)送的平均比特?cái)?shù)袋坑。 如果你對(duì)天氣的假設(shè)是完美的仗处,交叉熵就等于天氣本身的熵(即其內(nèi)部的不確定性)。 但是枣宫,如果你的假設(shè)是錯(cuò)誤的(例如婆誓,如果經(jīng)常下雨)交叉熵將會(huì)更大,稱為 Kullback-Leibler 散度(KL 散度)也颤。

兩個(gè)概率分布p之間的交叉熵定義為:H(p,q)=-\sum_xp(x)\log q(x)(分布至少是離散的)

這個(gè)損失函數(shù)關(guān)于\theta_k的梯度向量為公式 4-23:

公式 4-23:k類交叉熵的梯度向量

\nabla_{\theta_k}J(\Theta)=\frac{1}{m}\sum\limits_{i=1}^m\left(\hat{p}_k^{(i)}-y_k^{(i)}\right)\mathbf{x}^{(i)}

現(xiàn)在你可以計(jì)算每一類的梯度向量洋幻,然后使用梯度下降(或者其他的優(yōu)化算法)找到使得損失函數(shù)達(dá)到最小值的參數(shù)矩陣\Theta

讓我們使用 Softmax 回歸對(duì)三種鳶尾花進(jìn)行分類翅娶。當(dāng)你使用LogisticRregression對(duì)模型進(jìn)行訓(xùn)練時(shí)文留,Scikit Learn 默認(rèn)使用的是一對(duì)多模型,但是你可以設(shè)置multi_class參數(shù)為“multinomial”來把它改變?yōu)?Softmax 回歸故觅。你還必須指定一個(gè)支持 Softmax 回歸的求解器厂庇,例如“l(fā)bfgs”求解器(有關(guān)更多詳細(xì)信息,請(qǐng)參閱 Scikit-Learn 的文檔)输吏。其默認(rèn)使用\ell_12正則化权旷,你可以使用超參數(shù)C控制它。

X = iris["data"][:, (2, 3)] # petal length, petal width
y = iris["target"]

softmax_reg = LogisticRegression(multi_class="multinomial",solver="lbfgs", C=10)
softmax_reg.fit(X, y)

所以下次你發(fā)現(xiàn)一個(gè)花瓣長為 5 厘米贯溅,寬為 2 厘米的鳶尾花時(shí)拄氯,你可以問你的模型你它是哪一類鳶尾花,它會(huì)回答 94.2% 是 Virginica 花(第二類)它浅,或者 5.8% 是其他鳶尾花译柏。

>>> softmax_reg.predict([[5, 2]])
array([2])
>>> softmax_reg.predict_proba([[5, 2]])
array([[ 6.33134078e-07, 5.75276067e-02, 9.42471760e-01]])是
圖 4-25:Softmax 回歸的決策邊界

圖 4-25 用不同背景色表示了結(jié)果的決策邊界。注意姐霍,任何兩個(gè)類之間的決策邊界是線性的鄙麦。 該圖的曲線表示 Versicolor 類的概率(例如典唇,用 0.450 標(biāo)記的曲線表示 45% 的概率邊界)。注意模型也可以預(yù)測(cè)一個(gè)概率低于 50% 的類胯府。 例如介衔,在所有決策邊界相遇的地方,所有類的估計(jì)概率相等骂因,分別為 33%炎咖。

練習(xí)

  1. 如果你有一個(gè)數(shù)百萬特征的訓(xùn)練集,你應(yīng)該選擇哪種線性回歸訓(xùn)練算法寒波?
  2. 假設(shè)你訓(xùn)練集中特征的數(shù)值尺度(scale)有著非常大的差異乘盼,哪種算法會(huì)受到影響?有多大的影響俄烁?對(duì)于這些影響你可以做什么绸栅?
  3. 訓(xùn)練 Logistic 回歸模型時(shí),梯度下降是否會(huì)陷入局部最低點(diǎn)猴娩?
  4. 在有足夠的訓(xùn)練時(shí)間下阴幌,是否所有的梯度下降都會(huì)得到相同的模型參數(shù)勺阐?
  5. 假設(shè)你使用批量梯度下降法卷中,畫出每一代的驗(yàn)證誤差。當(dāng)你發(fā)現(xiàn)驗(yàn)證誤差一直增大渊抽,接下來會(huì)發(fā)生什么蟆豫?你怎么解決這個(gè)問題?
  6. 當(dāng)驗(yàn)證誤差升高時(shí)懒闷,立即停止小批量梯度下降是否是一個(gè)好主意十减?
  7. 哪個(gè)梯度下降算法(在我們討論的那些算法中)可以最快到達(dá)解的附近?哪個(gè)的確實(shí)會(huì)收斂愤估?怎么使其他算法也收斂帮辟?
  8. 假設(shè)你使用多項(xiàng)式回歸,畫出學(xué)習(xí)曲線玩焰,在圖上發(fā)現(xiàn)學(xué)習(xí)誤差和驗(yàn)證誤差之間有著很大的間隙由驹。這表示發(fā)生了什么?有哪三種方法可以解決這個(gè)問題昔园?
  9. 假設(shè)你使用嶺回歸蔓榄,并發(fā)現(xiàn)訓(xùn)練誤差和驗(yàn)證誤差都很高,并且?guī)缀跸嗟饶铡D愕哪P捅憩F(xiàn)是高偏差還是高方差甥郑?這時(shí)你應(yīng)該增大正則化參數(shù)\alpha,還是降低它荤西?
  10. 你為什么要這樣做:
  • 使用嶺回歸代替線性回歸澜搅?
  • Lasso 回歸代替嶺回歸伍俘?
  • 彈性網(wǎng)絡(luò)代替 Lasso 回歸?
  1. 假設(shè)你想判斷一副圖片是室內(nèi)還是室外勉躺,白天還是晚上养篓。你應(yīng)該選擇二個(gè)邏輯回歸分類器,還是一個(gè) Softmax 分類器赂蕴?
  2. 在 Softmax 回歸上應(yīng)用批量梯度下降的早期停止法(不使用 Scikit-Learn)柳弄。

附錄 A 提供了這些練習(xí)的答案。


(第一部分 機(jī)器學(xué)習(xí)基礎(chǔ))
第01章 機(jī)器學(xué)習(xí)概覽
第02章 一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(上)
第02章 一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(下)
第03章 分類
第04章 訓(xùn)練模型
第05章 支持向量機(jī)
第06章 決策樹
第07章 集成學(xué)習(xí)和隨機(jī)森林
第08章 降維
(第二部分 神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí))
第9章 啟動(dòng)和運(yùn)行TensorFlow
第10章 人工神經(jīng)網(wǎng)絡(luò)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(上)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(下)
第12章 設(shè)備和服務(wù)器上的分布式 TensorFlow
第13章 卷積神經(jīng)網(wǎng)絡(luò)
第14章 循環(huán)神經(jīng)網(wǎng)絡(luò)
第15章 自編碼器
第16章 強(qiáng)化學(xué)習(xí)(上)
第16章 強(qiáng)化學(xué)習(xí)(下)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末概说,一起剝皮案震驚了整個(gè)濱河市碧注,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌糖赔,老刑警劉巖萍丐,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異放典,居然都是意外死亡逝变,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門奋构,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壳影,“玉大人,你說我怎么就攤上這事弥臼⊙邕郑” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵径缅,是天一觀的道長掺栅。 經(jīng)常有香客問我,道長纳猪,這世上最難降的妖魔是什么氧卧? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮氏堤,結(jié)果婚禮上沙绝,老公的妹妹穿的比我還像新娘。我一直安慰自己丽猬,他們只是感情好宿饱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脚祟,像睡著了一般谬以。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上由桌,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天为黎,我揣著相機(jī)與錄音邮丰,去河邊找鬼。 笑死铭乾,一個(gè)胖子當(dāng)著我的面吹牛剪廉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炕檩,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斗蒋,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了笛质?” 一聲冷哼從身側(cè)響起泉沾,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妇押,沒想到半個(gè)月后跷究,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敲霍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年俊马,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩杈。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柴我,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锋恬,到底是詐尸還是另有隱情屯换,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布与学,位于F島的核電站,受9級(jí)特大地震影響嘉抓,放射性物質(zhì)發(fā)生泄漏索守。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一抑片、第九天 我趴在偏房一處隱蔽的房頂上張望卵佛。 院中可真熱鬧,春花似錦敞斋、人聲如沸截汪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衙解。三九已至,卻和暖如春焰枢,著一層夾襖步出監(jiān)牢的瞬間蚓峦,已是汗流浹背舌剂。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暑椰,地道東北人霍转。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像一汽,于是被迫代替她去往敵國和親避消。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353