深度學習是一個發展迅速的領域,除了眾多學術界專家在理論方面的貢獻之外,工業界也為深度學習提供了很多工具框架,例如,伯克利視覺和學習中心開發的Caffe,微軟推出的開源深度學習框架CNTK,LISA開發的基於Python的Theano,Google主推的TensorFlow、以及Torch、MxNet等。目前來看,業界使用最多的是Caffe、Theano和TensorFlow。(1)CaffeCaffe是由伯克利視覺和學習中心(Berkeley Vision and Learning Center,BVLC)開發的基於C++/CUDA/Python實現的卷積神經網路框架,提供了面向命令列、Matlab和Python的繫結介面。Caffe 遵循BSD-2協議,程式碼組織良好,可讀性強。同時,Caffe提供了一整套工具集,可用於模型訓練、預測、微調、釋出、資料預處理,以及良好的自動測試。(2)TheanoTheano是由LISA開發的基於Python的深度學習框架,可以定義數學表示式並高效地最佳化、求值。Theano支援機器學習中的邏輯迴歸(LR)、多層感知器(MLP)、深度卷積網路等監督學習方法,以及自編碼器(AE)、降噪自編碼器、受限玻爾茲曼機(RBM)、深度置信網路(DBN)等非監督/半監督學習方法。但是Theano計算速度慢,雖然有GPU加速,但仍然不如其他框架高效。(3)TensorFlowTensorFlow是Google在2015 Google Research Blog宣佈推出的新一代人工智慧學習系統。TensorFlow是一個異構分散式學習系統上的大規模機器學習框架,移植性好,小到移動裝置如手機,大到規模叢集,都能支援。同時TensorFlow支援多種深度學習模型,隨著TensorFlow原始碼不斷開放,對新硬體、新裝置、新的加速庫如cuDNN的支援力度也在不斷提升。
作為演算法從業者,目前小黑對深度學習理解暫時整理如下,如有最新進展在更新,如果您是大神請留言補充!深度學習概述 深度學習是模擬人腦進行分析學習的多層神經網路,它模仿人腦的機制來解釋資料,處理資料,透過組合低層特徵形成更加抽象的高層表示屬性類別或特徵,以發現數據的分散式特徵表示。深度學習本質上是機器學習技術的一種,根據一般的機器學習和深度學習的工作方法和我們的經驗,我們認為採用深度學習技術解決實際業務問題的完整過程主要包括五個方面:問題理解與分析、訓練環境構建、資料管理、模型訓練以及生產應用。基於此,我們對每個環節分別闡述最佳實踐,作為研究與工程應用的參考指南。圖1.深度學習解決問題的五個基本環節問題理解與分析 深度學習不是一項“放之四海而皆準”的技術,採用深度學習解決複雜問題,首先需對實際問題全面剖析:問題是否適合採用深度學習解決,是否具備深度學習應用的資料條件,如何將實際業務問題轉換成深度學習可以解決的技術問題等。1.場景分析 原則上,傳統機器學習能夠解決的問題,深度學習都能夠解決,譬如傳統機器學習主要面向學習類問題,包括有監督學習(分類和迴歸場景),無監督學習(聚類等),均能夠採用深度學習網路訓練模型和應用,但是兩者應用效果會有所差異。依據實踐,在如下場景,可以優先考慮採用深度學習:(1)業界提供了公開成熟的深度學習網路模型的細分場景。面對這些場景的業務問題,可以基於公開的網路模型進行網路權重微調(fine-tune),能夠達到不錯效果。以影象識別為例,業界已經公開了AlexNet,ResNet等深度網路模型,在解決實際影象分類問題時可避免從頭訓練深度模型,在該模型的基礎上, 使用樣本資料進行模型引數最佳化(fine-tune)即可。(2)深度學習應用成功的行業,譬如,深度學習在影象分類、語音識別、自然語言處理等感知領域均取得實際應用效果,並在行業內得到驗證,因此如果問題域屬於影象、語音、影片等領域的問題,深度學習應用效果往往比較理想。(3)業務問題本身複雜,樣本資料充足,但問題本身又無法或者難以用人工的方式提取特徵,此時傳統機器學習無法進行模型訓練,採用深度學習,可以有效發揮深度學習自動提取特徵的價值。此外,深度學習模型訓練過程中,需要大量的浮點計算以及矩陣運算,若問題解決方不具備高效的計算環境以及海量樣本資料的客觀條件,也不推薦使用深度學習解決問題。2.資料評估 無論是有監督學習,還是無監督學習,深度學習的模型訓練都建立在大量樣本的迭代訓練基礎之上,在採用深度學習解決實際問題之前,需對問題領域資料仔細分析,衡量資料規模與質量。以下提供幾條基本原則供借鑑:(1)深度學習能夠從樣本資料自動提取特徵,但在實際考查準備樣本資料集時,建議儘可能與問題領域的業務專家充分交流,洞察問題與資料的相關性,剔除噪聲資料,這樣可以大大提高模型訓練的效率,少走彎路。(2)考察問題領域的存量資料後,若發現不是特別充裕,可考慮如下方法進行資料擴充:爬取公共資料;對已有資料進行變換,擴充資料,譬如利用反射變化擴充圖片資料;人工製造,譬如人工拍攝影象資料等;與產業界公司進行資料合作等。(3)當採用業界公開的網路模型進行微調(fine-tune),需要進一步驗證問題資料型別與公開網路模型訓練資料型別的相似性。若兩者資料型別差距比較大,採用微調(fine-tune)的方法訓練出來的模型效果往往不理想,可能需要考慮從頭開始訓練新的模型。(4)樣本資料在整個深度學習模型訓練過程不是一成不變的,模型實際訓練過程中,會視模型的訓練效果,不斷進行多輪資料的迭代最佳化等,讓樣本資料型別覆蓋更多的實際測試資料的型別,降低噪聲資料。因此,需要牢記,資料考量會貫穿整個模型訓練過程。3.問題抽象 在利用傳統機器學習分析具體問題時,需要將問題抽象為有監督學習問題或者無監督問題。如果是有監督問題,還需要進一步抽象成分類或迴歸問題,最後再選擇適合的演算法來訓練模型。深度學習本質上仍屬機器學習範疇,因此利用深度學習解決實際問題,需要同樣的問題抽象過程:與傳統機器學習一樣,有監督學習問題和無監督學習問題主要由樣本資料是否需要標籤來決定:(1)有監督學習問題透過有標籤訓練資料集的形式,在輸入和輸出的資料之間建立相關性。(2)無監督學習問題透過分析非標記資料,幫助檢測資料的相似性和差異性,譬如圖片搜尋和欺詐檢測等應用場景。
當問題定位為有監督問題後,需進一步確認是分類問題還是迴歸問題,判斷原則如下:
(1)迴歸問題通常用來預測一個值,如預測下一季度銀行卡消費金額、交易筆數等等,迴歸是對真實值的一種逼近預測。(2)分類問題是用於將資料打上一個標籤,通常結果為離散值,分類並沒有逼近的概念,最終正確結果只有一個,錯誤的就是錯誤的,不會有相近的概念。當實際問題抽象成具體深度學習技術問題後,即可以結合問題的資料型別選擇合適的深度網路結構進行模型訓練,譬如影象資料處理,選擇卷積神經網路(CNN)等。訓練環境構建構建深度學習研究環境首先要考慮硬體環境的支援,這也是深度學習演算法區別於其他機器學習演算法的重要一點,同時還要依據實際需求對深度學習軟體框架進行規劃和選擇。硬體環境選擇
深度學習需要很高的內在並行度、大量的浮點計算能力以及矩陣運算,傳統的基於CPU叢集的雲計算技術並不擅長處理這類問題,例如,斯坦福大學的研究人員Adam Coates採用GPU將三臺計算機連貫在一起進行深度學習實驗,結果卻得到了與Google數千臺計算機一樣的效果。由此可見,只有更好的硬體加速條件,才能滿足現有資料和模型規模繼續擴大的需求。目前,最主流的硬體加速器件非GPU莫屬。最重要的是GPU出色的浮點計算效能特別提高了深度學習兩大關鍵活動:分類和卷積的效能,同時又達到所需的精準度,並且在相同的精度下,相對傳統CPU的方式,擁有更快的處理速度、更少的伺服器投入和更低的功耗。因此,Google和Facebook等巨頭也在轉向使用GPU作為硬體加速的基礎原件。此外,業界也出現了其他進行深度學習硬體加速的方案。比如,部分公司正在研究採用FPGA作為進行深度學習加速,以期使其對深度學習領域經常使用的上層軟體相容性更強,並行訓練架構更加靈活。同時,FPGA在單位能耗下效能更強,這對大規模伺服器部署或資源有限的嵌入式應用的研究而言也至關重要。建設深度學習硬體加速環境需要較大的資金和技術投入,需要進行精細研究並審慎選擇,建議遵循以下原則:選擇硬體加速環境時儘量採用具備更多使用者友好開發工具的晶片,這樣能夠很好的降低學習門檻。建立龐大且需要平行的深度網路,需要考慮硬體的開放性、資料並行和模型並行支援度,以及單位能耗特點。深度學習模型訓練過程中需對深度網路進行多次反向傳導運算計算量大,而深度模型進行生產應用時只需進行前向傳播計算,因此建議在訓練環境中採用硬體加速,生產應用環境無需進行硬體加速。常用深度學習軟體框架簡介
深度學習是一個發展迅速的領域,除了眾多學術界專家在理論方面的貢獻之外,工業界也為深度學習提供了很多工具框架,例如,伯克利視覺和學習中心開發的Caffe,微軟推出的開源深度學習框架CNTK,LISA開發的基於Python的Theano,Google主推的TensorFlow、以及Torch、MxNet等。目前來看,業界使用最多的是Caffe、Theano和TensorFlow。(1)CaffeCaffe是由伯克利視覺和學習中心(Berkeley Vision and Learning Center,BVLC)開發的基於C++/CUDA/Python實現的卷積神經網路框架,提供了面向命令列、Matlab和Python的繫結介面。Caffe 遵循BSD-2協議,程式碼組織良好,可讀性強。同時,Caffe提供了一整套工具集,可用於模型訓練、預測、微調、釋出、資料預處理,以及良好的自動測試。(2)TheanoTheano是由LISA開發的基於Python的深度學習框架,可以定義數學表示式並高效地最佳化、求值。Theano支援機器學習中的邏輯迴歸(LR)、多層感知器(MLP)、深度卷積網路等監督學習方法,以及自編碼器(AE)、降噪自編碼器、受限玻爾茲曼機(RBM)、深度置信網路(DBN)等非監督/半監督學習方法。但是Theano計算速度慢,雖然有GPU加速,但仍然不如其他框架高效。(3)TensorFlowTensorFlow是Google在2015 Google Research Blog宣佈推出的新一代人工智慧學習系統。TensorFlow是一個異構分散式學習系統上的大規模機器學習框架,移植性好,小到移動裝置如手機,大到規模叢集,都能支援。同時TensorFlow支援多種深度學習模型,隨著TensorFlow原始碼不斷開放,對新硬體、新裝置、新的加速庫如cuDNN的支援力度也在不斷提升。深度學習軟體框架選擇
透過對Caffe、Theano、TensorFlow的研究經驗,其優勢與缺陷可歸納為下表所示:在實際的工作中,需要依據問題特徵和業務需求進行深度學習框架工具的選擇,以下是挑選工具框架的幾點建議:(1)進行資料特徵提取或基於現有模型進行微調選用Caffe。(2)需要對預訓練模型進行復雜處理選用Theano。(3)處理適用於RNN模型的問題,選用Theano或者TensorFlow。(4)建立龐大且需要平行的深度網路模型時選用TensorFlow。(5)Caffe、Theano、TensorFlow各有自身獨特優勢,在選擇某一深度學習框架時要保持對其他工具技術發展的關注。資料管理深度學習是建立在對大量訓練資料進行學習、特徵提取等基礎之上的實踐性方法,深度學習模型只有在海量資料輸入下才能達到最好的效能,可見有效的資料對深度學習的重要性。同時,資料管理中的資料的採集、處理等各環節也很有講究,有些實踐性的技巧。資料獲取依據獲取資料的成本可將市場上的資料劃分為三類:免費公開資料、付費公開資料以及私有資料。以下列舉了不同型別資料的獲取渠道:(1)免費公開資料來源(a)公開的資料庫公開資料庫是獲取海量資料最簡單有效的方式。公開資料庫基本按照學術問題、行業應用劃分針對性較強,而且資料庫中資料大都經過人工整理和標註,規範性和易用性更強。以下是一些常用的公開資料庫資源列表:(b)網路爬蟲網路爬蟲是獲取各類網站公開資料的有效工具,使用網路爬蟲是研究深度學習技術的一項必備技能。網路採集器屬於網路爬蟲的一種,透過軟體的形式實現簡單快捷地採集網路上分散的內容,具有很好的內容收集作用,而且不需要技術成本,可被用作為初級的資料採集工具,例如火車採集器、八爪魚、集搜客等。此外,針對特定網站的特定資料採集需求,也可結合開源系統自行開發爬蟲工具,這樣具有更高的自由性和自主性。利用爬蟲可以獲取一些從其它渠道獲取不到的資料資源,更重要的是幫助研究者開啟尋找和蒐集資料的思路。(2)付費公開資料來源(a)商業化資料交易平臺數據交易平臺是一些專注於網際網路綜合資料交易和服務的公司,其致力於融合和盤活各類大資料資源。可以透過資料購買的方式在資料交易平臺上獲取深度學習訓練和測試資料。國內知名的商業化資料交易憑條有優易資料、資料堂等,其提供的服務和資料資源各有特色:(b)政府性資料交易平臺隨著國家十三五規劃中提出的國家大資料戰略的實施,各地方政府對大資料產業發展高度重視,因而國內政府性交易平臺建設也蓬勃發展,成為重要的資料來源頭:(3)私有資料來源(a)商業合作交換目前產業發展已經進入大資料時代,資料是企業生存的核心競爭力之一,因而各行各業對自身資料的保護都倍加關注,想透過付費或爬取的方式獲得企業的核心資料就變得更加困難。然而,如果行業間的資料合作能夠給雙方帶來巨大的資料增值收益,則可以透過推動跨領域商業合作的方式進行資料互換,從而完成資料收集形成完整的資料鏈。(b)自建資料庫在有些資料是外界無法獲取的情況下有可能需要自主進行資料採集並維護一個小型的資料庫。為了保證資料採集的有效性在進行資料採集的過程中關鍵是明確資料要求。以銀行卡分類問題為例,通常採用照片拍攝與影片拍攝,為了避免拍攝之後複雜的裁剪旋轉工作,設定如下拍攝要求:在拍攝板中央固定一個卡槽,相機固定在中央上方並與板面保持平行;選擇Sunny、陰天、夜晚三個場景於室內室外分別拍攝。增加可變燈光進行場景模擬。資料預處理獲取資料後需要進行資料處理,在深度學習中,常常面臨資料不足的問題,在這種情形下,深度學習演算法往往難以達到最優的效果,因此需要對現有的原始資料來源進行必要的擴充與拓展或稱為資料合成。以圖片資料處理為例,常見的資料擴充方法大致有如下幾種:(1)旋轉|反射變換(rotation/reflection): 隨機旋轉影象一定角度,改變影象內容的朝向。(2)翻轉變換(flip):沿著水平或者垂直方向翻轉影象。(3)縮放變換(zoom):按照一定的比例放大或者縮小影象。(4)平移變換(shift):在影象平面上對影象以一定方式進行平移,可以採用隨機或人為定義的方式指定平移範圍和平移步長,沿水平或豎直方向進行平移,改變影象內容的位置。(5)尺度變換(scale):對影象按照指定的尺度因子, 進行放大或縮小; 或者參照SIFT特徵提取思想, 利用指定的尺度因子對影象濾波構造尺度空間. 改變影象內容的大小或模糊程度。(6)對比度和亮度變換: 在影象的HSV顏色空間,改變飽和度S和V亮度分量,保持色調H不變。對每個畫素的S和V分量進行指數運算(指數因子在0.25到4之間), 增加光照變化。(7)噪聲擾動(noise): 對影象的每個畫素RGB進行隨機擾動, 常用的噪聲模式是椒鹽噪聲和高斯噪聲。此外,從影片中提取圖片也是獲取大量資料的有效途徑,透過自制影片轉換工具可將上述圖片預處理方法進行整合,這樣能夠有效擴大資料採集量。資料標註對於有監督的分類任務一項重要的工作就是資料標註。目前資料標註的方法可劃分為人工標記與自動化標記。(1)人工標註對於分類問題,可以人工將類別相同的資料放在一個資料夾中,然後透過程式碼遍歷訪問資料形成分類標籤。對於檢測問題,需要人工用矩形框來標記圖片中的物體,往往會採用標註工具,比如LabelImg,輔助完成。(2)自動化標記自動化標記則是透過少量樣本人工標記,然後提取傳統特徵(比如SIFT、LBP等)並訓練分類器,接著對大量待標記樣本進行分類標記。經過一次分類器分類的樣本標記往往錯誤較多,對於這批標記資料進行抽樣訓練另一個分類器進行分類,對於兩次具有不同標籤的資料進行人工修正,則可以以少量人力得到精度較高的標記資料。模型訓練常用深度網路簡介
深度學習技術的核心基礎是深度網路模型,在其產生和發展演進的過程產生了諸多網路結構,目前常用的深度網路結構有DBN、CNN、RNN。下表對DBN、CNN、RNN的網路結構和特特性進行了簡要對比。深度網路模型選擇學界對深度網路所使用的問題已經有了基本的認識,下表給出了一些深度學習演算法和對應的領域:因而,建議從問題特徵出發選擇對應的深度網路結構,並遵循如下原則:(1)對於文字領域,整體選擇RNTN(遞迴張量神經網路)或DBN來處理,RNTN是RNN(迴圈神經網路)的一個變種。(2)對於文件(相對於文字更大),選擇自編碼器或者DBN解決問題。(3)對於影象來說,DBN或CNN應用更多,處理影象搜尋或圖片語義問題採用自編碼器更好。(4)處理聲音問題,選擇RNN或CNN。(5)處理時間序列問題,比如預測分析,選擇DBN或DNN。引數調優技巧在確定深度網路結構後,需要透過大量訓練和測試以獲取有效的模型,以下是一些常用的引數設定和調優原則。(1)儘量基於成熟模型進行微調(fine-tune)深度網路引數訓練最佳化是一項冗長而複雜的工作,若技術人員的經驗不足,則容易導致訓練過程引數不收斂或者陷入區域性最優而得不到很好的結果。因此,基於前人已經訓練好的網路引數模型進行微調是目前通行的良好實踐原則。(2)權重初始化策略在開始訓練深度網路之前,需要對網路連線權值進行初始化,目前在神經網路中建議使用的權重初始化策略是將值歸一化到範圍[-b,b],b為: 分別是權值向量之前和之後的隱藏層大小,這樣有助於加速網路引數收斂,避免區域性最優或網路失靈。(3)高維度網路結構克服區域性最小深層網路由於是高度非線性的,有著太多的區域性極值,傳統觀念認為在這樣的條件下很難保證能夠得到一個可以接受的好的解,容易陷入區域性最小。實際上透過增加深度網路的維度和訓練時間,陷入區域性最優解的機率會越小。當損失函式接近全域性最小時,如果我們找到了真正的區域性最小,那麼它將非常接近全域性最小,這種差異是無關緊要的。比如從alexnet、VGG、googlenet、resnet等卷積模型中進行選擇並在自己的資料集進行微調。這些網路效果隨層數遞增,因而採用resnet或者更新的googlenet-v4將會發現測試結果會更令人滿意。(4)資料批次大小設定增加網路強度的一種方式(受計算而不是記憶體限制)是,將資料分成小批次。這可以避免一些記憶體操作,GPU也擅長並行處理大矩陣計算。然而,增加批次的大小的話可能會對訓練演算法有影響,並且合併需要更多時間。重要的是要找到一個很好的平衡點,以在最短的時間內獲得最好的效果。此外,使用小批次的資料,梯度會更加穩定。(5)訓練誤差衡量準則在訓練與測試一個深度神經網路模型時,我們通常使用三個資料集,即訓練集、開發集、測試集。模型對應這三個資料集有三個誤差,訓練集誤差、開發集誤差、與測試集誤差,另外還有一個人類梳理這類問題的誤差值—人類水平誤差。基於此的著名的偏差-方差權衡理論是指導我們調參的準則:人類誤差與訓練集誤差之間的差距稱為可避免的偏差,這部分誤差可以透過進一步學習及模型調優來避免。而訓練集和開發集之間的差距稱為方差,它是訓練集與開發集的分佈差異造成的。當訓練誤差較大時,是指模型並未達到最優解(陷入區域性最優)或者模型不夠表達你的資料集。這時需要更換更深的模型,或者訓練更長的時間。當訓練誤差較小,而開發集誤差較大,則是模型過擬合,即訓練樣本並未完全包含目標任務的資料型別,這時候需要增加訓練樣本或者使用正則化來防止過擬合。如果訓練集誤差與開發集誤差都很小,測試集誤差較大,那麼是開發集與測試集的分配不合適,需要增大開發集所佔的比例。(6)其他訓練技巧歸一化實值資料,減去平均值,再除以標準差。降低訓練過程中的學習率。使用動量,幫助引數透過停滯區。生產應用上述幾個小節介紹的都是在深度學習研究過程中需要注意的事項,本節將討論如何將深度網路模型與生產系統進行無縫對接。訓練環境與生產環境的資料介面
實現深度學習訓練模型到生產系統的遷移,需要在遮蔽訓練環境和生產應用環境的軟硬體環境的基礎上實現網路結構和引數資料的無縫相容。目前通行的原則是網路定義檔案、網路引數檔案分離。(1)深度網路定義檔案用於定義深度網路的節點設定和節點間連線結構的引數檔案,例如採用Caffe的prototext檔案。(2)深度網路引數檔案用於儲存訓練結束時得到的深度網路各連線之間加權值,以二進位制流形式儲存,例如採用caffe的caffemodel檔案。生產應用環境服務介面深度學習的理論模型投入生產仍需要“IT團隊”花費大量時間進行系統性的改變和最佳化,因此在深度學習生產應用環境中,透過Restful API向企業其他生產系統提供服務是很好的形式,這樣既可以遮蔽內部實現細節,又可以在產生模型變動時實現平滑的遷移。在API的規劃中需包含如下必要介面:模型退化的解決方法深度學習問題建模的過程中,訓練資料集是固定的,大部分資料由資料合成產生,資料質地和分佈可能與實際生產應用不一致,容易導致訓練集誤差、開發集誤差、與測試集誤差。因而在生產環境中進行模型應用時,隨著呼叫案例的增加,會產生模型退化問題,即訓練模型分類錯誤增多。要解決這一問題,可以採取以下措施:(1)對判別置信度低或使用者反饋出現判別錯誤的資料進行儲存收集。(2)定期利用收集到的資料對原有模型進行微調並在生產應用環境進行模型更新參考文獻:
《Nature》雜誌“人工智慧 + 機器人”專題 ,發表的多篇相關論文,其中包括了Yann LeCun、Yoshua Bengio和Geoffrey Hinton首次合作的這篇綜述文章“Deep Learning”。
商業引用請註明:出處