Chapter1-2_Speech_Recognition(LAS)
文章目錄
- 1 內(nèi)容簡述
- 2 模型詳述
- 2.1 Listen
- RNN Encoder
- 1D-CNN Encoder
- Self-attentinon Encoder
- Down Sampling
- 2.2 Attend
- 2.3 Spell
- 2.4 Beam Search
- 2.5 Training
- 2.6 Back to Attention
本文為李弘毅老師【Speech Recognition - Listen, Attend, Spell】的課程筆記,課程視頻youtube地址,點這里👈(需翻墻)。
下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權,必定刪除。
文章索引:
上篇 - 1-1 overview
下篇 - 1-3 CTC, RNN-T and more
總目錄
1 內(nèi)容簡述
本文要講的模型是2015年出自William Chan的Listen, Attend and Spell,論文地址點這里👈。
這是一個標準的seq2seq with attention的模型,listen就是一個encoder,spell就是一個decoder,Attend自然就是attention啦。下面來逐一說明各個模塊。
2 模型詳述
2.1 Listen
Listen即是模型的Encoder部分,這個部分的輸入是一個長度TTT的聲音信號特征向量,輸出也是一個長度TTT的特征向量。我們希望經(jīng)過這個Encoder之后,輸出的特征可以保留和內(nèi)容有關的信息,去除不相關的噪聲和不同人說話帶來的variance。
input:{x1,x2,...,xT}output:{h1,h2,...,h3}input: \{x^1, x^2, ...,x^T\}\\ output: \{h^1, h^2, ...,h^3\} input:{x1,x2,...,xT}output:{h1,h2,...,h3}
既然這是一個Encoder,那目前用來做序列特征提取的方法就都可以用上,比如單向或者雙向的RNN,1-D的CNN,self-attention,論文原文中所使用的是雙向的LSTM。
RNN Encoder
RNN大家應該比較熟悉,就不多講,不明白的可以參看李老師的RNN教學視頻,或者參考我的這篇課程筆記。
1D-CNN Encoder
用1-D的CNN去抽取sequence的特征的方式如下圖所示。比如我們有一個kernel_size是3的filter,先把[0,x1,x2][0, x^1, x^2][0,x1,x2]塞進kernel得到b1b^1b1中的一點,再把[x1,x2,x3][x^1, x^2, x^3][x1,x2,x3]塞進同一個kernel得到b2b^2b2中的一點,依次類推可以得到和輸入長度相等的TTT的點,再換一個kernel_size是3的filter再來一遍,就又得到了一組長度為TTT的點,這些點concat起來就得到了輸出的特征。當然這里b1b^1b1只考慮到了[x1,x2][x^1, x^2][x1,x2]的信息,b2b^2b2只考慮到了[x1,x2,x3][x^1, x^2, x^3][x1,x2,x3]的信息,為了讓最終輸出的特征可以參考到更多的信息,可以再疊加一層1-D的CNN。怎么樣,get到我說的意思了吧?沒錯,CNN也可以用來提取sequence的特征。
那這兩者,哪一種更好呢?文獻中通常會把CNN和RNN相結合,前幾層CNN一下,后幾層RNN一下。
Self-attentinon Encoder
還有一種近期常用的方法,叫做self-attention,它也是輸入一個sequence,輸出一個sequence,具體的細節(jié)可參見李老師的Transformer教學視頻,也可以參考我的這篇課程筆記。
Down Sampling
而在語音辨識中,由于輸入的特征非常長(TTT很大),直接硬train的話,很難train。所以通常也會加一些down sampling的操作,常見的有Pyramid RNN(原文的方案),Pooling over time,Time-delay DNN,Truncated Self-attention。其中,Time-delay DNN其實就是1-D dilated CNN,我覺得stride搞大點,也可以有down sampling的效果。
其目的在于讓輸入Encoder的sequence變得短一點。
2.2 Attend
在Listen完之后呢,我們就得到了一個sequence,叫做hhh,我們需要對這個hhh做attention來得到decoder中每一個time step的context vector。說簡單粗暴點,就是我們要不斷對hhh的每個time step做加權平均,得到decoder中每個time step的輸入(context vector)。
我們來看看下面這張圖,圖中的h1h^1h1,h2h^2h2,h3h^3h3和h4h^4h4就是Listen之后得到的結果的每個time step的vector。然后我們會有一個decoder的hidden state叫做ziz^izi(原文中其實叫做sis_isi?,這里是為了和李老師的PPT保持一致),這個最初的z0z^0z0可以是一個隨機初始化的向量。這個z0z^0z0會去和每個hih^ihi做一個attentioin的計算,得到一個表示他們相關性的數(shù)值α0i\alpha^i_0α0i?。然后這些α0i\alpha^i_0α0i?會經(jīng)過一層softmax,歸一化一下,也就得到了每個hih^ihi在z0z^0z0下的權重,最后加權求和一下得到了c0c^0c0。之后的每一個cic^ici都是如是得到的。
ci=AttentionContext(zi,h)c^i = AttentionContext(z^i, h) ci=AttentionContext(zi,h)
其中,用來做attention的方法很多,最常用的就是Dot-product Attention和Additive Attention。原文中使用了前者,也就是用個矩陣去乘一下,也就是加了層全連接。
αti=<?(zt),ψ(hi)>\alpha^i_t=<\phi(z^t), \psi(h^i)> αti?=<?(zt),ψ(hi)>
其中,?\phi?和ψ\psiψ是不同的全連接層。
2.3 Spell
Spell的部分,其實就是用RNN來做了decoder,利用cic^ici和ziz^izi作為輸入,和正常的seq2seq沒有什么區(qū)別,直到遇到終止符后結束。不過它的輸出是一個概率分布,也就是它的每個time step的輸出為一個size和vocabulary size大小一致的vector。整個輸出就是一個V×TV \times TV×T的概率矩陣,VVV表示字典的大小,TTT表示time step的長度。
我們要從這個概率矩陣中找到一條概率乘積最大的路徑來作為最終的結果。一般情況下,直接取每個time step中概率最大的那個值作為該time step的輸出就可以了,這種方法叫做greedy search。不過,為了讓結果更精確,可以采用犧牲時間的方法,比如beam search。
2.4 Beam Search
所謂Beam Search就是每個time step保留概率組合最大的前nnn個組合,這個nnn就被稱為beam_size。當n=1n=1n=1時,就退化為了greedy search。比如下圖就是一個V=2V=2V=2,T=3T=3T=3,n=2n=2n=2的例子。
time step 1:只有A和B,故A和B都保留;
time step 2:AA=0.24,AB=0.36,BA=0.04,BB=0.36,故保留AB和BB;
time step 3:ABA=0.144,ABB=0.216,BBA=0.036,BBB=0.324,故保留ABB和BBB。
由于time step 3是最后一個time step,故取保留下來中的概率最大組合BBB作為最終結果。
如果采用greedy search,每次取最大的話,結果就是ABB。可見不同的beam_size,結果是會有區(qū)別的。beam_size越大,結果也就越準,但消耗的時間也就越久。
2.5 Training
訓練的時候使用了cross entropy作為loss,這也是常規(guī)的做法,希望每個time step輸出的的概率向量中和label對應的輸出的概率越大越好。不過這里有一點要注意的是,和inference的時候不同,在training的時候,前一個time step的輸出是不會作為下一個time step的輸入的。我們是直接使用前一個time step的label作為下一個time step的輸入,這個方法也叫做teacher forcing。因為剛開始訓練的時候,往往輸出都是比較亂七八糟的,用訓練的輸出作為輸入的話,很難train起來。
2.6 Back to Attention
在做attention的時候,實際上會有兩種處理方式,一種是把由ztz^tzt產(chǎn)生的ctc^tct作為下一個time step的輸入,另一種把由ztz^tzt產(chǎn)生的ctc^tct作為當前time step的輸入。
當然,也有我全都要的做法,就是產(chǎn)生的ctc^tct既會影響當前的time step,也會影響下一個time step。
不過,attention用在語音這里有一點殺雞用牛刀的意思。因為用了attention之后,每個time step輸出的feature可以考慮整個輸入序列的。但是語音這個領域,在生成第一個字的時候,我們完全沒有必要去參考以下最后一個字,我們希望這個attention時可以只關心對應的局部的,然后隨著time step的增大,關心的位置也在不斷地往后平移。于是,就有了location-aware attention。
所謂的location-aware attention就是我們在產(chǎn)生當前這個attention的時候,我們會額外考慮前一個time step生成的attention在這個time step的附近的權重是怎么樣的。通過這個方式,模型就可以學到說,產(chǎn)生的attention是一個考慮局部特征的attention。
總結
以上是生活随笔為你收集整理的Chapter1-2_Speech_Recognition(LAS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode LCS 01. 下载插
- 下一篇: fastapi PUT更新数据 / PA