RUN++ | 对比学习加持,多轮对话改写新SOTA!
?作者 | 林億
單位 | 科大訊飛AI研究院
研究方向 | 對話系統
背景
對話系統中,DST(對話狀態跟蹤)可以說是直接決定多輪對話效果的一大模塊,其主要作用就根據對話歷史信息推斷當前對話狀態和各類屬性值,多輪對話中一些不完整表述則可能對 DST 中的意圖、槽位等產生影響,而對話改寫就是解決方案之一,如關鍵詞補全、指代消解、實體消歧等;如下面的對話:
M:親需要些什么? C:有戴森的吹風機嗎? M:沒有哦親親 C:那有松下的嗎?如果按照單輪對話來做,對話系統接收到“那松下的呢?”這句話是直接懵圈的,實際上我們更期待用戶的問題是“那有松下的吹風機嗎?”,這就是多輪對話改寫任務 [1](排名)。
前言
逛 openreview 看到的一篇將對比學習應用到多輪對話任務中,并超越當前 SOTA——RUN 的文章,《Utterance Rewriting with Contrastive Learning in Multi-turn Dialogue》[2]
全文只在 RUN 的基礎上加了一些工程性 trick 使提升為 SOTA,沒有創新性工作,如多任務+對比學習損失。
進入正題
先說一下當前的多輪對話改寫任務——RUN,EMNLP 2020 的一篇文章,鏈接:Incomplete Utterance Rewriting as Semantic Segmentation [3],其主要解決了多輪對話中的關鍵詞補全與指代消解任務。關鍵詞補全就如背景中的例子,對“那有松下的嗎”進行“吹風機”補全;指代消解如下例:
C:播放周杰倫的歌 M:好的,已經播放 C:不聽他的了,換張學友的期待改寫成“不聽周杰倫的了,換張學友的”;
RUN 是怎么做的?非常簡單,其假設關鍵詞補全的關鍵詞,與指代消解的原詞,均來自于歷史對話,如上文的補全的“吹風機”,與“他”指代的“周杰倫”均來自于上文,所以只要找到當前對話中需要插入關鍵詞的位置、需要替換的指代詞位置,以及上文中對應的關鍵詞與原指代即可;
聽起來好像很復雜,看一下實際怎么操作的,假設有這么一組對話:
訓練腳本:M:需要什么
C:有戴森吹風機嗎
M:沒有
C:那松下的呢
標簽:
C:那松下的吹風機呢
首先把訓練腳本中的所有字符連接到一起,即“需要什么 [SEP] 有戴森吹風機嗎 [SEP] 沒有 [SEP]”,這是一個長度為 M=16 的文本,和改寫前的當前 N=6 的會話“那松下的呢 [END]”,構造一個 M*N 的全 0 矩陣;[SEP] 僅用來分割不同對話,[END] 符號第 2 點說。
然后定義三種操作 {'none': 0, 'replace': 1, 'insert': 2},在 M*N 矩陣中,需要對當前矩陣進行插入關鍵詞操作的位置改寫成 2,需要進行替換操作的,改寫成 1;而 1 中在句子末尾加上 [END] 符號的原因就是也有可能會在句末進行插入。按這個邏輯,上面的標簽最終轉化的 M*N 矩陣就是一個 16*6 的矩陣,也是任務最終訓練的目標:
▲ 圖一 關鍵詞補全,將上文出現的”吹風機“補到當前會話”呢“字前
這個圖就一目了然了,如果是有指代消解任務,就假設是需要將“松下”替換成“戴森”,如下圖:
▲ 圖二 關鍵詞補全+指代消解 這里假設用松下指代戴森,實際對話場景種通常是”他她它那個這個“指代某某
任務到這里就一目了然了,基本就當成 CV 里面的語義分割來做就行了,不管你用什么樣的網路結構去搭積木,最終輸出目標就是這樣;在 RUN 原文中用的結構是 BERT->LSTM->Unet-> 交叉熵。
主角出場——RUN++
RUN++ 其實是我自己給這篇文章取的名字,因為這篇文章全文沒給自己取名字,只說了自己是在 RUN 的基礎上加了對比學習和多任務,刷新了 RUN 的表現,成為 SOTA;為了方便描述,下面都會稱這篇文章 RUN++。
RUN++ 的損失函數一:RUN 的原損失函數, 就是上面的標簽, 就是模型預測輸出,CE 是交叉熵。
RUN++ 的損失函數二:關鍵詞檢測,把多輪對話(包括當前句),有操作的字是 1,其它是 0,如圖二,輸入“需要什么 [SEP] 有戴森吹風機嗎 [SEP] 沒有 [SEP] 那松下的呢 [END]”,標簽就是“0000001111100000011010”,其中“戴森”(替換當前句中松下)、“吹風機”(插入當前句中呢字前插入),“松下”(被歷史對話中戴森替換),“呢”(被歷史對話中吹風機插入),
其中, 是一個 M*N*2 大小的矩陣,2 代表標簽 0 和 1;
RUN++ 損失函數三:意圖一致性檢測,用完整的上下文表述的語義應該和標簽句保持一致語義,然后用當前句原句(即未改寫的真實句)在每輪訓練時隨機刪除一些字,當做其自身負例,如圖所示:
損失函數,希望拉近完整的上下文和標簽句,即這是一對正例對,、推遠完整的上下文和其它上下文、推遠完整的上下文和其自身負例、推遠完整的上下文和其它上下文負例,公式表述如下:
RUN++ 損失函數四:對比損失,注意在損失函數一和二中的 、,同樣的一組輸入,像 SimCSE 那樣輸入兩次,經過兩次 dropout 的結果,應該互相靠近,利用 KL 散度拉近,(其實是論文 R-Drop 的做法),如下所示:
上面的 和 不是,C 和 、C 和 的意思啊,是 {CQ} 第一次編碼后 dropout 和第二次編碼后的 dropout;
到此為止,RUN++的多任務損失函數就整理出來了,如下
即等于:
① Loss(forward): 和 ,原始 RUN 的輸出矩陣兩次 dropout 的結果; 和 ,關鍵字檢測兩次輸出的結果; ——有監督。
② Loss(icon):意圖一致性損失(個人覺得應該叫語義一致性更合適)——無監督。
③ Loss(pcon):對比損失;——無監督。
表現
可以看到本文一系列操作之后,指標確實上去了,并且只是在訓練時候新增了多個優化目標,實際推理的時候和 RUN 沒什么區別,所以推理速度不會增加。
代碼
工程部分最關鍵的無非就根據多輪對話構建標簽矩陣以及根據標簽矩陣輸出改寫內容,這部分寫了個類無依賴環境可以直接運行,代碼:GitHub - ZeroE04/run_encrypt_decrypt: Incomplete Utterance Rewriting as Semantic Segmentation [4],剩下的結構偏置、調參過程、數據使用策略,仁者見仁智者見智。
參考文獻
[1] https://paperswithcode.com/sota/dialogue-rewriting-on-multi-rewrite
[2] https://openreview.net/pdf?id=HQ1M0wv2RrL
[3] https://arxiv.org/pdf/2009.13166v1.pdf
[4] https://github.com/ZeroE04/run_encrypt_decrypt
特別鳴謝
感謝 TCCI 天橋腦科學研究院對于 PaperWeekly 的支持。TCCI 關注大腦探知、大腦功能和大腦健康。
更多閱讀
#投 稿?通 道#
?讓你的文字被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學術熱點剖析、科研心得或競賽經驗講解等。我們的目的只有一個,讓知識真正流動起來。
📝?稿件基本要求:
? 文章確系個人原創作品,未曾在公開渠道發表,如為其他平臺已發表或待發表的文章,請明確標注?
? 稿件建議以?markdown?格式撰寫,文中配圖以附件形式發送,要求圖片清晰,無版權問題
? PaperWeekly 尊重原作者署名權,并將為每篇被采納的原創首發稿件,提供業內具有競爭力稿酬,具體依據文章閱讀量和文章質量階梯制結算
📬?投稿通道:
? 投稿郵箱:hr@paperweekly.site?
? 來稿請備注即時聯系方式(微信),以便我們在稿件選用的第一時間聯系作者
? 您也可以直接添加小編微信(pwbot02)快速投稿,備注:姓名-投稿
△長按添加PaperWeekly小編
🔍
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
·
總結
以上是生活随笔為你收集整理的RUN++ | 对比学习加持,多轮对话改写新SOTA!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么食物是一尝就忘不了的?
- 下一篇: 消防配电箱导线规范要求