1. 程式人生 > >深度學習(三十)——Deep Speech, 自動求導

深度學習(三十)——Deep Speech, 自動求導

CTC

推斷計算(續)

上圖是一個Beam Width為3的Beam Search。Beam Search的細節可參見《機器學習(二十三)》。

由於語音的特殊性,我們實際上用的是Beam Search的一個變種:

如上圖所示,所有在合併規則下,能夠合併為同一字首的分支,在後續計算中,都被認為是同一分支。其概率值為各被合併分支的概率和。

此外,如果在語音識別中,能夠結合語言模型的話,將可以極大的改善語音識別的準確率。這種情況下的CTC loss為:

Y

= argmax Y p ( Y
X ) p ( Y ) α
L ( Y ) β Y^*=\mathop{\text{argmax}}_{Y} p(Y \mid X)\cdot p(Y)^{\alpha}\cdot L(Y)^{\beta}

其中, p ( Y ) α p(Y)^{\alpha} 是語言模型概率,而 L ( Y ) β L(Y)^{\beta} 表示詞嵌入獎勵。

CTC的特性

CTC是條件獨立的。

缺點:條件獨立的假設太強,與實際情況不符,因此需要語言模型來改善條件依賴性,以取得更好的效果。

優點:可遷移性比較好。比如朋友之間的聊天和正式發言之間的差異較大,但它們的聲學模型卻是類似的。

CTC是單調對齊的。這在語音識別上是沒啥問題的,但在機器翻譯的時候,源語言和目標語言之間的語序不一定一致,也就不滿足單調對齊的條件。

CTC的輸入/輸出是many-to-one的,不支援one-to-one或one-to-many。比如,“th”在英文中是一個音節對應兩個字母,這就是one-to-many的案例。

最後,Y的數量不能超過X,否則CTC還是沒法work。

CTC應用

HMM

如上圖所示,CTC是一種特殊的HMM。CTC的狀態圖是單向的,這也就是上面提到的單調對齊特性,這相當於給普通HMM模型提供了一個先驗條件。因此,對於滿足該條件的情況,CTC的準確度要超過HMM。

最重要的是,CTC是判別模型,它可以直接和RNN對接。

Encoder-Decoder模型

Encoder-Decoder模型是sequence問題最常用的框架,它的數學形式為:

H = e n c o d e ( X ) p ( Y X ) = d e c o d e ( H ) H=encode(X)\\ p(Y\mid X)=decode(H)

這裡的H是模型的hidden representation。

CTC模型可以使用各種Encoder,只要保證輸入比輸出多即可。CTC模型常用的Decoder一般是softmax。

參考

https://distill.pub/2017/ctc/

Sequence Modeling With CTC

http://blog.csdn.net/laolu1573/article/details/78791992

Sequence Modeling With CTC中文版

https://mp.weixin.qq.com/s?__biz=MzIzNDQyNjI5Mg==&mid=2247483834&idx=1&sn=3a92eb19858d2cec709af28d2eb69c4a

時序分類演算法之Connectionist Temporal Classification

http://blog.csdn.net/u012968002/article/details/78890846

CTC原理

https://www.zhihu.com/question/47642307

語音識別中的CTC方法的基本原理

https://www.zhihu.com/question/55851184

基於CTC等端到端語音識別方法的出現是否標誌著統治數年的HMM方法終結?

https://zhuanlan.zhihu.com/p/23308976

CTC——下雨天和RNN更配哦

https://zhuanlan.zhihu.com/p/23293860

CTC實現——compute ctc loss(1)

https://zhuanlan.zhihu.com/p/23309693

CTC實現——compute ctc loss(2)

http://blog.csdn.net/xmdxcsj/article/details/70300591

端到端語音識別(二)ctc。這個blog中還有5篇《CTC學習筆記》的連結。

https://blog.csdn.net/luodongri/article/details/77005948

白話CTC(connectionist temporal classification)演算法講解

Warp-CTC

Warp-CTC是一個可以應用在CPU和GPU上的高效並行的CTC程式碼庫,由百度矽谷實驗室開發。

官網:

https://github.com/baidu-research/warp-ctc

非官方caffe版本:

https://github.com/xmfbit/warpctc-caffe

Deep Speech

Deep Speech是吳恩達領導的百度矽谷AI Lab 2014年的作品。

論文:

《Deep Speech: Scaling up end-to-end speech recognition》

程式碼:

https://github.com/mozilla/DeepSpeech

在這裡插入圖片描述

上圖是Deep Speech的網路結構圖。網路的前三層和第5層是FC,第4層是雙向RNN,Loss是CTC。

主要思路:

1.這裡的FC只處理部分音訊片段,因此和CNN有異曲同工之妙。

2.論文解釋了不用LSTM的原因是:很難並行處理。

參考:

http://blog.csdn.net/xmdxcsj/article/details/54848838

Deep Speech筆記

Deep speech 2

Deep speech 2是Deep speech原班人馬2015年的作品。

論文:

《Deep speech 2: End-to-end speech recognition in english and mandarin》

程式碼:

https://github.com/PaddlePaddle/DeepSpeech

這個官方程式碼是PaddlePaddle實現的,由於比較小眾,所以還有非官方的程式碼:

https://github.com/ShankHarinath/DeepSpeech2-Keras

不出所料,這裡使用CNN代替了FC,音訊資料和影象資料一樣,都是區域性特徵很明顯的資料,從直覺上,CNN應該要比FC好使。

至於多層RNN或者GRU都是很自然的嘗試。論文的很大篇幅都是各種調參,也就是俗稱的“深度煉丹”。

論文附錄中,如何利用叢集進行分散式訓練,是本文的乾貨,這裡不再贅述。

EESEN

論文:

《EESEN: End-to-End Speech Recognition using Deep RNN Models and WFST-based Decoding》

苗亞傑,南京郵電大學本科(2008)+清華碩士(2011)+CMU博士(2016)。
個人主頁:
http://www.cs.cmu.edu/~ymiao/

官網:

https://github.com/srvk/eesen

eesen是基於Tensorflow開發的,苗博士之前還有個用Theano開發的叫PDNN的庫。

自動求導

DL發展到現在,其基本運算單元早就不止CNN、RNN之類的簡單模組了。針對新運算層出不窮的現狀,各大DL框架基本都實現了自動求導的功能。

論文:

《Automatic Differentiation in Machine Learning: a Survey》

Numerical differentiation

數值微分最大的特點就是很直觀,好計算,它直接利用了導數定義:

f ( x ) = lim h 0 f ( x + h ) f ( x ) h f'(x)=\lim_{h\to 0}{f(x+h)-f(x)\over h}

不過這裡有一個很大的問題:h怎麼選擇?選大了,誤差會很大;選小了,不小心就陷進了浮點數的精度極限裡,造成舍入誤差。

第二個問題是對於引數比較多時,對深度學習模型來說,上面的計算是不夠高效的,因為每計算一個引數的導數,你都需要重新計算 f ( x + h ) f(x+h)

因此,這種方法並不常用,而主要用於做梯度檢查(Gradient check),你可以用這種不高效但簡單的方法去檢查其他方法得到的梯度是否正確。

Symbolic differentiation

符號微分的主要步驟如下:

1.需要預置基本運算單元的求導公式。

2.遍歷計算圖,得到運算表示式。

3.根據導數的代入法則和四則運演算法則,求出複雜運算的求導公式。

這種方法沒有誤差,是目前的主流,但遍歷比較費時間。

Automatic differentiation

除此之外,常用的自動求導技術,還有Automatic differentiation。(請注意這裡的AD是一個很狹義的概念。)

類比複數的概念:

x = a + b i ( i 2 = 1 ) x = a + bi \quad (i^2 = -1)

我們定義Dual number:

x x = x + x ˙ d ( d 2 = 0 ) x \mapsto x = x + \dot{x} d \quad (d^2=0)

定義Dual number的運演算法則:

( x + x ˙ d ) + ( y + y ˙ d ) = x + y + ( x ˙ + y ˙ ) d (x + \dot{x}d) + ( y + \dot{y}d) = x + y + (\dot{x} + \dot{y})d

( x + x ˙ d ) ( y + y ˙ d ) = x y + x ˙ y d + x y ˙ d + x ˙ y ˙ d 2 = x y + ( x ˙ y + x y ˙ ) d (x + \dot{x}d) ( y + \dot{y}d) = xy + \dot{x}yd + x\dot{y}d + \dot{x}\dot{y}d^2 = xy + (\dot{x}y+ x\dot{y})d

( x + x ˙ d ) = x x ˙ d -(x + \dot{x}d) = - x - \dot{x}d

1 x + x ˙ d = 1 x x ˙ x 2 d \frac{1}{x + \dot{x}d} = \frac{1}{x} - \frac{\dot{x}}{x^2}d

dual number有很多非常不錯的性質。以下面的指數運算多項式為例:

f ( x ) = p 0 + p 1 x + p 2 x 2 + . . . + p n x n f(x) = p_0 + p_1x + p_2x^2 + ... + p_nx^n

x + x