- Python機器學習(原書第3版)
- (美)塞巴斯蒂安·拉施卡 瓦希德·米爾賈利利
- 3947字
- 2021-06-11 16:13:37
2.3 自適應線性神經元和學習收斂
本節將討論另外一種單層神經網絡(NN):自適應線性神經元(Adaline)。Adaline是在Frank Rosenblatt提出感知器算法幾年之后,由Bernard Widrow及其博士生Tedd Hoff聯合提出的,它可以被視為對前者的優化和改進[3]。
Adaline算法特別有趣,因為它說明了定義和最小化連續代價函數的關鍵概念。這為理解諸如邏輯回歸、支持向量機和回歸模型等更高級的分類機器學習算法奠定了基礎,我們將在以后的章節中討論這些問題。
Adaline算法的規則(也被稱為Widrow-Hoff規則)與Frank Rosenblatt的感知器之間的關鍵差異在于,Adaline算法規則的權重基于線性激活函數更新,而感知器則是基于單位階躍函數。Adaline的線性激活函數?(z)是凈輸入的等同函數,即
?(wTx)=wTx
盡管線性激活函數可用于學習權重,但是我們仍然使用閾值函數進行最終的預測,這與前面看到的單位階躍函數類似。
感知器與Adaline算法的主要區別如圖2-9所示。

圖 2-9
圖2-9說明,在連續評估正確的分類標簽與線性激活函數之后,Adaline算法通過比較實際標簽與線性激活函數的連續有效輸出以計算模型誤差,并更新權重。與之相反,感知器則是比較實際分類標簽與預測分類標簽。
2.3.1 通過梯度下降最小化代價函數
監督機器學習算法的一個關鍵組成部分是在學習過程中優化的目標函數。該目標函數通常是我們想要最小化的代價函數。對Adaline而言,可以把學習權重的代價函數J定義為計算結果與真正分類標簽之間的誤差平方和(SSE):

從下面的段落中可以看到,添加只是為了方便,它使與權重參數相關的代價函數或者損失函數的梯度推導更容易。與單位階躍函數相反,這種連續線性激活函數的主要優點是代價函數變得可分。代價函數的另外一個優點是凸起,因此,可以用被稱為梯度下降的簡單而強大的優化算法來尋找權重,最小化代價函數以分類鳶尾花數據集樣本。
如圖2-10所示,可以把梯度下降背后的主要邏輯描述為走下坡路直到抵達局部或全局代價最小為止。每次迭代都向梯度相反的方向上邁出一步,步幅由學習速率以及梯度斜率來決定。

圖 2-10
采用梯度下降方法,現在我們可以通過在代價函數J(w)的梯度▽J(w)的相反方向上邁出一步來更新權重:
w:=w+Δw
其中,把權重變化Δw定義為負的梯度乘以學習速率η:
Δw=-η▽J(w)
要計算代價函數的梯度,我們需要分別用每個權重wj來計算代價函數的偏導數:

這樣就可以把權重wj的更新表達為:

因為同時更新所有的權重,所以Adaline的學習規則就成為:
w:=w+Δw
平方差的導數
如果熟悉微積分,與第j個權重相對應的SSE代價函數的偏導數可以計算如下:

盡管Adaline的學習規則看起來與感知器一樣,但應該注意的是當z(i)=wTx(i)時,?(z(i))為實數而不是整數型分類標簽。此外,權重更新是基于訓練數據集中所有樣本進行計算的,而不是在每個樣本之后逐步更新權重,這也就是為什么這種方法被稱為批量梯度下降。
2.3.2 用Python實現Adaline
因為感知器的算法規則與Adaline非常相近,本章將在前面的感知器實現的基礎上修改fit
方法,通過梯度下降最小化代價函數來更新權重。



不像感知器那樣在每次訓練模型后都更新權重,我們根據整個訓練數據集來計算梯度,調用self.eta * errors.sum()
計算偏置單元(零權重),調用self.eta * X.T.dot(errors)
計算從1到m的權重,這里X.T.dot(errors)
是特征矩陣與誤差向量的矩陣相乘。
請注意,activation
方法對代碼沒有影響,因為它只是一個標識函數。在這里,我們添加激活函數(通過activation
方法來計算)來說明信息是如何通過單層神經網絡流動的:從輸入數據、凈輸入、激活到輸出。
第3章將學習具有非同一性、非線性激活函數的邏輯回歸分類器。我們將會看到邏輯回歸模型與Adaline關系密切,兩者之間唯一的區別在于激活函數和代價函數。
與感知器類似,我們把所收集的代價存儲在self.cost_
列表,以檢驗訓練后的算法是否收斂。
矩陣乘法
矩陣乘法與向量點積非常相似,把矩陣中的每行當成單一的行向量來計算。這種向量化的方法代表了更緊湊的表達方法,可以用NumPy做更為有效的計算。例如:

請注意,在前面的等式中,我們用一個向量乘以一個矩陣,數學上對此并無定義。然而,記住本書前面的約定,向量可以被表達為3×1的矩陣。
在實踐中,我們經常需要通過實驗找到可以達到最優收斂的最佳學習速率η。所以選擇η=0.1和η=0.0001兩個不同的學習速率,把代價函數與迭代次數的關系在圖中畫出,以便觀察Adaline實現從訓練數據中學習的情況。
感知器超參數
學習速率η(eta
)和迭代次數n_tier
是感知器和Adaline學習算法的超參數。第6章會分析各種不同的技術,以自動尋找確保分類模型可以獲得最佳性能所需要的不同超參數值。
下述代碼將根據兩種不同的學習速率,畫出代價與迭代次數之間的關系圖:

從圖2-11中繪制的代價函數圖可以看到,存在著兩種不同類型的問題。左圖顯示選擇學習速率太大將會出現的情況。因為所選的全局最小值太低,以至于代價函數無法最小化,結果誤差經過每次迭代變得越來越大。另一方面,從右圖可以看到代價在降低,但所選的學習速率η=0.0001太小,以至于算法需要經過多次迭代才能收斂到全局最低代價。

圖 2-11
圖2-12說明了如果改變某個特定權重參數的值來最小化代價函數J時會發生的情況。左圖顯示如果選擇一個好的學習速率,代價會逐漸降低,向全局最小的方向發展。然而,右圖顯示如果選擇的學習速率太大,將會錯過全局最小值。

圖 2-12
2.3.3 通過特征縮放改善梯度下降
本書中的許多機器學習算法,都需要通過某種形式的特征縮放來優化性能,第3章和第4章將對此做詳細的討論。
梯度下降是從特征縮放受益的眾多算法之一。本節將用一種稱為標準化的特征縮放方法,它可以使數據具有標準正態分布的特性:零均值和單位方差。此標準化過程有助于促進梯度下降學習更快地收斂。但它不會使原始數據集呈正態分布。標準化會使每個特征的均值以零為中心,并且每個特征的標準差為1(單位方差)。例如,對第j個特征的標準化,我們可以簡單地用每個訓練樣本值減去均值μj,然后再除以標準差σj:
這里xj是包含所有n個訓練樣本的第j個特征值的向量,該標準化技術將應用于數據集的每個特征j。
優化器必須遍歷幾個步驟才能發現好的或者最優解(全局代價最小),這是標準化有助于梯度下降學習的原因之一,如圖2-13所示,兩個子圖將代價平面表示為二元分類問題中兩個模型權重的函數。

圖 2-13
用NumPy內置的mean
和std
方法可以很容易地實現標準化:

標準化完成之后,將再次訓練Adaline,然后在學習速率η=0.01的條件下,可以看到它經過幾輪迭代后完成了收斂:


執行代碼后應該可以看到圖2-14所示的決策區域以及代價下降情況。

圖 2-14
從圖2-14可以看到,在學習速率η=0.01的情況下,Adaline經過訓練已經開始收斂。然而,即使所有的樣本都分類正確了,SSE仍然保持非零。
2.3.4 大規模機器學習與隨機梯度下降
在上一節中,我們學習了如何基于整個訓練數據集來計算代價梯度,從相反方向來最小化代價函數,這就是為什么這種方法有時也稱為批量梯度下降。假設現在有一個擁有數百萬個數據點的非常大的數據集,這在許多機器學習應用中并不少見。在這種情況下,運行批量梯度下降的計算成本巨大,因為向全局最小值的方向每邁出一步,都需要重新評估整個訓練數據集。
隨機梯度下降(SGD)算法是批量梯度下降算法的一種常用替代方法,它有時也稱為迭代或在線梯度下降法。該方法并不是基于所有樣本x(i)的累積誤差之和來更新權重:

而是逐漸更新每個訓練樣本的權重:
η(y(i)-?(z(i)))x(i)
雖然隨機梯度下降可以看作梯度下降的近似,但因為需要更頻繁地更新權重,所以通常收斂得更快。因為要根據單個訓練實例來計算每個梯度,所以誤差平面比梯度下降噪聲更大,當然這也有優勢,因為如果采用非線性代價函數,隨機梯度下降更容易逃脫淺度局部極小值,這從本書第12章可以看到。要通過隨機梯度下降獲得滿意的結果,很重要的一點是將訓練數據以隨機順序呈現出來,同時要對訓練數據集重新洗牌以防止迭代循環。
在訓練中調整學習速率
在隨機梯度下降的實現中,固定的學習速率η經常被隨時間下降的自適應學習速率所取代,例如:
其中C1和C2為常數,要注意隨機梯度下降并沒有到達全局最小值,而是在一個非常靠近這個點的區域。用自適應學習速率可以把代價進一步最小化。
隨機梯度下降的另外一個優點是它可以用于在線學習。在線學習中模型可以在數據到達時實時完成訓練。這對累積大量數據的情況特別有用(例如網絡應用中的用戶數據)。采用在線學習的方法,系統可以立即適應變化,而且在存儲空間有限的情況下,可以在更新模型后丟棄訓練數據。
小批量梯度下降
批量梯度下降和隨機梯度下降之間的折中就是所謂的小批量學習。小批量學習可以理解為對訓練數據的較小子集采用批量梯度下降,例如,每次32個訓練樣本。小批量梯度下降的優點是可以通過更頻繁的權重更新,實現快速收斂。此外,小批量學習允許利用線性代數概念中的向量化操作(例如,通過點積實現加權求和)取代隨機梯度下降中訓練樣本上的for
循環,進一步提高學習算法的計算效率。
因為我們已經采用梯度下降實現了Adaline學習規則,所以只需要對學習算法做一些調整以讓其通過隨機梯度下降更新權重。在調用fit
方法的過程中,將在每個樣本訓練之后更新權重。此外,將在實現在線學習時調用額外的partial_fit
方法,不再重新初始化權重。為了檢驗算法在訓練后是否收斂,每次迭代都將計算訓練樣本的平均代價。而且還將增加一個選項,在每次迭代開始之前,對訓練數據重新洗牌以避免在優化代價函數時重復循環。通過random_state
參數,允許為反復訓練定義隨機種子:



AdalineSGD
分類器中使用的_shuffle
方法的工作方式如下:通過調用np.random
中的permutation
函數生成范圍從0~100的唯一數組成的隨機序列。然后以這些數字作為索引來對特征矩陣和分類標簽向量進行洗牌。
可以調用fit
方法來訓練AdalineSGD
分類器,用plot_decision_regions
把訓練結果以圖形表示出來:

通過執行前面的示例代碼可以得到兩張圖,如圖2-15所示。

圖 2-15
如圖2-15所示,平均代價降低得非常快,在15次迭代后,最終的決策邊界看起來與批量梯度下降的Adaline結果類似。如果要更新模型,例如,要實現流式數據的在線學習,可以對單個訓練樣本直接調用partial_fit
方法,比如ada_sgd.partial_fit(X_std[0, :], y[0])
。
- Advanced Quantitative Finance with C++
- 深入核心的敏捷開發:ThoughtWorks五大關鍵實踐
- 一步一步學Spring Boot 2:微服務項目實戰
- Go語言高效編程:原理、可觀測性與優化
- 趣學Python算法100例
- Unity Virtual Reality Projects
- 單片機應用技術
- 精通Scrapy網絡爬蟲
- Effective Python Penetration Testing
- Quarkus實踐指南:構建新一代的Kubernetes原生Java微服務
- Mastering HTML5 Forms
- Julia High Performance(Second Edition)
- 從“1”開始3D編程
- Getting Started with Web Components
- JavaScript全棧開發