本文是吳恩達老師的深度學習課程[1]筆記部分。 做者:黃海廣[2] 主要編寫人員:黃海廣、林興木(第四全部底稿,第五課第一二週,第三週前三節)、祝彥森:(第三課全部底稿)、賀志堯(第五課第三週底稿)、王翔、胡瀚文、 餘笑、 鄭浩、李懷鬆、 朱越鵬、陳偉賀、 曹越、 路皓翔、邱牧宸、 唐天澤、 張浩、 陳志豪、 遊忍、 澤霖、沈偉臣、 賈紅順、 時超、 陳哲、趙一帆、 胡瀟楊、段希、於衝、張鑫倩 參與編輯人員:黃海廣、陳康凱、石晴路、鍾博彥、向偉、嚴鳳龍、劉成 、賀志堯、段希、陳瑤、林家泳、王翔、 謝士晨、蔣鵬 備註:筆記和做業(含數據、原始做業文件)、視頻都在 github[3]中下載。 我將陸續將課程筆記發佈在公衆號「機器學習初學者」,敬請關注。
你們可能已經瞭解了,那麼本週,咱們將繼續學習如何有效運做神經網絡,內容涉及超參數調優,如何構建數據,以及如何確保優化算法快速運行,從而使學習算法在合理時間內完成自我學習。git
第一週,咱們首先說說神經網絡機器學習中的問題,而後是隨機神經網絡,還會學習一些確保神經網絡正確運行的技巧,帶着這些問題,咱們開始今天的課程。github
在配置訓練、驗證和測試數據集的過程當中作出正確決策會在很大程度上幫助你們建立高效的神經網絡。訓練神經網絡時,咱們須要作出不少決策,例如:算法
神經網絡分多少層安全
學習速率是多少網絡
建立新應用的過程當中,咱們不可能從一開始就準確預測出這些信息和其餘超級參數。實際上,應用型機器學習是一個高度迭代的過程,一般在項目啓動時,咱們會先有一個初步想法,好比構建一個含有特定層數,隱藏單元數量或數據集個數等等的神經網絡,而後編碼,並嘗試運行這些代碼,經過運行和測試獲得該神經網絡或這些配置信息的運行結果,你可能會根據輸出結果從新完善本身的想法,改變策略,或者爲了找到更好的神經網絡不斷迭代更新本身的方案。架構
現現在,深度學習已經在天然語言處理,計算機視覺,語音識別以及結構化數據應用等衆多領域取得巨大成功。結構化數據無所不包,從廣告到網絡搜索。其中網絡搜索不只包括網絡搜索引擎,還包括購物網站,從全部根據搜索欄詞條傳輸結果的網站。再到計算機安全,物流,好比判斷司機去哪接送貨,範圍之廣,不勝枚舉。app
我發現,可能有天然語言處理方面的人才想踏足計算機視覺領域,或者經驗豐富的語音識別專家想投身廣告行業,又或者,有的人想從電腦安全領域跳到物流行業,在我看來,從一個領域或者應用領域得來的直覺經驗,一般沒法轉移到其餘應用領域,最佳決策取決於你所擁有的數據量,計算機配置中輸入特徵的數量,用GPU訓練仍是CPU,GPU和CPU的具體配置以及其餘諸多因素。框架
目前爲止,我以爲,對於不少應用系統,即便是經驗豐富的深度學習行家也不太可能一開始就預設出最匹配的超級參數,因此說,應用深度學習是一個典型的迭代過程,須要屢次循環往復,才能爲應用程序找到一個趁心的神經網絡,所以循環該過程的效率是決定項目進展速度的一個關鍵因素,而建立高質量的訓練數據集,驗證集和測試集也有助於提升循環效率。機器學習
假設這是訓練數據,我用一個長方形表示,咱們一般會將這些數據劃分紅幾部分,一部分做爲訓練集,一部分做爲簡單交叉驗證集,有時也稱之爲驗證集,方便起見,我就叫它驗證集(dev set),其實都是同一個概念,最後一部分則做爲測試集。ide
接下來,咱們開始對訓練集執行算法,經過驗證集或簡單交叉驗證集選擇最好的模型,通過充分驗證,咱們選定了最終模型,而後就能夠在測試集上進行評估了,爲了無偏評估算法的運行情況。
在機器學習發展的小數據量時代,常見作法是將全部數據三七分,就是人們常說的70%訓練集,30%測試集。若是明確設置了驗證集,也能夠按照60%訓練集,20%驗證集和20%測試集來劃分。這是前幾年機器學習領域廣泛承認的最好的實踐方法。
若是隻有100條,1000條或者1萬條數據,那麼上述比例劃分是很是合理的。
可是在大數據時代,咱們如今的數據量多是百萬級別,那麼驗證集和測試集佔數據總量的比例會趨向於變得更小。由於驗證集的目的就是驗證不一樣的算法,檢驗哪一種算法更有效,所以,驗證集只要足夠大到能評估不一樣的算法,好比2個甚至10個不一樣算法,並迅速判斷出哪一種算法更有效。咱們可能不須要拿出20%的數據做爲驗證集。
好比咱們有100萬條數據,那麼取1萬條數據便足以進行評估,找出其中表現最好的1-2種算法。一樣地,根據最終選擇的分類器,測試集的主要目的是正確評估分類器的性能,因此,若是擁有百萬數據,咱們只須要1000條數據,便足以評估單個分類器,而且準確評估該分類器的性能。假設咱們有100萬條數據,其中1萬條做爲驗證集,1萬條做爲測試集,100萬里取1萬,比例是1%,即:訓練集佔98%,驗證集和測試集各佔1%。對於數據量過百萬的應用,訓練集能夠佔到99.5%,驗證和測試集各佔0.25%,或者驗證集佔0.4%,測試集佔0.1%。
總結一下,在機器學習中,咱們一般將樣本分紅訓練集,驗證集和測試集三部分,數據集規模相對較小,適用傳統的劃分比例,數據集規模較大的,驗證集和測試集要小於數據總量的20%或10%。後面我會給出如何劃分驗證集和測試集的具體指導。
現代深度學習的另外一個趨勢是愈來愈多的人在訓練和測試集分佈不匹配的狀況下進行訓練,假設你要構建一個用戶能夠上傳大量圖片的應用程序,目的是找出並呈現全部貓咪圖片,可能你的用戶都是愛貓人士,訓練集多是從網上下載的貓咪圖片,而驗證集和測試集是用戶在這個應用上上傳的貓的圖片,就是說,訓練集多是從網絡上抓下來的圖片。而驗證集和測試集是用戶上傳的圖片。結果許多網頁上的貓咪圖片分辨率很高,很專業,後期製做精良,而用戶上傳的照片多是用手機隨意拍攝的,像素低,比較模糊,這兩類數據有所不一樣,針對這種狀況,根據經驗,我建議你們要確保驗證集和測試集的數據來自同一分佈,關於這個問題我也會多講一些。由於大家要用驗證集來評估不一樣的模型,儘量地優化性能。若是驗證集和測試集來自同一個分佈就會很好。
但因爲深度學習算法須要大量的訓練數據,爲了獲取更大規模的訓練數據集,咱們能夠採用當前流行的各類創意策略,例如,網頁抓取,代價就是訓練集數據與驗證集和測試集數據有可能不是來自同一分佈。但只要遵循這個經驗法則,你就會發現機器學習算法會變得更快。我會在後面的課程中更加詳細地解釋這條經驗法則。
最後一點,就算沒有測試集也沒關係,測試集的目的是對最終所選定的神經網絡系統作出無偏估計,若是不須要無偏估計,也能夠不設置測試集。因此若是隻有驗證集,沒有測試集,咱們要作的就是,在訓練集上訓練,嘗試不一樣的模型框架,在驗證集上評估這些模型,而後迭代並選出適用的模型。由於驗證集中已經涵蓋測試集數據,其再也不提供無偏性能評估。固然,若是你不須要無偏估計,那就再好不過了。
在機器學習中,若是隻有一個訓練集和一個驗證集,而沒有獨立的測試集,遇到這種狀況,訓練集還被人們稱爲訓練集,而驗證集則被稱爲測試集,不過在實際應用中,人們只是把測試集當成簡單交叉驗證集使用,並無徹底實現該術語的功能,由於他們把驗證集數據過分擬合到了測試集中。若是某團隊跟你說他們只設置了一個訓練集和一個測試集,我會很謹慎,心想他們是否是真的有訓練驗證集,由於他們把驗證集數據過分擬合到了測試集中,讓這些團隊改變叫法,改稱其爲「訓練驗證集」,而不是「訓練測試集」,可能不太容易。即使我認爲「訓練驗證集「在專業用詞上更準確。實際上,若是你不須要無偏評估算法性能,那麼這樣是能夠的。
因此說,搭建訓練驗證集和測試集可以加速神經網絡的集成,也能夠更有效地衡量算法地誤差和方差,從而幫助咱們更高效地選擇合適方法來優化算法。
我注意到,幾乎全部機器學習從業人員都指望深入理解誤差和方差,這兩個概念易學難精,即便你本身認爲已經理解了誤差和方差的基本概念,卻總有一些意想不到的新東西出現。關於深度學習的偏差問題,另外一個趨勢是對誤差和方差的權衡研究甚淺,你可能據說過這兩個概念,但深度學習的偏差不多權衡兩者,咱們老是分別考慮誤差和方差,卻不多談及誤差和方差的權衡問題,下面咱們來一探究竟。
假設這就是數據集,若是給這個數據集擬合一條直線,可能獲得一個邏輯迴歸擬合,但它並不能很好地擬合該數據,這是高誤差(high bias)的狀況,咱們稱爲「欠擬合」(underfitting)。
相反的若是咱們擬合一個很是複雜的分類器,好比深度神經網絡或含有隱藏單元的神經網絡,可能就很是適用於這個數據集,可是這看起來也不是一種很好的擬合方式分類器方差較高(high variance),數據過分擬合(overfitting)。
在二者之間,可能還有一些像圖中這樣的,複雜程度適中,數據擬合適度的分類器,這個數據擬合看起來更加合理,咱們稱之爲「適度擬合」(just right)是介於過分擬合和欠擬閤中間的一類。
咱們沿用貓咪圖片分類這個例子,左邊一張是貓咪圖片,右邊一張不是。理解誤差和方差的兩個關鍵數據是訓練集偏差(Train set error)和驗證集偏差(Dev set error),爲了方便論證,假設咱們能夠辨別圖片中的小貓,咱們用肉眼識別幾乎是不會出錯的。
假定訓練集偏差是1%,爲了方便論證,假定驗證集偏差是11%,能夠看出訓練集設置得很是好,而驗證集設置相對較差,咱們可能過分擬合了訓練集,在某種程度上,驗證集並無充分利用交叉驗證集的做用,像這種狀況,咱們稱之爲「高方差」。
經過查看訓練集偏差和驗證集偏差,咱們即可以診斷算法是否具備高方差。也就是說衡量訓練集和驗證集偏差就能夠得出不一樣結論。
假設訓練集偏差是15%,咱們把訓練集偏差寫在首行,驗證集偏差是16%,假設該案例中人的錯誤率幾乎爲0%,人們瀏覽這些圖片,分辨出是否是貓。算法並無在訓練集中獲得很好訓練,若是訓練數據的擬合度不高,就是數據欠擬合,就能夠說這種算法誤差比較高。相反,它對於驗證集產生的結果倒是合理的,驗證集中的錯誤率只比訓練集的多了1%,因此這種算法誤差高,由於它甚至不能擬合訓練集,這與上一張幻燈片最左邊的圖片類似。
再舉一個例子,訓練集偏差是15%,誤差至關高,可是,驗證集的評估結果更糟糕,錯誤率達到30%,在這種狀況下,我會認爲這種算法誤差高,由於它在訓練集上結果不理想,並且方差也很高,這是方差誤差都很糟糕的狀況。
再看最後一個例子,訓練集偏差是0.5%,驗證集偏差是1%,用戶看到這樣的結果會很開心,貓咪分類器只有1%的錯誤率,誤差和方差都很低。
有一點我先在這個簡單提一下,具體的留在後面課程裏講,這些分析都是基於假設預測的,假設人眼辨別的錯誤率接近0%,通常來講,最優偏差也被稱爲貝葉斯偏差,因此,最優偏差接近0%,我就不在這裏細講了,若是最優偏差或貝葉斯偏差很是高,好比15%。咱們再看看這個分類器(訓練偏差15%,驗證偏差16%),15%的錯誤率對訓練集來講也是很是合理的,誤差不高,方差也很是低。
當全部分類器都不適用時,如何分析誤差和方差呢?好比,圖片很模糊,即便是人眼,或者沒有系統能夠準確無誤地識別圖片,在這種狀況下,最優偏差會更高,那麼分析過程就要作些改變了,咱們暫時先不討論這些細微差異,重點是經過查看訓練集偏差,咱們能夠判斷數據擬合狀況,至少對於訓練數據是這樣,能夠判斷是否有誤差問題,而後查看錯誤率有多高。當完成訓練集訓練,開始使用驗證集驗證時,咱們能夠判斷方差是否太高,從訓練集到驗證集的這個過程當中,咱們能夠判斷方差是否太高。
以上分析的前提都是假設基本偏差很小,訓練集和驗證集數據來自相同分佈,若是沒有這些假設做爲前提,分析過程更加複雜,咱們將會在稍後課程裏討論。
上一張幻燈片,咱們講了高誤差和高方差的狀況,你們應該對優質分類器有了必定的認識,誤差和方差都高是什麼樣子呢?這種狀況對於兩個衡量標準來講都是很是糟糕的。
咱們以前講過,這樣的分類器,會產生高誤差,由於它的數據擬合度低,像這種接近線性的分類器,數據擬合度低。
可是若是咱們稍微改變一下分類器,我用紫色筆畫出,它會過分擬合部分數據,用紫色線畫出的分類器具備高誤差和高方差,誤差高是由於它幾乎是一條線性分類器,並未擬合數據。
這種二次曲線可以很好地擬合數據。
這條曲線中間部分靈活性很是高,卻過分擬合了這兩個樣本,這類分類器誤差很高,由於它幾乎是線性的。
而採用曲線函數或二次元函數會產生高方差,由於它曲線靈活性過高以至擬合了這兩個錯誤樣本和中間這些活躍數據。
這看起來有些不天然,從兩個維度上看都不太天然,但對於高維數據,有些數據區域誤差高,有些數據區域方差高,因此在高維數據中採用這種分類器看起來就不會那麼牽強了。
總結一下,咱們講了如何經過分析在訓練集上訓練算法產生的偏差和驗證集上驗證算法產生的偏差來診斷算法是否存在高誤差和高方差,是否兩個值都高,或者兩個值都不高,根據算法誤差和方差的具體狀況決定接下來你要作的工做,下節課,我會根據算法誤差和方差的高低狀況講解一些機器學習的基本方法,幫助你們更系統地優化算法,咱們下節課見。
上節課咱們講的是如何經過訓練偏差和驗證集偏差判斷算法誤差或方差是否偏高,幫助咱們更加系統地在機器學習中運用這些方法來優化算法性能。
下圖就是我在訓練神經網絡用到的基本方法:(嘗試這些方法,可能有用,可能沒用)
這是我在訓練神經網絡時用到的基本方法,初始模型訓練完成後,我首先要知道算法的誤差高不高,若是誤差較高,試着評估訓練集或訓練數據的性能。若是誤差的確很高,甚至沒法擬合訓練集,那麼你要作的就是選擇一個新的網絡,好比含有更多隱藏層或者隱藏單元的網絡,或者花費更多時間來訓練網絡,或者嘗試更先進的優化算法,後面咱們會講到這部份內容。你也能夠嘗試其餘方法,可能有用,也可能沒用。
一下子咱們會看到許多不一樣的神經網絡架構,或許你能找到一個更合適解決此問題的新的網絡架構,加上括號,由於其中一條就是你必須去嘗試,可能有用,也可能沒用,不過採用規模更大的網絡一般都會有所幫助,延長訓練時間不必定有用,但也沒什麼壞處。訓練學習算法時,我會不斷嘗試這些方法,直到解決掉誤差問題,這是最低標準,反覆嘗試,直到能夠擬合數據爲止,至少可以擬合訓練集。
若是網絡足夠大,一般能夠很好的擬合訓練集,只要你能擴大網絡規模,若是圖片很模糊,算法可能沒法擬合該圖片,但若是有人能夠分辨出圖片,若是你以爲基本偏差不是很高,那麼訓練一個更大的網絡,你就應該能夠……至少能夠很好地擬合訓練集,至少能夠擬合或者過擬合訓練集。一旦誤差下降到能夠接受的數值,檢查一下方差有沒有問題,爲了評估方差,咱們要查看驗證集性能,咱們能從一個性能理想的訓練集推斷出驗證集的性能是否也理想,若是方差高,最好的解決辦法就是採用更多數據,若是你能作到,會有必定的幫助,但有時候,咱們沒法得到更多數據,咱們也能夠嘗試經過正則化來減小過擬合,這個咱們下節課會講。有時候咱們不得不反覆嘗試,可是,若是能找到更合適的神經網絡框架,有時它可能會一舉兩得,同時減小方差和誤差。如何實現呢?想系統地說出作法很難,總之就是不斷重複嘗試,直到找到一個低誤差,低方差的框架,這時你就成功了。
有兩點須要你們注意:
第一點,高誤差和高方差是兩種不一樣的狀況,咱們後續要嘗試的方法也可能徹底不一樣,我一般會用訓練驗證集來診斷算法是否存在誤差或方差問題,而後根據結果選擇嘗試部分方法。舉個例子,若是算法存在高誤差問題,準備更多訓練數據其實也沒什麼用處,至少這不是更有效的方法,因此你們要清楚存在的問題是誤差仍是方差,仍是二者都有問題,明確這一點有助於咱們選擇出最有效的方法。
第二點,在機器學習的初期階段,關於所謂的誤差方差權衡的討論家常便飯,緣由是咱們能嘗試的方法有不少。能夠增長誤差,減小方差,也能夠減小誤差,增長方差,可是在深度學習的早期階段,咱們沒有太多工具能夠作到只減小誤差或方差卻不影響到另外一方。但在當前的深度學習和大數據時代,只要持續訓練一個更大的網絡,只要準備了更多數據,那麼也並不是只有這兩種狀況,咱們假定是這樣,那麼,只要正則適度,一般構建一個更大的網絡即可以,在不影響方差的同時減小誤差,而採用更多數據一般能夠在不過多影響誤差的同時減小方差。這兩步實際要作的工做是:訓練網絡,選擇網絡或者準備更多數據,如今咱們有工具能夠作到在減小誤差或方差的同時,不對另外一方產生過多不良影響。我以爲這就是深度學習對監督式學習大有裨益的一個重要緣由,也是咱們不用太過關注如何平衡誤差和方差的一個重要緣由,但有時咱們有不少選擇,減小誤差或方差而不增長另外一方。最終,咱們會獲得一個很是規範化的網絡。從下節課開始,咱們將講解正則化,訓練一個更大的網絡幾乎沒有任何負面影響,而訓練一個大型神經網絡的主要代價也只是計算時間,前提是網絡是比較規範化的。
今天咱們講了如何經過組織機器學習來診斷誤差和方差的基本方法,而後選擇解決問題的正確操做,但願你們有所瞭解和認識。我在課上不止一次提到了正則化,它是一種很是實用的減小方差的方法,正則化時會出現誤差方差權衡問題,誤差可能略有增長,若是網絡足夠大,增幅一般不會過高,咱們下節課再細講,以便你們更好理解如何實現神經網絡的正則化。
深度學習可能存在過擬合問題——高方差,有兩個解決方法,一個是正則化,另外一個是準備更多的數據,這是很是可靠的方法,但你可能沒法時時刻刻準備足夠多的訓練數據或者獲取更多數據的成本很高,但正則化一般有助於避免過擬合或減小你的網絡偏差。
若是你懷疑神經網絡過分擬合了數據,即存在高方差問題,那麼最早想到的方法多是正則化,另外一個解決高方差的方法就是準備更多數據,這也是很是可靠的辦法,但你可能沒法時時準備足夠多的訓練數據,或者,獲取更多數據的成本很高,但正則化有助於避免過分擬合,或者減小網絡偏差,下面咱們就來說講正則化的做用原理。
爲何正則化有利於預防過擬合呢?爲何它能夠減小方差問題?咱們經過兩個例子來直觀體會一下。
左圖是高誤差,右圖是高方差,中間是Just Right,這幾張圖咱們在前面課程中看到過。
咱們再來直觀感覺一下,正則化爲何能夠預防過擬合,假設咱們用的是這樣的雙曲線激活函數。
第一節課咱們講過,若是每層都是線性的,那麼整個網絡就是一個線性網絡,即便是一個很是深的深層網絡,因具備線性激活函數的特徵,最終咱們只能計算線性函數,所以,它不適用於很是複雜的決策,以及過分擬合數據集的非線性決策邊界,如同咱們在幻燈片中看到的過分擬合高方差的狀況。
這就是L2正則化,它是我在訓練深度學習模型時最經常使用的一種方法。在深度學習中,還有一種方法也用到了正則化,就是dropout正則化,咱們下節課再講。
這是網絡節點精簡後的一個樣本,對於其它樣本,咱們照舊以拋硬幣的方式設置機率,保留一類節點集合,刪除其它類型的節點集合。對於每一個訓練樣本,咱們都將採用一個精簡後神經網絡來訓練它,這種方法彷佛有點怪,單純遍歷節點,編碼也是隨機的,可它真的有效。不過可想而知,咱們針對每一個訓練樣本訓練規模小得多的網絡,最後你可能會認識到爲何要正則化網絡,由於咱們在訓練規模小得多的網絡。
事實證實,在測試階段,當咱們評估一個神經網絡時,也就是用綠線框標註的反向隨機失活方法,使測試階段變得更容易,由於它的數據擴展問題變少,咱們將在下節課討論。
據我瞭解,目前實施dropout最經常使用的方法就是Inverted dropout,建議你們動手實踐一下。Dropout早期的迭代版本都沒有除以keep-prob,因此在測試階段,平均值會變得愈來愈複雜,不過那些版本已經再也不使用了。
顯然在測試階段,咱們並未使用dropout,天然也就不用拋硬幣來決定失活機率,以及要消除哪些隱藏單元了,由於在測試階段進行預測時,咱們不指望輸出結果是隨機的,若是測試階段應用dropout函數,預測會受到干擾。理論上,你只須要屢次運行預測處理過程,每一次,不一樣的隱藏單元會被隨機歸零,預測處理遍歷它們,但計算效率低,得出的結果也幾乎相同,與這個不一樣程序產生的結果極爲類似。
Inverted dropout函數在除以keep-prob時能夠記住上一步的操做,目的是確保即便在測試階段不執行dropout來調整數值範圍,激活函數的預期結果也不會發生變化,因此不必在測試階段額外添加尺度參數,這與訓練階段不一樣。
總結一下,若是你擔憂某些層比其它層更容易發生過擬合,能夠把某些層的keep-prob值設置得比其它層更低,缺點是爲了使用交叉驗證,你要搜索更多的超級參數,另外一種方案是在一些層上應用dropout,而有些層不用dropout,應用dropout的層只含有一個超級參數,就是keep-prob。
結束前分享兩個實施過程當中的技巧,實施dropout,在計算機視覺領域有不少成功的第一次。計算視覺中的輸入量很是大,輸入太多像素,以致於沒有足夠的數據,因此dropout在計算機視覺中應用得比較頻繁,有些計算機視覺研究人員很是喜歡用它,幾乎成了默認的選擇,但要牢記一點,dropout是一種正則化方法,它有助於預防過擬合,所以除非算法過擬合,否則我是不會使用dropout的,因此它在其它領域應用得比較少,主要存在於計算機視覺領域,由於咱們一般沒有足夠的數據,因此一直存在過擬合,這就是有些計算機視覺研究人員如此鍾情於dropout函數的緣由。直觀上我認爲不能歸納其它學科。
一.數據擴增(數據加強)
假設你正在擬合貓咪圖片分類器,若是你想經過擴增訓練數據來解決過擬合,但擴增數據代價高,並且有時候咱們沒法擴增數據,但咱們能夠經過添加這類圖片來增長訓練集。例如,水平翻轉圖片,並把它添加到訓練集。因此如今訓練集中有原圖,還有翻轉後的這張圖片,因此經過水平翻轉圖片,訓練集則能夠增大一倍,由於訓練集有冗餘,這雖然不如咱們額外收集一組新圖片那麼好,但這樣作節省了獲取更多貓咪圖片的花費。
除了水平翻轉圖片,你也能夠隨意裁剪圖片,這張圖是把原圖旋轉並隨意放大後裁剪的,仍能辨別出圖片中的貓咪。
經過隨意翻轉和裁剪圖片,咱們能夠增大數據集,額外生成假訓練數據。和全新的,獨立的貓咪圖片數據相比,這些額外的假的數據沒法包含像全新數據那麼多的信息,但咱們這麼作基本沒有花費,代價幾乎爲零,除了一些對抗性代價。以這種方式擴增算法數據,進而正則化數據集,減小過擬合比較廉價。
像這樣人工合成數據的話,咱們要經過算法驗證,圖片中的貓通過水平翻轉以後依然是貓。你們注意,我並無垂直翻轉,由於咱們不想上下顛倒圖片,也能夠隨機選取放大後的部分圖片,貓可能還在上面。
對於光學字符識別,咱們還能夠經過添加數字,隨意旋轉或扭曲數字來擴增數據,把這些數字添加到訓練集,它們仍然是數字。爲了方便說明,我對字符作了強變形處理,因此數字4看起來是波形的,其實不用對數字4作這麼誇張的扭曲,只要輕微的變形就好,我作成這樣是爲了讓你們看的更清楚。實際操做的時候,咱們一般對字符作更輕微的變形處理。由於這幾個4看起來有點扭曲。因此,數據擴增可做爲正則化方法使用,實際功能上也與正則化類似。
二.early stopping
若是你還不能徹底理解這個概念,不要緊,下節課咱們會詳細講解正交化,這樣會更好理解。
若是你使用非歸一化的輸入特徵,代價函數會像這樣:
總結一下,咱們講了深度神經網絡是如何產生梯度消失或爆炸問題的,實際上,在很長一段時間內,它曾是訓練深度神經網絡的阻力,雖然有一個不能完全解決此問題的解決方案,可是已在如何選擇初始化權重問題上提供了不少幫助。
上節課,咱們學習了深度神經網絡如何產生梯度消失和梯度爆炸問題,最終針對該問題,咱們想出了一個不完整的解決方案,雖然不能完全解決問題,卻頗有用,有助於咱們爲神經網絡更謹慎地選擇隨機初始化參數,爲了更好地理解它,咱們先舉一個神經單元初始化地例子,而後再演變到整個深度網絡。
但願你如今對梯度消失或爆炸問題以及如何爲權重初始化合理值已經有了一個直觀認識,但願你設置的權重矩陣既不會增加過快,也不會太快降低到0,從而訓練出一個權重或梯度不會增加或消失過快的深度網絡。咱們在訓練深度網絡時,這也是一個加快訓練速度的技巧。
在實施backprop時,有一個測試叫作梯度檢驗,它的做用是確保backprop正確實施。由於有時候,你雖然寫下了這些方程式,卻不能100%肯定,執行backprop的全部細節都是正確的。爲了逐漸實現梯度檢驗,咱們首先說說如何計算梯度的數值逼近,下節課,咱們將討論如何在backprop中執行梯度檢驗,以確保backprop正確實施。
若是你不理解上面兩條結論,全部公式都在這兒,不用擔憂,若是你對微積分和數值逼近有所瞭解,這些信息已經足夠多了,重點是要記住,雙邊偏差公式的結果更準確,下節課咱們作梯度檢驗時就會用到這個方法。
在實施神經網絡時,我常常須要執行foreprop和backprop,而後我可能發現這個梯度檢驗有一個相對較大的值,我會懷疑存在bug,而後開始調試,調試,調試,調試一段時間後,我獲得一個很小的梯度檢驗值,如今我能夠很自信的說,神經網絡實施是正確的。
如今你已經瞭解了梯度檢驗的工做原理,它幫助我在神經網絡實施中發現了不少bug,但願它對你也有所幫助。
這節課,分享一些關於如何在神經網絡實施梯度檢驗的實用技巧和注意事項。
參考資料
[1]
深度學習課程: https://mooc.study.163.com/university/deeplearning_ai
[2]
黃海廣: https://github.com/fengdu78
[3]