Coursera自动驾驶课程第10讲:Feedforward Neural Networks
在上一講《Coursera自動駕駛課程第9講:Visual Features Detection Description and Matching》中我們學習了如何進行圖像特征檢測,特征匹配以及如何構建視覺里程計來估計相機的運動。
本講我們將學習神經網絡模塊,關于神經網絡或深度學習網上有很多相關課程,這里推薦吳恩達老師的深度學習專項課程。由于篇幅所限,本講介紹的不會很深入。
B站視頻鏈接:https://www.bilibili.com/video/BV1PE411D72p。
文章目錄
- 1. Feedforward Neural Networks
- 1.1 Overview
- 1.2 Applications
- 1.3 Mode of Action of Neural Networks
- 1) Hidden units
- 2) Activation functions
- 2.Output Layers and Loss Functions
- 2.1 Machine Learning Algorithm Design
- 2.2 Classification: Softmax Output Layers
- 2.3 Regression: Linear Output Layers
- 3. Neural Network Training with Gradient Descent
- 3.1 Overview
- 3.2 Batch Gradient Descent (重點)
- 3.3 Stochastic Gradient Descent (重點)
- 4. Data Splits and Neural Network Performance Evaluation
- 4.1 Data Splits
- 4.2 Underfitting & Overfitting
- 5. Neural Network Regularization
- 5.1 Overview
- 5.2 Parameter norm penalites
- 5.3 Dropout
- 5.4 Early Stopping
- 6. Convolutional Neural Networks
- 6.1 ConvNets
- 6.2 Cross Correlation
- 6.3 Output Volume Shape
1. Feedforward Neural Networks
1.1 Overview
本講,我們將學習一個新的主題:深度學習。我們將學習前饋神經網絡,前饋神經網絡是一種非常有用的人工神經網絡。
前饋神經網絡本質上也是一種函數,定義了從輸入xxx到輸出yyy的映射,函數形式如下,θ\thetaθ是需要的參數。
y=f(x;θ)y=f(x ; \theta)y=f(x;θ)
下面來看一個神經網絡的例子:這是一個四層前饋神經網絡。該神經網絡具有輸入層,輸入層為xxx。在這里,xxx可以是標量,向量,矩陣甚至是nnn維張量,例如圖像。輸入經過神經網絡的第一層處理。我們將此層稱為第一隱藏層。類似地,第二隱藏層處理第一隱藏層的輸出。我們可以根據需要添加任意數量的隱藏層,但是每個層都會添加其他要學習的參數。神經網絡的最后一層稱為輸出層。它獲取最后一個隱藏層的輸出并將其轉換為所需的輸出yyy。現在,我們應該對為什么將這些網絡稱為前饋具有直覺。這是因為信息從輸入xxx經過一些中間計算,一直流到輸出yyy,而沒有任何反饋連接。
然后,我們將網絡擴展到NNN層,函數形式為:
f(x;θ)=f(N)(f(N?1)(…f(2)(f(1)(x))))f(x ; \theta)=f^{(N)}\left(f^{(N-1)}\left(\ldots f^{(2)}\left(f^{(1)}(x)\right)\right)\right)f(x;θ)=f(N)(f(N?1)(…f(2)(f(1)(x))))
其中,xxx為輸入層,f(N)f^{(N)}f(N)為輸出層,函數f(1)f^{(1)}f(1)到f(N?1)f^{(N-1)}f(N?1)為隱藏層。
1.2 Applications
現在,我們看一下深度學習在自動駕駛中的應用實例,輸入為圖像。
- 最基本的感知任務是分類任務。在這里,我們需要神經網絡告訴我們圖像所屬分類。
- 我們還可以對圖像中的對象的進行定位,稱之為目標檢測。
- 另一組任務是像素級任務。舉例來說,我們可能想估計圖像中每個像素的深度值。
- 我們可能要確定每個像素屬于哪個類。此任務稱為語義分割。
1.3 Mode of Action of Neural Networks
現在我們了解一些關于神經網絡訓練的知識。在稱為神經網絡訓練的過程中,我們通過修改描述網絡的參數θ\thetaθ來使神經網絡fff以匹配真值f?(x)f ^*(x)f?(x),即:
f(x;θ)?f?(x)f(x ; \theta) \cong f^{*}(x)f(x;θ)?f?(x)
這里訓練數據為xxx和其真值f?(x)f ^*(x)f?(x)。
1) Hidden units
現在我們來深入了解隱藏層,隱藏層由仿射變換和一個非線性變換ggg組成。
- 其中非線性函數ggg稱為激活函數。
- 第nnn個隱藏層的輸入為n?1n-1n?1層的輸出,在該層是第一隱藏層的情況下,其輸入僅是輸入圖像xxx。
- 仿射變換由一個乘法權重矩陣WWW和一個偏差bbb組成。這些權重和偏差是神經網絡需要學習的參數θ\thetaθ。
- 最后,轉換后的輸入通過激活函數ggg傳遞。
2) Activation functions
下面我們來介紹神經網絡中常用的激活函數,ReLU是現在常用的激活函數,其形式為:
g(z)=max?(0,z)g(z)=\max (0, z)g(z)=max(0,z)
ReLU將零和仿射變換的輸出之間的最大值作為其輸出。
讓我們來看一個ReLU隱藏層計算的示例。 已知前一個隱藏層輸出hn?1h_{n-1}hn?1?,權重矩陣WWW和偏差bbb。 首先進行仿射變換,仿射變換的最終結果是5×35\times35×3矩陣。
現在,讓我們將此矩陣傳遞給ReLU函數。 我們可以看到ReLU防止了仿射變換的任何負輸出傳遞到下一層。
實際上,隱藏單元的設計是深度學習中一個非常活躍的研究領域,并且還沒有很多指導理論。 例如,某些神經網絡體系結構使用sigmoid函數,雙曲正切非線性tanh函數,ReLU的泛化,Maxout非線性作為其隱藏層激活函數,如果想深入了解可以查看相關教材和論文。
2.Output Layers and Loss Functions
2.1 Machine Learning Algorithm Design
包括神經網絡在內的有監督機器學習模型有兩種工作模式:推理和訓練。
- 給定一組參數,將輸入xxx傳遞到模型中,可以獲得輸出yyy,這種工作模式稱為推理,網絡及其參數是固定的。
- 第二種工作模式,涉及對網絡參數進行優化,這種模式稱為訓練。
讓我們看看通常如何進行訓練。我們從與推理相同的工作流程開始。但是,在訓練過程中,我們有訓練數據。這樣,我們知道xxx的真值是什么,即模型的預期輸出。對于自動駕駛,訓練數據常見的為人類標注的圖像,這往往需要花費很長時間才能完成。我們通過損失函數將預測的輸出yyy和xxx的實際輸出真值進行比較。
損失函數將來自網絡的預測輸出yyy和x的實際輸出作為輸入,并提供了兩者之間差異的度量。我們通常嘗試通過修改參數來最小化此度量,以使網絡的輸出yyy與xxx的預期輸出盡可能相似。我們通過優化函數對參數進行修改。
在上一課中討論了前饋神經網絡,該神經網絡將輸入xxx傳遞給隱藏層函數,然后將隱藏層的輸出傳遞給輸出層。這是神經網絡的推理階段。為了進行訓練,我們將預測的輸出傳遞給損失函數,然后使用優化函數來生成一組新的參數。
人工神經網絡的設計與傳統機器學習算法的設計之間的主要區別在于,神經網絡僅通過輸出層與損失函數進行交互。然后通過優化函數進行參數調整。(這里課程說的不是很準確,其實神經網絡會通過反向傳播來調整每一層參數值。)
2.2 Classification: Softmax Output Layers
自動駕駛感知的第一個常見任務就是分類任務。分類可以描述為將輸入xxx映射到kkk個類別中的其中一個類別,包括圖像分類,語義分割,實體分割等。
自動駕駛感知的第二個任務是回歸任務。在回歸中,我們將輸入映射為一組實數。回歸的示例包括深度估計,估計圖像中每個像素的真實深度值。我們也可以將兩個任務混合在一起。例如,目標檢測通常包括一個回歸任務和一個分類任務,在回歸任務中我們估計目標的邊界框,在分類任務中我們確定邊界框中的目標類型。
讓我們先從分類任務開始。 通常,對于kkk個類別的分類任務,常用的分類函數為softmax函數。 Softmax函數能夠表示kkk個類別上的概率分布。 softmax輸出層將神經網絡最后一個隱藏層的輸出作為輸入hhh。 然后通過線性變換得到向量zzz。
z=WTh+bz=W^{T} h+bz=WTh+b
接下來,使用softmax函數將向量zzz轉換為離散概率分布。 對于每個元素ziz_izi?,此函數都會計算元素ziz_izi?的指數與zzz的所有元素的指數之和之比。 結果為一個介于0和1之間的值,即其所屬類別的概述,概率總和是1。
Softmax?(zi)=exp?(zi)∑jexp?(zj)\operatorname{Softmax}\left(z_{i}\right)=\frac{\exp \left(z_{i}\right)}{\sum_{j} \exp \left(z_{j}\right)}Softmax(zi?)=∑j?exp(zj?)exp(zi?)?
讓我們看一個示例,以更好地解釋softmax。 在此示例中,我們想對包含貓,狗或狐貍的圖像進行分類。 首先,根據我們的網絡,我們定義輸出矢量的第一個元素以對應于圖像是貓的概率。 類的順序是任意的,對網絡性能沒有影響。 以線性變換的輸出為例,我們通過將輸出中每個元素的指數除以所有元素的指數總和來計算概率。我們得出該圖像為貓的概率為88%,該圖像為狐貍的概率為11.9%,而該圖像為狗的概率非常低 。
現在,讓我們看看如何設計一個損失函數,該函數使用softmax輸出層的輸出向我們展示估計的準確性。 softmax輸出層使用的損失函數是交叉熵損失,它是通過取softmax函數的負對數來形成的。交叉熵損失具有兩項來控制網絡輸出與真實概率的接近程度,損失函數形式為:
L(θ)=?log?(Softmax?(zi))=?zi+(log?∑jexp?(zj))L(\theta)=-\log \left(\operatorname{Softmax}\left(z_{i}\right)\right)=-z_{i}+\left(\log \sum_{j} \exp \left(z_{j}\right)\right)L(θ)=?log(Softmax(zi?))=?zi?+(logj∑?exp(zj?))
要更好地了解這種損失。讓我們看一個如何通過分類神經網絡的輸出來計算交叉熵損失的數值示例。回顧前面的示例,我們首先需要選擇ziz_izi?是什么。 ziz_izi?是對應于真實輸入類別的線性變換輸出。在這種情況下,ziz_izi?是對應于cat類的線性變換輸出的元素。一旦確定了ziz_izi?,就可以使用交叉熵來計算最終損失值。在這種情況下,網絡可以正確地預測輸入為貓,損失函數值為0.12。
現在讓我們再次進行計算,但是網絡輸出錯誤。網絡的輸入仍然是貓的圖像。網絡仍將13的值分配給線性變換輸出的cat條目。但是這一次fox條目的值為14。計算交叉熵損失,我們發現它的評估值為1.31,是前一張幻燈片的十倍。損失函數會嚴重懲罰錯誤的預測,這種差異加快了學習過程。
2.3 Regression: Linear Output Layers
線性輸出層主要用于回歸任務,線性輸出層僅由一個線性變換組成,無任何非線性。 常見的損失函數為均方誤差函數。
L(θ)=∑i(zi?f?(xi))2L(\theta)=\sum_{i}\left(z_{i}-f^{*}\left(x_{i}\right)\right)^{2}L(θ)=i∑?(zi??f?(xi?))2
上面描述的線性和softmax是當今神經網絡中最常用的輸出層,可以與各種任務(特定的損失函數)結合使用,以執行用于自動駕駛的各種感知任務。
3. Neural Network Training with Gradient Descent
3.1 Overview
讓我們首先回顧一下我們先前描述的前饋神經網絡訓練過程。給定訓練輸入數據xxx和相應的標簽f?(x)f^*(x)f?(x)。
我們首先將輸入xxx傳遞給隱藏層,然后傳遞給輸出層以獲得最終輸出yyy。我們在這里看到輸出yyy是參數θ\thetaθ的函數。請記住,θ\thetaθ包含網絡內部線性變換的權重和偏差。
接下來,我們通過損失函數將xxx和θ\thetaθ的預測輸出yyy與f?(x)f^*(x)f?(x)進行比較。請記住,損失函數衡量的是網絡輸出與真值之間的誤差有多大。目標是使損失函數最小。我們通過使用損失函數作為指導來產生一組新的參數θ\thetaθ來達到預期的最小的損失值目的。具體來說,我們使用損失函數的梯度來修改參數θ\thetaθ。此優化過程稱為梯度下降。
3.2 Batch Gradient Descent (重點)
在詳細介紹梯度下降之前,讓我們再來看看神經網絡的損失函數。通常,我們有數千對訓練數據,xxx和f?(x)f^*(x)f?(x)。
我們可以計算所有訓練樣本的損失,作為單個訓練樣本損失的平均值,公式為:
J(θ)=1N∑i=1NL[f(xi,θ),f?(xi)]J(\theta)=\frac{1}{N} \sum_{i=1}^{N} L\left[f\left(x_{i}, \theta\right), f^{*}\left(x_{i}\right)\right]J(θ)=N1?i=1∑N?L[f(xi?,θ),f?(xi?)]
然后我們可以計算訓練損失相對于參數θ\thetaθ的梯度,最終得到的梯度下降算法為:
?θJ(θ)=?θ[1N∑i=1NL[f(xi,θ),f?(xi)]]=1N∑i=1N?θL[f(xi,θ),f?(xi)]\nabla_{\theta} J(\theta)=\nabla_{\theta}\left[\frac{1}{N} \sum_{i=1}^{N} L\left[f\left(x_{i}, \theta\right), f^{*}\left(x_{i}\right)\right]\right]=\frac{1}{N} \sum_{i=1}^{N} \nabla_{\theta} L\left[f\left(x_{i}, \theta\right), f^{*}\left(x_{i}\right)\right]?θ?J(θ)=?θ?[N1?i=1∑N?L[f(xi?,θ),f?(xi?)]]=N1?i=1∑N??θ?L[f(xi?,θ),f?(xi?)]
梯度下降是迭代一階優化算法。迭代意味著它從參數θ\thetaθ的初始值開始,迭代改進參數。一階是指算法只利用一階導數來改善參數θ\thetaθ。批量梯度下降過程如下:
- 首先,對神經網絡的參數θ\thetaθ進行初始化。
- 其次,確定停止條件,終止迭代并返回最終的參數。一旦迭代過程開始,算法要做的第一件事就是計算損失函數相對于參數θ\thetaθ的梯度:?θJ(θ)\nabla_{\theta} J(\theta)?θ?J(θ)。梯度可以用我們前面推導的方程來計算。最后,根據計算的梯度更新參數θ\thetaθ:θ←θ???θJ(θ)\theta \leftarrow \theta-\epsilon \nabla_{\theta} J(\theta)θ←θ???θ?J(θ)。在這里,?\epsilon?稱為學習率,它控制著我們在每次迭代時,在負梯度方向上調整參數的程度。
讓我們看一個二維情況下梯度下降的例子。在這里,我們試圖找到使函數JJJ最小化的參數θ1\theta1θ1和θ2\theta2θ2。圖中的等高線是相等的。梯度下降迭代地尋找新的參數θ\thetaθ,在每次迭代中,它會使我們向內前進一步。
- 算法的第一步是初始化參數θ\thetaθ。使用我們的初始參數,我們得到損失函數的初始值。
- 我們通過計算初始參數θ1\theta1θ1和θ2\theta2θ2處損失函數的梯度開始梯度下降。使用更新步驟,我們得到新的參數,以達到我們的損失函數的低點。
- 我們重復這個過程,直到滿足終止條件。然后我們得到最后一組參數。該算法還缺少兩個部分。我們如何初始化參數,以及如何決定何時停止算法?
對于參數初始化,我們通常使用標準正態分布初始化權重,并將偏差設為0。值得一提的是,還有一些特定于某些激活函數的啟發式算法在文獻中被廣泛使用。
梯度下降的停止條件有點復雜。有三種方法可以確定何時停止訓練算法。
- 當迭代次數超過多最大迭代次數時,終止迭代。
- 另一種啟發式方法是基于參數θ\thetaθ在迭代之間的變化程度(即θnew??θold?\boldsymbol{\theta}_{\text {new }}-\boldsymbol{\theta}_{\text {old }}θnew???θold??)。微小的變化意味著算法不再有效地更新參數,這可能意味著已經達到最小值。
- 最后一個廣泛使用的停止條件是迭代之間損失函數值的變化。同樣,隨著迭代之間損失函數的變化變小,優化很可能已經收斂到最小值。
3.3 Stochastic Gradient Descent (重點)
不幸的是,批梯度下降算法有嚴重的缺點。為了能夠計算梯度,我們需要使用反向傳播。而批梯度下降則對整個訓練集的梯度進行評估。使執行單個更新步驟的速度非常慢。為了解決這個問題,我們現在可以使用訓練數據的一個小批量來計算我們的梯度。那么,如何使用小批量修改我們的批梯度下降算法?
對算法的唯一修改是在采樣步驟。這里我們選擇訓練數據的子樣本作為我們的小批量,這種算法被稱為隨機或小批量梯度下降,因為我們隨機選擇樣本,但是,此算法會導致另一個要確定的參數,即我們要使用的minibatch大小N′N^{\prime}N′。
?θJ(θ)=1N′∑iN′?θL[fi(x,θ),fi?(x)]\nabla_{\theta} J(\theta)=\frac{1}{N^{\prime}} \sum_{i}^{N^{\prime}} \nabla_{\theta} L\left[f_{i}(x, \theta), f_{i}^{*}(x)\right]?θ?J(θ)=N′1?i∑N′??θ?L[fi?(x,θ),fi??(x)]
在使用GPU時,我們可以將minibatch設置為2的nnn次方。要記住的最后一個問題是,在對minibatch進行采樣之前,需要對數據集進行打亂。
隨機梯度下降法在文獻中有許多變體,每種變體都有各自的優缺點。可能很難選擇要使用哪種變體,有時其中一種變體比另一種變體更適用于某些問題。作為自動駕駛應用的簡單經驗法則,安全的選擇是adam優化方法。它對初始參數θ\thetaθ具有很強的魯棒性,應用廣泛。
4. Data Splits and Neural Network Performance Evaluation
4.1 Data Splits
讓我們以一個現實問題為例。我們得到了一個包含10000張交通標志圖像的數據集,其中包含相應的分類標簽。我們想訓練我們的神經網絡來進行交通標志分類。如何處理這個問題?我們是否需要對所有數據進行訓練,然后部署交通標志分類器?這種方法肯定會失敗,原因如下。給定一個足夠大的神經網絡,我們幾乎可以保證得到一個非常低的訓練損失。這是因為在一個典型的深度神經網絡中,參數數量會非常大,允許它在給定足夠多的迭代次數的情況下,記憶訓練數據。更好的方法是將這些數據分為三部分:訓練集、驗證集和測試集。
- 訓練集,顧名思義,在神經網絡訓練過程中,模型在訓練集上使損失函數最小化。
- 當超參數發生變化時,使用驗證集來驗證神經網絡的性能。超參數包括:學習率、網絡層數、每層神經元數等。
- 測試集用于測試網絡性能的無偏估計。在開發神經網絡結構時,測試集是禁止的,這樣神經網絡在訓練或超參數優化過程中就不會看到這些數據。
現在讓我們來確定不同數據集百分比劃分。在大數據錯誤之前,當數據量小于10000時,默認數據百分比約為60%用于訓練,20%用于驗證,20%用于測試。然而,如今數據量可以達到上百萬甚至更多,在驗證和測試集中使用20%的數據是不必要的,因為驗證和測試包含的樣本將遠遠超過目的所需的樣本。在這種情況下,我們會發現98%的訓練集和1%的驗證和測試集并不少見。
4.2 Underfitting & Overfitting
讓我們回到我們的交通標志分類問題。我們假設我們的交通標志數據集由10000個標記的示例組成。我們可以根據6000、2000、2000的大小將數據集分成訓練集、驗證集和測試集。我們現在使用損失函數來評估我們的神經網絡在每個數據集上的性能。
對于分類問題,損失函數定義為預測值與真值之間的交叉熵。交叉熵嚴格地大于零,所以它的值越高,分類器的性能就越差。記住,神經網絡只直接觀察訓練集。所有開發人員都使用驗證集來確定要使用的最佳超參數。訓練的最終目標仍然是最小化測試集上的誤差,因為它是對系統性能的無偏估計,并且數據從未被網絡觀察到。
- 讓我們首先考慮以下場景。假設我們的估計器在訓練集上的交叉熵損失為0.21,在驗證集上的交叉熵損失為0.25,最后在測試集上的交叉熵損失為0.3。此外,由于數據集標簽的錯誤,我們可以預期的最小交叉熵損失為0.18。在這種情況下,我們有一個相當好的分類器,因為三個集合上的損失是相當一致的。
- 讓我們考慮第二個場景,其中訓練損失現在是1.9,大約是最小損失的10倍。正如我們在上一課中所討論的,我們期望任何大小合理的神經網絡都能夠在足夠的訓練時間內幾乎完美地擬合數據。但在這種情況下,網絡無法做到這一點。我們將這種情況稱為神經網絡無法降低訓練損失的欠擬合。
- 我們可能面臨的另一種情況是,訓練集準確率較高,但驗證和測試集準確率較低。這里驗證損失大約是訓練損失的十倍。這種情況被稱為過擬合,是由于神經網絡優化其參數,以精確地再現訓練數據輸出。當我們在驗證集上部署時,網絡不能很好地推廣到新數據。訓練和驗證損失之間的差距稱為泛化差距。我們希望這個差距盡可能小,同時仍然有足夠低的訓練損失。
讓我們看看如何改善欠擬合:
- 第一個選擇是延長訓練時間。即迭代次數越多,訓練損失越小。
- 為神經網絡添加更多層,或者為每層添加更多參數。
現在,讓我們討論如何減少過擬合:
- 最簡單的方法就是收集更多的數據。
- 另一個解決方案是正則化。
5. Neural Network Regularization
5.1 Overview
讓我們在一個示例中逐步進行神經網絡的迭代開發。我們將笛卡爾空間分成兩個部分,橙色和藍色。屬于藍色空間的任何點都應標記為1,而屬于橙色空間的任何點都應標記為2。但是,我們無法直接訪問這些類或其邊界。相反,我們只能訪問傳感器測量值,這些測量值為我們提供了點及其相應的類別。不幸的是,傳感器存在噪音,這意味著它有時會提供錯誤的標簽。標簽在藍色空間中指向2,在橙色空間中指向1。
現在我們先使用一個簡單的神經元網絡,該網絡具有二個隱藏層來對數據進行分類。使用這種設計選擇,我們可以得到以下空間分類。訓練集損失為0.264,驗證集損失0.268。但是,它仍然遠高于最小可實現的損失0.1。這是明顯不合時宜的情況。當我們將網絡分類的結果與真實空間分類的結果進行比較時,我們發現神經網絡無法捕獲當前問題的復雜性,并且沒有按照要求將空間正確地劃分為四個部分。
為了解決欠擬合問題,我們通過增加五個隱藏層來增加網絡規模。我們的模型能夠更好的學習數據特征,因此它應該能夠更好地表示真實的分類。我們繼續再次訓練模型,然后進行測試以查看我們做得如何。我們注意到,我們的驗證集損失為0.45,遠遠高于我們的訓練集損失0.1。但是,訓練集損失等于此任務上可實現的最小損失0.1。我們處于過擬合訓練數據的狀態。為了解決過擬合現象,我們將介紹一種處理過擬合的方法:正則化。
5.2 Parameter norm penalites
讓我們看看神經網絡常用的第一種正則化方法。適用于神經網絡的最傳統形式的正則化形式是參數范數懲罰。常見的表達形式為:
J(θ)reg=J(θ)+αΩ(θ)J(\theta)_{r e g}=J(\theta)+\alpha \Omega(\theta)J(θ)reg?=J(θ)+αΩ(θ)
α\alphaα是一個超參數, Ω(θ)\Omega(\theta)Ω(θ)是參數θ\thetaθ的懲罰項,常見的是LpLpLp正則化。此外,我們通常僅約束神經網絡參數的權重值。
神經網絡中最常用的規范懲罰是L2正則化。 其形式為:
Ω(W)=12WTW=12∥W∥22\Omega(W)=\frac{1}{2} W^{T} W=\frac{1}{2}\|W\|_{2}^{2}Ω(W)=21?WTW=21?∥W∥22?
請記住,我們此前設計的網絡導致對訓練數據集的過擬合。加上L2范數懲罰后,驗證集損失與訓練集損失從0.1增加到0.176,驗證集損失從0.45降為0.182。訓練集損失與驗證集損失與最小損失幾乎相等。
5.3 Dropout
當前,研究人員已經開發出特定于神經網絡的正則化機制:Dropout。讓我們看看在模型訓練期間如何應用Dropout。Dropout的第一步是選擇一個稱為PkeepP_{keep}Pkeep?的概率。在每次迭代訓練中,此概率用于選擇要保留在網絡中的網絡節點子集。這些節點可以是隱藏單元,輸出單元或輸入單元。然后,我們切斷所有該神經節點的后續連接。
Dropout可以直觀地解釋為迫使模型在缺少輸入和隱藏單元的情況下進行學習。它提供了一種在計算過程中不昂貴但功能強大的方法,可以在訓練過程中對大量的神經網絡模型進行正則化,從而大大減少過擬合的情況。此外,Dropout并沒有明顯限制可以使用的訓練模型。它幾乎適用于參數化表示形式上的任何模型,并且可以通過隨機梯度下降進行訓練。最后,所有神經網絡庫都已實現了Dropout層。
5.4 Early Stopping
最后一種正則化方法是Early Stopping。為了從視覺上解釋,我們查看了在訓練集上的損失函數的變化,訓練損失應該能夠減少到接近零。但是,如果我們有獨立的訓練和驗證集,則驗證損失將先下降然后開始增加,這種現象在過擬合中很常見。
停止訓練后,將返回驗證損失最小的參數集。最后要說明的是,不應該將早期停止用作進行正則化的首選。由于它限制了訓練時間,因此可能會影響整體模型性能。
6. Convolutional Neural Networks
6.1 ConvNets
卷積神經網絡是一種特殊的神經網絡,用于處理具有網格狀拓撲的數據。這樣的數據的示例可以是以規則間隔采樣的1D時間序列數據,2D圖像甚至3D視頻。卷積網主要由兩種類型的層組成:卷積層和池化層。 ConvNet體系結構的一個簡單示例是VGG 16。該網絡接收圖像,并將其傳遞給卷積層,池化層,然后是池化層和卷積層等。現在,不必太擔心VGG1 6網絡設計的細節,當我們了解目標檢測時,我們將在后面的視頻中詳細討論該網絡。
讓我們看看這兩種類型的卷積層在實際中如何工作。到目前為止,我們描述的神經網絡,隱藏層通常稱為完全連接層。顧名思義,上一層網絡的每個節點與下一層網絡的所有節點進行連接。這是通過矩陣乘法在軟件中實現的。
盡管反直覺,但是卷積層對其線性算子使用互相關而不是卷積,不是通用矩陣乘法。在卷積運算中僅使用了有限大小的內核。
6.2 Cross Correlation
讓我們開始描述卷積層在實際中如何工作的。我們假設要對輸入圖像應用卷積層。我們將該圖像稱為輸入量,因為我們將看到卷積層也將其他層的輸出作為輸入。輸入寬度是其水平尺寸,高度是其垂直尺寸,深度是通道數。在我們的案例中,所有三個特征的值均為三個。在卷積運算中通常我們也會進行填充操作,這種情況下,在每一側添加的像素數稱為填充大小,填充對于保持執行卷積所需的形狀至關重要。
我們通過一組內核執行卷積運算。每個內核由一組權重和一個偏差組成。內核通道數對應于輸入通道數。在這種情況下,每個內核有三個權重通道,分別對應于輸入圖像的紅色,綠色和藍色通道。
通常每個卷積層有多個卷積核。讓我們看看如何應用二個卷積核從輸入中獲取輸出。輸入維度為(3,3,3)(3,3,3)(3,3,3),輸出維度(2,2,2)(2,2,2)(2,2,2)
6.3 Output Volume Shape
假設卷積核大小是(m,m)(m,m)(m,m),并且我們有KKK個卷積核,步長為SSS,填充大小為PPP。則輸出寬度為:
Wout=Win?m+2×Ps+1\boldsymbol{W}_{\boldsymbol{o u t}}=\frac{\boldsymbol{W}_{\boldsymbol{i n}}-m+2 \times P}{s}+1Wout?=sWin??m+2×P?+1
輸出高度為:
Hout=Hin??m+2×PS+1\boldsymbol{H}_{\boldsymbol{o u t}}=\frac{\boldsymbol{H}_{\text {in }}-m+2 \times P}{S}+1Hout?=SHin???m+2×P?+1
通道數為:
Dout?=K\boldsymbol{D}_{\text {out }}=KDout??=K
現在讓我們繼續描述ConvNets的第二個構建塊,池化層。讓我們以最常用的池化層(最大池化)為例。下面是一個最大池化的示例。
同樣,我們也可以給出最大池化輸出的維度,假設池化卷積核大小為(n,n)(n,n)(n,n),步長為SSS。其輸出寬度為:
Wout=Win?ns+1W_{o u t}=\frac{W_{i n}-n}{s}+1Wout?=sWin??n?+1
輸出高度為:
Hout=Hin?nS+1H_{o u t}=\frac{H_{i n}-n}{S}+1Hout?=SHin??n?+1
輸出高度為:
Dout?=Din?\boldsymbol{D}_{\text {out }}=\boldsymbol{D}_{\text {in }}Dout??=Din??
ConvNets的有效性有兩個重要原因。
- 首先,它們在卷積層中的參數通常比具有完全連接層的類似網絡少得多。 這減少了通過參數共享而過擬合的機會,并允許ConvNets在較大的圖像上運行。
- 也許更重要的是平移不變性。 通過使用相同的參數來處理圖像的每個塊,即使在圖像平面上平移幾個像素,ConvNets仍能夠檢測對象或對像素進行分類。 這意味著我們可以隨時隨地檢測到汽車。
總結
以上是生活随笔為你收集整理的Coursera自动驾驶课程第10讲:Feedforward Neural Networks的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是商业银行?哪些银行属于商业银行?
- 下一篇: 详解惯性导航论文 RINS-W: Rob