循環神經網路綜述-語音識別與自然語言處理的利器(上篇)

循環神經網路綜述-語音識別與自然語言處理的利器(上篇)

本文為SIGAI原創文章,僅供個人學習使用,未經允許,不能用於商業目的

導言循環神經網路是一種具有記憶功能的神經網路,適合序列數據的建模。它在語音識別、自然語言處理等領域取得了成功。是除卷積神經網路之外深度學習中最常用的一種網路結構。在本文中,SIGAI將和大家一起回顧循環神經網路的發展歷程與在各個領域的應用。

序列數據建模

全連接網路和卷積網路在運行時每次接收的都是獨立的輸入數據,沒有記憶能力。在有些應用中需要神經網路具有記憶功能,典型的是時間序列預測問題,時間序列可以抽象的表示為一個向量序列:

這裡的下標表示時刻,神經網路每個時刻接收一個向量輸入。不同時刻的向量之間存在關係,每個時刻的向量與更早時刻的向量相關。例如,在說話時當前要說的詞和之前所說的詞之間相關,依賴於上下文語境。我們需要根據輸入序列來產生輸出向量。這類問題稱為序列預測問題,輸入序列的長度可能不固定。

語音識別與自然語言處理的問題是這類序列預測問題的典型代表。前者的輸入是一個時間序列的語音信號;後者是文字序列。下面我們用一個實際例子來說明序列預測問題。假設神經網路要用來完成漢語填空,考慮下面這個句子:

現在已經半夜12點了,我非常困,想回家__。

最佳答案是「睡覺」或者「休息」,這個答案需要根據上下文理解得到。在這裡,神經網路每次的輸入為一個詞,最後要填出這個空,這需要網路能夠理解語義,並記住之前輸入的信息即語句上下文。這裡需要神經網路具有記憶功能,能夠根據之前的輸入詞序列計出當前使用哪個詞的概率最大。如何設計一個神經網路滿足上面的要求?答案就是我們接下來要介紹的循環神經網路。

循環層的工作原理

循環神經網路(簡稱RNN)[1]會記住網路在上一個時刻的輸出值,並將該值用於當前時刻輸出值的生成,這由循環層實現。RNN的輸入為前面介紹的向量序列,每個時刻接收一個輸入,網路會產生一個輸出,而這個輸出是由之前的序列共同作用決定的。假設t時刻循環層的狀態值為 h_{t} ,它由上一時刻的狀態值以及當前時刻的輸入值共同決定,即:

這是一個遞推關係式,現在的問題是確定這個表達式的具體形式,即將上一時刻的狀態值與當前時刻的輸入值整合到一起。在全連接神經網路中,神經元的輸出值是對輸入值進行加權,然後用激活函數進行作用,得到輸出。在這裡,我們可以對上一時刻的狀態值,當前時刻的輸入值進行類似的處理,即將它們分別都乘以權重矩陣,然後整合起來。整合可以採用加法,也可以採用乘法或者更複雜的運算,最簡單的是加法,乘法在數值上不穩定,多次乘積之後數為變得非常大或者非常小。顯然,這裡需要兩個權重矩陣,分別作用於上一時刻狀態值,當前時刻的輸入值,由此得到下面的遞推關係式:

其中W為權重矩陣,b為偏置向量。和全連接神經網路相比,這裡只是多了一個項:

它意味著在實現循環神經網路的時候需要用變數記住隱含層上次的輸出值。使用激活函數的原因在SIGAI之前公眾號的文章中介紹過,是為了確保非線性。下面我們用示意圖來表示一個隱含層的變換:

在上圖中 h_{t-1}X_{t}共同決定 h_{t}h_{t-1} 體現了記憶功能,而它的值又是由 h_{t-1}X_{t-1}

決定。因此h_{t}的值實際上是由 X_{1},...,X_{t} 決定的,它記住了之前完整的序列信息。需要強調的是,權重矩陣 W_{hh} 並不會隨著時間變化,而是固定的,即在每個時刻進行計算時使用的是同一個矩陣。這樣做的好處一方面是減少了模型參數,另一方面也記住了之前的信息。

如果把每個時刻的輸入和輸出值按照時間線展開,如下圖所示:

網路結構

最簡單的循環神經網路由一個輸入層,一個循環層,一個輸出層組成。輸出層接收循環層的輸出值作為輸入併產生輸出,它不具有記憶功能。輸出層實現的變換為:

函數g的類型根據任務而定,對於分類任務一般選用softmax函數,輸出各個類的概率。結合循環層和輸出層,循環神經網路完成的變換為:

在這裡只使用了一個循環層和一個輸出層,實際使用時可以有多個循環層,即深度循環神經網路,在下一節中會詳細介紹。

深層網路

上面我們介紹的循環神經網路只有一個輸入層,一個循環層和一個輸出層,這是一個淺層網路。和全連接網路以及卷積網路一樣,我們可以把它推廣到任意多個隱含層的情況,得到深度循環神經網路[11]。

這裡有3種方案,第一種方案為Deep Input-to-Hidden Function,在循環層之前加入多個普通的前饋層,將輸入向量進行多層映射之後再送入循環層進行處理。

第二種方案是Deep Hidden-to-Hidden Transition,它使用多個循環層,這和前饋型神經網路類似,唯一不同的是計算隱含層輸出的時候需要利用本隱含層在上一個時刻的輸出值。

第三種方案是Deep Hidden-to-Output Function,它在循環層到輸出層之間加入多前饋層,這和第一種情況類似。

由於循環層一般用tanh作為激活函數,層次過多之後會導致梯度消失問題,和殘差網路類似,可以採用跨層連接的方案。在語音識別、自然語言處理問題上,我們會看到深層循環神經網路的應用,實驗結果證明深層網路比淺層網路有更好的精度。

訓練演算法

前面我們介紹了循環神經網路的結構,接下來要解決的問題是網路的參數如何通過訓練確定。由於循環神經網路的輸入是時間序列,因此每個訓練樣本是一個時間序列,包含多個相同維度的向量。解決循環神經網路訓練問題的演算法是Back Propagation Through Time演算法,簡稱BPTT[2-4],原理和標準的反向傳播演算法類似,都是建立誤差項的遞推公式,根據誤差項計算出損失函數對權重矩陣、偏置向量的梯度值。不同的是,全連接神經網路中遞推是在層之間建立的,而這裡是沿著時間軸建立的。限於篇幅,在這裡我們不詳細介紹和推導BPTT的原理,如果有機會,SIGAI會在後續的公眾號文章中給出。

挑戰與改進措施

循環神經網路與其他類型的神經網路共同要面對的是梯度消失問題,對此出現了一些解決方案,如LSTM等。相比卷積神經網路,循環神經網路在結構上的改進相對要少一些。

梯度消失問題

和前饋型神經網路一樣,循環神經網路在進行梯度反向傳播時也面臨著梯度消失和梯度爆炸問題,只不過這種消逝問題表現在時間軸上,即如果輸入序列的長度很長,我們很難進行有效的梯度更新。對這一問題的解釋和理論分析,SIGAI會在以後的文章中給出。文獻[5]對循環神經網路難以訓練的問題進行了分析。進一步的,文獻[6]對這一問題作出了更深的解釋,並給出了一種解決方案。

LSTM

長短期記憶模型(long short time memory,簡稱LSTM)由Schmidhuber等人在1997年提出[7],與高速公路網路(highway networks)有異曲同工之妙。它對循環層進行改造,具體方法是使用輸入門、遺忘門、輸出門3個元件,通過另外一種方式由 h_{t-1} 計算h_{t}

。LSTM的基本單元稱為記憶單元,它記住了上一個時刻的狀態值。記憶單元在t時刻維持一個記憶值 C_{t} ,循環層狀態的輸出值計算公式為:

即輸出門與狀態值的乘積,在這裡是向量對應元素相乘。其中 O_{t} 為輸出門,是一個向量,按照如下公式計算:

其中 sigma 為sigmoid函數,後面公式中含義相同。輸出門控制著記憶單元中存儲的記憶值有多大比例可以被輸出。使用sigmoid函數這是因為它的值域是(0,1),這樣O_{t}的所有分量的取值範圍都在0和1之間,它們分別與另外一個向量的分量相乘,可以控制另外一個向量的輸出比例。分別為輸出門的權重矩陣和偏置向量。 W_{xo},W_{ho},b_{o} 是輸出門的權重矩陣和偏置項,這裡參數通過訓練得到。

記憶值 C_{t} 是循環層神經元記住的上一個時刻的狀態值,隨著時間進行加權更新,它的計算公式為:

其中 f_{t} 是遺忘門, C_{t-1} 是記憶單元在上一時刻的值,遺忘門決定了記憶單元上一時刻的值有多少會被傳到當前時刻。上式表明,記憶單元當前值是上時刻值與當前輸入值的加權和,記憶值只是個中間值。遺忘門的計算公式為:

這裡也使用了sigmoid函數, W_{xf},W_{hf},b_{f} 分別為遺忘門的權重矩陣和偏置向量。 i_{t} 是輸入門,控制著當前時刻的輸入有多少可以進入記憶單元,其計算公式為:

其中 W_{xi},W_{hi},b_{i} 分別為輸入門的權重矩陣和偏置向量。這3個門的計算公式都是一樣的,分別使用了自己的權重矩陣和偏置向量,這3個值的計算都用到了 X_{t}h_{t-1} ,它們起到了信息的流量控制作用。

隱含層的狀態值由遺忘門,記憶單元上一時刻的值,以及輸入門,輸出門共同決定。除掉3個門之外,真正決定 h_{t} 的只有 X_{t}h_{t-1} 。總結起來,LSTM的計算思路為:

輸入門作用於輸入信息,遺忘門作用於之前的記憶信息,二者加權和,得到匯總信息;最後通過輸出門決定輸出信息。

所有的權重矩陣,偏置向量都通過訓練得到,這和普通的循環神經網路沒有區別,根據BPTT演算法,我們可以得到這些參數的梯度值,在這裡不詳細介紹。

GRU

門控循環單元[8](Gated Recurrent Units,簡稱GRU)是解決循環神經網路梯度消失的另外一種方法,它也是通過門來控制信息的流動。和LSTM不同的是,它只使用了兩個門,把LSTM的輸入門和遺忘門合併成更新門。在這裡我們不詳細介紹計算公式,感興趣的讀者可以閱讀參考文獻。

雙向網路

前面介紹的循環神經網路是單向的,每一個時刻的輸出依賴於比它早的時刻的輸入值,這沒有利用未來時刻的信息,對於有些問題,當前時刻的輸出不僅與過去時刻的數據有關,還與將來時刻的數據有關,為此Schuster等人設計了雙向循環神經網路[9],它用兩個不同的循環層分別從正向和反向對數據進行掃描。正向傳播時的流程為:

1.循環,對t=1,...T

用正向循環層進行正向傳播,記住每一個時刻的輸出值

結束循環

2.循環,對對t=T,...1

用反向循環層進行正向傳播,記住每一個時刻的輸出值

結束循環

3.循環,對所有的t,可以按照任意順序進行計算

用正向和反向循環層的輸出值作為輸出層的輸入,計算最終的輸出值

結束循環

下面用一個簡單的例子來說明,假設雙向循環神經網路的輸入序列為 X_{1},...,X_{4} 。首先用第一個循環層進行正向迭代,得到隱含層的正向輸出序列:

然後將每個時刻的隱含層正向輸出序列和反向輸出序列合併起來:

送入神經網路中後面的層進行處理,此時,各個時刻的處理順序是隨意的,可以不用按照輸入序列的時間順序。

多維網路

循環神經網路的另外一個改進是拓展到多維的情況,得到多維網路,限於篇幅,在這裡不詳細介紹,感興趣的讀者可以閱讀參考文獻[18]。

序列預測問題

序列預測問題是一類問題的抽象,它的輸入是一個序列,輸出也是一個序列,而且輸入和輸出序列的長度是不固定的。這是循環神經網路最擅長處理的問題之一。

序列標註問題

序列標註問題[12]是一個抽象的概念,它泛指將一個序列數據映射成另外一個序列的任務,其本質是根據上下文信息對序列每個時刻的輸入值進行預測。典型的序列標註問題包括語音識別,機器翻譯,詞性標註等。對於語音識別問題,輸入數據是語音信號序列,輸出是離散的文字序列;對於機器翻譯問題,輸入是一種語言的語句,即單詞序列,輸出是另外一種語言的單詞序列;對於詞性標註問題,輸入是一句話的單詞序列,輸出是每個單詞的詞性,如名詞、動詞。

與普通的模式分類問題相比,序列標註問題最顯著的區別是輸入序列數據的數據點之間存在相關性,輸出的序列數據的數據點之間也存在相關性。例如,對於語音識別問題,一句話的語音信號在各個時刻顯然是相關的;識別的結果單詞序列組成,各個單詞之間顯然也具有相關性,它們必須符合詞法和語法規則。

序列標註問題的一個困難之處在於輸入序列和輸出序列之間的對齊關係是未知的。以語音識別問題為例,輸入語音信號哪個時間段內的數據對應哪個單詞的對應關係在進行識別之前並不知道,我們不知道一個單詞在語音信號中的起始時刻和終止時刻。

循環神經網路因為具有記憶功能,因此特別適合於序列標註任務。但是循環神經網路在處理這類任務時面臨幾個問題。第一個問題是標準的循環神經網路是單向的,但有些問題不僅需要序列過去時刻的信息,還需要未來時刻的信息。例如我們要理解一個句子中的某個詞,它不僅與句子中前面的詞有關,還和後門的詞有關,即所謂的上下文語境。解決這個問題的方法是上面介紹的雙向循環神經網路。

第二個問題是循環神經網路的輸出序列和輸入序列之間要對齊。即每一個時刻的輸出值與輸入值對應,而有些問題中輸入序列和輸出序列的對應關係是未知的。典型的是語音識別問題,這在前面已經介紹。解決這個問題的經典方法是連接主義時序分類,即Connectionist Temporal Classification,簡稱CTC。

根據輸入序列和輸出序列的對應關係,我們可以將序列標註問題分為三類。第一類為序列分類問題,它給輸入序列賦予一個類別標籤,即輸出序列只有一個值,因此輸出序列的長度為1。第二類問題為段分類問題,輸入序列被預先分成了幾段,每段為一個序列,為每一段賦予一個標籤值,顯然,第一種問題是第二種問題的一個特例。第三類問題為時序分類問題,對於這類問題,輸入序列和輸出序列的任何對齊方式都是允許的。顯然,第二類問題是第三類問題的一個特例,因此這3類問題是層層包含關係。三類問題的關係如下圖所示:

CTC

循環神經網路雖然可以解決序列數據的預測問題,但它要求輸入的數據是每個時刻分割好並且計算得到的固定長度的特徵向量。對於有些問題,對原始的序列數據進行分割並計算特徵向量存在困難,典型的是語音識別。原始的聲音信號我們很難先進行準確的分割,得到每個發音單元所對應的準確的時間區間。解決這類問題的一種典型方法是CTC技術。

CTC[13]是一種解決從未分段的序列數據預測標籤值的通用方法,在這裡不要求將輸入數據進行分割之後再送入循環神經網路中預測。2014年Graves等人將這一方法用於語音識別問題[14],通過和循環神經網路整合來完成語音識別任務。CTC解決問題的關鍵思路是引入了空白符以及消除重複,以及用一個映射函數將循環神經網路的原始輸出序列映射為最終需要的標籤序列。

假設訓練樣本集為S,訓練樣本服從概率分布 D_{X*Z} 。輸入空間是輸入序列的集合,定義為:

這是所有m維實向量序列的集合。目標空間是我們需要的預測結果序列的集合,定義為:

這是建立在包含有限個字母集L之上的標籤序列的集合,我們將L*中的元素稱為標籤序列。對於語音識別,L是文字字典,L*是識別出來的句子。訓練樣本集中的每個樣本是一個序列對(x,z)。其中輸入序列為:

目標序列為:

這有一個約束條件,目標序列的長度不大於輸入序列的長度,即 Uleq T 。由於輸出序列的長度與輸入序列的長度可能不相等,因此無法用先驗知識將它們對齊,即讓輸出序列的某些元素和輸入序列的某一個元素對應起來。我們的目標是用訓練樣本集訓練一個時序分類器:

然後用它對新的輸入序列進行分類。分類時,要讓定義的某種誤差最小化。要使用循環神經網路對時序數據進行分類,其中關鍵的步是將循環神經網路的輸出值轉換成某一個序列的條件概率值。這樣,我們通過尋找使得這個條件概率最大化的輸出序列來完成對輸入序列的分類。

CTC網路的輸出層為softmax層,如果標籤字母集中的字母個數為|L|,則這一層有|L|+1個神經元,其中前|L|個神經元表示在某一個時刻輸出標籤為每一個標籤字母的概率,最後一個神經元的輸出值為輸出標籤值為空的概率,即沒有標籤輸出。這樣,softmax層在各個時刻的輸出值合併在一起,定義了各種可能的輸出標籤序列和輸入序列進行對齊的方式的概率。任何一個標籤序列的概率值可以通過對其所有不同的對齊方式的概率進行求和得到。

假設輸入序列的長度為T,循環神經網路的輸入數據為m維,輸出向量為n維,權重向量為w,它實現了如下的映射:

我們將網路的映射寫成 Y=N_{w}(X) ,其中y是輸出序列。在t時刻,網路第k個輸出單元的值為 Y_{k}^{t} 。在這裡Y_{k}^{t}可以將解釋為在t時刻觀測標籤k的概率。這個概率值定義了集合 L^{t} 中長度為T的序列所服從的概率分布,其中 L^{}=Lcup {blank},其中blank為空白符號,即:

在這裡我們將集合L^{t}中的元素稱為路徑(path),記為 pi 。接下來,我們定義一個多對一的映射,將神經網路的輸出序列映射為最終需要的標籤值序列:

其中 L^{leq T} 是所有可能的輸出標籤序列的集合,即由字母集合中的字母組成的長度小於等於T的序列的集合。從神經網路的輸出序列 L^{T} 得到目標標籤序列L^{leq T}的做法是消除空白符和連續的重複標籤值。下面來看B函數作用於一個序列的例子:

其中,-為空白符號。由於與一個標籤序列對應的路徑不止一個,因此目標標籤序列的條件概率應該等於能得到它的所有路徑的條件概率之和。我們藉助映射B來定義一個標籤序列 1in L^{leq T} 的條件概率,它等於所有映射後為l的路徑 piin B^{-1}(1) 的概率之和:

下面用一個簡單的例子進行說明。如果標籤字母集合為{a,b,c},路徑的序列長度為4,標籤序列的長度為3。則標籤序列l = abc所對應的所有可能路徑 pi 為:

總共有7條路徑和一個標籤序列對應。基於上面的定義,CTC分類器的分類結果是給定輸入序列,尋找上面的條件概率最大的那個輸出序列:

在這裡,需要解決如何找到概率最大的輸出序列的問題,而前面定義的框架只是計算給定的輸出序列的條件概率。採用和隱馬爾可夫模型類似的概念,我們稱這一過程為解碼,它們都是要得到概率最大的序列值。直接暴力枚舉計算量太大,這裡採用了動態規劃建立遞推公式進行計算,限於篇幅,我們不能詳細介紹,在後面的文章中,SIGAI將對此展開講解。

seq2seq

對有些問題,輸入序列的長度和輸出序列不一定相等,而且我們事先並不知道輸出序列的長度,典型的是機器翻譯問題。以機器翻譯為例,將一種語言的句子翻譯成另外一種語言之後,句子的長度即包括的單詞數量一般是不相等的。以英譯漢為例,英文句子「whats your name」是3個單片語成的序列,翻譯成中文為「你叫什麼名字」,由4個漢字片語成。標準的RNN沒法處理這種輸入序列和輸出序列長度不相等的情況,解決這類問題的一種方法是序列到序列學習技術。

Sequence to Sequence Learning,即序列到序列的學習[15],簡稱seq2seq,是用循環神經網路構建的一種框架,它能實現從一個序列到另外一個序列的映射,兩個序列的長度可以不相等。seq2seq框架包括兩部分,分別稱為編碼器和解碼器,它們都是循環神經網路。這裡要完成的是從一個序列到另外一個序列的預測:

前者是源序列,後者是目標序列,兩個序列的長度可能不相等。

用於編碼器的循環神經網路接受輸入序列 X_{1},...,X_{T} ,最後時刻T產生的隱含層狀態值 h_{t}

作為序列的編碼值,它包含了時刻1到T輸入序列的所有信息,在這裡我們將其簡寫為v,這是一個固定長度的向量。用於解碼的RNN的初始隱含狀態為v,它可以計算目標序列 Y_{1},...,Y_{T}

的條件概率:

根據訓練神經網路的輸出值之間的關係,這個概率可以進一步寫成:

如果在輸出層使用softmax函數映射,就可以到到上面每一個時刻的概率。實現時編碼器和解碼器同時訓練,最大化上面的條件概率。在這裡訓練樣本是成對的序列(A,B),訓練的目標是讓序列A編碼之後解碼得到序列B的概率最大,即最大化如下的條件對數似然函數:

其中N是訓練樣本數, 	heta 為要求解的參數。輸入序列和對應的輸出序列組合在一起為一個訓練樣本。下圖是編碼器對句子編碼後的結果,在這裡投影到2維平面上了:

seq2seq框架有兩種用法。第一種用法是為輸入輸出序列對打分,即計算條件概率值:

第二種用法是根據輸入序列生成對應的輸出序列,由於seq2seq只有計算條件概率的功能,因此需要採用搜索技術得到條件概率最大的輸出序列,可以使用集束搜索(beam search)技術。機器翻譯問題採用的是第二種用法。seq2seq框架提供的是一種預測輸出序列對輸入序列的條件概率的手段。

集束搜索通過在每一步對上一步的結果進行擴展來生成最優解。在每一步,選擇一個詞添加到之前的序列中,形成新的序列,並只保留概率最大的k個序列。在這裡,k為人工設定的參數,稱為集束寬度。

下面用一個例子來說明集束搜索的原理。假設詞典大小為3,包含的詞為{a,b,c}。如果集束搜索的搜索寬度設置為2,則在選擇第一個詞的時候,尋找概率最大的兩個詞,假設為{a,b}。接下來,生成下一個詞,對所有可能的組合{aa,ab,ac,ba,bb,bc},保留概率最大的2個,假設為{ab,bb}。接下來,在這個基礎上再選擇第三個詞,以此類推。最終得到概率最大的完整序列作為輸出。

典型應用

循環神經網路被成功應用於各類時間序列數據的分析和建模,包括語音識別,自然語言處理,機器視覺中的目標跟蹤、視頻動作識別等。

語音識別

深度學習最早應用於語音識別問題時的作用是替代GMM-HMM框架中的高斯混合模型,負責聲學模型的建模,即DNN-HMM結構。在這種結構里,深層神經網路負責計算音頻幀屬於某一聲學狀態的概率或者是提取出聲音的特徵,其餘的部分和GMM-HMM結構相同。

語音識別的困難之處在於輸入語音信號序列中每個發音單元的起始位置和終止位置是未知的,即不知道輸出序列和輸入序列之間的對齊關係,這屬於前面介紹的時序分類問題。

深度學習技術在語音識別里一個有影響力的成果是循環神經網路和CTC的結合,和卷積神經網路、自動編碼器等相比,循環神經網路具有可以接受不固定長度的序列數據作為輸入的優勢,而且具有記憶功能。文獻[14]將CTC技術用於語音識別問題。語音識別中,識別出的字元序列或者音素序列長度一定不大於輸入的特徵幀序列。CTC在標註符號集中加上空白符號blank,然後利用循環神經網路進行標註,再把blank符號和預測出的重複符號消除。下圖是CTC的原理:

假設x為語音輸入序列,l為識別出來的文字序列, pi 為循環神經網路的輸出。可能有多個連續幀對應一個文字,有些幀可能沒有任何輸出,按照CTC的原理,用多對一的函數B把輸出序列中重複的字元進行合併,形成一個唯一的序列:

其中l為文字序列, pi 是帶有冗餘的循環神經網路輸出。映射函數B將神經網路的輸出序列pi映射成文字序列l。分類器的輸出為對輸入序列最可能的標籤值:

解碼時採用的是前綴搜索技術。CTC在這裡起到了對齊的作用,最顯著的優勢是實現了端到端的學習,無需人工對語音序列進行分割,這樣做還帶來了精度上的提升。

在實現時循環神經網路採用了雙向LSTM網路,簡稱BLSTM。訓練樣本集的音頻數據被切分成10毫秒的幀,其中相鄰幀之間有5毫秒的重疊,使用MFCC特徵作為循環神經網路的輸入向量。原始音頻信號被轉換成一個MFCC向量序列。特徵向量為26維,包括了對數能量和一階導數值。向量的每一個分量都進行了歸一化。在解碼時,使用最優路徑和前綴搜索解碼,解碼的結果就是語音識別要得到的標記序列。

文獻[14]中的循環神經網路是一個淺層的網路,文獻[17]提出了一種用深度雙向LSTM網路和CTC框架進行語音識別的方法,這種方法主要的改進是使用了多個雙向LSTM層,稱為深度LSTM網路。。對於多層RNN網路,計算公式為:

雙向深度循環神經網路採用兩套隱含層,分別正向、反向對輸入序列進行處理,並把最後一個隱含層的輸出值合併之後送到輸出層,計算公式為:

對於深度雙向LSTM網路原理類似,只是把隱含層的變換換成LSTM結構的公式,在這裡不再詳細介紹。

假設輸入的聲學序列數據為x,輸出音素序列為y。第一步是給定輸入序列和所有可能的輸出序列,用循環神經網路計算出條件概率值p(y|x)。在訓練時的樣本為輸入序列以及對應的輸出序列。訓練時的損失函數為對數似然函數:

這裡使用CTC來對序列z進行分類,對於一段輸入的語音數據,分類的結果是一個音素序列。假設有k個音素,再加上一個空白符,是一個k+1類的分類問題。循環神經網路的最後一層為softmax層,輸出k+1個概率值,在時刻t輸出值為p(y|t)。

神經網路在每一個時刻確定是輸出一個音素,還是不輸出即輸出空白符。將所有時刻的輸出值合併在一起,得到了一個輸入和輸出序列的對齊方案。CTC對所有的對齊方式進行概率求和得到p(z|x)。

在使用CTC時,循環神經網路被設計成雙向的,這樣每個時刻的概率輸出值為:

其中N是隱含層的數量,y是神經網路的輸出向量。上式用softmax映射根據神經網路的輸出向量得到每一個音素的概率值。

前面介紹的CTC框架輸入是聲學數據,輸出是音素數據,只是一個聲學模型。接下來還需要將音素序列轉化成最終的文字序列作為識別結果,需要一個語言模型。在這裡採用RNN transducer,一種集成了聲學建模CTC和語言模型RNN的方法,後者負責將音素轉化成文字,二者聯合起來訓練得到模型,我們稱第一個網路為CTC網路,第二個網路為預測網路。

RNN transducer只是給出了任何一個輸出序列相對於輸入序列的條件概率值,還需要解碼演算法得到概率最大的輸出序列。在這裡使用了集束搜索演算法,演算法給出n個最優的候選結果,選擇的依據是概率值P(k|t)。

整個系統的輸入數據是對音頻數據進行分幀後的編碼向量,具體做法是對分幀後的音頻數據進行傅里葉編碼,然後40個傅里葉係數,加上能量,以及它們的一階和二階導數構成的向量,因此特徵向量為123維。整個向量進行了歸一化。在這裡使用了61個音素,它們被映射為39個類。實驗結果證明,更深的網路具有更高的準確率,雙向LSTM比單向網路也有更高的精度。

文獻[19]提出了一種融合了卷積神經網路和循環神經網路的英語與漢語普通話語音識別演算法。這也是一種完全端到端的方法,所有人工工程的部分都用神經網路替代,可以處理各種情況,包括雜訊、各種語言。

整個系統的輸入為音頻數據,使用20毫秒的窗口對原始音頻數據分幀,然後計算對數譜,對功率進行歸一化形成序列數據,送入神經網路中處理。首先是1D或者2D卷積層,然後是雙向RNN,接下來全力連接的lookahead卷積層,最後是CTC分類器。整個模型也實現了端到端的訓練。

在每個時刻t神經網路的輸出值為 P(l_{t}|X) 。其中 L_{t} 為字母表中的符號或者是空格。對於英文為:

{a,b,c,...,z,space,apotrohpe,blank}

其中space為詞之間的邊界。對於中文輸出值為簡化的漢字字元。識別時CTC模型和語言模型結合起來使用。解碼時使用集束搜索演算法尋找輸出序列y,最大化如下函數:

第一部分為RNN的損失函數,第二部分為語言模型的損失函數,第三部分對英文為單詞數,對漢語為字數, alphaeta 為人工設定的權重參數。

網路的最前端是卷積層,對輸入的頻譜向量執行1D或者2D卷積。實驗結果證明2D卷積有更好的效果。

整個網路包含多個循環層,循環層還使用了批量歸一化技術,它可以作用於前一層和本層上一時刻狀態值的線性加權和,也可以只作用於前一層的輸入值。

在所有循環層之前,加上了lookahead卷積層,計算公式為:

其中d為前一層的神經元個數,h是前一層的輸出值,W是 d*	au 的權重矩陣, 	au 為時間步長。除了上面介紹的這些論文,用循環神經網路進行語音識別的文章還很多,限於篇幅,不能一一列舉,感興趣的讀者可以自己去閱讀。

自然語言處理

自然語言處理的很多問題是時間序列問題,也是循環神經網路被廣為應用的領域,下面介紹在一些典型問題上的使用情況。文獻[30]為自然語言處理的很多問題提供了一個用循環神經網路解決的統一框架。這個框架用循環神經網路為句子序列進行編碼,得到上下文語義信息,然後產生輸出,如下圖所示:

中文分詞

漢語句子的詞之間沒有類似英文的空格,因此我們需要根據上下文來完成對句子的切分。分詞的任務是把句子切分成詞的序列,即完成我們通常所說的斷句功能,它是解決自然語言處理很多問題的第一步,在搜索引擎等產品中都有應用。由於歧義和未登錄詞即詞典里沒有的新詞的存在,中文分詞並不是一件簡單的任務。以下面的句子為例:

乒乓球拍賣了

顯然這句話有歧義,對應於下面兩種切分方案:

乒乓球 拍賣 了

乒乓球拍 賣 了

句子中出現詞典里沒有的詞也會影響我們的正確切分,例如下面的句子:

李國慶節日在加班

在這裡李國慶是一個人名字,而國慶節也是一個合法的詞,正確的分詞需要程序知道李國慶是人名。

最簡單的分詞演算法是基於詞典匹配,這又分為正向匹配,反向匹配和雙向匹配3種策略。如果使用正向最大匹配,在分詞時用詞典中所有的詞和句子中還未切分的部分進行匹配,如果存在多個匹配的詞,則以長度最大的那個詞作為匹配結果。反向最大匹配的做法和正向最大匹配類似,只是從後向前掃描句子。雙向最大匹配則既進行正向最大匹配,也進行反向最大匹配,以切分的詞較少的最為結果。顯然,詞典匹配無法有效的處理未登錄詞問題,對歧義切分也只能簡單使用長度最大的詞去匹配。詞典匹配可以看作是解決分詞問題的基於規則的方法。

作為改進,可以採用全切分路徑技術。這種技術列出一個句子所有切分的方案,然後選擇出最佳的方案。隨著句子的增長,這種方法的計算量將呈指數級增長。

機器學習技術也被用於分詞問題,採用序列標註的手段解決此問題。隱馬爾可夫模型、條件隨機場等方法為其中的代表。

可以看成是序列標註問題,將一個句子中的每個字標記成各種標籤。系統的輸入是字序列,輸出是一個標註序列,因此這是一個標準的序列到序列的問題。在這裡,標註序列有這樣幾種類型:

{B,N,E,S}

其中B表示當前字為一個詞的開始,M表示當前字為一個詞的中間位置,E表示當前字為一個詞的結束位置,S表示單字詞。以下面的句子為例:

我是中國人

其分詞結果為:

我 是 中國人

標註序列為:

我/S 是/S 中/B 國/M 人/E

同樣的,我們可以用循環神經網路進行序列標註從而完成分詞任務,在這裡網路的輸出是句子中的每個字,輸出是每個字的類別標籤。得到類別標籤之後,我們就完成了對句子的切分。

詞性標註

詞性標註(POS Tagging)是確定一個句子中各個詞的類別,它是和分詞密切相關的一個問題。典型的分類有名詞,動詞,形容詞和副詞等。給定句子中的詞序列,詞性標註的結果是每個詞的詞類別。這也可以看成是一個序列標註問題,即給定一個句子,預測出句子中每個詞的類別:

最簡單的是基於統計信息的模型,即從訓練樣本中統計出每種詞性的詞後面所跟的詞的詞性,然後計算最大的概率。除此之外,條件熵,隱馬爾可夫模型,條件隨機場等技術也被用於詞性標註問題。

同樣的,詞性標註問題可以看做是一個序列標註問題。將循環神經網路用於詞性標註時,輸入序列是一個句子的單詞序列,每個時刻的輸入向量是單詞的one-hot編碼向量,網路的輸出為單詞屬於某一類次的概率,此時輸出層可以採用softmax作為激活函數。在這裡,典型的標註集合為:

{v,n,a,...}

其中v為動詞,n為名字,a為形容詞,其他詞性在這裡不詳細列出。訓練時,也使用端到端的方案,直接給定語句和對應的標籤序列。神經網路的預測輸出就是每個詞的詞性類別值。

命名實體識別

命名實體識別(Named Entity Recognition,簡稱NER)又稱為專名識別,其目標是識別文本中有特定含義的實體,如人名、地名、機構名稱、專有名詞等,屬於未登錄詞識別的範疇。命名實體識別和其他自然語言處理問題相比存在的一個困難是訓練樣本的缺乏,因為未登錄詞很少有重複的,基本上都是新詞。

如果直接用序列標註的方法解決命名實體識別,思路和分詞類似,這裡要識別出句子里所有的專名詞。假設要識別的專有詞包括人名,地名,組織機構名稱,則標註集合為:

{BN,MN,EN,BA,MA,EA,BO,MO,EO,O}

其中BN表示這個字是人名的開始,BN表示人名的中間字,EN表示人名的結束;BA表示地名的開始,MA表示地名的中間字,EA表示地名的結束;BO表示機構名稱的開始,MO表示機構名稱的中間字,EO表示機構名稱的結束;O表示這個字不是命名實體。給定所有訓練樣本句子的標註序列,我們就可以實現端到端的訓練。預測時輸入一個句子,輸出標籤序列,根據標籤序列我們可以得到命名實體識別的結果。

除了這種最直接的序列標記手段,還更複雜的方法。文獻[31]提出了一種用LSTM和條件隨機場CRF進行命名實體識別的方法。假設LSTM網路的輸入序列是 (X_{1},...,X_{n})

,輸出序列是 (h_{1},...,h_{n}) 。其中,輸入序列是一個句子所有的單詞,這些單詞被編碼為向量。

是非常重要的信息,也通過LSTM計算得到,具體做法是將整個句子顛倒過來送入LSTM中計算,第個時刻的輸出向量即為右上下文。在這裡,稱第一個LSTM為前向LSTM,第二個為後向LSTM。它們是兩個不同的神經網路,分別有各自的參數。這種結構也稱為雙向LSTM。

每個詞用它的左上下文和右上下文聯合起來表示,即將兩個向量拼接起來:

接下來用條件隨機場對句子中的所有詞進行聯合標註。對於一個句子,假設矩陣P是雙向LSTM輸出的得分矩陣。這是一個NxK的矩陣,其中k是不同的標記個數。元素 P_{ij}

為第i個單詞被賦予第j個標記的概率。對於預測輸出序列y,它的得分定義為:

其中矩陣A是轉移得分矩陣,其元素表示從標記i轉移到標記j的得分。 y_{0}y_{n} 是句子的開始和結束標記,我們把它們加入到標記集合中。因此矩陣A是一個k+2階方陣。

對所有可能的標記序列的softmax值定義了序列的概率:

其中 Y_{x} 為句子X所有可能的標記序列。在解碼時將具有最大得分的序列作為預測輸出:

這可以通過動態規劃演算法得到。根據輸出序列的值,我們就可以直接得到命名實體識別的結果。

文本分類

文本分類是自然語言處理中的重要問題,經典的機器學習演算法如支持向量機、貝葉斯分類器等都曾被用於解決此問題。卷積神經網路在文本分類問題中也有應用。除了這些方法之外,循環神經網路也被成功的應用於文本分類問題。

文獻[34]設計了一種用分層注意力網路進行文本分類的方案。在這種方案里採用了分層的結構,首先建立句子的表示,然後將它們聚合,形成文檔的表示。在文檔中,不同的詞和句子所蘊含的有用信息是不一樣的,而且重要性和文檔上下文有密切的關係。因此,採用了兩層的注意力機制,第一個是單詞級的,第二個是句子級的。在提取文檔的表示特徵時,會關注某些詞和句子,也會忽略一些詞和句子。

整個網路由一個單詞序列編碼器,一個單詞級注意力層,一個句子編碼器,一個句子級注意力層組成。單詞序列編碼器由GRU循環神經網路實現。網路的輸入是一個句子的單詞序列,輸出是句子的編碼向量。

假設一篇文檔有L個句子 S_{i} ,句子S_{i}T_{i} 個詞。 W_{it} 表示第i個句子中的第t個單詞,其中 tin [1,T] 。HAN將文檔投影為一個向量,然後對這個向量進行分類。

第一步是採用詞嵌入技術將一個句子的單詞轉換為一個向量。計算公式為:

在這裡 W_{e} 稱為嵌入矩陣。然後用雙向GRU網路對詞序列進行編碼:

具體做法參考雙向RNN和雙向LSTM。得到隱含層的狀態值:

將這個狀態值作為句子的表示。句子中的不同單詞有不同的重要性,在這裡採用了注意力機制。它的計算公式為:

首先將 h_{it} 輸入一個單層的MLP,得到它的隱含層表示 U_{it} ,這個單詞的重要性由向量U_{it}與單詞級上下文向量 U_{w} 的相似度來衡量。通過softmax函數,最後得到歸一化的重要性權重值 alpha_{it} 。接下來計算句子向量 S_{i} ,它是詞向量的加權平均,加權值為每個詞的重要性權重。在這裡,上下文向量 U_{w} 被隨機初始化,並且在訓練過程中和神經網路一起訓練得到。

在得到句子向量之後,我們可以用類似的方式得到文檔向量。在這裡,使用雙向GRU對句子進行編碼:

將這兩個向量合併,得到句子的編碼向量:

這個編碼綜合第i個句子周圍的句子,但還是聚焦於第i個句子。類似的,我們用句子級的注意力機制來形成文檔的表示向量:

在這裡v是文檔向量,它綜合了文檔中所有句子的信息。同樣的,向量 U_{s}

通過訓練得到。

最後用文檔向量來對文檔進行分類:

訓練時的損失函數採用負對數似然函數,定義為:

其中j是第d個文檔的類別標籤值。採用注意力機制,可以直接把對分類有貢獻的詞和句子顯示出來,便於理解和調試分析。

自動摘要

自動摘要的目標是給定一段文本,得到它的摘要信息,摘要信息濃縮了文本的內容,和輸入文本有相同的語義,體現了文章的主要內容。在這裡,輸入文本可以是一句話或者多句話。摘要輸出語句的辭彙表和輸入文本的辭彙表相同。可以將自動摘要也看成是一個序列到序列的預測問題,輸出序列的長度遠小於輸入序列的長度。

文獻[35]提出了一種使用注意力機制和seq2seq技術的新聞類文章標題生成演算法。在這裡,先用seq2seq的編碼網路生成文本的抽象表示,解碼器網路在生成摘要的每個單詞的時候使用注意力機制關注文本中的重點詞。

首先,新聞文章的每個單詞被依次輸入編碼網路,單詞首先被送入嵌入層,生成概率分布表示。然後,被送入有多個隱含層組成的訓練神經網路。所有詞被輸入網路處理之後,最後一個隱含層的狀態值將用來作為解碼器網路的輸入。

接下來將作為解碼器網路的初始狀態。首先將一個結束符end-of-sequences,簡稱EOS,輸入解碼器網路,用softmax層和注意力機制生成每一個摘要單詞,最後以EOS結束。在生成每一個單詞時,將生成的上一個單詞作為解碼器網路的輸入。

訓練時的損失函數定義為:

其中 X_{i} 是輸入文本的單詞序列, Y_{i} 是生成的摘要單詞序列。訓練時,解碼器在每個時刻的輸入為真實的標題中的單詞,而不是上一時刻生成的單詞。在測試時,則使用的是上一時刻生成的單詞。但這樣做會造成訓練和預測時的脫節,作為補救,在訓練時隨機的使用真實的單詞和上一時刻生成的單詞作為輸入。在預測時,使用集束搜索技術生成每一個輸出單詞。

在解碼器生成每個輸出單詞時使用了注意力機制。對於每一個輸出單詞,注意力機製為每個輸入單詞計算一個權重值,這個權重值決定了對每個輸入單詞的關注度。這些權重的和為1,並被用於計算最後一個隱含層的輸出值的加權平均值,在這裡,每次處理完一個輸入單詞,會產生一個輸出值,最後是對這些輸出值進行平均。這個加權平均值被看做是文檔的上下文信息,接下來,它和解碼器當前解碼時最後一個隱含層的輸出值一起被送入softmax層進行計算。

機器翻譯

統計機器翻譯採用大量的語料庫進行學習,訓練樣本為源語言和目標語言的語句。得到模型之後,對於一個語句,演算法直接使用這個模型得到目標語言的語句。如果用統計學習的方法,機器翻譯要解決的問題是,給定一個輸入句子a,對於另外一種語言所有可能的翻譯結果b,計算條件概率:

概率最大的句子就是翻譯的結果。使用機器學習的翻譯有基於詞的翻譯和基於短語的翻譯兩種方法。前者對詞進行翻譯,不考慮上下文語境和詞之間的關聯,後者對整個句子進行翻譯,目前主流的是基於短語的翻譯。

我們可以將機器翻譯問題抽象成一個序列 X_{i} 到另外一個序列 Y_{i} 的預測:

和語音識別之類的應用不同,這裡的序列到序列映射並不是一個單調映射,也就是說,輸出序列的順序是按照輸入序列的順序來的。這很容易理解,將一種語言的句子翻譯成另一一種語言的句子時,源語言種的每個單詞的順序和目標語言種每個單詞的順序不一定是一致的。

訓練時的目標是對所有的樣本最大化下面的條件概率:

因此我們需要在所有可能的輸出序列中尋找到上面的條件概率值最大的那個序列作為機器翻譯的輸出。如果用神經網路來對機器翻譯進行建模,稱為神經機器翻譯。當前,用循環神經網路解決機器翻譯問題的主流方法是序列到序列學習技術。

文獻[15]提出了用seq2seq技術解決機器翻譯問題。在這裡,使用編碼器對輸入的輸入序列進行特徵編碼,得到這句話的意義,然後用解碼器對這個意義進行解碼並得到概率最大的輸出序列,這就得到了翻譯的結果。

先將源句子表示成向量序列 X_{i},i=1,...,T

,在這裡每個向量是一個詞的編碼向量。通過第一個循環神經網路,當我們輸入完這個序列之後得到最後時刻的隱含層狀態值 h_{T} ,在這裡簡記為v。這個值包含了整個句子的信息。

接下來用解碼器生成翻譯序列。解碼器循環神經網路銀行層的初始狀態值為v,它輸出向量序列 Y_{i},i=,...,n 。對於所有可能的輸出序列,我們都可以用解碼器計算出它的條件概率值,在這裡要尋找概率值最大的那個序列。如果枚舉所有可能的輸出序列,計算量太大,顯然是不現實的。在這裡採用了集束搜索技術。

訓練樣本是成對的句子,即源句子和它的翻譯結果。訓練的目標是最大化對數概率值:

其中D是訓練樣本集,S是源句子,T是翻譯的句子。訓練完成之後,可以用這個模型來進行翻譯,即尋找概率最大的輸出序列:

在這裡採用了自左到右的集束解碼器。它維持K個最有可能的部分結果,部分結果是整個翻譯句子的前綴部分。在每一步,我們在詞典的範圍內用每一個可能的詞擴展這個部分結果。然後用seq2seq模型計算這些部分結果的概率,保留概率最大的個部分結果。當輸入結束符之後,整個翻譯過程結束。

在實現時,無論是在訓練階段還是測試階段,都將句子反序輸入,但是預測結果序列是正序而不是反序。另外,並沒有採用單個隱含層的循環神經網路,而是採用了4層的LSTM網路。

文獻[36]提出了一種用編碼器-解碼器框架進行機器翻譯的方法。在這裡,編碼器-解碼器框架的結構和之前介紹的相同。

不同的是,使用了一種新的隱藏單元,即循環層的激活函數。這種激活函數和LSTM類似,但計算更簡單。在這裡,使用了兩個門來進行信息流的控制,分別稱為更新門和複位門。複位門的計算公式為:

更新門的計算公式為:

隱含層的變換公式為:

在這裡,更新門用來控制新老信息的權重。其中:

假設e為源語句,f為翻譯後的目標語句。根據貝葉斯公式,機器翻譯的目標是給定源語句,尋找使得如下條件概率最大的目標語句:

上式右邊的第一項為轉換模型,第二項為語言模型,這和語音識別類似。大多數機器翻譯演算法將轉換模型表示成對數線性模型:

其中 f_{n} 為第n個特徵, W_{n} 為特徵的權重, Z(e) 為歸一化因子。在這裡編碼器-解碼器框架用於對對數線性模型的翻譯候選結果短語進行評分。

文獻[37]提出了一種使用了雙向循環神經網路的機器翻譯演算法,循環層也使用了重置門和更新門結構。

解碼器用循環神經網路實現,它根據當前狀態,以及當前的輸出詞預測下一個輸出詞,計算公式為:

其中 S_{i} 為解碼器網路隱含層的狀態。這個框架採用了注意力機制,計算方法和之前介紹的相同。

文獻[38]介紹了Google的機器翻譯系統。他們的系統同樣採用了編碼器-解碼器架構,兩個網路都由深層雙向LSTM網路實現,並採用了注意力機制。

這裡的深層雙向LSTM網路和前面介紹的相同,不再重複講述。為了克服深層帶來的梯度消失問題,隱含層採用了殘差網路結構,即跨層連接。

訓練時的目標是最大化對數似然函數,即對數條件概率值:

在這裡 	heta 是要求解的參數。同樣的,解碼時也使用了集束搜索演算法。

(未完待續,參見下篇)

原創聲明

本文為 SIGAI 原創文章,僅供個人學習使用,未經允許,不能用於商業目的

更多乾貨請關注V X公眾號:SIGAI


推薦閱讀:

TAG:語音識別 | 深度學習DeepLearning | 機器學習 |