背景
在深度學(xué)習(xí)火爆的今天,大規(guī)模數(shù)據(jù)下訓(xùn)練的大規(guī)模模型在線上任務(wù)中日益常見。隨著大模型效果的提升,隨之帶來了一些使用上的不便。通常情況下,大模型需要基于大量語料、文本訓(xùn)練,迭代周期長。且對于特定場景下詞語在訓(xùn)練語料中出現(xiàn)次數(shù)不多,常常擬合不好。本文介紹的是關(guān)鍵詞即特定場景語料,在序列到序列任務(wù)中通過構(gòu)建狀態(tài)轉(zhuǎn)移自動機的方法改善最終效果的方案。
生成模型即生成模型解碼
序列到序列模型常用于機器翻譯、語音識別等任務(wù)。其架構(gòu)提出于 2014 年 [1],包含兩個核心組件:編碼器、解碼器。本文中略去這種模型的訓(xùn)練過程,對該模型在使用過程中解碼這一過程進行介紹
通過這個圖我們不難發(fā)現(xiàn),每個時刻的生成結(jié)果不僅于輸入時刻序列有關(guān),還與輸出序列相關(guān),一個簡單的想法,將每個時刻置信度最高的結(jié)果存下來,做為下一個時刻輸入,但這樣很容易產(chǎn)生問題:在一個時刻缺乏全局視野,即某一個時刻最優(yōu)不代表是全局最優(yōu)的結(jié)果。而將所有結(jié)果都記錄下來,這將會是指數(shù)級增長的數(shù)據(jù)量。因此一種 beam search 的方法被提出用來解決這一問題,我們用一個形象的例子來講述 beam search 這一過程。
假設(shè)我們得到了一串拼音序列:
y | i | d | a | l | i | zh | i |
我們?nèi)绾沃肋@個拼音序列代表什么意思呢?
如下圖所示,我們展現(xiàn)了一個通過簡單概率模型產(chǎn)生的文本,在第零個時刻的 5 個候選(為了展示方便,這里省略了編號為④的候選),在第一個時刻各產(chǎn)生了三個延伸在這 15 個候選中,通過語言模型概率選取了 top5 保留,剩余的舍棄掉,以達到縮減搜索空間的目的。通過這樣的方法,每一個時刻不保留全部結(jié)果只保留 top N,最終將指數(shù)級增長的搜索空間變?yōu)槠椒郊壴鲩L的搜索空間。
傳統(tǒng)解碼應(yīng)用問題與改進
這種方法與全部狀態(tài)保存的方案相比犧牲了準(zhǔn)確度以換取時間,具有一定局限性。對于通常情況,每個時刻 top N 能覆蓋當(dāng)前時刻 90% 以上的情況,但是這種方法在面對關(guān)鍵詞檢測、風(fēng)控詞語檢測等任務(wù)會產(chǎn)生兩個問題:
1、待檢測關(guān)鍵字在日常語料中較少出現(xiàn),傳統(tǒng) beam search 非常容易漏召回。
2、時效性強,經(jīng)常有實時插入的新檢測詞語,要即時生效。
對于第一個問題,一種直觀的思想是通過標(biāo)注數(shù)據(jù),弱標(biāo)注數(shù)據(jù)等重新訓(xùn)練模型,但這顯然迭代周期長且迭代預(yù)期不穩(wěn)定。
Google 在 2018 年論文中 [2],提出一種設(shè)計方案調(diào)整 beam search 的結(jié)果,即不重新訓(xùn)練模型,僅在解碼時通過追加模型進行重新打分來改善對小眾語料的擬合。
以上圖中識別系統(tǒng)設(shè)計為例,除去傳統(tǒng)聲學(xué)識別模塊還增加了上下文模塊,這個模塊舉例了幾個功能,包括標(biāo)點,語言模型打分,文本歸一。其中語言模型的使用如下圖,用 beam search 對中間結(jié)果進行追加打分,更新 beam search 中 top N,并將當(dāng)前結(jié)果作為下一時刻解碼的輸入。這種方式的優(yōu)點是,在不更新語音識別模型的情況下,也可以通過添加不同語境的語言模型影響 beam search 過程中 top N 選取,從而達到改善結(jié)果的目的。缺點便是顯著增加了計算量;盡管語言模型計算量常常不高,但 beam search 過程中每個候選結(jié)果都要多次經(jīng)過語言模型,次數(shù)過多,耗時上升比較明顯。
為了改進計算效率,經(jīng)典 wfst 解碼 [3] 方案重新在 seq2seq 模型中使用 [4],這種解碼方案注意到了我們是在一個序列過程中重打分,不需在每一個時刻對從開始至當(dāng)前所有文本進行重新計算,我們將語言模型生成新的概率轉(zhuǎn)移自動機 [5],解碼時,維護當(dāng)前 beam search 過程中 top N 于圖 2 狀態(tài)。如下圖為 cat(音標(biāo):k?t) 這個單詞的狀態(tài)轉(zhuǎn)移圖,當(dāng)聲學(xué)識別模塊產(chǎn)出 c 對應(yīng)的 k 的音其轉(zhuǎn)移到狀態(tài) 1,而當(dāng) a 對應(yīng)的?產(chǎn)生時,不在需要從狀態(tài) 0 計算 k ?一起的概率,而是計算當(dāng)前狀態(tài) 1 的后繼狀態(tài)中是否有?。沒有則計算回退到初始狀態(tài)的概率。這樣對于在序列生成中的計算,只需要記錄其處于圖中狀態(tài),在新的識別結(jié)果產(chǎn)生時對當(dāng)前狀態(tài)計算可行的轉(zhuǎn)移狀態(tài)即可。與普通語言模型相比,相當(dāng)于省去了從狀態(tài) 0 至當(dāng)前狀態(tài)的重復(fù)計算,復(fù)雜度大為降低。
這種淺融合的方案很好的解決了訓(xùn)練語料不均衡的問題,缺點是不能實時對圖進行修改,且缺乏對特定詞的加權(quán),為此我們引入了前綴自動機來對這一過程改進。
基于前綴自動機的解碼加權(quán)方案
前綴自動機,是一種經(jīng)典算法,常應(yīng)用于多模式串匹配。如果我們有一個字典,對于輸入文本想檢測是否命中字典中詞語,這便是一個多模式串匹配任務(wù)。對于這類任務(wù),一個顯然的方案是遍歷全部字典,但這樣復(fù)雜度太高。
對此我們開始優(yōu)化,一種方式是優(yōu)化字典結(jié)構(gòu),即字典中字符有公共部分的比如 teach 和 teacher 都在字典中,那如果 teach 不匹配了,teacher 這個單詞也不用匹配了。將順序的字典變?yōu)榍熬Y樹的存儲方式。
與此同時,我們繼續(xù)在這種情況下優(yōu)化,如果一個詞前綴為另一個詞的子串,如上圖中 she 和 her,檢測字符串 sher 中含有前綴樹中多個詞,當(dāng) she 在狀態(tài) 4 匹配成功后我們知道 he 也是待匹配串中的,因此我們不需要跳回狀態(tài) 1,而是直接跳轉(zhuǎn)至狀態(tài) 9,從 r 開始匹配即可。這便是前綴自動機的核心思想。
這種跳轉(zhuǎn)關(guān)系構(gòu)建方法是一種遞歸過程。用一句話來概括,一層一層的構(gòu)建,如果我的父節(jié)點的跳轉(zhuǎn)狀態(tài)的子節(jié)點中有與我相同的,那就是我的跳轉(zhuǎn)狀態(tài),否則我的跳轉(zhuǎn)狀態(tài)就是根結(jié)點。按照這個思路,我們將上圖的點按遍歷順序重新標(biāo)號以便于理解
有了這個前綴轉(zhuǎn)移關(guān)系,我們便能高效的處理熱詞構(gòu)建及查詢,一個帶有前綴自動機的解碼流程如下:
即對于每個 beam search 過程我們不僅維護 beam search 過程中結(jié)果,同時維護其處于前綴自動機狀態(tài);此狀態(tài)便于維護,僅存儲狀態(tài)指針即可。從性能上看,執(zhí)行時的額外計算量及內(nèi)存使用量都可以認(rèn)為是常數(shù)增加。
前綴自動機實時增加新詞方案
前一段中我們介紹了通過前綴自動機的解碼方案,但這一過程依然不能很好解決“實時”這一要求,如果我希望實時向解碼過程中添加熱詞,需要怎么改進?
回顧上一節(jié)的內(nèi)容,我們了解到前綴自動機構(gòu)建應(yīng)分為兩步,即前綴樹的構(gòu)建與狀態(tài)轉(zhuǎn)移的構(gòu)建。其中,前綴樹是算法正確性的保證,而狀態(tài)轉(zhuǎn)移可以大幅優(yōu)化時間。同時,狀態(tài)轉(zhuǎn)移需要層次遍歷整棵前綴樹,這意味轉(zhuǎn)移狀態(tài)的構(gòu)建不能隨前綴樹形態(tài)更改而自動更改,而必須全量重新構(gòu)建。
當(dāng)我們插入一個新詞,由于前綴樹的特性,可以在字符長度的復(fù)雜度將該詞插入前綴樹,但是構(gòu)建新的轉(zhuǎn)移狀態(tài)需要遍歷所有節(jié)點,如果每次插入新詞都要重新訪問整棵樹全部節(jié)點,這種復(fù)雜度是難以接受的。比較起來,損失一些轉(zhuǎn)移狀態(tài)等價于將部分詞的查詢復(fù)雜度變大,對比遍歷全部詞典的復(fù)雜度這種損失是可以接受的。
根據(jù)上述想法,我們將整體查詢變?yōu)閮煽脴?,一棵為帶轉(zhuǎn)移狀態(tài)的前綴自動機,另一棵為普通字典樹,當(dāng)新詞插入時我們在普通字典樹插入,當(dāng)普通字典樹規(guī)模大于一規(guī)定閾值后我們將他們合并,并在合并后的樹上構(gòu)建轉(zhuǎn)移狀態(tài)。對于一次查詢,復(fù)雜度從詞長變?yōu)樾∽值錁湟?guī)模,但能夠節(jié)省構(gòu)建轉(zhuǎn)移狀態(tài)遍歷全文的時間。
方案效果
我在語音識別系統(tǒng)中應(yīng)用了這種解碼方案,并通過兩方面指標(biāo)評估該模塊效果,一方面通過標(biāo)注帶關(guān)鍵詞語音數(shù)據(jù)集,評估關(guān)鍵詞準(zhǔn)召。在下表中,beam search 代表普通方案,ac automation 代表前綴自動機加權(quán)解碼方案,發(fā)現(xiàn)在識別結(jié)果中對關(guān)鍵詞召回相對提升 4.6%。另外,我們對比在普通語音識別數(shù)據(jù)集上字錯誤率(CER),由于對特殊詞提升了權(quán)重使整體準(zhǔn)確率有一定的下降,但整體損失可以接受,低于對關(guān)鍵詞召回的收益。
總結(jié)?
本文主要基于 seq2seq 類模型,通過追加狀態(tài)轉(zhuǎn)移自動機來減少模型在面對專有領(lǐng)域語料時的識別準(zhǔn)確率;同時可以使語料實時生效,并將該工作的實時性流程構(gòu)建方法加以介紹。對于語音轉(zhuǎn)錄文本中的關(guān)鍵詞檢測,常常局限于語音模型不能實時調(diào)整,很難識別出新詞,通過這種方案可以做到秒級別新詞添加,顯著改變這一困擾。
參考文獻
[1] Sutskever, Ilya, Oriol Vinyals, and Quoc V. Le. "Sequence to sequence learning with neural networks." Advances in neural information processing systems 27 (2014).
[2] Zhao, Ding, et al. "Shallow-Fusion End-to-End Contextual Biasing." Interspeech. 2019.
[3] Hori T, Hori C, Minami Y, et al. Efficient WFST-based one-pass decoding with on-the-fly hypothesis rescoring in extremely large vocabulary continuous speech recognition[J]. IEEE Transactions on audio, speech, and language processing, 2007, 15(4): 1352-1365.
[4] Williams I, Kannan A, Aleksic P S, et al. Contextual Speech Recognition in End-to-end Neural Network Systems Using Beam Search[C]//Interspeech. 2018: 2227-2231.
[5] Hori T, Nakamura A. Speech recognition algorithms using weighted finite-state transducers[J]. Synthesis Lectures on Speech and Audio Processing, 2013, 9(1): 1-162.
[6]https://blog.csdn.net/weixin_53360179/article/details/119718426
編輯:黃飛
?
評論
查看更多