集束搜尋(Beam Search)
集束搜尋是一種啟發式搜尋演算法,用於序列預測任務,它在每個時間步保留多個最有可能的候選序列(集束),而非僅僅選擇最佳選項。
完整說明
核心概念
集束搜尋是一種啟發式搜尋演算法,旨在解決序列生成任務中,貪婪演算法容易陷入局部最佳解的問題。與貪婪演算法每次只選擇當前最佳選項不同,集束搜尋在每個時間步保留 k 個最有可能的候選序列,其中 k 被稱為集束寬度(beam width)。
核心概念包括:
- 集束寬度 (Beam Width):
k值,決定了在每個時間步保留多少個候選序列。較大的k值意味著更廣泛的搜索空間,但也需要更多的計算資源。 - 候選序列 (Candidate Sequence): 在每個時間步,演算法維護的
k個最有可能的序列。 - 分數 (Score): 每個候選序列都有一個分數,通常是該序列的對數概率。分數用於評估序列的優劣。
- 擴展 (Expansion): 在每個時間步,演算法會將每個候選序列擴展到所有可能的下一個詞,並計算每個新序列的分數。
- 修剪 (Pruning): 在擴展後,演算法會根據分數修剪序列,只保留
k個最佳序列。
運作原理
集束搜尋的運作原理可以概括為以下步驟:
- 初始化: 從一個空的序列開始,作為初始集束。
- 迭代: 對於每個時間步,執行以下操作:
- 擴展: 將集束中的每個序列擴展到所有可能的下一個詞。
- 評分: 計算每個新序列的分數(通常是對數概率)。
- 修剪: 根據分數,從所有新序列中選擇
k個最佳序列,作為新的集束。
- 終止: 當所有序列都達到終止符號或達到最大長度時,演算法終止。
- 選擇最佳序列: 從最終的集束中選擇分數最高的序列作為最終輸出。
更詳細的步驟如下:
- Step 1: 初始化
- 從一個起始符號(例如
<SOS>)開始,建立一個包含單一空序列的集束。這個序列的分數通常初始化為 0。
- 從一個起始符號(例如
- Step 2: 迭代 (每個時間步 t)
- 擴展: 對於集束中的每個序列,將其擴展到所有可能的下一個詞彙。這意味著對於每個序列,我們都會生成
|V|個新序列,其中|V|是詞彙表的大小。 - 評分: 使用模型(例如,序列到序列模型)計算每個新序列的條件概率。通常,我們使用對數概率,因為它可以避免數值下溢,並且將概率的乘法轉換為加法。序列的分數是其所有詞的對數概率之和。
- 修剪: 從所有新生成的序列中,選擇分數最高的
k個序列,作為新的集束。這個步驟是集束搜尋的核心,它允許演算法在探索多個可能性的同時,保持計算的可控性。
- 擴展: 對於集束中的每個序列,將其擴展到所有可能的下一個詞彙。這意味著對於每個序列,我們都會生成
- Step 3: 終止
- 當集束中的所有序列都以終止符號(例如
<EOS>)結束,或者達到預定義的最大長度時,演算法終止。
- 當集束中的所有序列都以終止符號(例如
- Step 4: 選擇最佳序列
- 從最終的集束中,選擇分數最高的序列作為最終的輸出。這個序列被認為是最有可能的序列。
數學表示:
假設我們有一個序列到序列模型,它將輸入序列 x = (x_1, x_2, ..., x_n) 映射到輸出序列 y = (y_1, y_2, ..., y_m)。集束搜尋的目標是找到最有可能的輸出序列 y*:
y* = argmax_y P(y | x)
在每個時間步 t,集束搜尋維護一個包含 k 個候選序列的集束 B_t。每個序列 y_{1:t} = (y_1, y_2, ..., y_t) 都有一個分數 S(y_{1:t}),通常是其對數概率:
S(y_{1:t}) = log P(y_{1:t} | x) = Σ_{i=1}^t log P(y_i | y_{1:i-1}, x)
在每個時間步,集束搜尋通過擴展集束中的每個序列,並選擇分數最高的 k 個序列來更新集束。
實際應用
集束搜尋廣泛應用於各種序列生成任務中,包括:
- 機器翻譯: 將一種語言的文本翻譯成另一種語言。
- 文本摘要: 將長文本壓縮成簡短的摘要。
- 語音辨識: 將語音信號轉換成文本。
- 圖像字幕: 為圖像生成描述性文本。
- 程式碼生成: 從自然語言描述生成程式碼。
- 對話系統: 生成對話回應。
在這些應用中,集束搜尋通常與序列到序列模型(例如,Transformer)結合使用,以生成高品質的輸出序列。
具體案例:機器翻譯
在機器翻譯中,集束搜尋用於生成目標語言的翻譯。給定一個源語言句子,集束搜尋會探索多個可能的目標語言翻譯,並選擇最有可能的翻譯。集束寬度 k 的選擇會影響翻譯的質量和計算成本。較大的 k 值通常會產生更好的翻譯,但需要更多的計算資源。
常見誤區
- 集束搜尋一定能找到最佳解嗎?
- 不一定。集束搜尋是一種啟發式演算法,它不能保證找到全局最佳解。由於它只保留
k個候選序列,因此可能會錯過一些更優的序列。
- 不一定。集束搜尋是一種啟發式演算法,它不能保證找到全局最佳解。由於它只保留
- 集束寬度越大越好嗎?
- 不一定。雖然較大的集束寬度可以探索更廣泛的搜索空間,但也會增加計算成本。此外,隨著集束寬度的增加,收益遞減效應也會出現,即增加集束寬度所帶來的性能提升會越來越小。通常需要根據具體任務和計算資源來選擇合適的集束寬度。
- 集束搜尋和貪婪演算法有什麼區別?
- 貪婪演算法在每個時間步只選擇當前最佳選項,而集束搜尋則保留
k個最佳選項。因此,集束搜尋可以探索更多的可能性,並降低陷入局部最佳解的風險。然而,集束搜尋的計算成本也比貪婪演算法更高。
- 貪婪演算法在每個時間步只選擇當前最佳選項,而集束搜尋則保留
- 集束搜尋是否適用於所有序列生成任務?
- 集束搜尋通常適用於需要生成高品質序列的任務。對於一些對延遲要求較高的任務,例如實時語音辨識,貪婪演算法可能更適合。
總之,集束搜尋是一種強大的序列生成演算法,它通過在每個時間步保留多個候選序列來探索更廣泛的搜索空間,並降低陷入局部最佳解的風險。然而,它也需要更多的計算資源,並且不能保證找到全局最佳解。在實際應用中,需要根據具體任務和計算資源來選擇合適的集束寬度。
相關術語
常見問題
延伸學習
延伸學習
想看 集束搜尋 的完整影片教學?前往 美第奇 AI 學院