在本章中,我們將介紹如何使用深度學習來解決計算機視覺、語音識別、自然語言處理以及其他商業領域中的應用。首先我們將討論在許多最重要的AI 應用中所需的大規模神經網絡的實現。接著,我們將回顧深度學習已經成功應用的幾個特定領域。
盡管深度學習的一個目標是設計能夠處理各種任務的算法,然而截至目前深度學習的應用仍然需要一定程度的特化。例如,計算機視覺中的任務對每一個樣本都需要處理大量的輸入特征(像素),自然語言處理任務的每一個輸入特征都需要對大量的可能值(詞匯表中的詞) 建模。
深度學習的基本思想基于聯結主義:盡管機器學習模型中單個生物性的神經元或者說是單個特征不是智能的,但是大量的神經元或者特征作用在一起往往能夠表現出智能。我們必須著重強調神經元數量必須很大這個事實。
相比20世紀80年代,如今神經網絡的精度以及處理任務的復雜度都有一定提升,其中一個關鍵的因素就是網絡規模的巨大提升。在過去的30年內,網絡規模是以指數級的速度遞增的。然而如今的人工神經網絡的規模也僅僅和昆蟲的神經系統差不多。由于規模的大小對于神經網絡來說至關重要,因此深度學習需要高性能的硬件設施和軟件實現。
快速的CPU實現
傳統的神經網絡是用單臺機器的CPU 來訓練的。如今,這種做法通常被視為是不可取的。現在,我們通常使用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)。
模型壓縮