丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預覽,將在時失效
人工智能 正文
發(fā)私信給大牛講堂
發(fā)送

0

干貨 | 算法工程師入門第一期——羅恒講深度學習

本文作者: 大牛講堂 編輯:谷磊 2017-07-14 18:46
導語:大牛講堂實用干貨-算法工程師入門課程,首期將由地平線資深算法研究員羅恒為大家講述深度學習簡介,包括神經(jīng)網(wǎng)絡的歷史回顧和神經(jīng)網(wǎng)絡的訓練等內(nèi)容。

雷鋒網(wǎng)按:本文為大牛講堂算法工程師入門課程第一篇。地平線資深算法工程師羅恒、穆黎森、黃李超將分別帶來深度學習、增強學習、物體檢測的相關課程。本期地平線資深算法研究員羅恒將為大家?guī)砩疃葘W習簡介,包括神經(jīng)網(wǎng)絡歷史回顧和神經(jīng)網(wǎng)絡訓練等內(nèi)容。

干貨 | 算法工程師入門第一期——羅恒講深度學習

▼ 

整個神經(jīng)網(wǎng)絡,從歷史上就可以把很多東西搞清楚,比如它是怎么變過來的。我認為神經(jīng)網(wǎng)絡其實是變得越來越簡單,越來越好用的?,F(xiàn)在神經(jīng)網(wǎng)絡常用的東西已經(jīng)很固定了,你不用再加任何東西就能用。但有些時候你覺得這個東西應該work,但它不work,這種情況該怎么辦。所以盡管現(xiàn)在很多東西已經(jīng)純標準化,但了解這些對于你找問題找錯誤,還是很重要。所以這次主要講兩個東西,優(yōu)化和正則化。絕大多數(shù)情況,正則化不是問題,我們只關心優(yōu)化問題,往往你發(fā)現(xiàn)需要做正則化的時候多半是數(shù)據(jù)問題。

神經(jīng)網(wǎng)絡經(jīng)歷了三次研究熱潮。第一次是60年代,感知器出來后很多人認為離人工智能已經(jīng)很近了。但馬上有人寫了本書叫《感知器》,說它不能解決異或問題,這個時候大家一下子又不感興趣了。到80年代,BP算法出來,又開始變得火熱起來。但當時人們認為多層神經(jīng)網(wǎng)絡優(yōu)化困難,又對它失去了信心。直到很多年后,2006年出來了Deep Belief Nets。學術界又開始慢慢對神經(jīng)網(wǎng)絡有興趣,等到神經(jīng)網(wǎng)絡在語音識別和物體識別上取得突破后,神經(jīng)網(wǎng)絡的第三次熱潮又開始了,一直持續(xù)到現(xiàn)在。

感知器已經(jīng)有了現(xiàn)代神經(jīng)網(wǎng)絡的原型,輸入特征與參數(shù)w連接,加權累加之后進入神經(jīng)元,通過激活函數(shù)輸出。與現(xiàn)在的網(wǎng)絡的區(qū)別主要有兩點,第一是數(shù)據(jù)要經(jīng)過人工編碼形成特征;第二是網(wǎng)絡的輸出是離散的二值。前者導致了相當一段時間,人們認為什么是好的特征應該由專家來設計,有了好的特征之后再解決分類問題,從這個角度上看,SVM也只是個特殊的感知器。

關于第二點,輸出的離散的,這個帶來一個問題,就是從輸入到輸出不是一個連續(xù)的光滑的,這個其實是限制使用梯度優(yōu)化網(wǎng)絡的最大障礙。

干貨 | 算法工程師入門第一期——羅恒講深度學習

很快,Minsky和Papert的《感知器》里面證明了上面的感知器不能解決異或等一大類問題,這本書因此也造成了神經(jīng)網(wǎng)絡研究的第一次低潮。有趣的是,其實也就是在《感知器》里面,作者指出如果在網(wǎng)絡中能夠增加一些額外的類似感知器的單元,那么就能解決那些不能解決的問題。

這類神經(jīng)元后來被Hinton稱之為隱藏單元(Hidden Units),在傳統(tǒng)的感知器中,輸出神經(jīng)元是可見的,根據(jù)訓練數(shù)據(jù),我們知道輸出單元應當是什么樣的狀態(tài),而隱藏單元的狀態(tài)則不可知。就像之前提到的,如果隱藏單元的輸出是離散的,那么根據(jù)輸入特征,得到對應的輸出就需要考慮隱藏單元的各種可能狀態(tài),那么就是一個組合優(yōu)化問題,求解困難。

80年代,BP算法的成功的主要原因,就是改變激活函數(shù)為光滑連續(xù)的函數(shù)(可導),這樣一來,對于一個含有隱藏單元的神經(jīng)網(wǎng)絡,從輸入x到輸入y也是一個關于所有連接參數(shù)w的光滑連續(xù)的函數(shù)。那么使用鏈式法則求導,我們就可以得到網(wǎng)絡所有參數(shù)的梯度,也就是說我們現(xiàn)在知道按梯度方向調(diào)整參數(shù)w就可以使得給定輸入數(shù)據(jù)x改變網(wǎng)絡的輸出大小,不斷地修正,就可以使得網(wǎng)絡的行為去擬合訓練數(shù)據(jù)。之后,BP算法大獲成功,神經(jīng)網(wǎng)絡迎來了第二次的研究熱潮。

80年代到90年代,大量的研究人員使用BP算法訓練神經(jīng)網(wǎng)絡,但是大家發(fā)現(xiàn)優(yōu)化十分困難,最常見的失敗就是無論怎么調(diào)整參數(shù),訓練的loss就是不降。由于神經(jīng)網(wǎng)絡是優(yōu)化一個非線性函數(shù),那么意味著理論上存在局部極小點,因此,每當loss不降,大家都是自然而然地認為這是遇到了局部極小點,同時理論上層數(shù)越多的神經(jīng)網(wǎng)絡非線性越強會有更多的局部極小,現(xiàn)實的觀察也發(fā)現(xiàn)更深的網(wǎng)絡往往結(jié)果更差,從而大量的研究者對神經(jīng)網(wǎng)絡失去信心,神經(jīng)網(wǎng)絡進入第二次低潮。90年代末開始的SVM相關研究以及后來對凸優(yōu)化的癡迷,也都是在這個大背景下發(fā)生的。

進入2000年之后,Hinton發(fā)現(xiàn)使用一些非監(jiān)督方法對多層神經(jīng)網(wǎng)絡做初始化之后再使用BP算法,能夠成功地訓練并得到更好的結(jié)果。再后來,發(fā)現(xiàn)直接使用BP算法進行監(jiān)督訓練就能在很多很多問題上得到非常好的結(jié)果。那么為什么90年代的時候沒有成功呢?一個是當時訓練數(shù)據(jù)相對很少,而且當時的機器訓練起來很慢;另外一個是當時訓練優(yōu)化方法不太先進,所以有時在訓練的時候梯度會出一些問題。

干貨 | 算法工程師入門第一期——羅恒講深度學習

上面的圖是一個四隱藏層的神經(jīng)網(wǎng)絡訓練在MNIST上面(激活函數(shù)是tanh),大家可以看到訓練一開始,最頂層的神經(jīng)元的激活值迅速減小,那么意味著從這一層往后傳遞的梯度也會迅速減小,同時也可以觀察到loss會基本保持不變(最后一層的激活函數(shù)接近0,那么無論什么樣的輸入到這一層之后都差不多,自然也就無法正確分類降低loss)。

但是隨著訓練的進行,頂層的激活又從0開始慢慢變大,loss最后又開始降。也就是在優(yōu)化的時候,本來以為是掉到某一個坑里(局部極小),無論把w怎么改變,你的loss都沒辦法降下來。但實際情況是你在一個很平的高原上,你沿各個方向走,這個loss都差不多。現(xiàn)在我們知道使用適當?shù)膮?shù)初始化、使用沒有飽和的激活函數(shù)(如ReLU)、使用Batch Normalization都可以、使用一些自適應學習率方法(如Adam,RMSProp)都可以緩解上面這種情況,當然更重要的一點是使用GPU。

歷史講完了,接下來講講算法工程師日常工作面臨的問題。我有一堆數(shù)據(jù),質(zhì)量差不多,我要拿到這些數(shù)據(jù)去訓練一個模型,讓這個模型能夠投入使用。至于訓練模型,我們現(xiàn)在工具已經(jīng)很完備了,數(shù)據(jù)整理好之后梳理好命令,機器去跑,拿到一個結(jié)果,就最好了。但通常呢,會發(fā)現(xiàn)結(jié)果不好,結(jié)果不好有兩種情況,一種是我剛才說的,模型在訓練集上表現(xiàn)不好,也就是對應我們要講的第一個問題,優(yōu)化問題。也就是你拿到一個數(shù)據(jù),你第一件事情你不要考慮測試集,你就考慮訓練集,我要讓我這個模型在訓練上能做的足夠好,所以這個實際上是一個優(yōu)化問題。通常我們絕大多數(shù)困難都在這個問題。

當這個問題解決之后,可能又開始第二個問題。就是我在訓練集上做的很好,但是在驗證集上做的不好,這個就是overfitting,overfitting有很多種情況,從學術上講比如說訓練數(shù)據(jù)中包含一些噪聲。我們?nèi)粘V挟斈惆l(fā)現(xiàn)你的loss很低,但是在你的驗證集結(jié)果不好,通常是你的訓練集和你的測試集不一樣。這個不一樣可能有很多種原因,比如是不同的時間采集的,采集數(shù)據(jù)的策略發(fā)生了變化等等。這時首先需要做的是通過可視化對數(shù)據(jù)的分布有直覺上的認識,解決數(shù)據(jù)本身的問題。最簡單的一種可視化辦法,比如說你是一個二分類,你現(xiàn)在數(shù)據(jù)你就把它全部過一遍,二分類只有一個輸出,每個訓練的數(shù)據(jù)給它分一個數(shù),你把這個數(shù)從大到小排一遍,驗證集也可以得到一個數(shù),也從大到小排一遍。

然后你就從大到小隨機抽一些采樣,就會發(fā)現(xiàn)你數(shù)據(jù)的問題在哪。不斷地做這個過程,不斷地改進新的數(shù)據(jù)集,這個將會是你的最大的收益。也就是改你的數(shù)據(jù)擴大你的數(shù)據(jù)集,使你的數(shù)據(jù)覆蓋的種類更全,收益可能是幾十個百分點的,而調(diào)整你的優(yōu)化策略可能只是幾個百分點的收益,正則化方法可能只是千分位上的收益。

所以,理解神經(jīng)網(wǎng)絡背后的優(yōu)化過程,理解你的數(shù)據(jù)才是最重要的。具體的可視化、數(shù)據(jù)采樣的方法往往需要結(jié)合問題本身發(fā)揮創(chuàng)造力。當訓練、驗證數(shù)據(jù)大致滿足需求之后,接下來要做的就是訓練網(wǎng)絡,不斷減小訓練集上的loss。如今有大量的開源工具,對于一些主流的任務,通常可以方便的找到適合的網(wǎng)絡結(jié)構(gòu)以及相應的超參數(shù)。

大家只要結(jié)合自己的計算資源上的限制對這些網(wǎng)絡做些適當?shù)募舨镁涂梢裕@里就不展開了。下面介紹一些訓練過程中常見的情況以及如何調(diào)整。訓練中常見的困難是loss不降,常見的情況是輸入數(shù)據(jù)從下往上傳輸?shù)臅r候,某一層的表示完全相同(比如某層的激活函數(shù)為0),這樣學習自然就無法進行了。

因此在訓練的過程中查看激活函數(shù)的相關統(tǒng)計信息是個好習慣。常見的情況,比如到softmax的連接矩陣w迅速變小,這有可能是由于數(shù)據(jù)類別分布非常不均衡導致的,這時候做些采樣以及適當改變mini-batch的大小可能會有緩解。除了考慮數(shù)據(jù)樣本的均衡之外,也可以適當?shù)馗淖冞@層連接矩陣的參數(shù)初始化。當網(wǎng)絡中間某層的激活函數(shù)總是輸出0,這種時候loss的下降也會停止。

這時候可以考慮幾個方面,首先在這個激活函數(shù)之前是否有Batch Normalization,如果沒有最好加上試試(對于現(xiàn)在的前向網(wǎng)絡,最好保證除softmax之外的激活函數(shù)之前都有BN),如果有BN也可以進一步檢查eps是否設的過大,可以適當調(diào)小試試;其次也可以檢查一下是否ReLU造成的,這時候也可以試著改變這一層的bias和BN的beta的初始化(初始化成某個正數(shù),比如+1);第三,如果改變了原始的網(wǎng)絡結(jié)構(gòu),那么也最好避免表示的瓶頸(這一層的隱單元個數(shù)不要比之前層的隱單元個數(shù)少得過多)。

如果是從輸入開始的第一層就激活為0,那么就要檢查數(shù)據(jù)的預處理和相應參數(shù)初始化。一種很簡便的方式,則是讓輸入數(shù)據(jù)先通過一個Batch Normalization層,然后再連接后面的w。訓練集上的loss能夠正常的下降之后,那么接下來就需要看驗證集上的表現(xiàn)了。如果我們是不計代價地獲得驗證集的表現(xiàn),那么就像Yann LeCun給的建議一樣,首先應當通過不斷地增加網(wǎng)絡的大小使得出現(xiàn)overfitting(訓練集的loss越來越低,而驗證集的loss降低到某個程度之后不變甚至開始變高)。

說到這里,插一句。神經(jīng)網(wǎng)絡是非常靈活強大的模型,也就是說只要模型的大小足夠,那么應當可以完美地擬合訓練數(shù)據(jù)。如果當你發(fā)現(xiàn)沒有辦法完美擬合訓練集,假如優(yōu)化過程沒有問題,那么很大的可能性是訓練數(shù)據(jù)中存在自相矛盾的數(shù)據(jù),比如同樣一張圖在訓練集出現(xiàn)多次,并且每次的label又各自不同。語言模型往往很難完美擬合訓練集也是類似的原因,就是不同的詞卻有相同的(或極相似的的)上下文。提升驗證集的效果最直接效果最好的辦法就是在訓練集中增加更多的各式各樣的與驗證集類的數(shù)據(jù)。

這個聽上去像廢話,這里強調(diào)一下是希望大家時刻記住條件允許的時候,這總是應該最先考慮的努力方向;其次,依據(jù)關注的問題不同,各式各樣的數(shù)據(jù)增強往往對結(jié)果也會帶來很大的提升。除去上面兩種,那么接下來可以考慮各種正則化方法。先講兩種比較容易被大家忽視的正則化。

首先,盡可能在每輪的訓練中徹底地shuffle訓練數(shù)據(jù),這會帶來一定的正則化效果(特別是在到處有Batch Normalization的網(wǎng)絡,充分的shuffle可以避免某些數(shù)據(jù)總是出現(xiàn)在同一個mini-batch),其次,在訓練效率和問題本身允許的情況下,盡量嘗試更小的mini-batch。小的mini-batch可以使得sgd的過程中產(chǎn)生很多對模型推廣有益的噪聲。此外,dropout、weight decay都應該嘗試,也可以適當?shù)恼{(diào)整他們的參數(shù)。這些的調(diào)整,對于驗證集的結(jié)果提升往往比較有限。

最后,對于那些離散的長尾輸入數(shù)據(jù)(比如一些語言相關的輸入),也可以考慮在輸入層的參數(shù)上加入L1正則化。

-End-

雷峰網(wǎng)特約稿件,未經(jīng)授權禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

干貨 | 算法工程師入門第一期——羅恒講深度學習

分享:
相關文章

地平線機器人技術

嵌入式人工智能全球領導者
當月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
立即設置 以后再說