基於序列模型的隨機取樣
本文作者為李炎洋,來自東北大學自然語言處理實驗室,向雷鋒網 (公眾號:雷鋒網)AI科技評論獨家投稿。
對於目前基於神經網路的序列模型,很重要的一個任務就是從序列模型中取樣。比如解碼時我們希望能產生多個不一樣的結果,而傳統的解碼演算法只能產生相似的結果。又比如訓練時使用基於強化學習或者最小風險訓練的方法需要從模型中隨機採集多個不一樣的樣本來計算句子級的損失,而一般的確定性方法不能提供所需要的隨機性。本文回顧了一系列常用的序列模型取樣方法,包括基於蒙特卡洛的隨機取樣和隨機束搜尋,以及最近提出的基於Gumbel-Top-K的隨機束搜尋。表1展示了這三種方法各自的優缺點。
序列模型中的束搜尋
在此之前,我們首先回顧一下束搜尋。在序列模型中,束搜尋通常被用來提升模型解碼時的效能。預設的貪婪解碼總是在每一步挑選一個當前分數最高的詞來組成序列。相比起貪婪解碼,束搜尋每一步都挑選多個詞來組成多個候選序列,最後挑選分數最高的序列作為最終輸出。束搜尋雖然增加了計算量,但是也顯著提升了模型效能。圖1是一個束大小為2的束搜尋的例子:
圖1 束搜尋第一步
在解碼第一步的時候,束搜尋從句子開始符<START>開始,根據模型的打分logPLM(PLM是在給定字首的情況下模型輸出的下一詞分佈)來挑選詞表中得分最高的前兩個詞he和I,並用he和I的得分logPLM(he|<START> )和logPLM(I|<START> )分別作為候選序列<START> he和<START> I的得分。
圖2 計算束搜尋第二步打分
在解碼第二步的時候,根據模型的打分logPLM為已經生成部分內容的句子<START> he和<START> I各自挑選得分最高的前兩個詞,如<START> he會挑選hit和struck,<START> I會挑選was和got,然後組成一共四個候選序列<START> he hit,<START> he struck,<START> I was和<START> I got,並分別計算他們的得分,比如<START> he hit的得分等於<START> he這個序列的得分加上hit的得分 logPLM(hit|<START> he),如圖2所示。最後保留這四個候選序列中得分最高的前兩個序列
即<START> he hit和<START> I was,如圖3所示。
圖3 挑選束搜尋第二步候選
以此類推,束搜尋一直迭代到固定次數或者所有的候選序列都結束才停止。在這個例子中束搜尋在第六步停止,產生了兩個候選序列<START> he hit me with a pie和<START> he hit me with a tart,並挑選得分最高的<START> he hit me with a pie作為最終的結果,如圖4所示。
圖4 束搜尋最終結果
序列模型中的隨機取樣
從序列模型中採集多個樣本有兩種經典的方法:基於蒙特卡洛的隨機取樣和基於蒙特卡洛的束搜尋。
基於蒙特卡洛的隨機取樣
在序列模型中取樣的最簡單方法就是在貪婪搜尋的基礎上,在每一步挑選下一個詞的時候不是根據它們相應的得分logPLM而是根據模型輸出的下一個詞分佈PLM來隨機選取一個,這樣重複到固定長度或者挑選到句子結束符時停止。這樣我們獲得了一個樣本。如果需要採集多個樣本,那麼重複這個過程若干次便可得到多個樣本。
基於蒙特卡洛的隨機取樣雖然簡單,但是它面臨著嚴重的效率問題。如果模型輸出的下一個詞分佈PLM熵很低,即對於個別詞輸出機率特別高,那麼採集到的樣本將有很大一部分重複,比如接近收斂時候的模型。因此為了採集到固定數目的不同樣本,基於蒙特卡洛的隨機取樣可能需要遠遠大於所需樣本數的取樣次數,使得采樣過程十分低效。
基於蒙特卡洛的隨機束搜尋
基於蒙特卡洛的隨機束搜尋在採集多個不同樣本遠比基於蒙特卡洛的隨機取樣高效。假設現在束大小為K,基於蒙特卡洛的隨機束搜尋在束搜尋的基礎上,把根據下一詞的得分logPLM挑選前K個得分最高的詞的操作替換成根據下一個詞分佈PLM隨機挑選K個不同詞。因為每一步都挑選了不同的詞,因此最終產生的K個候選序列都不會相同,從而達到了高效採集K個樣本的目的。
但是基於蒙特卡洛的隨機束搜尋也面臨著方差的問題。在每一步中它都是根據PLM隨機挑選K個不同詞,它無法控制隨機取樣時的噪聲,也就是樣本分佈的方差跟每一步的PLM的方差相關,而PLM的方差是無法控制的,它可能非常大也可能非常小。因此在基於蒙特卡洛的隨機束搜尋採集到的樣本上估計的統計量會非常不穩定,比如在使用句子級損失的任務中採用樣本估計損失的時候會計算出不穩定的值,使模型訓練受到影響。
基於Gumbel-Top-K的隨機束搜尋
解決基於蒙特卡洛的隨機束搜尋的問題關鍵在於怎麼控制每一步隨機取樣時的噪聲。最近的論文提出使用了Gumbel-Top-K技巧來達到這個目的。
Gumbel-Top-K技巧
自底向上的取樣方法
如果我們把每個可能的句子當成一個單獨的類別來構造一個類別數非常龐大(假設所有句子長度相等,那麼有VT個類別,其中V是詞表大小,T是句子長度)的類別分佈,那麼便可以使用Gumbel-Top-K技巧來從這一個龐大的類別分佈中採集K個不同樣本,同時每個樣本都服從於原始的分佈。這也是論文提出的自底向上的取樣方法。
圖5 自底向上的取樣方法
圖5展示了一個詞表大小V=3(hello,world,!),句子長度T=3和樣本數K=2的例子。我們需要先從第一個詞開始列舉所有的9個可能的句子,同時使用模型計算這9個句子的機率。因為模型通常只能計算整個句子的機率,而Gumbel噪聲需要加到整個logit上,我們可以使用整個句子的對數機率
我們就完成了取樣,但是自頂向上的方法需要先列舉所有句子和計算其對數機率才能開始使用噪聲擾動每個句子的對數機率,那麼我們能不能從句子開始一邊列舉一邊計算和擾動生成的不同句子的對數機率?在此之前,我們必須先定義在列舉過程中中間生成的只有部分內容的句子的對數擾動機率。只有部分內容的句子(部分生成的句子)的對數擾動機率,比如例子中的<START> world,定義為以該部分生成的句子為字首的所有完整句子中對數擾動機率最大的一個
自頂向下的取樣方法
這樣,我們可以一邊列舉所有句子的同時計算句子的對數擾動機率。
更進一步地,我們可以看到,因為我們定義部分生成的句子的對數擾動機率為其對應的所有完整句子的最大的對數擾動機率,因此如果我們在列舉的時候只保留分數最高的K個候選,那麼我們可以保證最終的K個候選一定是所有句子中分數最高的前K個,因為部分生成的句子的對數擾動機率的定義已經說明一個內部節點的所有葉子節點的對數擾動機率不可能比它的對數擾動機率大,因此在當前一層中不是分數最高的前K個的話以後它任何一個後代節點也不可能是分數最高的前K個。這樣一個自頂向下的方法可以非常高效的採集K個不同樣本而不需要列舉所有句子。
圖6 自頂向下的取樣方法
圖6展示了一個K=2的自頂向下的取樣例子。我們先對<START>的對數機率進行擾動,得到-1.2,然後我們對所有候選序列<START> hello,<START> !和<START> world的對數機率進行擾動並進行糾正,得到-4.3,-3.2,-1.2,最後我們只保留對數擾動機率最高的<START> !和<START> world繼續進行擴充,最終得到<START> world hello和<START> world world兩個樣本。
展望
最新提出的基於Gumbel-Top-K的隨機束搜尋提供了一種高效的取樣手段。利用這種方法,我們可以:
1. 對於需要取樣來計算句子級損失的任務,可以更高效地訓練模型;
2. 類似於使用Gumbel-Softmax的梯度作為Gumbel-Max梯度的有偏估計,為Gumbel-Top-K尋找類 似的梯度有偏估計,使得模型可以直接最佳化其搜尋過程;
3. 機率化束搜尋,為束搜尋可能導致的一系列問題如過翻譯,漏譯等提供機率解釋。
參考文獻
Kool, W., Hoof, H.V., & Welling, M. (2019). Stochastic Beams and Where To Find Them: The Gumbel-Top-k Trick for Sampling Sequences Without Replacement. ICML.
Shen, S., Cheng, Y., He, Z., He, W., Wu, H., Sun, M., & Liu, Y. (2015). Minimum Risk Training for Neural Machine Translation. ArXiv, abs/1512.02433.
作者介紹
李炎洋,東北大學自然語言處理實驗室研究助理。東北大學自然語言處理實驗室由姚天順教授建立於 1980 年,現由朱靖波教授、肖桐博士領導,長期從事計算語言學的相關研究工作,主要包括機器翻譯、語言分析、文字挖掘等。團隊研發的支援119種語言互譯的小牛翻譯系統已經得到廣泛應用。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2655960/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 聊聊基於Alink庫的隨機森林模型隨機森林模型
- 基於隨機定位的地圖資訊獲取方式隨機地圖
- EMNLP 2021 | LayoutReader:基於ReadingBank的閱讀序列抽取模型模型
- Python中的隨機取樣和概率分佈(一)Python隨機概率分佈
- Python中的隨機取樣和概率分佈(二)Python隨機概率分佈
- delphi基於資料模型(data-model)JSON序列模型JSON
- ArcGIS如何自動獲得隨機取樣點?隨機
- matlab 生成隨機數序列Matlab隨機
- SiMBA:基於Mamba的跨影像和多元時間序列的預測模型模型
- 2.基於取樣的路徑規劃:RRT
- 基於TimeLine模型的訊息同步機制模型
- 獲取和生成基於TensorFlow的MobilNet預訓練模型模型
- matlab生成0,1隨機序列Matlab隨機
- STM32F3系列 ADC取樣單端取樣模式(基於LL庫)模式
- 天坑,這樣一個lambda隨機取資料也有Bug隨機
- 基於量子隨機遊走的影像加密演算法隨機加密演算法
- 【python3】基於隨機森林的氣溫預測Python隨機森林
- 逆機率取樣-接受拒絕取樣-MCMC取樣
- 投機取樣會損失大語言模型的推理精度嗎?模型
- numpy2.隨機抽樣隨機
- Python基礎_根據隨機數_按長度_升序或降序排序列表Python隨機排序
- 尤拉計劃697:隨機衰減序列隨機
- 【API】隨機獲取圖片API隨機
- 模型的威力:基於模型,快速梳理原始碼模型原始碼
- 時間序列資料的預處理及基於ARIMA模型進行趨勢預測-大資料ML樣本集案例實戰模型大資料
- 基於數採儀對水質自動取樣方案的應用
- 基於多模態大模型的人機對話大模型
- JS基礎_獲取元素的樣式JS
- KMP演算法(基於程式碼隨想錄)的隨筆KMP演算法
- 關於 OB 4.2.x 新增副本隨機拉取問題的解決方案隨機
- 基於viper的配置讀取
- 基於ObjectMapper的本地快取ObjectAPP快取
- Moment:又一個開源的時間序列基礎模型模型
- 能量視角下的GAN模型(二):GAN=“分析”+“取樣”模型
- 基於Python的Xgboost模型實現Python模型
- 基於python的事件處理模型Python事件模型
- Java之獲取隨機數的4種方法Java隨機
- 基於隨機森林演算法進行硬碟故障預測隨機森林演算法硬碟