深度学习(三十)——Deep Speech, 自动求导
CTC
推斷計算(續(xù))
上圖是一個Beam Width為3的Beam Search。Beam Search的細(xì)節(jié)可參見《機(jī)器學(xué)習(xí)(二十三)》。
由于語音的特殊性,我們實際上用的是Beam Search的一個變種:
如上圖所示,所有在合并規(guī)則下,能夠合并為同一前綴的分支,在后續(xù)計算中,都被認(rèn)為是同一分支。其概率值為各被合并分支的概率和。
此外,如果在語音識別中,能夠結(jié)合語言模型的話,將可以極大的改善語音識別的準(zhǔn)確率。這種情況下的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是條件獨立的。
缺點:條件獨立的假設(shè)太強(qiáng),與實際情況不符,因此需要語言模型來改善條件依賴性,以取得更好的效果。
優(yōu)點:可遷移性比較好。比如朋友之間的聊天和正式發(fā)言之間的差異較大,但它們的聲學(xué)模型卻是類似的。
CTC是單調(diào)對齊的。這在語音識別上是沒啥問題的,但在機(jī)器翻譯的時候,源語言和目標(biāo)語言之間的語序不一定一致,也就不滿足單調(diào)對齊的條件。
CTC的輸入/輸出是many-to-one的,不支持one-to-one或one-to-many。比如,“th”在英文中是一個音節(jié)對應(yīng)兩個字母,這就是one-to-many的案例。
最后,Y的數(shù)量不能超過X,否則CTC還是沒法work。
CTC應(yīng)用
HMM
如上圖所示,CTC是一種特殊的HMM。CTC的狀態(tài)圖是單向的,這也就是上面提到的單調(diào)對齊特性,這相當(dāng)于給普通HMM模型提供了一個先驗條件。因此,對于滿足該條件的情況,CTC的準(zhǔn)確度要超過HMM。
最重要的是,CTC是判別模型,它可以直接和RNN對接。
Encoder-Decoder模型
Encoder-Decoder模型是sequence問題最常用的框架,它的數(shù)學(xué)形式為:
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等端到端語音識別方法的出現(xiàn)是否標(biāo)志著統(tǒng)治數(shù)年的HMM方法終結(jié)?
https://zhuanlan.zhihu.com/p/23308976
CTC——下雨天和RNN更配哦
https://zhuanlan.zhihu.com/p/23293860
CTC實現(xiàn)——compute ctc loss(1)
https://zhuanlan.zhihu.com/p/23309693
CTC實現(xiàn)——compute ctc loss(2)
http://blog.csdn.net/xmdxcsj/article/details/70300591
端到端語音識別(二)ctc。這個blog中還有5篇《CTC學(xué)習(xí)筆記》的鏈接。
https://blog.csdn.net/luodongri/article/details/77005948
白話CTC(connectionist temporal classification)算法講解
Warp-CTC
Warp-CTC是一個可以應(yīng)用在CPU和GPU上的高效并行的CTC代碼庫,由百度硅谷實驗室開發(fā)。
官網(wǎng):
https://github.com/baidu-research/warp-ctc
非官方caffe版本:
https://github.com/xmfbit/warpctc-caffe
Deep Speech
Deep Speech是吳恩達(dá)領(lǐng)導(dǎo)的百度硅谷AI Lab 2014年的作品。
論文:
《Deep Speech: Scaling up end-to-end speech recognition》
代碼:
https://github.com/mozilla/DeepSpeech
上圖是Deep Speech的網(wǎng)絡(luò)結(jié)構(gòu)圖。網(wǎng)絡(luò)的前三層和第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實現(xiàn)的,由于比較小眾,所以還有非官方的代碼:
https://github.com/ShankHarinath/DeepSpeech2-Keras
不出所料,這里使用CNN代替了FC,音頻數(shù)據(jù)和圖像數(shù)據(jù)一樣,都是局部特征很明顯的數(shù)據(jù),從直覺上,CNN應(yīng)該要比FC好使。
至于多層RNN或者GRU都是很自然的嘗試。論文的很大篇幅都是各種調(diào)參,也就是俗稱的“深度煉丹”。
論文附錄中,如何利用集群進(jìn)行分布式訓(xùn)練,是本文的干貨,這里不再贅述。
EESEN
論文:
《EESEN: End-to-End Speech Recognition using Deep RNN Models and WFST-based Decoding》
苗亞杰,南京郵電大學(xué)本科(2008)+清華碩士(2011)+CMU博士(2016)。
個人主頁:
http://www.cs.cmu.edu/~ymiao/
官網(wǎng):
https://github.com/srvk/eesen
eesen是基于Tensorflow開發(fā)的,苗博士之前還有個用Theano開發(fā)的叫PDNN的庫。
自動求導(dǎo)
DL發(fā)展到現(xiàn)在,其基本運算單元早就不止CNN、RNN之類的簡單模塊了。針對新運算層出不窮的現(xiàn)狀,各大DL框架基本都實現(xiàn)了自動求導(dǎo)的功能。
論文:
《Automatic Differentiation in Machine Learning: a Survey》
Numerical differentiation
數(shù)值微分最大的特點就是很直觀,好計算,它直接利用了導(dǎo)數(shù)定義:
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怎么選擇?選大了,誤差會很大;選小了,不小心就陷進(jìn)了浮點數(shù)的精度極限里,造成舍入誤差。
第二個問題是對于參數(shù)比較多時,對深度學(xué)習(xí)模型來說,上面的計算是不夠高效的,因為每計算一個參數(shù)的導(dǎo)數(shù),你都需要重新計算f(x+h)f(x+h)f(x+h)。
因此,這種方法并不常用,而主要用于做梯度檢查(Gradient check),你可以用這種不高效但簡單的方法去檢查其他方法得到的梯度是否正確。
Symbolic differentiation
符號微分的主要步驟如下:
1.需要預(yù)置基本運算單元的求導(dǎo)公式。
2.遍歷計算圖,得到運算表達(dá)式。
3.根據(jù)導(dǎo)數(shù)的代入法則和四則運算法則,求出復(fù)雜運算的求導(dǎo)公式。
這種方法沒有誤差,是目前的主流,但遍歷比較費時間。
Automatic differentiation
除此之外,常用的自動求導(dǎo)技術(shù),還有Automatic differentiation。(請注意這里的AD是一個很狹義的概念。)
類比復(fù)數(shù)的概念:
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有很多非常不錯的性質(zhì)。以下面的指數(shù)運算多項式為例:
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的系數(shù)就是f′(x)f'(x)f′(x)。
參考
https://mp.weixin.qq.com/s/7Z2tDhSle-9MOslYEUpq6g
從概念到實踐,我們該如何構(gòu)建自動微分庫
https://mp.weixin.qq.com/s/bigKoR3IX_Jvo-re9UjqUA
機(jī)器學(xué)習(xí)之——自動求導(dǎo)
https://www.jianshu.com/p/4c2032c685dc
自動求導(dǎo)框架綜述
https://mp.weixin.qq.com/s/xXwbV46-kTobAMRwfKyk_w
自動求導(dǎo)–Deep Learning框架必備技術(shù)二三事
總結(jié)
以上是生活随笔為你收集整理的深度学习(三十)——Deep Speech, 自动求导的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word2vec, LSTM Speec
- 下一篇: 深度学习(三十一)——Style Tra