集束搜索(Beam Search)


簡介

部分參考簡書文章【Beam Search原理及應用】【Beam_search集束搜索】.
一種啟發式圖搜索算法,通常用在圖的解空間比較大的情況下,為了減少搜索所占用的空間和時間,在每一步深度擴展的時候,剪掉一些質量比較差的結點,保留下一些質量較高的結點。
這樣減少了空間消耗,並提高了時間效率,但缺點就是有可能存在潛在的最佳方案被丟棄,因此,Beam Search算法是不完全的,一般用於解空間較大的系統中。

步驟

Beam Search的一般步驟為:
1、初始化beam_size個序列,序列均為空,這些序列稱之為beam paths;
2、取下一個Frame的前N個候選值(N一般為beam size或者更大,Frame內部侯選值已按照概率倒序排列),與已存在的beam paths組合形成N * beam_size條路徑,稱之為prob_paths;
3、對prob_paths進行打分,取前beam_size個prob_path作為新的beam paths;
4、若解碼結束則完成算法,否則回到步驟2。

總結

經典的beam search算法以最大后驗概率作為優化目標函數,每一個time step只保留B個最優的狀態(B表示集束寬度),是一種典型的貪心算法。
beam search可以看做是做了約束優化的廣度優先搜索,首先使用廣度優先策略建立搜索樹,樹的每層,按照啟發代價對節點進行排序,然后僅留下預先確定的個數(Beam width,集束寬度)的節點,僅這些節點在下一層次繼續擴展,其他節點被剪切掉。
BS嘗試在廣度優先基礎上進行進行搜索空間的優化(類似於剪枝)達到減少內存消耗的目的。
其中,集束寬度B可以是預先定好的,也可以是變動的,可以先按照一個最小的集束寬度進行搜索,如果沒有找到合適的解,再擴大集束寬度再找一遍。
當集束寬度B=1時,該算法退化為傳統的貪心算法。
當集束寬度B無窮大,該算法就是廣度優先搜索。

應用

這個算法常常被用於解碼可選狀態數量多的情形,比如生成對話、生成圖片描述、機器翻譯等,每一步都有詞表大小的可選狀態集。
多適用於機器翻譯,語音識別,當系統的數據集比較大,計算資源受限,而且沒有唯一最優解時,該算法能夠較快的找到接近最正確的解。
在sequence2sequence模型中,beam search的方法只用在測試的情況,因為在訓練過程中,每一個decoder的輸出是有正確答案的,也就不需要beam search去加大輸出的准確率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM