盡管
深度學習的一個目標是設計能夠處理各種任務的算法,然而截至目前
深度學習的應用仍然需要一定程度的特化。例如,
計算機視覺中的任務對每一個樣本都需要處理大量的輸入
特征(像素),
自然語言處理任務的每一個輸入
特征都需要對大量的可能值(詞匯表中的詞) 建模。
深度學習的基本思想基于聯結主義:盡管
機器學習模型中單個生物性的神經元或者說是單個
特征不是智能的,但是大量的神經元或者
特征作用在一起往往能夠表現出智能。我們必須著重強調神經元數量必須很大這個事實。
相比20世紀80年代,如今
神經網絡的
精度以及處理任務的復雜度都有一定提升,其中一個關鍵的因素就是網絡規模的巨大提升。在過去的30年內,網絡規模是以指數級的速度遞增的。然而如今的人工
神經網絡的規模也僅僅和昆蟲的神經系統差不多。由于規模的大小對于
神經網絡來說至關重要,因此
深度學習需要高性能的硬件設施和軟件實現。
快速的CPU實現
傳統的
神經網絡是用單臺機器的CPU 來訓練的。如今,這種做法通常被視為是不可取的?,F在,我們通常使用GPU 或者許多臺機器的CPU 連接在一起進行計算。在使用這種昂貴配置之前,為論證CPU 無法承擔
神經網絡所需的巨大計算量,研究者們付出了巨大的努力。
描述如何實現高效的數值CPU 代碼已經超出了本書的討論范圍,但是我們在這里還是要強調通過設計一些特定的CPU
上的操作可以大大提升效率。例如,在2011 年,最好的CPU
在訓練
神經網絡時使用定點運算能夠比浮點運算跑得更快。通過調整定點運算的實現方式,Vanhoucke et al. (2011) 獲得了3
倍于一個強浮點運算系統的速度。因為各個新型CPU都有各自不同的特性,所以有時候采用浮點運算實現會更快。一條重要的準則就是,通過特殊設計的數值運算,我們可以獲得巨大的回報。除了選擇定點運算或者浮點運算以外,其他的策略還包括了如通過優化
數據結構避免高速緩存缺失、使用向量指令等。
機器學習的研究者們大多會忽略這些實現的細節,但是如果某種實現限制了模型的規模,那該模型的
精度就要受到影響。
GPU實現
許多現代
神經網絡的實現基于圖形處理器(Graphics Processing Unit, GPU)。圖形處理器最初是為圖形應用而開發的專用硬件組件。視頻游戲系統的消費市場刺激了圖形處理硬件的發展。GPU為視頻游戲所設計的特性也可以使
神經網絡的計算受益。
大規模的分布式實現
在許多情況下,單個機器的計算資源是有限的。因此,我們希望把訓練或者推斷的任務分攤到多個機器上進行。
分布式的推斷是容易實現的,因為每一個輸入的樣本都可以在單獨的機器上運行。這也被稱為數據并行(data parallelism)。
同樣地,模型并行(model parallelism) 也是可行的,其中多個機器共同運行一個數據點,每一個機器負責模型的一個部分。對于推斷和訓練,這都是可行的。
在訓練過程中,數據并行從某種程度上來說更加困難。對于隨機
梯度下降的單步來說,我們可以增加小批量的大小,但是從優化性能的角度來說,我們得到的回報通常并不會線性增長。使用多個機器并行地計算多個
梯度下降步驟是一個更好的選擇。不幸的是,
梯度下降的標準定義完全是一個串行的過程:第t
步的梯度是第t ? 1 步所得參數的函數。
這個問題可以使用異步隨機
梯度下降(Asynchoronous Stochasitc Gradient
Descent)(Bengio et al., 2001b; Recht et al., 2011)
解決。在這個方法中,幾個處理器的核共用存有參數的內存。每一個核在無鎖的情況下讀取這些參數,并計算對應的梯度,然后在無鎖狀態下更新這些參數。由于一些核把其他的核所更新的參數覆蓋了,因此這種方法減少了每一步
梯度下降所獲得的平均提升。但因為更新步數的速率增加,總體上還是加快了學習過程。Deanet
al. (2012) 率先提出了多機器無鎖的
梯度下降方法,其中參數是由參數服務器(parameterserver)
管理而非存儲在共用的內存中。分布式的異步
梯度下降方法保留了訓練深度
神經網絡的基本策略,并被工業界很多
機器學習組所使用(Chilimbi et
al., 2014; Wu et al.,
2015)。學術界的
深度學習研究者們通常無法負擔那么大規模的分布式學習系統,但是一些研究仍關注于如何在校園環境中使用相對廉價的硬件系統構造分布式網絡(Coates
et al., 2013)。
在許多商業應用的
機器學習模型中,一個時間和內存開銷較小的推斷算法比一個時間和內存開銷較小的訓練算法要更為重要。對于那些不需要個性化設計的應用來說,我們只需要一次性地訓練模型,然后它就可以被成千上萬的用戶使用。在許多情況下,相比開發者,終端用戶的可用資源往往更有限。例如,開發者們可以使用巨大的計算機
集群訓練一個語音識別的網絡,然后將其部署到移動手機上。
減少推斷所需開銷的一個關鍵策略是模型
壓縮(model compression)(Bucilu·a et al., 2006)。模型
壓縮的基本思想是用一個更小的模型取代替原始耗時的模型,從而使得用來存儲與評估所需的內存與運行時間更少。
當原始模型的規模很大,且我們需要防止
過擬合時,模型
壓縮就可以起到作用。在許多情況下,擁有最小泛化誤差的模型往往是多個獨立訓練而成的模型的集成。評估所有n
個集成成員的成本很高。有時候,當單個模型很大(例如,如果它使用Dropout
正則化) 時,其
泛化能力也會很好。
這些巨大的模型能夠學習到某個函數f(x),但選用的參數數量超過了任務所需的參數數量。只是因為訓練樣本數是有限的,所以模型的規模才變得必要。只要我們擬合了這個函數f(x),我們就可以通過將f
作用于隨機采樣點x
來生成有無窮多訓練樣本的訓練集。然后,我們使用這些樣本訓練一個新的更小的模型,使其能夠在這些點上擬合f(x)。為了更加充分地利用這個新的小模型的容量,最好從類似于真實測試數據(之后將提供給模型)
的分布中采樣x。這個過程可以通過損壞訓練樣本或者從原始訓練數據訓練的生成模型中采樣完成。
此外,我們還可以僅在原始訓練數據上訓練一個更小的模型,但只是為了復制模型的其他
特征,比如在不正確的類上的后驗分布(Hinton et al., 2014, 2015)。
動態結構
一般來說,加速
數據處理系統的一種策略是構造一個系統,這個系統用動態結構(dynamicstructure)
描述圖中處理輸入所需的計算過程。在給定一個輸入的情況中,
數據處理系統可以動態地決定運行
神經網絡系統的哪一部分。單個
神經網絡內部同樣也存在動態結構,給定輸入信息,決定
特征(隱藏單元)
哪一部分用于計算。這種
神經網絡中的動態結構有時被稱為條件計算(conditional computation)(Bengio, 2013;
Bengio et al., 2013b)。由于模型結構許多部分可能只跟輸入的一小部分有關,只計算那些需要的
特征就可以起到加速的目的。
動態結構計算是一種基礎的計算機科學方法,廣泛應用于軟件工程項目。應用于
神經網絡的最簡單的動態結構基于決定
神經網絡(或者其他
機器學習模型) 中的哪些子集需要應用于特定的輸入。
深度網絡的專用硬件實現
自從早期的
神經網絡研究以來,硬件設計者就已經致力于可以加速
神經網絡算法的訓練和/或推斷的專用硬件實現。讀者可以查看早期的和更近的專用硬件深度網絡的評論(Lindseyand
Lindblad, 1994; Beiu et al., 2003; Misra and Saha, 2010)。
不同形式的專用硬件(Graf and Jackel, 1989; Mead and Ismail, 2012; Kim et
al., 2009; Phamet al., 2012; Chen et al., 2014b,a)
的研究已經持續了好幾十年,比如專用集成電路(application—speci?c integrated circuit, ASIC)
的數字(基于數字的二進制表示)、模擬(Graf and Jackel,1989; Mead and Ismail,
2012)(基于以電壓或電流表示連續值的物理實現) 和混合實現(組合數字和模擬組件)。近年來更靈活的現場可編程門陣列(?eld
programmable gated array, FPGA)實現(其中電路的具體細節可以在制造完成后寫入芯片) 也得到了長足發展。
雖然CPU 和GPU 上的軟件實現通常使用32 位或64
位的
精度來表示浮點數,但是長期以來使用較低的
精度在更短的時間內完成推斷也是可行的(Holt and Baker, 1991; Holi
andHwang, 1993; Presley and Haggard,1994; Simard and Graf, 1994;
Wawrzynek et al., 1996; Savichet al.,
2007)。這已成為近年來更迫切的問題,因為
深度學習在工業產品中越來越受歡迎,并且由于更快的硬件產生的巨大影響已經通過GPU
的使用得到了證明。激勵當前對深度網絡專用硬件研究的另一個因素是單個CPU 或GPU
核心的進展速度已經減慢,并且最近計算速度的改進來自核心的并行化(無論CPU 還是GPU)。這與20 世紀90 年代的情況(上一個
神經網絡時代)
的不同之處在于,
神經網絡的硬件實現(從開始到芯片可用可能需要兩年) 跟不上快速進展和價格低廉的通用CPU
的腳步。因此,在針對諸如手機等低功率設備開發新的硬件設計,并且想要用于
深度學習的一般公眾應用(例如,具有語音、
計算機視覺或自然語言功能的設施)
時,研究專用硬件能夠進一步推動其發展。
最近對基于反向傳播
神經網絡的低
精度實現的工作(Vanhoucke et al., 2011; Courbariauxet al.,
2015; Gupta et al., 2015) 表明,8 位和16
位之間的
精度足以滿足使用或訓練基于反向傳播的深度
神經網絡的要求。顯而易見的是,在訓練期間需要比在推斷時更高的
精度,并且數字某些形式的動態定點表示能夠減少每個數需要的存儲空間。傳統的定點數被限制在一個固定范圍之內(其對應于浮點表示中的給定指數)。而動態定點表示在一組數字(例如一個層中的所有權重)
之間共享該范圍。使用定點代替浮點表示并且每個數使用較少的比特能夠減少執行乘法所需的硬件表面積、功率需求和計算時間。而乘法已經是使用或訓練反向傳播的現代深度網絡中要求最高的操作。
長久以來,
計算機視覺就是
深度學習應用中幾個最活躍的研究方向之一。因為視覺是一個對人類以及許多動物毫不費力,但對計算機卻充滿挑戰的任務(Ballard et al., 1983)。
深度學習中許多流行的標準基準任務包括對象識別和光學字符識別。
計算機視覺是一個非常廣闊的發展領域,其中包括多種多樣的處理圖片的方式以及應用方向。
計算機視覺的應用廣泛:從復現人類視覺能力(比如識別人臉)
到創造全新的視覺能力。舉個后者的例子,近期一個新的
計算機視覺應用是從視頻中可視物體的振動識別相應的聲波(Davis et al.,
2014)。大多數
計算機視覺領域的
深度學習研究未曾關注過這樣一個奇異的應用,它擴展了圖像的范圍,而不是僅僅關注于人工智能中較小的核心目標||
復制人類的能力。無論是報告圖像中存在哪個物體,還是給圖像中每個對象周圍添加注釋性的邊框,或從圖像中轉錄符號序列,或給圖像中的每個像素標記它所屬對象的標識,大多數
計算機視覺中的
深度學習往往用于對象識別或者某種形式的檢測。由于生成模型已經是
深度學習研究的指導原則,因此還有大量圖像合成工作使用了深度模型。盡管圖像合成(“無中生有”)
通常不包括在
計算機視覺內,但是能夠進行圖像合成的模型通常用于圖像恢復,即修復圖像中的缺陷或從圖像中移除對象這樣的
計算機視覺任務。
預處理
由于原始輸入往往以
深度學習架構難以表示的形式出現,許多應用領域需要復雜精細的預處理。
計算機視覺通常只需要相對少的這種預處理。圖像應該被標準化,從而使得它們的像素都在相同并且合理的范圍內,比如[0;
1] 或者[?1; 1]。將[0; 1] 中的圖像與[0; 255]
中的圖像混合,通常會導致失敗。將圖像格式化為具有相同的比例,嚴格上說是唯一一種必要的預處理。許多
計算機視覺架構需要標準尺寸的圖像,因此必須裁剪或縮放圖像以適應該尺寸。然而,嚴格地說即使是這種重新調整比例的操作并不總是必要的。一些卷積模型接受可變大小的輸入,并動態地調整它們的池化區域大小以保持輸出大小恒定(Waibel
et al., 1989)。其他卷積模型具有可變大小的輸出,其尺寸隨輸入自動縮放,例如對圖像中的每個像素進行去噪或標注的模型(Hadsell
et al., 2007)。
數據集增強可以被看作一種只對訓練集做預處理的方式。數據集增強是減少大多數
計算機視覺模型泛化誤差的一種極好方法。在測試時可用的一個相關想法是將同一輸入的許多不同版本傳給模型(例如,在稍微不同的位置處裁剪的相同圖像),并且在模型的不同實例上決定模型的輸出。后一個想法可以被理解為集成方法,并且有助于減少泛化誤差。
其他種類的預處理需要同時應用于訓練集和測試集,其目的是將每個樣本置于更規范的形式,以便減少模型需要考慮的變化量。減少數據中的變化量既能夠減少泛化誤差,也能夠減小擬合訓練集所需模型的大小。更簡單的任務可以通過更小的模型來解決,而更簡單的解決方案
泛化能力一般更好。這種類型的預處理通常被設計為去除輸入數據中的某種可變性,這對于人工設計者來說是容易描述的,并且人工設計者能夠保證不受到任務影響。當使用大型數據集和大型模型訓練時,這種預處理通常是不必要的,并且最好只是讓模型學習哪些變化性應該保留。例如,用于分類ImageNet
的AlexNet 系統僅具有一個預處理步驟:對每個像素減去訓練樣本的平均值(Krizhevsky et al., 2012b)。
數據集增強
如第7.4
節中講到的一樣,我們很容易通過增加訓練集的額外副本來增加訓練集的大小,進而改進分類器的
泛化能力。這些額外副本可以通過對原始圖像進行一些變化來生成,但是并不改變其類別。對象識別這個分類任務特別適合于這種形式的數據集增強,因為類別信息對于許多變換是不變的,而我們可以簡單地對輸入應用諸多幾何變換。如前所述,分類器可以受益于隨機轉換或者旋轉,某些情況下輸入的翻轉可以增強數據集。在專門的
計算機視覺應用中,存在很多更高級的用以增強數據集的變換。這些方案包括圖像中顏色的隨機擾動(Krizhevskyet
al., 2012b),以及對輸入的非線性幾何變形(LeCun et al., 1998c)。
語音識別
語音識別任務是將一段包括了自然語言發音的聲學信號投影到對應說話人的詞序列上。令X = (x(1), x(2), …, x(T))
表示語音的輸入向量(傳統做法以20ms
為一幀分割信號)。許多語音識別的系統通過特殊的手工設計方法預處理輸入信號,從而提取
特征,但是某些
深度學習系統(Jaitly and
Hinton, 2011) 直接從原始輸入中學習
特征。令y = (y1; y2,…, yN)
表示目標的輸出序列(通常是一個詞或者字符的序列)。自動語音識別(automatic speech recognition,ASR)
任務指的是構造一個函數f*ASR,使得它能夠在給定聲學序列X 的情況下計算最有可能的語言序列y:
從20 世紀80 年代直到2009?2012 年,最先進的語音識別系統是隱馬爾可夫模型(hiddenmarkov model,
HMM) 和高斯混合模型(gaussian mixture model, GMM) 的結合。GMM 對聲學
特征和音素(phoneme)
之間的關系建模(Bahl et al., 1987),HMM 對音素序列建模。GMM-HMM 模型將語音信號視作由如下過程生成:首先,一個HMM
生成了一個音素的序列以及離散的子音素狀態(比如每一個音素的開始、中間、結尾),然后GMM
把每一個離散的狀態轉化為一個簡短的聲音信號。盡管直到最近GMM-HMM 一直在ASR
中占據主導地位,語音識別仍然是
神經網絡所成功應用的第一個領域。從20 世紀80 年代末期到90
年代初期,大量語音識別系統使用了
神經網絡(Bourlard and Wellekens, 1989; Waibel et al., 1989;
Robinsonand Fallside, 1991; Bengio et al., 1991, 1992; Konig et al.,
1996)。當時,基于
神經網絡的ASR的表現和GMM-HMM 系統的表現差不多。比如說,Robinson and Fallside (1991)
在TIMIT數據集(Garofolo et al., 1993)(有39 個區分的音素) 上達到了26%
的音素錯誤率,這個結果優于或者說是可以與基于HMM 的結果相比。從那時起,TIMIT
成為音素識別的一個基準數據集,在語音識別中的作用就和MNIST
在對象識別中的作用差不多。然而,由于語音識別軟件系統中復雜的工程因素以及在基于GMM-HMM
的系統中已經付出的巨大努力,工業界并沒有迫切轉向
神經網絡的需求。結果,直到21 世紀00
年代末期,學術界和工業界的研究者們更多的是用
神經網絡為GMM-HMM 系統學習一些額外的
特征。
之后,隨著更大更深的模型以及更大的數據集的出現,通過使用
神經網絡代替GMM 來實現將聲學
特征轉化為音素(或者子音素狀態)
的過程可以大大地提高識別的
精度。從2009年開始,語音識別的研究者們將一種
無監督學習的
深度學習方法應用于語音識別。這種
深度學習方法基于訓練一個被稱作是受限玻爾茲曼機的無向概率模型,從而對輸入
數據建模。受限玻爾茲曼機將會在第三部分中描述。為了完成語音識別任務,
無監督的預訓練被用來構造一個深度前饋網絡,這個
神經網絡每一層都是通過訓練受限玻爾茲曼機來初始化的。這些網絡的輸入是從一個固定規格的輸入窗(以當前幀為中心)
的譜聲學表示抽取,預測了當前幀所對應的HMM 狀態的
條件概率。訓練一個這樣的
神經網絡能夠可以顯著提高在TIMIT
數據集上的識別率(Mohamed et al., 2009,2012a),并將音素級別的錯誤率從大約26%
降到了20:7%。關于這個模型成功原因的詳細分析可以參考Mohamed et al.
(2012b)。對于基本的電話識別工作流程的一個擴展工作是添加說話人自適應相關
特征(Mohamed et al., 2011)
的方法,這可以進一步地降低錯誤率。緊接著的工作則將結構從音素識別(TIMIT 所主要關注的)轉向了大規模詞匯語音識別(Dahl et al.,
2012),這不僅包含了識別音素,還包括了識別大規模詞匯的序列。語音識別上的深度網絡從最初的使用受限玻爾茲曼機進行預訓練發展到了使用諸如整流線性單元和Dropout
這樣的技術(Zeiler et al., 2013; Dahl et al.,
2013)。從那時開始,工業界的幾個語音研究組開始尋求與學術圈的研究者之間的合作。Hinton et al.
(2012a)描述了這些合作所帶來的突破性進展,這些技術現在被廣泛應用在產品中,比如移動手機端。
機器翻譯以一種自然語言讀取句子并產生等同含義的另一種語言的句子。機器翻譯系統通常涉及許多組件。在高層次,一個組件通常會提出許多候選翻譯。由于語言之間的差異,這些翻譯中的許多翻譯是不符合語法的。例如,許多語言在名詞后放置形容詞,因此直接翻譯成英語時,它們會產生諸如“apple
red”的短語。提議機制提出建議翻譯的許多變體,理想情況下應包括“red apple”。翻譯系統的第二個組成部分(語言模型)
評估提議的翻譯,并可以評估“red apple”比“apple red”更好。