深度學習已成功應用於這三大領域
在本章中,我們將介紹如何使用深度學習來解決計算機視覺、語音識別、自然語言處理以及其他商業領域中的應用。首先我們將討論在許多最重要的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)。
模型壓縮
在許多商業應用的機器學習模型中,一個時間和記憶體開銷較小的推斷演算法比一個時間和記憶體開銷較小的訓練演算法要更為重要。對於那些不需要個性化設計的應用來說,我們只需要一次性地訓練模型,然後它就可以被成千上萬的使用者使用。在許多情況下,相比開發者,終端使用者的可用資源往往更有限。例如,開發者們可以使用巨大的計算機叢集訓練一個語音識別的網路,然後將其部署到移動手機上。
減少推斷所需開銷的一個關鍵策略是模型壓縮(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 = (y
1
; y
2
,…, y
N
) 表示目標的輸出序列(通常是一個詞或者字元的序列)。自動語音識別(automatic speech recognition,ASR) 任務指的是構造一個函式f*ASR,使得它能夠在給定聲學序列X 的情況下計算最有可能的語言序列y:
其中P*是給定輸入值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)描述了這些合作所帶來的突破性進展,這些技術現在被廣泛應用在產品中,比如移動手機端。
隨後,當研究組使用了越來越大的帶標籤的資料集,加入了各種初始化、訓練方法以及除錯深度神經網路的結構之後,他們發現這種無監督的預訓練方式是沒有必要的,或者說不能帶來任何顯著的改進。
用語音識別中詞錯誤率來衡量,在語音識別效能上的這些突破是史無前例的(大約30%的提高)。在這之前的長達十年左右的時間內,儘管資料集的規模是隨時間增長的(見Deng and Yu (2014) 的圖2.4),但基於GMM-HMM 的系統的傳統技術已經停滯不前了。這也導致了語音識別領域快速地轉向深度學習的研究。在大約兩年的時間內,工業界大多數的語音識別產品都包含了深度神經網路,這種成功也激發了ASR 領域對深度學習演算法和結構的新一波研究浪潮,並且影響至今。
其中的一個創新點是卷積網路的應用(Sainath et al., 2013)。卷積網路在時域與頻域上覆用了權重,改進了之前的僅在時域上使用重複權值的時延神經網路。這種新的二維卷積模型並不是將輸入的頻譜當作一個長的向量,而是當成一個影像,其中一個軸對應著時間,另一個軸對應的是譜分量的頻率。
完全拋棄HMM 並轉向研究端到端的深度學習語音識別系統是至今仍然活躍的另一個重要推動。這個領域第一個主要突破是Graves et al. (2013),他訓練了一個深度的長短期記憶迴圈神經網路(見第10.10 節),使用了幀-音素排列的MAP 推斷,就像LeCun et al. (1998c)以及CTC 框架(Graves et al., 2006; Graves, 2012) 中一樣。一個深度迴圈神經網路(Graves et al., 2013) 每個時間步的各層都有狀態變數,兩種展開圖的方式導致兩種不同深度:一種是普通的根據層的堆疊衡量的深度,另一種是根據時間展開衡量的深度。這個工作把TIMIT 資料集上音素的錯誤率記錄降到了新低17:7%。關於應用於其他領域的深度迴圈神經網路的變種可以參考Pascanu et al. (2014a); Chung et al. (2014)。
另一個端到端深度學習語音識別方向的最新方法是,讓系統學習如何利用語音(phonetic)層級的資訊“排列”聲學(acoustic) 層級的資訊(Chorowski et al., 2014; Lu et al., 2015)。
自然語言處理
自然語言處理(natural language processing,NLP) 是讓計算機能夠使用人類語言,例如英語或法語。為了讓簡單的程式能夠高效明確地解析,計算機程式通常讀取和發出特殊化的語言。而自然語言通常是模糊的,並且可能不遵循形式的描述。自然語言處理中的應用如機器翻譯,學習者需要讀取一種人類語言的句子,並用另一種人類語言發出等同的句子。許多NLP 應用程式基於語言模型,語言模型定義了關於自然語言中的字、字元或位元組序列的機率分佈。
與本章討論的其他應用一樣,非常通用的神經網路技術可以成功地應用於自然語言處理。然而,為了實現卓越的效能並擴充套件到大型應用程式,一些領域特定的策略也很重要。為了構建自然語言的有效模型,通常必須使用專門處理序列資料的技術。在很多情況下,我們將自然語言視為一系列詞,而不是單個字元或位元組序列。因為可能的詞總數非常大,基於詞的語言模型必須在極高維度和稀疏的離散空間上操作。為了使這種空間上的模型在計算和統計意義上都高效,研究者已經開發了幾種策略。
n-gram
語言模型(language model) 定義了自然語言中標記序列的機率分佈。根據模型的設計,標記可以是詞、字元甚至是位元組。標記總是離散的實體。最早成功的語言模型基於固定長度序列的標記模型,稱為n-gram。一個n-gram 是一個包含n 個標記的序列。
神經語言模型
神經語言模型(neural language model, NLM) 是一類用來克服維數災難的語言模型,它使用詞的分散式表示對自然語言序列建模(Bengio et al., 2001b)。不同於基於類的n-gram 模型,神經語言模型在能夠識別兩個相似的詞,並且不喪失將每個詞編碼為彼此不同的能力。神經語言模型共享一個詞(及其上下文) 和其他類似詞(和上下文之間) 的統計強度。模型為每個詞學習的分散式表示,允許模型處理具有類似共同特徵的詞來實現這種共享。例如,如果詞dog和詞cat對映到具有許多屬性的表示,則包含詞cat的句子可以告知模型對包含詞dog的句子做出預測,反之亦然。因為這樣的屬性很多,所以存在許多泛化的方式,可以將資訊從每個訓練語句傳遞到指數數量的語義相關語句。維數災難需要模型泛化到指數多的句子(指數相對句子長度而言)。該模型透過將每個訓練句子與指數數量的類似句子相關聯克服這個問題。
高維輸出
在許多自然語言應用中,通常希望我們的模型產生詞(而不是字元) 作為輸出的基本單位。對於大詞彙表,由於詞彙量很大,在詞的選擇上表示輸出分佈的計算成本可能非常高。在許多應用中,V 包含數十萬詞。表示這種分佈的樸素方法是應用一個仿射變換,將隱藏表示轉換到輸出空間,然後應用softmax 函式。假設我們的詞彙表V 大小為|V|。因為其輸出維數為|V|,描述該仿射變換線性分量的權重矩陣非常大。這造成了表示該矩陣的高儲存成本,以及與之相乘的高計算成本。因為softmax 要在所有|V| 輸出之間歸一化,所以在訓練時以及測試時執行全矩陣乘法是必要的|| 我們不能僅計算與正確輸出的權重向量的點積。因此,輸出層的高計算成本在訓練期間(計算似然性及其梯度) 和測試期間(計算所有或所選詞的機率) 都有出現。對於專門的損失函式,可以有效地計算梯度(Vincent et al., 2015),但是應用於傳統softmax 輸出層的標準交叉熵損失時會出現許多困難。
結合n-gram 和神經語言模型
n-gram 模型相對神經網路的主要優點是n-gram 模型具有更高的模型容量(透過儲存非常多的元組的頻率),並且處理樣本只需非常少的計算量(透過查詢只匹配當前上下文的幾個元組)。如果我們使用雜湊表或樹來訪問計數,那麼用於n-gram 的計算量幾乎與容量無關。相比之下,將神經網路的引數數目加倍通常也大致加倍計算時間。當然,避免每次計算時使用所有引數的模型是一個例外。嵌入層每次只索引單個嵌入,所以我們可以增加詞彙量,而不會增加每個樣本的計算時間。一些其他模型,例如平鋪卷積網路,可以在減少引數共享程度的同時新增引數以保持相同的計算量。然而,基於矩陣乘法的典型神經網路層需要與引數數量成比例的計算量。
因此,增加容量的一種簡單方法是將兩種方法結合,由神經語言模型和n-gram 語言模型組成整合(Bengio et al., 2001b, 2003)。
對於任何整合,如果整合成員產生獨立的錯誤,這種技術可以減少測試誤差。整合學習領域提供了許多方法來組合整合成員的預測,包括統一加權和在驗證集上選擇權重。Mikolovet al. (2011a) 擴充套件了整合,不是僅包括兩個模型,而是包括大量模型。我們也可以將神經網路與最大熵模型配對並聯合訓練(Mikolov et al., 2011b)。該方法可以被視為訓練具有一組額外輸入的神經網路,額外輸入直接連線到輸出並且不連線到模型的任何其他部分。額外輸入是輸入上下文中特定n-gram 是否存在的指示器,因此這些變數是非常高維且非常稀疏的。
模型容量的增加是巨大的(架構的新部分包含高達|sV | n 個引數),但是處理輸入所需的額外計算量是很小的(因為額外輸入非常稀疏)。
神經機器翻譯
機器翻譯以一種自然語言讀取句子併產生等同含義的另一種語言的句子。機器翻譯系統通常涉及許多元件。在高層次,一個元件通常會提出許多候選翻譯。由於語言之間的差異,這些翻譯中的許多翻譯是不符合語法的。例如,許多語言在名詞後放置形容詞,因此直接翻譯成英語時,它們會產生諸如“apple red”的短語。提議機制提出建議翻譯的許多變體,理想情況下應包括“red apple”。翻譯系統的第二個組成部分(語言模型) 評估提議的翻譯,並可以評估“red apple”比“apple red”更好。
最早的機器翻譯神經網路探索中已經納入了編碼器和解碼器的想法(Allen 1987; Chris-man 1991; Forcada and ~Neco 1997),而翻譯中神經網路的第一個大規模有競爭力的用途是透過神經語言模型升級翻譯系統的語言模型(Schwenk et al., 2006; Schwenk, 2010)。之前,大多數機器翻譯系統在該元件使用n-gram 模型。機器翻譯中基於n-gram 的模型不僅包括傳統的回退n-gram 模型(Jelinek and Mercer, 1980; Katz, 1987; Chen and Goodman, 1999),而且包括最大熵語言模型(maximum entropy language models)(Berger et al., 1996),其中給定上下文中常見的詞,a±ne-softmax 層預測下一個詞。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2662475/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 目前,深度學習已成功運用於這三大領域深度學習
- 深度學習在醫療領域的應用深度學習
- 【AI in 美團】深度學習在文字領域的應用AI深度學習
- 深度學習在自動駕駛感知領域的應用深度學習自動駕駛
- 深度學習在CV領域已觸及天花板?深度學習
- python都應用於哪些領域?Python開發學習Python
- 深度學習影象演算法在內容安全領域的應用深度學習演算法
- linux目前應用領域如何?學習linuxLinux
- Linux應用領域有哪些?linux應用技術學習Linux
- 盤點:文字內容安全領域 深度學習的六個主流應用方法深度學習
- 深度學習領域的資料增強深度學習
- 深度學習及深度強化學習應用深度學習強化學習
- 超全!深度學習在計算機視覺領域應用一覽(附連結)深度學習計算機視覺
- 回顧·深度學習的可解釋性與低頻事件學習在金融領域的研究與應用深度學習事件
- 什麼是人工智慧領域的深度學習?人工智慧深度學習
- Linux的應用領域有什麼?Linux入門學習Linux
- nodejs應用領域NodeJS
- Linux 應用領域Linux
- 不同的領域、框架,這是一份超全的深度學習模型GitHub集合框架深度學習模型Github
- AR眼鏡,機器學習領域的殺手級應用?機器學習
- 學Python需要多久?應用領域有哪些?Python
- Java學完可以應用在什麼領域?這8大領域你要知道Java
- Linux好嗎?Linux可應用於哪些領域?Linux
- 人人都可以創造自己的AI:深度學習的6大應用及3大成熟領域AI深度學習
- 網路安全應用領域有哪些?常見應用領域總結!
- IT伺服器領域Linux應用如何?linux基礎入門學習伺服器Linux
- Python應用於哪些領域 如何更快入門PythonPython
- 無人機應用進軍生物學領域無人機
- 《深度學習案例精粹:基於TensorFlow與Keras》案例集用於深度學習訓練深度學習Keras
- 大資料應用:這5個領域必不可少!大資料
- 深度學習領域的論文應該怎麼寫,可以提供一些方向嗎?深度學習
- 七夕“加餐”:深度學習影像演算法在內容安全領域的應用實踐和優化深度學習演算法優化
- 深度學習之卷積模型應用深度學習卷積模型
- 深度學習的應用與實踐深度學習
- 深度學習在OC中的應用深度學習
- 擴充 Swift 應用領域Swift
- 效能測試應用領域
- 深度學習在人工智慧領域的七大階段深度學習人工智慧