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