新年新起點,請收下這份誠意滿滿的“深度學習”教程

haibao 7年前發布 | 10K 次閱讀 深度學習 設計 機器學習

近幾年深度學習的概念非常火,我們很幸運趕上并見證了這一波大潮的興起。記得2012年之前提及深度學習,大部分人并不熟悉,而之后一段時間里,也有些人仍舊持懷疑的態度,覺得這一波浪潮或許與之前sparse coding類似,或許能持續火個兩三年,但終究要被某個新技術新方法所取代,再后來,無論是學術界還是工業界,總有些研究者為自己沒有在第一時間跟進這波浪潮感到后悔莫及。確實,從2012年AlexNet取得ImageNet的冠軍開始,五年過去了,深度學習的方法仍舊占領著人工智能這片領域。

隨著這波浪潮,有些人作為弄潮兒,興起一波波巨浪,引領各個領域從傳統方法到深度學習方法的轉變,并希望能夠通過了解其他領域的方法改進自己所從事的領域;有些人辛勤地工作,利用深度學習的方法為公司提高業績,希望實時跟進并實現最新的技術;有些校園中的研究僧,一方面需要了解最新技術及其背后原理,另一方面還有發文章和找工作的壓力;有些相關從業者,如編輯、記者,經常報道AI領域新聞,卻從沒有時間仔細研究深度學習;還有些非技術人員,總會在這些新聞后驚恐地詢問“天網是否能在有生之年建成?”或是“AI對人類的威脅到了什么程度?”。

僅僅通過一節課程,或是一本書來解決以上所有問題明顯是不可能的。鑒于國內機器學習資料還是偏少,而且大多是理論性質,并沒有實踐模塊,我們從去年年底開始著手寫一本深度學習相關的tutorial,并希望通過一章章真實的案例來帶大家熟悉深度學習、掌握深度學習。這個tutorial中每一章內容都圍繞著一個真實問題,從背景介紹到使用PaddlePaddle平臺進行代碼實驗,完整地讓大家了解整個問題如何用深度學習來解決,從此告別紙上談兵。本篇課程可能要一些同學失望了,因為這一講作為第一講,只能考慮到大多數用戶,設計成難度適中的課程,為大家提供一些深度學習最基本的概念,以便更輕松地入門深度學習。如果您是高端用戶(能自己run起來深度學習模型或做過一些常識),建議您可以直接移步tutorial自學,當然如果感興趣,歡迎繼續關注我們系列的后續課程。

首先,對這個系列的后續深度學習課程做一個預告。在這份tutorial中,我們將覆蓋如下內容:

1. 新手入門

2. 識別數字

3. 圖像分類

4. 詞向量

5. 情感分析

6. 文本序列標注

7. 機器翻譯

8. 個性化推薦

本節課程中,我們主要帶大家了解深度學習,通過它的一些有用或有趣的應用了解深度學習的基本原理和工作方式。

深度學習是什么

傳統的機器學習中,我們要為每種任務定義其特定的解決方案。對于圖像,曾經人們耗費大量精力設計各種描述子進行圖像特征描述;對于文本,單單一個機器翻譯任務就動輒多個模型的設計:如詞語對齊、分詞或符號化(tokenization)、規則抽取、句法分析等,每一步的錯誤都會積累到下一步,導致整個翻譯結果不可信,且要追查一個錯誤會非常復雜。深度學習的優勢,就是可以彌補以上問題,一方面減少了對大量手工特征的依賴,對于圖像文本等領域可以直接從原數據進行建模;另一方面通過端到端的網絡模型(即一個網絡直接從輸入到輸出建模,而不需要中間步驟)減少了多步驟中錯誤累積的問題。

深度學習采用多層神經網絡的方法,依賴大數據和強硬件。

1.大數據  

在這個數據爆發的時代,普遍的認知是,大數據并不是問題。但實際上也不完全是這樣。從領域角度,圖像的通用分類和語言模型的訓練或許可以從搜索引擎中獲取大量樣本,但對于細粒度圖像分類(如不同類型的花的分類)或是 專業領域的對話數據(如法律咨詢類)的數據就比較稀缺;從應用方法角度,圖像、文本和語音都方便獲取,但如果希望進行有監督訓練,就必須有對應的標記(label),如標明一段語音對應的人,或是一段語音對應的文本,這就是個大工程了。這就需要我們利用已有資源,最簡單的方法比如可以先利用大量無標記數據學習數據的特征,就可以減少數據標注規模。

2.強硬件  

由于深度學習需要強計算處理能力,因此需要GPU顯卡進行并行加速,拼硬件已經成為學界和工業界在研究深度學習網絡時的一大共識。在2016年期間,英偉達和AMD的股票價格都實現了飛漲,如下圖是GPU制造商英偉達(NVIDIA)公司今年的股價趨勢。可以說這種跳躍式增長得益于GPU芯片在游戲、虛擬現實、自動駕駛、數據中心等各個高性能計算需求領域的應用。

GPU的每個顯卡具有多個(通常是幾十個)多處理器(Streaming Multiprocessors, SMs),每個多處理器中有上百個CUDA核。一個多線程程序的一個kernel實例在一個SM上執行,一個kernel實例上的操作會分配到不同cuda核中獨立執行。所以只要程序分配得當,GPU中的處理器越多執行越快。如Titan X(GM100)顯卡擁有24個多處理器,每個多處理器擁有128個CUDA核,整個顯卡有3072個CUDA核, 其相對16核Xeon E5 CPU處理器要加速5.3~6.7倍[1],這對于實時性要求較高的應用意義非凡。

深度學習的應用

深度學習可以涵蓋很多應用范圍,我們這里可以先以幾個有意思的應用,給大家一個基本概念, 工業界常用的例子會在后續課程中詳細地舉例。

1.極簡版無人車

無人車概念近幾年很火,從傳統領域到互聯網企業都多少有這個方向的研究者。對于初步接觸神經網絡的同學,我們先引入一個小任務。如下圖所示為一個可遙控小車在車道上的運行軌跡,小車上方搭載GoPro攝像頭。圖中藍線表示垂直基準線,紅線表示每一時刻小車應駛方向。我們的目標是,基于人為操控小車的行駛方向和當前圖像數據,給出其駕駛方案。

這里,可以用神經網絡指定網絡的輸入輸出分別是當前圖像和應走的方向,整體作為一個回歸問題來處理,其中輸入圖像用多層卷積神經網絡來解析。這里可能有朋友會說,其實我只需要用基本圖像處理技術(比如二值化圖像后再檢測連通域)找出來左右兩條車道,再向前方車道線中點位置方向走不就行了嗎?確實是可以這么干的,我們這里只是為了說明深度學習的端到端訓練,舉例個最簡版的無人車,有清晰的車道線,并且沒有紅綠燈、障礙物等干擾。實際情況中,需要考慮跟蹤前車、車道保持、障礙物檢測、紅綠燈檢測等多種情況,因此需要多模型的設計和集成。單就最簡單情況下車道檢測的這個事情來說, 確實可以僅通過圖像處理+人工策略達成目的,也不需要什么訓練數據,但這就要求程序員每遇到一個badcase都需要人工修改策略,這樣等下一位程序員接手這段代碼的時候,就只能嗚嗚嗚了。

2.拍攝照片油畫化 

2015年的一篇文章[5],將藝術家梵高和深度學習聯系在了一起,文中實現了將藝術畫style附體于日常拍攝照片,從而得到“藝術照”的效果。其做法是設計一個神經網絡,定義該網絡的損失函數為Diff(拍攝照片,生成作品) 與 Diff(藝術畫,生成作品)這兩個Diff的加權和。其中Diff表示兩幅圖片的差異。但如果通過每個像素的差異來計算這個Diff的話,顯然不合理,對于拍攝照片和生成作品而言,像素值必然已經大變,而對于藝術畫和生成作品而言,可能色調相似,但靠單個像素值去比就肯定是相差甚遠了。所以我們其實想要的只是一個抽象的概念,如下圖的例子,我們只需要生成的圖包含“貓”,且畫風和中間的藝術照相似。于是采用了神經網絡的隱層作為度量他們Diff的空間。

圖: http://phunter.farbox.com/post/mxnet-tutorial2

3.機器翻譯

剛才的兩個例子都是深度學習在圖像中的應用,其在文本中同樣意義重大。和圖像不同的是,文本作為一個序列化信息,深度神經網絡對這樣數據的的處理和圖像不太相同,但除此之外的基本思路就可以相互遷移了。比如已經了解了通過深度學習進行圖像分類的方法,那么文本分類只是變化一下,將一短文本映射成特征向量從而進行分類,這可以通過將理解圖片的卷積神經網絡改為處理序列信息的循環神經網絡完成。類似地,機器翻譯(用計算機來進行不同語言之間的翻譯)也可以通過類似的方法。以通過深度學習進行中譯英為例,首先通過一個循環神經網絡理解一句漢語(映射為文本語義信息,可以是一個向量,也可以是一個時序信息),稱此過程為“編碼”,再將這個文本語義信息通過另一個循環神經網絡,每個時刻輸出一個英語單詞,稱此過程為“解碼”,通過這樣的編碼-解碼結構即完成了機器翻譯。我這里只是白話說出了機器翻譯的大概思想,感興趣的同學可以參考機器翻譯一章的tutorial或追蹤后續課程。

4.為你寫詩 

看完以上內容,如果想讓你根據一個詞創作一首詩,你想能怎么做呢?恐怕已經有同學想到了:用翻譯的做法寫詩。不錯,機器翻譯其實可以用到很多地方,只需要修改數據集就ok,如果我們想根據一個詞,讓機器“創作”一首詩,只需要將翻譯模型的輸入設置為這個詞,而輸出是詩句即可。不過,通常這么做是有問題的,因為這樣做導致輸入序列很短而輸出很長,其間的依賴并不能充分發揮出來,硬將這樣的兩個序列綁在一起可能導致機器強硬地“背”下來如輸入語料而沒有真正理解語義。因此,有的工作中用短語生成第一句詩詞,用第一句去生成第二句……;或者可以用前n-1句生成第n句詩詞。感興趣的同學可以自己試一下,也可以試用一下度秘里面寫詩模塊。

5.商品推薦

商品推薦是電商和新聞客戶端們的關注熱點,他們都關注用戶興趣的把控,其推薦系統的好壞往往會對用戶留存和購買情況有較大影響。這里我們可以想見,最基本的推薦策略是爆款推薦(全民熱點),和已瀏覽或是購買/收藏了的項目。對于大量用戶沒有過瀏覽記錄的項目,傳統推薦方法一般采用協同過濾,即推薦給用戶相似用戶的興趣項,另一種方法是通過基于內容過濾推薦,即推薦給用戶瀏覽項目的相似項,這其中就涉及到用戶相似度和產品/項目相似度的獲取。一方面,我們可以利用深度學習進行其相似度的建模,另一方面,我們還可以將用戶特征和產品/項目特征映射到一個相同的空間進行特征比較,也就是將下圖A(協同過濾)和B(基于內容過濾)策略改為C。

深度學習的缺陷

說過了神經網絡的牛逼之處,我們再來看看它的一些缺陷,至少是目前難以解決的問題。

1.特斯拉事件

關注特斯拉的同學應該都有注意到,去年一位23歲的中國男青年,在駕駛特斯拉電動汽車沿京港澳高速河北邯鄲段公路行駛時,前車躲避障礙物后,該男子躲閃不及撞上了道路清掃車,發生嚴重車禍導致死亡。

特斯拉官方并沒有公布過其內部算法,我們只知道特斯拉的自動駕駛系統Autopolit中曾有以色列Mobileye公司提供的技術。Mobileye是一家基于視覺幫助減少交通事故的公司,其研發多年的高級駕駛輔助系統(ADAS)處于業內領先,主要基于單目攝像頭傳回的圖像,通過深度神經網絡進行車輛檢測、車道識別等[3]。但Mobileye自己也表示曾經提醒過特斯拉公司,他們的這套系統只能起輔助作用, 并不完善,也不能完全保障車主。雖然特斯拉官方聲明由于車主家屬不愿提供更多信息,導致具體Autopolit錯誤原因無從定位,但原因或是因為中國獨有的道路清掃車不曾出現在單目視覺的訓練數據集,或是因為光照等特殊因素導致的圖像質量問題,都說明無法僅通過視覺技術保障自動駕駛的安全性。我們不能將這起事故歸結于是深度學習的缺陷,但在實際系統中, 我們目前確實難從一個端到端的系統中完全定位并解決問題,大家還可以看下面的例子進一步理解。

2.可解釋性

在之前的“深度學習是什么”這一節中,我們講到深度學習可以利用端到端的學習避免一些多步驟積累錯誤導致的問題,然而這其實也是一種缺陷。我們無從定位問題出在哪里。下面就以圖像分類的一個badcase為例進行說明。

ImageNet競賽2012年冠軍工作AlexNet的作者Krizhevsky 曾提出,雖然AlexNet效果很棒,但為了最優化該數據集上的效果,不得不建立這樣一個含有非常多參數的深度神經網絡,而這樣的網絡非常容易過擬合。在15年的CVPR會議中,Anh Nguyen提出了一種生成樣本的方法,該方法生成的樣本可以“愚弄” 用于圖像識別的深度神經網絡[4],如下圖所示的8幅圖下面標注的文字分別為ImageNet競賽數據集上效果最好的網絡對該圖的識別結果(置信度高于99.6%), 該網絡將我們認為的這些波紋分別識別成了王企鵝、海星、棒球、電吉他、火車車廂、遙控器、孔雀、非洲灰鸚鵡。這種很容易“愚弄”神經網絡的樣本,被稱為對抗樣本。

深度學習希望模擬人腦中的神經元,通過一個神經網絡進行參數擬合,但學習的過程不盡相同。事實上,當人去學習知識的時候,是“哪里不會點哪里”、“哪里錯了改哪里”,即局部調整,而深度學習通常都是通過所有樣本來決定整個網絡的全部參數,希望在所有樣本上獲得全局最優解;當人們學習什么是“企鵝”的時候,既不會刻意地通過某幾個的特征(如顏色、體態)去捕捉,也不需要看上千八百張圖片才了解到這樣一種模式,我們就知道如下三幅圖,都是一個物種, 而神經網絡想學到這樣一個概念并不容易,往往需要企鵝的各個品種、各種pose的圖片。

同樣,當神經網絡的結果有誤時,我們無法像人腦學習一樣局部修改部分參數,即便可以,對于端到端的神經網絡,調整哪一塊參數、如何調整也是無從下手。這就是深度學習可解釋性方面的局限。

參考文獻:

[1]https://www.nvidia.com/content/tegra/embedded-systems/pdf/jetson_tx1_whitepaper.pdf

[2]https://www.quora.com/What-is-the-difference-between-Teslas-Autopilot-system-and-Googles-driver-less-car

[3]http://wccftech.com/tesla-autopilot-story-in-depth-technology/4/

[4]Nguyen A, Yosinski J, Clune J. Deep neural networks are easily fooled: High confidence predictions for unrecognizable images[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 427-436.

[5]Gatys L A, Ecker A S, Bethge M. A neural algorithm of artistic style[J]. arXiv preprint arXiv:1508.06576, 2015.

以上內容轉自GitChat,版權歸GitChat和張睿卿所有,轉載請聯系GitChat。

欲知后續更多精彩tutorial,請關注“百度大腦”微信公眾賬號:baidubrain

 

來自:http://36kr.com/p/5063385.html

 

 本文由用戶 haibao 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!