深度学习(三十)——Deep Speech, 自动求导
CTC
推斷計算(續)
上圖是一個Beam Width為3的Beam Search。Beam Search的細節可參見《機器學習(二十三)》。
由于語音的特殊性,我們實際上用的是Beam Search的一個變種:
如上圖所示,所有在合并規則下,能夠合并為同一前綴的分支,在后續計算中,都被認為是同一分支。其概率值為各被合并分支的概率和。
此外,如果在語音識別中,能夠結合語言模型的話,將可以極大的改善語音識別的準確率。這種情況下的CTC loss為:
Y?=argmaxYp(Y∣X)?p(Y)α?L(Y)βY^*=\mathop{\text{argmax}}_{Y} p(Y \mid X)\cdot p(Y)^{\alpha}\cdot L(Y)^{\beta}Y?=argmaxY?p(Y∣X)?p(Y)α?L(Y)β
其中,p(Y)αp(Y)^{\alpha}p(Y)α是語言模型概率,而L(Y)βL(Y)^{\beta}L(Y)β表示詞嵌入獎勵。
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=encode(X)p(Y∣X)=decode(H)H=encode(X)\\ p(Y\mid X)=decode(H) H=encode(X)p(Y∣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→0f(x+h)?f(x)hf'(x)=\lim_{h\to 0}{f(x+h)-f(x)\over h}f′(x)=h→0lim?hf(x+h)?f(x)?
不過這里有一個很大的問題:h怎么選擇?選大了,誤差會很大;選小了,不小心就陷進了浮點數的精度極限里,造成舍入誤差。
第二個問題是對于參數比較多時,對深度學習模型來說,上面的計算是不夠高效的,因為每計算一個參數的導數,你都需要重新計算f(x+h)f(x+h)f(x+h)。
因此,這種方法并不常用,而主要用于做梯度檢查(Gradient check),你可以用這種不高效但簡單的方法去檢查其他方法得到的梯度是否正確。
Symbolic differentiation
符號微分的主要步驟如下:
1.需要預置基本運算單元的求導公式。
2.遍歷計算圖,得到運算表達式。
3.根據導數的代入法則和四則運算法則,求出復雜運算的求導公式。
這種方法沒有誤差,是目前的主流,但遍歷比較費時間。
Automatic differentiation
除此之外,常用的自動求導技術,還有Automatic differentiation。(請注意這里的AD是一個很狹義的概念。)
類比復數的概念:
x=a+bi(i2=?1)x = a + bi \quad (i^2 = -1)x=a+bi(i2=?1)
我們定義Dual number:
x?x=x+x˙d(d2=0)x \mapsto x = x + \dot{x} d \quad (d^2=0)x?x=x+x˙d(d2=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+x˙d)(y+y˙d)=xy+x˙yd+xy˙d+x˙y˙d2=xy+(x˙y+xy˙)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)(y+y˙?d)=xy+x˙yd+xy˙?d+x˙y˙?d2=xy+(x˙y+xy˙?)d
?(x+x˙d)=?x?x˙d-(x + \dot{x}d) = - x - \dot{x}d?(x+x˙d)=?x?x˙d
1x+x˙d=1x?x˙x2d\frac{1}{x + \dot{x}d} = \frac{1}{x} - \frac{\dot{x}}{x^2}dx+x˙d1?=x1??x2x˙?d
dual number有很多非常不錯的性質。以下面的指數運算多項式為例:
f(x)=p0+p1x+p2x2+...+pnxnf(x) = p_0 + p_1x + p_2x^2 + ... + p_nx^nf(x)=p0?+p1?x+p2?x2+...+pn?xn
用x+x˙dx + \dot{x}dx+x˙d替換x,則有:
f(x+x˙d)=p0+p1(x+x˙d)+...+pn(x+x˙d)n=p0+p1x+p2x2+...+pnxn+p1x˙d+2p2xx˙d+...+npn?1xx˙d=f(x)+f′(x)x˙df(x + \dot{x}d) = p_0 + p_1(x + \dot{x}d) + ... + p_n(x + \dot{x}d)^n \\ = p_0 + p_1x + p_2x^2 + ... + p_nx^n + \\ p_1\dot{x}d + 2p_2x\dot{x}d + ... + np_{n-1}x\dot{x}d\\ = f(x) + f'(x)\dot{x}df(x+x˙d)=p0?+p1?(x+x˙d)+...+pn?(x+x˙d)n=p0?+p1?x+p2?x2+...+pn?xn+p1?x˙d+2p2?xx˙d+...+npn?1?xx˙d=f(x)+f′(x)x˙d
可以看出d的系數就是f′(x)f'(x)f′(x)。
參考
https://mp.weixin.qq.com/s/7Z2tDhSle-9MOslYEUpq6g
從概念到實踐,我們該如何構建自動微分庫
https://mp.weixin.qq.com/s/bigKoR3IX_Jvo-re9UjqUA
機器學習之——自動求導
https://www.jianshu.com/p/4c2032c685dc
自動求導框架綜述
https://mp.weixin.qq.com/s/xXwbV46-kTobAMRwfKyk_w
自動求導–Deep Learning框架必備技術二三事
總結
以上是生活随笔為你收集整理的深度学习(三十)——Deep Speech, 自动求导的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word2vec, LSTM Speec
- 下一篇: TensorFlow(二)