Beam Search还能更快?结合优先队列的最佳优先化Beam Search
論文標(biāo)題:Best-First Beam Search
論文作者:Clara Meister, Tim Vieira,?Ryan Cotterell
論文鏈接:https://arxiv.org/pdf/2007.03909.pdf
Beam Search是當(dāng)前各類(lèi)文本生成任務(wù)的標(biāo)配解碼方式,作為一種受限的寬度優(yōu)先搜索,它可以極大降低搜索復(fù)雜度。但是,Beam Search依舊還有提高的空間!
本文提出一種結(jié)合優(yōu)先隊(duì)列和A*經(jīng)驗(yàn)式搜索的Beam Search,可以顯著減少調(diào)用打分函數(shù)(如負(fù)對(duì)數(shù)似然)的次數(shù),從而能夠使整個(gè)Beam Search速度大大加快,還能得到和Beam Search一樣的結(jié)果。
Beam Search?概述
在文本生成中,Beam Search已經(jīng)被作為一種普遍的解碼方式運(yùn)用在各種任務(wù)中。假設(shè)當(dāng)前輸入是,要生成的句子是,最大長(zhǎng)度是,字典是,那么,所有可能的句子就是。Beam Search就是在每一步通過(guò)打分函數(shù)只保留個(gè)候選句子。打分函數(shù)一般是對(duì)數(shù)似然:
-最大堆,在每一步,對(duì)這個(gè)句子中的每一個(gè),如果它已經(jīng)結(jié)束了(第5行),那么就不處理它,否則加上當(dāng)前步的得分(每個(gè)句子都有次計(jì)算得分),再把新得到的句子加入堆中,等到所有句子處理完之后,再?gòu)闹腥€(gè)得分最大的。
因?yàn)锽eam Search是主要的比較對(duì)象,因此我們把由Beam Search返回的個(gè)句子叫做-最佳集,其中的任何一個(gè)句子都稱(chēng)為-最佳句子。
Beam Search 的問(wèn)題
從上面的介紹講,乍一看,Beam Search的效率很高,然而,Beam Search也隱藏著一些細(xì)節(jié)上的問(wèn)題。舉個(gè)例子,假設(shè),詞典是,現(xiàn)在保留的句子是,它們當(dāng)前的得分分別是,且下一步可能的句子的得分是:
| acb | acba | 0.30 | acbb | 0.31 | acbc | 0.25 |
| abb | abba | 0.29 | abbb | 0.28 | abbc | 0.24 |
看,在下一步的Beam Search中,我們當(dāng)前得到的第二個(gè)句子根本不重要,因?yàn)橄乱徊降梅肿罡叩膬蓚€(gè)句子都來(lái)自于,因此,我們完全可以不去計(jì)算由得到的三個(gè)句子。
那么,這里的關(guān)鍵是什么呢?是最佳優(yōu)先,即讓當(dāng)前得分最大的句子先計(jì)算下一步,這就很像A*搜索。
A?*?Beam?Search?
A*是一種啟發(fā)式搜索,即通過(guò)預(yù)定義的得分函數(shù),每次都首先探索得分最高的那一條路徑。顯然,只要得分函數(shù)定義得好,就能比DFS和BFS更快地找到正確答案。
那么在這里,所謂的正確答案就是BS得到的-最佳結(jié)果。我們的目標(biāo)是設(shè)計(jì)一種啟發(fā)式的搜索算法,既能得到-最佳結(jié)果,又比BS更快。
下面的算法就描述了一種通用的搜索算法框架。
注意觀察,和BS相比,該算法引入了4個(gè)關(guān)鍵的成分:(1)比較符;(2)停止策略;(3);(4)經(jīng)驗(yàn)函數(shù)。其中除了(3)是BS原有的之外,其他的都是新增的。有了這幾個(gè)成分,就可以使用該算法實(shí)現(xiàn)BS,和即將要介紹的A* Beam Search。
來(lái)看一下這個(gè)算法做了什么。首先用定義了一個(gè)優(yōu)先隊(duì)列;然后在搜索的每一步,直接看得分最大的那個(gè)句子,如果這個(gè)句子結(jié)束了,那么就繼續(xù)放入優(yōu)先隊(duì)列中。
否則像BS一樣考慮字典中的每個(gè)字,在原來(lái)的得分(如對(duì)數(shù)似然)上再加上經(jīng)驗(yàn)函數(shù)得分,然后再把它送到優(yōu)先隊(duì)列中。
注意到圖中綠色的部分,它的意思是,對(duì)同一個(gè)句子長(zhǎng)度,如果之前已經(jīng)遇到了個(gè)同樣長(zhǎng)度的句子,那么后面的同樣長(zhǎng)度的句子就不再考慮了,這是因?yàn)樽钕瓤紤]的一定是得分最大的,后面打分的得分過(guò)小再考慮就沒(méi)有意義。
那么這個(gè)算法怎么恢復(fù)到BS呢?其實(shí)很簡(jiǎn)單,只需要讓(4)經(jīng)驗(yàn)函數(shù)恒為0,讓比較運(yùn)算符(1)為:
這個(gè)式子的意思是,讓那些要么長(zhǎng)度更短要么長(zhǎng)度相同且得分更大的句子優(yōu)先被計(jì)算,這其實(shí)和BS是一致的。因?yàn)锽S在每一步要么優(yōu)先考慮已經(jīng)結(jié)束的句子,要么長(zhǎng)度相同但得分更大。
同時(shí)讓終止條件(2)為:
也就是說(shuō)要讓所有句子都搜索完。
那么,怎么用這個(gè)算法實(shí)現(xiàn)最佳優(yōu)先的A* Beam Search呢?回想一下,A*是優(yōu)先探索得分較大的路徑,但是它并不限制路徑的長(zhǎng)度,也就是說(shuō),如果已經(jīng)探索了條長(zhǎng)度為的路徑,如果后面需要,它還會(huì)繼續(xù)探索長(zhǎng)度為的其他路徑。
所以它在最壞情況下仍然是的。將A*和BS結(jié)合起來(lái),就是要在A*算法上限制可探索的路徑數(shù),這就是上述算法的思想。
所以,最佳優(yōu)先搜索就可以定義為:
(1)比較運(yùn)算符:
(2)終止條件:
(4)經(jīng)驗(yàn)函數(shù):根據(jù)得分函數(shù)的設(shè)置(對(duì)數(shù)似然設(shè)置為0)
正如上面所述,這個(gè)算法的優(yōu)勢(shì)在于,對(duì)于對(duì)數(shù)似然而言,一旦已經(jīng)計(jì)算了長(zhǎng)度為的個(gè)句子,那么后面任何長(zhǎng)度小于的句子都不需要再考慮了,因?yàn)樗鼈兊牡梅衷谠撻L(zhǎng)度上一定更低。
本文有一節(jié)專(zhuān)門(mén)證明了該結(jié)論,并證明了該算法的時(shí)間復(fù)雜度,由于內(nèi)容較為復(fù)雜,有興趣的讀者可以參考原文Section 4。
下圖是從本算法可以導(dǎo)出的主要搜索算法,包括BS,最佳優(yōu)先BS,A* 等算法??梢钥吹?#xff0c;通過(guò)定義4個(gè)關(guān)鍵因子,我們可以實(shí)現(xiàn)各種典型的搜索算法,當(dāng)然運(yùn)用在文本生成上,BS、最佳BS和A* BS是我們最關(guān)心的。
實(shí)驗(yàn)
空口無(wú)憑,且看實(shí)驗(yàn)效果。本文在多個(gè)數(shù)據(jù)集上測(cè)量各搜索算法具體調(diào)用了多少次得分函數(shù)。注意到這里沒(méi)直接比較運(yùn)行時(shí)間,原文認(rèn)為運(yùn)行時(shí)間和硬件關(guān)系很大。
下圖是在本文實(shí)驗(yàn)的機(jī)器上,運(yùn)行時(shí)間和得分函數(shù)調(diào)用次數(shù)的關(guān)系??梢钥吹?#xff0c;二者有很強(qiáng)的線性相關(guān)性,所以直接比較得分函數(shù)是合理的。
下表是主要實(shí)驗(yàn)結(jié)果。Beam Search (ES)是指使用了提前終止的BS。
從結(jié)果可以看到,相比BS和BS(ES),BFBS調(diào)用得分函數(shù)的次數(shù)顯著降低,這在很大的時(shí)候尤其明顯。這也就意味著,模型花在解碼上的時(shí)候大大縮短。
下面一個(gè)問(wèn)題是,BFBS真的可以取得BS的最后得到的句子嗎?如下表所見(jiàn),shrinking和ES都不能完全得到BS的結(jié)果(),反而效果也會(huì)變差。
相反,BFBS始終能得到BS一樣的結(jié)果,只要BS能夠取得好效果,BFBS也就能取得同樣的效果。
上面的實(shí)驗(yàn)都是基于對(duì)數(shù)似然這個(gè)得分函數(shù)而言,對(duì)于其他得分函數(shù),如互信息、長(zhǎng)度歸一化等,本文也都做了實(shí)驗(yàn),限于篇幅,在此不再展開(kāi),有興趣的讀者可以參考原文。
小結(jié)
這是一篇偏算法理論的應(yīng)用文,提出了一種通用的Beam Search算法框架,采用不同的比較運(yùn)算符、經(jīng)驗(yàn)函數(shù)、終止策略或Beam Size,算法可以復(fù)原很多常見(jiàn)的搜索算法。
基于這個(gè)算法框架,本文提出了一種新的,基于最佳優(yōu)先策略的Beam Search,和BS相比,能夠顯著減少得分函數(shù)的調(diào)用次數(shù),從而提高解碼速度。
當(dāng)然,本文所提出的算法其實(shí)并不算簡(jiǎn)單,在理解上也有諸多障礙,尤其是很多細(xì)節(jié),如是否可以并行化解碼,優(yōu)先隊(duì)列又該怎么在并行條件下實(shí)現(xiàn)等,都需要仔細(xì)推敲。原文Section3.1給出了實(shí)現(xiàn)的概述,讀者可以根據(jù)此自己嘗試實(shí)現(xiàn)一個(gè)版本。
????
現(xiàn)在,在「知乎」也能找到我們了
進(jìn)入知乎首頁(yè)搜索「PaperWeekly」
點(diǎn)擊「關(guān)注」訂閱我們的專(zhuān)欄吧
關(guān)于PaperWeekly
PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺(tái)。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號(hào)后臺(tái)點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結(jié)
以上是生活随笔為你收集整理的Beam Search还能更快?结合优先队列的最佳优先化Beam Search的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大疆 Air 3S 无人机提前开箱,定位
- 下一篇: 再破纪录!ECCV 2020 旷视研究院