卷積神經網絡的工程技巧總結

要成功地使用深度學習算法,僅僅知道存在哪些算法和解釋它們爲什麼有效的原理是不夠的。一個優秀的機器學習實踐者還需知道如何針對具體應用挑選一個合適的算法以及如何監控,並根據實驗反饋改進機器學習系統。在機器學習系統的平常開發中,實踐者須要決定是否收集更多的數據、增長或減小模型容量、添加或刪除正則化項、改進模型的優化、改進模型的近似推斷或調試模型的軟件實現。嘗試這些操做都須要大量時間,所以肯定正確的作法,而不盲目猜想尤其重要。在實踐中,正確使用一個普通算法一般比草率地使用了一個不清楚的算法效果更好。正確應用一個算法須要掌握一些至關簡單的方法論。算法

建議參考如下幾個實踐設計流程:數據庫

  • 肯定目標------使用什麼樣的偏差度量,併爲此偏差度量指定目標值。這些目標和偏差度量決定於該應用旨在解決的問題。
  • 儘快創建一個端到端的工做流程,包括估計合適的性能度量。
  • 搭建系統,並肯定性能瓶頸。檢查哪一個部分的性能差於預期,以及是不是由於過擬合、欠擬合,或者數據或軟件缺陷形成的。
  • 根據具體觀察反覆地進行增量式的改動,如收集新數據、調整超參數或改進算法。

將使用街景地址號碼轉錄系統做爲一個運行示例。該應用的目標是將建築物添加到谷歌地圖。街景車拍攝建築物,並記錄與每張建築照片相關的GPS座標。卷積網絡識別每張圖片上的地址號碼,由谷歌地圖數據庫在正確的位置添加該地址。這個商業應用是一個很好的示例,它的開發流程遵循上述方法。編程

1.性能度量

肯定目標,即便使用上面偏差度量,是必要的第一步,由於偏差度量將指導接下來的全部工做。同時也應該瞭解大概能獲得什麼級別的目標性能。安全

值得注意的是,對於大多數應用而言,不可能實現絕對零偏差。即便你有無限的訓練數據,而且恢復了真正的機率,貝葉斯偏差仍定義了能達到的最小錯誤率。這是由於輸入特徵可能沒法包含輸出變量的完整信息,或者由於系統可能本質上是隨機的。固然咱們還會受限於有限的訓練數據。網絡

訓練數據的數量會由於各類緣由受到限制,當目標是打造顯示世界中的產品或服務時,咱們一般須要手機更多的數據,但必須肯定進一步減小偏差的價值,並與收集更多數據的成本作權衡。數據收集會耗費時間、金錢、或帶來人體痛苦(例如,收集人體醫療測試數據)。科研中,目標一般是在某個肯定基準下探討哪一個算法更好,通常會固定訓練集,不容許收集更多的數據、架構

如何肯定合理的性能指望呢?在學術界,一般咱們能夠根據先前公佈的基準結果來估計預期錯誤率。在現實世界中,一個應用的錯誤率有必要是安全的。具備成本效益或者吸引消費者的。一旦你肯定了想要達到的錯誤率,那麼你的設計將由如何表達這個錯誤率來指導。app

除了須要考慮性能度量以外,另外一個須要考慮的是度量的懸着。咱們有幾種不一樣的性能度量,能夠用來度量一個含有機器學習組件的完整應用的有效性。這些性能度量一般不一樣於訓練模型的代價函數。然而,許多應用須要更高級的度量。框架

有時,一種錯誤可能會比另外一種錯誤更加驗證。例如,垃圾郵件檢測系統會有兩種錯誤:將正常郵件錯誤地歸爲垃圾郵件,將垃圾郵件錯誤地歸爲正常郵件。阻止正常消息比容許可疑消息經過糟糕的多。咱們但願度量某種形式的總代價,其中攔截正常郵件比容許垃圾郵件經過的代價更高,而不是度量垃圾郵件分類的錯誤率。機器學習

有時須要訓練檢測某些罕見事件的二元分類器。例如,可能會爲一種罕見疾病設計醫療測試。假設每一百萬人人中只有一我的患病。咱們只須要讓分類器一直報告沒有患者,就能輕易地在檢測任務上實現99.9999%的正確率。顯然,正確率很難描述這種系統的性能。解決這個問題的方法是度量精度(precision)和召回率(recall)。精度是模型報告的檢測正確的比率,而召回率是真實事件被檢測到的比率。檢測器永遠報告沒有患者,會獲得一個完美的精度,而召回率則是真實事件被檢測到的比率。檢測器永遠報告沒有患者,會獲得一個完美的精度,但召回率爲零。而報告每一個人都是患者的檢測器會獲得一個完美的召回率,可是精度會等於人羣中患有該病的比例(在咱們的例子中是0.0001%,即每一百萬人只有一個患病)。當使用精度和召回率是,一般會畫PR曲線(PR curve),y軸表示精度。x軸表示召回率。若是檢測到的事件發生了,那麼分類器會返回一個較高的得分。例如,咱們將前饋網絡設計爲檢測一種疾病,估計一個醫療結果由特徵x表示的人患病的機率爲\hat{y}=P(y=1|x)。每當這個得分超過某個閾值時,咱們報告檢測結果。經過調整閾值,咱們能權衡精度和召回率。在不少狀況下,咱們但願用一個數而不是曲線來歸納分類器的性能。要作到這一點,咱們能夠將精度p和召回率r轉換爲F分數(F-score)函數

                                                                           F=\frac{2pr}{p+r}

另外一種方法是報告PT曲線下方的總面積。

在一些應用中,機器學習系統可能會拒絕作出判斷。若是機器學習算法可以估計所做出的判斷的置信度,這將會很是有用,特別是在錯誤判斷會致使嚴重危害,而人工操做員可以偶爾接管的狀況下。街景轉錄系統能夠做爲這種狀況的一個示例。這個任務時識別照片上的地址號碼,將照片拍攝地點對應到地圖上的地址。若是地圖是不精確的,那麼地圖的價值會嚴重降低。所以只在轉錄正確的狀況下添加地址才十分重要。若是機器學習系統認爲它不能太能像人同樣正確地轉錄,那麼最好的辦法固然是讓人來轉錄照片。固然,只有當機器學習系統可以大量下降須要人工操做處理的圖片時,它纔是有用的。在這種狀況下,一種天然的性能度量度。一個系統能夠經過拒絕處理任意樣本的方式來達到100%的精度,可是覆蓋降到了0%。對於街景任務,該項目的目標是達到人類級別的轉錄精度,同時保持95%的覆蓋。在這項任務中,人類級別的性能是98%的精度。

還有許多其餘的性能度量。例如,我麼能夠度量點擊率、收集用戶滿意度調查等。許多專業的應用領域也有特定的標準。最重要的是首先要肯定改進哪一個性能度量,而後專心提升性能度量。若是沒有明確的目標,那麼咱們很難判斷機器學習系統上的改動是否有所改進。

2.默認的基準模型

肯定性能度量和目標後,任何實際應用系統的下一步是儘快創建一個合理的端到端的系統。下面提供了關於不一樣狀況下使用哪一種算法做爲第一基準方法的推薦。

根據問題的複雜性,項目開始時可能無須使用深度學習。若是隻需正確地選擇幾個線性權重就可能解決問題,那麼項目能夠開始於一個簡單的統計模型,如邏輯迴歸。

若是問題屬於「AI-徹底」類的,如對象識別、語音識別、機器翻譯等,那麼項目開始於一個合適的深度學習模型,效果會比較好。

首先,根據數據的結構選擇一類合適的模型。若是項目是以固定大小的向量做爲輸入的監督學習,按摩可使用全鏈接的前饋網絡。若是輸入已知的拓撲結構(例如,輸入的是圖像),那麼可使用卷積網絡。在這些狀況下,剛開始可使用某些分段線性單元(ReLU或者其擴展,如Leaky ReLU、PReLU和maxout)。若是輸入或輸出是一個序列,可使用門控循環網絡(LSTM或GRU)。

具備衰減學習率以及動量的SGD是優化算法一個合理的選擇(流行的衰減方法有,衰減到固定最低學習率的線性衰減、指數衰減,或每次發生驗證錯誤停滯時將學習率下降2~10倍,這些衰減方法在不一樣問題上好壞不一)。另外一個很是合理的選擇是Adam算法。批標準化對優化性能有着顯著的影響,特別是對卷積網絡和具備sigmoid非線性函數的網絡而言。雖然在最初的基準中忽略批標準化是合理的,然而當優化彷佛出現問題時,應該當即使用批標準化。

除非訓練集包含數千萬以及更多的樣本,不然項目應該在一開始就包含一些溫和的正則化,提早終止也被廣泛採用。Dropout也是一個很容易實現,且兼容不少模型和訓練算法的出色正則化項。批標準化有時也能下降泛化偏差,此時能夠省略Dropout步驟,由於用於標準化變量的統計自己就存在噪聲。

若是咱們的任務和另外一個被普遍研究的任務類似,那麼經過複製先前研究中已知性能良好的模型和算法,可能會獲得很好的小狗,甚至能夠從該任務中複製一個訓練好的模型。例如,一般會使用在ImageNet上訓練好的卷積網絡的特徵來解決其餘計算機視覺任務。

一個常見的問題是項目開始時是否使用無監督學習,在某些領域,好比自認語言處理,可以大大受益於無監督學習技術。如學習無監督詞嵌入。在其餘領域,如計算機視覺,除非在半監督的設定下(標註樣本數量不多),五千無監督學習並無帶來益處。若是應用所在環境中,無監督學習被認爲是很重要的,那麼將其包含在第一個端到端的基準中。不然,只有在解決無監督問題時,纔會第一次嘗試時使用無監督學習。在發現初始基準過擬合的時候,能夠嘗試加入無監督學習。

3.決定是否收集更多數據

在創建一個端到端的系統後,就能夠度量算法性能並決定如何改進算法。許多機器學習新手都忍不住嘗試不少不一樣的算法來進行改進。然而,收集更多的數據每每比改進學習算法要有用得多。

怎樣判斷是否要收集更多的數據?首先,肯定訓練集上的性能是否可接受。若是模型在訓練集上的性能就不好,學習算法都不能在訓練集上學習出良好的模型,那麼就不必收集更多的數據。反之,能夠嘗試增長更多的網絡層或每層增長更多的隱藏單元,以增長模型的規模。此外,也能夠嘗試調整學習率等超參數的措施來改進學習算法。若是更大的規模和仔細調試的優化算法效果不佳,那麼問題可能源自訓練集數據的質量。數據可能含太多噪聲,或是可能不包含預測輸出所需的爭取輸入。這意味着咱們須要從新更新開始,收集更乾淨的數據或是收集特徵更豐富的數據集。

若是訓練集上的性能是可接受的,那麼咱們開始度量測試集上的性能。若是測試集上的性能也是能夠接受的,那麼久順利完成了。若是測試集上的性能比訓練集的要差得多,那麼收集更多的數據是最有效的解決方案之一。這時主要的考慮是收集更多數據的代價和可行性,其餘方法下降測試偏差的代價和可行性,以及增長數據數量可否顯著提高測試集性能。在擁有百萬甚至上億用戶的大型網絡公司,收集大型數據集是可行的,而且這樣作的成本可能比其餘方法要少不少,因此答案几乎老是收集更多的訓練數據。例如,收集大型標註數據集是解決對象識別問題的主要因素之一。在其餘狀況下,如醫療應用,收集更多的數據可能代價很高或者不可行。一個能夠替代的簡單方法是下降,模型大小或者是改建正則化(調整超參數,如權重衰減係數,或是加入正則化策略,如Dropout)。若是調整正則化超參數後,訓練集性能和測試集性能之間的差距仍是不可接受,那麼收集更多的數據時可取的。

在決定收收集更多的數據時,也須要肯定收集多少數據。根據走勢曲線,能夠預測還需多少訓練數據來達到必定的性能。一般,加入總數目一小部分的樣本不會對泛化偏差產生顯著的影響。所以,建議值對數尺度上考慮訓練集的大小,例如在後續的實驗中倍增樣本數目。若是手機更多的數據是不可行的,那麼改進泛化偏差的惟一方法是改進學習算法自己。這屬於研究領域,並不是對應用實踐者的建議。

4.選擇超參數

大部分深度學習算法都有許多超參數來控制不一樣方面的算法表現。有些超參數會影響算法運行的時間和存儲成本,有些超參數會影響學習到的模型質量以及在新輸入上推斷正確結果的能力。有兩種選擇超參數的基本方法:手動選擇和自動選擇。手動選擇超參數須要瞭解超參數作了些什麼,以及機器學習模型如何才能取得良好的泛化。自動選擇超參數算法大大減小了瞭解這些想法的須要,但它們每每須要更高的計算成本。

1.手動調整超參數

手動設置超參數,咱們必須瞭解超參數、訓練偏差、泛化偏差和計算資源(內存和運行時間)之間的關係

手動搜索超參數的目標一般是最小化受限於運動時間和內存預算的泛化偏差。咱們不去探討如何肯定各類超參數對運行時間和內存的影響,由於這高度依賴於平臺。

手動搜索超參數的主要目標是調整模型的有效容量以匹配任務的複雜性。有效容量受限於3個因素:模型的表示容量、學習算法成功最小化訓練模型代價函數的能力,以及代價函數和訓練過程正則化模型的程度。具備更多網絡層、每層有更多的隱藏單元的模型具備較高的表示能力------可以表示更復雜的函數。然而,若是訓練算法不能找到某個合適的函數來最小化訓練代價,或是正則化項(如權重衰減)排除了這些合適的函數,那麼即便模型的表達能力較高,也不能學習處合適的函數。

當泛化偏差以某個超參數爲變量,做爲函數繪製出來時,一般會表現爲U形曲線。在某個極端狀況下,超參數對應着低容量,而且泛化偏差因爲訓練偏差較大而很高。這即是欠擬合的狀況。另外一種極端狀況,超參數對應着高容量,而且泛化偏差因爲訓練偏差和測試偏差之間的差距較大而很高。最優的模型容量位於曲線中間的某個位置,可以達到最低可能的泛化偏差,由某個中等的泛化偏差和某個中等的訓練偏差相加構成。

對於某些超參數,當超參數數值太大時,會發生過擬合。例如中間層隱藏單元的數量,增長數量能提升模型的容量,容易發生過擬合。對於某些超參數,當超參數數值過小時,也會發生過擬合。例如,最小的權重衰減係數容許爲零,此時學習算法具備最大的有效容量,反而容易發生過擬合。

並不是每一個超參數都能對應着完整的U形曲線。不少超參數是離散的,如中間層單元數目或是maxout單元中線性元件的數目,這種狀況只能沿曲線探索這些點。有些超參數是二值的。一般這些超參數用來指定是否使用學習算法中的一些可選部分。如預處理步驟減去均值併除以標準差來標準化輸入特徵。這些超參數只能探索曲線上的亮點。其餘一些超參數可能會有最小值或最大值,限制其探索曲線上的某些部分。例如,權重衰減係數最小是零。這意味着,若是權重權重衰減係數爲零時模型欠擬合,那麼咱們將沒法經過修改權重衰減係數探索擬合區域。換言之,有些超參數只能減小模型容量。

學習率多是最重要的超參數。若是你只有時間調整一個超參數,那就調整學習率。相比於其餘超參數,它以一種更復雜的方式控制着模型的有效容量------當學習率適合優化問題時,模型的有效容量最高,此時學習率是正確的,既不是特別大也不是特別小。學習率關於訓練偏差具備U形曲線。當學習率過大時,梯度降低可能會不經意地增長而非減小訓練偏差。在理想情下,若是學習率是最佳值的兩倍大時,則會發生這種狀況。當學習率過小,訓練不只慢,還有可能永久停留在一個很高的訓練偏差上。關於這種效應,咱們只是甚少(不會發生於一個凸損失函數中)。

調整學習率外的其餘參數時,須要同時監控訓練偏差和測試偏差,以判斷模型是否過擬合或欠擬合,而後適當調整其容量。若是訓練集錯誤率大於目標錯誤率,那麼只能增長模型容量以改進模型。若是沒有使用正則化,而且確信優化算法正確運行,那麼有必要添加更多的網絡層或隱藏單元。然而,使人遺憾的是,這增長了模型的計算代建。

若是測試集錯誤率大於目標錯誤率,那麼能夠採起兩個方法。測試偏差是訓練偏差和測試偏差之間差距與訓練偏差的總和。尋找最佳的測試偏差須要權衡這些數值。當訓練偏差較小(所以容量較大),測試偏差主要取決於訓練偏差和測試偏差之間的差距時,一般神經網絡效果最好。此時目標是縮小這一差距,使訓練數據的增加速率不快於差距減少的速率。要減小這個差距,咱們能夠改變正則化超參數,以減小有效的模型容量,如添加Dropout或權重衰減策略。一般,最佳性能來自正則化得很好的大規模模型,好比使用Dropout的神經網絡。大部分超參數能夠經過推理其是否增長或減小模型容量來設置。

超參數 容量合適增長 緣由 注意事項
隱藏層單元數 增長 增長隱藏單元數量會增長模型的表示能力

幾乎模型每一個操做所需的時間和內存代價都會

隨隱藏單元數量的增長而增長

學習率 調至最優

不正確的學習率,無論是過高仍是過低都

會因爲優化失敗而致使低有效容量的模型

 
卷積核寬度 增長 增長卷積核寬度會增長模型的參數數量

較寬的卷積核致使較窄的輸出尺寸,除非使用隱式

零填充較少此影響,不然會下降模型容量。較寬的

卷積核須要更多的內存存儲參數,並會增長運行時

間,但較窄的輸出會下降內存代價

隱式零填充 增長

在卷積以前隱式添加零能保持較大尺寸的

表示

大多數操做的時間和內存代價會增長
權重衰減係數 下降

下降權重衰減係數使得模型參數能夠自由

地變大

 
Dropout 比率 下降

較少地丟棄單元能夠更多地讓單元彼此「合力」

來適應訓練集

 

手動調整參數時,不要忘記最終目標:提高測試集性能。加入正則化只是實現這個目標的一種方法。只要訓練偏差低,隨時均可以經過收集更多的訓練數據來減小泛化偏差。實踐中能確保學習有效的暴力方法就是不斷提升模型容量和訓練集的大小,直到解決問題。這種作法增長了訓練和推斷的計算代價,因此只有在擁有足夠資源時纔是可行。原則上,這種作法可能會由於優化難度提升而失敗,但對於許多問題而言,優化彷佛並無成爲一個顯著的障礙,固然,前提是選擇了合適的參數。

2.自動超參數優化算法

理想的學習算法應該是隻須要輸入一個數據集,就能夠輸出學習的函數,而不須要手動調整超參數。一些流行的學習方法,如邏輯迴歸和支持向量機,流行的部分緣由是這類算法只有一到兩個超參數須要調整,它們也能表現出不錯的性能。有些狀況下,有些狀況下,所需調整的超參數數量較少時,神經網絡能夠表現出不錯的性能;但超參數數量有幾十甚至更多時,效果會提高得更加明顯。當使用者有一個很好的初始值,例如由在相同類型的應用和架構上具備經驗的人肯定初始值,或者使用者在類似問題上具備幾個月甚至幾年的神經網絡朝參數調整經驗,那麼手動調整超參數能有很好的效果。然而,對於不少應用而言,這些七點都不可用。在這些狀況下,自動算法能夠找到合適的超參數。

若是仔細詳想一想使用搜索學習算法合適超參數的方式,咱們會意識到這實際上是一種優化:咱們在試圖尋找超參數來優化目標函數,例如驗證偏差,有時還會有一些約束(如訓練時間、內存或識別時間的預算)。所以,原則上有可能開發出封裝學習算法的超參數優化算法,並選擇其超參數,從而使用者不須要指定學習算法的超參數。使人遺憾的是,超參數優化算法每每有本身的超參數,如學習算法的每一個超參數應該被探索的值的範圍。然而,這些次超參數一般很容易選擇,這就是說,相同的次超參數可以在不少不一樣的問題上具備良好的性能。

3.網格搜索

當有3個或更少的超參數時,常見的超參數搜索方法是網格搜索(grid search)。對於每一個超參數,使用者選擇一個較小的有限值集去探索。而後,這些超參數笛卡爾乘積獲得一組組超參數,網格搜索使用每組超參數訓練模型。挑選驗證集偏差最小的超參數做爲最好的超參數。

應該如何選擇搜索集合的範圍呢?在超參數時數值(有序)的狀況下,每一個列表的最小和最大的元素能夠基於先前類似實驗的經驗保守地挑選出來,以確保最優解很是可能在所選範圍內。一般,網格搜索大約會在對數尺度下挑選合適的值,例如,一個學習率的取值集合是{0.1, 0.01, 10^-3, 10^-4, 10^-5},或者隱藏單元數目的取值集合{50, 100, 200, 500, 1000, 2000}。

一般重複進行網格搜索時,效果會最好。例如,假設咱們在集合{-1,0,1}上網格搜索超參數a。若是找到的最佳值是1,那麼說明咱們低估了最優值a所在的範圍,應該改變搜索格點,例如在集合{1,2,3}中搜索。若是最佳值是0,那麼咱們不妨經過細化搜索範圍改進估計,在集合{-0.1, 0 ,0.1}上進行網格搜索。

網格搜索帶來的一個明顯問題時,計算代價會隨着超參數數量呈指數級增加。若是有m個超參數,每一個最多取n個值,那麼訓練和估計所需的實驗數將是O(n^m)。咱們能夠並行地進行實驗,而且並行要求十分款算(進行不一樣搜索的機器之間幾乎沒有必要進行通訊)。使人遺憾的是,因爲網絡搜索指數級增加計算代價,即便是並行,咱們也沒法提供使人滿意的搜索規模。

4.隨機搜索

幸運的是,有一個替代網格搜索的方法,而且編程簡單,使用更方便,能更快地收斂到超參數的良好取值------隨機搜索。隨機搜索過程以下,首先爲每一個超參數定義一個邊緣分佈,例如,Bernoulli分佈或範疇分佈(分別對應着二元超參數或離散朝參數),或者對數尺度上的均勻分佈(對應着實值超參數)。例如,

                                                            log\_learning \sim u(-1,-5)\\ learning\_rate = 10^{log\_learning\_rate}

其中,u(a,b)表示區間(a,b)上均勻採樣的樣本。相似地,log_number_of_hidden_units能夠從u(log(50),log(2000))上採樣。

與網格搜索不一樣,咱們不須要離散化超參數的值。這容許咱們在一個更大的集合上進行搜索,而不產生額外的計算代價。實際上,當有集合超參數對性能度量沒有影響時,隨機搜索相比於網絡搜索指數級地高效。

與網格搜索同樣,一般會重複運行不一樣版本的隨機搜索,以基於前一次運行的結果改進下一次搜索。隨機搜索能比網格搜索更快地找到良好超參數的緣由是,沒有浪費實驗,不像網格搜索有時會對一個超參數的兩個不一樣值(給定其餘超參數值不變)給出相同結果。在網格搜索中,其餘超參數將在這兩次實驗中擁有相同的值,而在隨機搜索中,它們一般會具備不一樣的值。所以,若是這兩個值的變化所對應的驗證集偏差沒有明顯區別的話,網格搜索沒有必要重複兩個等價的實驗,而隨機搜索仍然會對其餘超參數進行兩次獨立的探索。

5.基於模型的超參數優化

超參數搜索問題能夠轉化爲一個優化問題,決策變量是超參數,優化的代價是超參數訓練出來的模型在驗證集上的偏差。在簡化的設定下,能夠計算驗證集上可導偏差函數關於超參數的梯度,而後咱們遵循這個梯度更新。使人遺憾的是,在大多數實際設定中,這個梯度是不可用的。這多是由於其高額的計算代價和存儲成本,也多是由於驗證集偏差上本質上不可導,例如超參數是離散值的狀況。

爲了彌補梯度的缺失,咱們能夠對驗證集偏差建模,而後經過優化該模型來提出新的超參數猜測。大部分基於模型的超參數搜索算法,都是使用貝葉斯模型來估計每一個超參數的驗證集偏差指望和該指望的不肯定性。所以,優化涉及探索(探索高度不肯定的超參數,可能帶來顯著的效果提高,也可能效果不好)和使用(使用已經確信效果不錯的超參數------一般是先前見過的很是熟悉的超參數)之間的權衡。關於超參數優化的最前沿方法還包括Spearmint、TPE和SMAC。

目前,沒法明確肯定,貝葉斯超參數優化是不是一個可以實現更好深度學習結果或是可以事半功倍的更熟工具。貝葉斯超參數優化有時表現得很像人類專家,可以在有些問題上取得很好的效果,可是有時又會在某些問題上發生災難性的失誤。看看它是否使用於一個特定的問題是值得嘗試的,但目前該方法還不夠成熟或可靠。就像所說的那樣,超參數優化是一個重要的研究領域,一般主要受深度學習所需驅動,可是它不只能貢獻於整個機器學習領域,還能貢獻於一遍的工程學。

大部分超參數優化算法比隨機搜索更復雜,而且具備一個共同的缺點,在它們可以從實驗中提取任何信息以前,它們須要運行完整的訓練實驗。相比於人類實踐者動手搜索,考慮實驗早期能夠收集的信息量,這種方法是至關低效,由於手動搜索一般能夠很早判斷出某組超參數是否徹底病態。

5.調試策略

當一個機器學習系統效果很差時,一般很難判斷效果很差的緣由是算法自己,仍是算法實現錯誤。因爲各類緣由,機器學習系統很難調試。

在大多數狀況下,不能提早知道算法的行爲。事實上,使用機器學習的整個出發應是,它會發現一些咱們本身沒法發現的有用行爲。若是咱們在一個新的分類任務上訓練一個神經網絡,它達到5%的測試偏差,咱們沒法直接知道這是指望的結果,仍是次優的結果。

另外一個難點是,大部分機器學習模型有多個自適應的部分。若是一個部分失效了,其餘部分仍然能夠自使用,並得到大體可接受的性能。例如,假設咱們正在訓練多層神經網絡,其中參數爲權重W和偏置b,進一步假設,咱們單獨動手實現了每一個參數的梯度降低規則。而咱們在偏置更新時犯了個錯誤:

                                                                      b\leftarrow b-\alpha

其中\alpha是學習率。這個錯誤更新設置沒有使用梯度。它會致使偏置在整個學習中不斷變爲負值,對於一個學習算法來講這顯然是錯誤的。然而只是檢查模型輸出的話,該錯誤可能並非顯而易見的。根據輸入的分佈,權重可能能夠自適應地補償負的偏置。

大部分神經網絡的調試策略都是解決這兩個難題中的一個或兩個。咱們能夠設計一種足夠簡單的狀況,可以提早獲得正確結果,判斷模型預測是否與之相符;咱們也能夠設計一個測試,獨立檢查神經網絡實現的各個部分。

一些重要的調試檢測以下述。

可視化計算種模型的行爲:當訓練模型檢測圖像中的對象時,查看一些模型檢測到部分重疊的圖像。在訓練語音生成模型時,試聽一些生成的語音樣本。這彷佛是顯而易見的,但在實際中很容易只注意量化性能度量,如準確率或對數似然。直接觀察機器學習模型運行其任務,有助於肯定其達到的量化性能數據是否看上去合理。錯誤評估模型性能多是最具破壞性的錯誤之一,由於它們會使你在系統出問題時誤覺得系統運行良好。

可視化最嚴重到的錯誤:大多數模型可以輸出運行任務時的某種置信度量。例如,基於softmax函數輸出層的分類器給每一個類分配一個機率。所以,分配給最有可能的類的機率給出了模型在其分類決定上的置信估計值。一般,相比於正確預測的機率最大似然函數訓練會略有高估。可是因爲實際上模型的較小几率不大可能對應着正確的標籤,所以它們在必定意義上仍是有些用的。經過查看訓練集中很難正確建模的樣本,一般能夠發現該數據預處理或者標記方式的問題。例如,街景轉錄系統中本來有個問題是,地址號碼檢測系統會將圖像裁剪得過於緊密,而省略了一些數字。而後轉錄網絡會給這些圖像的正確答案分配很是低的機率。將圖像排序,肯定置信度最高的錯誤,顯示系統的裁剪有問題。修改檢測系統裁剪更寬的圖像,從而使整個系統得到更好的性能,可是轉錄網絡須要可以處理地址號碼中位置和範圍更大變化的狀況。

根據訓練和測試偏差檢測軟件:咱們每每很難肯定底層軟件是否正確實現。訓練和測試偏差可以提供一些線索。若是訓練偏差較低,可是測試偏差較高那麼極可能訓練過程時在正常運行,但模型因爲算法緣由過你喝了。另外一種多是,測試偏差沒有被正確的度量,多是因爲訓練後保存模型再重載去度量測試集時出現問題,或者是由於測試數據和訓練數據預處理的方法不一樣。若是訓練和測試偏差都很高,那麼很難肯定是軟件錯誤,仍是因爲算法緣由模型欠擬合。這種狀況須要進一步的測試,以下面所述。

集合極小的數據集:當訓練集上有很大的偏差時,咱們須要肯定問題時真正的欠擬合,仍是軟件錯誤。一般,即便是小模型能夠保證很好地擬合一個足夠小的數據集。例如,只有一個樣本的分類數據能夠經過正確設置輸出層的偏置來擬合。一般,即便是小模型也能夠保證很好地擬合一個足夠小的數據集。例如,只有一個樣本的分類數據能夠經過正確設置輸出層的偏置來擬合。一般,若是不能訓練一個分類器來正確標註一個單獨的樣本,或不能訓練一個自編碼器來成功地精確再現一個單獨的樣本,那麼極可能是因爲軟件錯誤阻止訓練集上的成功優化。此測試能夠擴展到只有少許樣本的小數據集上。

比較反向傳播導數和數值導數:若是讀者正在使用一個須要實現梯度計算的軟件框架,或者在添加一個新操做到求導庫中,必須定義它的bprop方法,那麼常見的錯誤緣由是沒能正確實現梯度表達。驗證這些求導正確性的一種方法是比較自動求導的實現和經過有限差分(finite difference)計算的導數:

                                                                   f'(x)=lim\frac{f(x+\varepsilon )}{\varepsilon }

 咱們可使用小的、有限的\varepsilon近似導數:

                                                                 f'(x)\approx lim\frac{f(x+\varepsilon )}{\varepsilon }

 

咱們可使用中心差分(centered difference)提升近似的準確率:
                                                                f'(x)\approx lim\frac{f(x+\varepsilon/2 )-f(x-\varepsilon/2 )}{\varepsilon }

擾動大小\varepsilon必須足夠大,以確保該擾動不會因爲數值計算的有限精度問題產生舍入偏差。

一般,咱們會測試向量值函數g:R^m\rightarrow R^n的梯度或Jacobian次評估g的全部偏導數,也能夠將該測試應用於一個新的函數(在函數g的輸入輸出都加上隨機投影)。例如,咱們能夠將導數實現的測試用於函數f(x)=u^Tg(vx),其中u和v是隨機向量。正確計算f'(x)要求可以正確地經過g反向傳播,可是使用有限差分可以高效地計算,由於f只有一個輸入和一個輸出。一般一個好的方法是在多個u的值和v的值上重複這個測試,能夠減小測試忽略了垂直於隨機投影餓錯誤的概率。

若是咱們能夠在複數上進行數值計算,那麼使用複數做爲函數的輸入會有很是搞笑的數值方法估算梯度。該方法基於以下觀察:

                                                  f(x+i\varepsilon )=f(x)+i\varepsilon f'(x)+O(\varepsilon ^2)

                                            real(f(x+i\varepsilon ))=f(x)+O(\varepsilon ^2), image(\frac{f(x+i\varepsilon )}{\varepsilon })=f'(x)+O(\varepsilon ^2)

其中i=\sqrt{-1}。和上面的實值狀況不一樣,這裏不存在消除影響,由於咱們對f在不一樣點上計算差分。所以咱們可使用很小的\varepsilon,好比\varepsilon = 10^{-150},其中偏差O(\varepsilon ^2)對全部使用目標都是微不足道的。

監控激活函數值和梯度直方圖:可視化神經網絡在大量訓練迭代後(也許是一個輪)收集到的激活函數值和梯度的統計量每每是有用的。隱藏單元的激活值能夠告訴咱們該單元是否飽和,或者它們飽和的頻率如何。例如,對於整流器,它們多久關一次?是否有單元一直關閉?對於雙曲正切單元而言,預激活絕對值的平均值能夠告訴咱們該單元的飽和程度。在深度網絡中,傳播梯度的快速增加或快速消失,可能會阻礙優化過程。最後,比較參數梯度和參數的量級也是有幫助的。正如所建議的,但願參數在一個小批量更新中變化的幅度是參數值1%這樣的級別,而不是50%或者0.001%(這會致使參數移動得太慢)。也有多是某些參數以良好的步長移動,而另外一些停滯。若是數據時稀疏的(好比天然語言),有些參數可能不多更新,檢測它們變化時應該記住這一點。

最後,許多深度學習算法爲每一步產生的結果提供了某種保證。一般,這些能夠經過測試它們每一個保證來調試。某些優化算法提供的保證包括,目標函數值在算法的迭代步中不會增長,某些變量的導數在算法的每一步中都是零,全部變量的梯度在收斂時會變爲零。一般,因爲舍入偏差,這些條件不會在數字計算機上徹底成立,所以調試測試應該包含一些容差參數。

 


承接Matlab、Python和C++的編程,機器學習、計算機視覺的理論實現及輔導,本科和碩士的都可,鹹魚交易,專業回答請走知乎,詳談請聯繫QQ號757160542,非誠勿擾。

本文同步分享在 博客「於小勇」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索