【NLP】文本生成?還不快上知識(shí)庫

來自 |?知乎
地址 | https://zhuanlan.zhihu.com/p/163343976
作者 | 三和廠妹
編輯 |?機(jī)器學(xué)習(xí)算法與自然語言處理公眾號(hào)
本文已獲得作者授權(quán),未經(jīng)許可禁止二次轉(zhuǎn)載
本文本來是寫ACL2020一篇對(duì)話系統(tǒng)論文《Dynamic Fusion Network for Multi-Domain End-to-end Task-Oriented Dialog》筆記,發(fā)現(xiàn)需要太多的前序知識(shí),于是順便按時(shí)間順序整理了一下記憶網(wǎng)絡(luò)和知識(shí)庫任務(wù)導(dǎo)向的幾篇經(jīng)典論文。
【知識(shí)庫導(dǎo)向】
知識(shí)庫任務(wù)導(dǎo)向可以融合進(jìn)很多任務(wù)中,如ERNIE就是在bert的基礎(chǔ)上利用了知識(shí)庫;之前在一個(gè)信息抽取的比賽任務(wù)冠軍方案中,看到加入知識(shí)庫也是一個(gè)上分點(diǎn),在抽取人物或者作品的時(shí)候,知識(shí)庫能幫你確認(rèn)這是什么類型;另外,比如知識(shí)庫在對(duì)話文本生成的場景中,如果不結(jié)合外部知識(shí)庫,生成的任務(wù)語義都只能源于訓(xùn)練數(shù)據(jù),無法獲得一些常識(shí)性知識(shí),如:
”我想喝星巴克“
”附近沒有星巴克呢,有其他咖啡店請問你需要么“如果你的訓(xùn)練數(shù)據(jù)中沒有”星巴克“是”咖啡店“的知識(shí),那捕獲不到這種語義,而依賴知識(shí)庫,相當(dāng)于給一個(gè)已經(jīng)十歲的孩子再教育,比剛生出來開始教爬容易多了。
【記憶網(wǎng)絡(luò)】
MemNN也是NLP的一個(gè)分支,它最大的特點(diǎn)是不像普通的編碼結(jié)構(gòu)如LSTM和CNN之類的會(huì)對(duì)信息壓縮成hidden state,從hidden state中抽取特征,這類方法產(chǎn)生的記憶太小了,在壓縮過程中損失了很多有用信息,MemNN是將所有的信息存在一個(gè)外部memory中,和inference一起聯(lián)合訓(xùn)練,得到一個(gè)能夠存儲(chǔ)和更新的長期記憶模塊,最大限度的保存有用信息。
通過幾篇論文具體了解一下:
1. MemNN記憶網(wǎng)絡(luò)原理簡介
MemNN主要包括2種操作:

embedding:sentence經(jīng)embedding過程產(chǎn)生2個(gè)矩陣:input(圖中 embedding A) 和output matrix (embedding B)
inference: 計(jì)算得到和上述內(nèi)部向量之間的相關(guān)性,具體是三個(gè)步驟。
input memory representation過程會(huì)計(jì)算問題向量Embedding B 和input matrix (Embedding A )的點(diǎn)積后歸一化,得到和input matrix維度一致的概率向量p,即問題和各記憶向量的相關(guān)程度;
output memory representation過程將output matrix(Embedding c)按概率向量p進(jìn)行加權(quán)求和,得到輸出向量o,相當(dāng)于選取了相關(guān)性最高的記憶向量組合;
output calculation是將輸出向量轉(zhuǎn)化為所需答案的格式,得到各單詞相對(duì)答案的概率,運(yùn)算是全連接型的矩陣乘累加;
inference是通過多層神經(jīng)網(wǎng)絡(luò)來推斷語句和問題的相關(guān)性(圖中右邊的多個(gè)疊加)
MemNN 存在的問題
MemNN對(duì)輸入內(nèi)容的保存沒有經(jīng)過大幅度的壓縮(參數(shù)都是embedding),信息完整性很高,這樣在問答推理上相比RNN等壓縮模型很有優(yōu)勢,不過帶來的問題就是存儲(chǔ)空間會(huì)隨著內(nèi)容的增大而線性增加,內(nèi)存帶寬需求的增加。
由于MemNN計(jì)算的特點(diǎn)是從sentence生成的多個(gè)向量中選擇相關(guān)性最大的產(chǎn)生答案,因此中間結(jié)果矩陣會(huì)是一個(gè)很稀疏的矩陣,只有相關(guān)性較強(qiáng)的部分才有值,其他不相關(guān)的幾乎都是0,因此密集運(yùn)算加速器(如GPU等)效果就不好了,需要軟件和硬件著重考慮如何進(jìn)行稀疏性的優(yōu)化。
2. KV-MemNN 字典型記憶網(wǎng)絡(luò)

在MemN2N中把context線性變換成了一個(gè)整體的embedding作為memory,而KV-MemNN的不同之處在于引入了外部知識(shí)源,將其中的memory變成了(key, value)鍵值對(duì)。
主要包括下面三個(gè)步驟:
Key Hashing:使用的是倒排索引的方法,選擇一個(gè)大小為N的k-v對(duì)集合,從知識(shí)庫中選出潛在的候選記憶,在消除停用詞的情況下保證key對(duì)應(yīng)的單詞在query中出現(xiàn);
Key Addressing:階段主要是利用Hashing的結(jié)果(候選記憶)去和query經(jīng)過線性變換后的結(jié)果計(jì)算一個(gè)相關(guān)概率(relevance probability), 與MemNN中 的inner product 類似
?
其中?
?是query, ?
?是特征篩選器,?
?是矩陣, 初始時(shí)
?
value reading: key被設(shè)計(jì)的和query相關(guān)(圖中藍(lán)色矩陣),value被設(shè)計(jì)的和answer相關(guān)(圖中黃色部分),所以使用Addressing得到的probability和kv中的v進(jìn)行weight sum操作 ?

表示即根據(jù)query的偏重注意力從中讀取出來知識(shí)源中有價(jià)值的記憶,
記憶會(huì)多跳循環(huán)更新,雖然這部是無監(jiān)督的,但是多跳更新直觀上與推理能對(duì)應(yīng)上?
?的多跳更新
?
?的更新
?
最后label與model的輸出點(diǎn)乘后softmax后求loss
?
文中作者還嘗試了很多K-V的表示形式, 感興趣大家可以讀原文;
3. Mem2seq 記憶網(wǎng)絡(luò)文本生成

Mem2Seq是一個(gè)使用帶有指針網(wǎng)絡(luò)思想的多跳注意力機(jī)制的生成模型,這種方法有效的結(jié)合了KB的信息且Mem2Seq學(xué)習(xí)如何生成動(dòng)態(tài)的查詢來控制memory的訪問。它與KV-MemNN的區(qū)別在于知識(shí)源的表達(dá)形式以及它是在應(yīng)用在seq的生成中,decoder的每一步都用到了記憶并對(duì)記憶更新。
Encoder:上圖中a部分是encoder的核心,?
?表示第k跳記憶,query要經(jīng)過K-hop的更新,類似從歷史對(duì)話中找到這是真正的query是什么,從上面幾種方案中可以看出,這個(gè)也是memNet的常規(guī)操作;
Decoder:?上圖b部分描述解碼,每一個(gè)時(shí)刻,將產(chǎn)生兩個(gè)分布:詞表分布?
?和記憶部分分布?
?記憶部分分布是指對(duì)話歷史以及KB的信息。
計(jì)算如下:

上式表明,當(dāng)生成的詞與記憶存儲(chǔ)器中的詞相等時(shí),使用記憶存儲(chǔ)器的詞,即完成復(fù)制功能,當(dāng)生成的詞不在記憶存儲(chǔ)器中時(shí),?
?指向一個(gè)特殊字符,模型將使用詞表分布?
?來生成輸出。
4. GLMP-任務(wù)型對(duì)話中全局到局部的記憶指針網(wǎng)絡(luò)
GLMP是最接近我們要看的這篇論文的內(nèi)容了,仔細(xì)介紹一下:
解決的問題是如何有效地在任務(wù)型對(duì)話系統(tǒng)中嵌入知識(shí)庫
Mem2Seq的改進(jìn)在于將decoder變成了PointNetwork,將copy以及生成思想和記憶網(wǎng)絡(luò)結(jié)合在一起,有效的實(shí)現(xiàn)了任務(wù)型對(duì)話知識(shí)庫嵌入;
動(dòng)態(tài)的大量的知識(shí)庫的嵌入無疑相當(dāng)于對(duì)模型引入一個(gè)巨量噪聲,而且加大模型計(jì)算等方面的開銷(知識(shí)庫難于編碼以及解碼),為了有效地在任務(wù)型對(duì)話系統(tǒng)中嵌入知識(shí)庫,原文提出了全局到局部的記憶指針網(wǎng)絡(luò)(GLOBAL-TO-LOCAL MEMORY POINTER NETWORKS,GLMP, 全局到局部的記憶指針網(wǎng)絡(luò));
2. GLMP結(jié)構(gòu)
【Encoder部分】
Global Memory Encoder編碼對(duì)話歷史,輸出的兩個(gè)量:全局上下文表示和全局記憶指針
全局上下文表征
編碼上下文?使用了一個(gè)context rnn(其實(shí)就是雙向GRU)來編碼用戶的一句話,得到每一個(gè)時(shí)間步?

編碼記憶?每一hop的可訓(xùn)練嵌入矩陣與Mem2Seq相似?

上下文與記憶的鏈接?為了克服MN的弊端--建模記憶之間相關(guān)性比較困難,因此將得到的隱狀態(tài)加到dialogue memory representation中,即

encoder端的輸入為:?
?, 其中?
?表示的是上文提到的三元組;(B是歷史對(duì)話信息,X是三元組,m對(duì)話也轉(zhuǎn)成3元 組信息, 統(tǒng)一表達(dá)形式,n+l 外部三元組和歷史對(duì)話拼接起來的字?jǐn)?shù))
終于得到了全局上下文的表達(dá)為:


全局上下文表征?
?的是?
?(?
?雙向GRU最后隱狀態(tài))經(jīng)過K-hop迭代產(chǎn)生的)

2.?全局記憶指針(Global Memory Pointer)
全局記憶指針用來過濾其余知識(shí)庫的噪聲
首先使用編碼器的最后一個(gè)隱層狀態(tài)?
?查詢外部知識(shí)直到最后一跳(只是最后一條計(jì)算吧),做內(nèi)積相似度計(jì)算,執(zhí)行Sigmoid函數(shù)(0-1的值),最后獲得的memory分布即為全局內(nèi)存指針G,最終它被傳遞給解碼器使用。訓(xùn)練全局記憶指針的生成需要添加額外的輔助任務(wù),使用標(biāo)簽為?
?來檢查?
?中的 Object詞是否在對(duì)應(yīng)的真實(shí)響應(yīng)?
?中出現(xiàn),如果出現(xiàn)則為1,沒有為0。

最終交叉熵loss為:

因?yàn)镾igmoid是一個(gè)二分類的函數(shù),非真即假,添加額外的輔助任務(wù)訓(xùn)練全局記憶指針就是為了過濾知識(shí)庫,保留有用的知識(shí)傳遞給decoder來實(shí)例化slot, 那就得到了一個(gè)全局記憶的指針;

【decoder部分】
decoder使用了粗略空槽的RNN(sketch rnn),先用一個(gè)占位符占著, 然后利用全局記憶指針過濾掉的外部知識(shí)庫來尋找槽位具體相關(guān)信息 ,最后使用局部記憶指針(local memory point)來實(shí)例化未填充的slot值,這個(gè)slot的值可能是知識(shí)庫中的信息或者生成的內(nèi)容。
首先有產(chǎn)生一個(gè)粗糙(sketch)帶有未填充slot值(但是有slot標(biāo)簽)的響應(yīng) , sketch RNN 是一個(gè)單層的GRU,但是它的生成單詞表中有Sketch Tag,例如 會(huì)產(chǎn)生“@poi is @distance away”來替代“Starbucks is 1 mile away.”
在每一個(gè)時(shí)間步,sketch RNN 的隱狀態(tài)有兩個(gè)作用:
如果判斷結(jié)果是生成而非copy, 那h的作用預(yù)測(生成)下一個(gè)詞(就是decoder的用法),使用?
?(t時(shí)間步d維的隱狀態(tài))的計(jì)算公式為生成下一個(gè)詞可以表示為:
?
loss表示為
2. 作為外部知識(shí)庫的查詢向量,當(dāng)生成的結(jié)果是Tag時(shí),之前編碼的全局記憶指針就會(huì)遞給外部知識(shí)庫,來確定這個(gè)tag填什么,起到過濾外部知識(shí)庫作用;
?作為查詢向量來與過濾后的外部知識(shí)庫做PointNetwork,產(chǎn)生的分布就是局部記憶指針(Local memory pointer,L)計(jì)算如下(copy point 原理部分,有生成目標(biāo)就生成,沒有就copy):


用幾句話描述GLMP
引入了知識(shí)庫和記憶網(wǎng)絡(luò)結(jié)合
decoder引入了pointer Net
encoder 編碼記憶網(wǎng)絡(luò)和上下文(包括知識(shí)庫實(shí)體)并生成全局的關(guān)注點(diǎn)指針(用于過濾噪聲),decoder部分借鑒pointerNet, 用隱狀態(tài)生成局部指針來確定copy時(shí)指向那個(gè)實(shí)體
DFU:多領(lǐng)域端到端任務(wù)導(dǎo)向的動(dòng)態(tài)融合對(duì)話網(wǎng)絡(luò)
終于到了這篇Dynamic Fusion Network for Multi-Domain End-to-end Task-Oriented Dialog 主角了,其實(shí)有了GLMP的前序知識(shí),這篇看起來就簡單多了。
相對(duì)GLMP這篇文章要解決的主要問題是:在任務(wù)型對(duì)話中如何快速在不同領(lǐng)域遷移學(xué)習(xí)。任務(wù)型對(duì)話是領(lǐng)域強(qiáng)相關(guān)的,不同領(lǐng)域數(shù)據(jù)和模型相差巨大,作者設(shè)計(jì)了一個(gè)基于GLMP的架構(gòu)DF-Net,既能自動(dòng)學(xué)習(xí)到不同領(lǐng)域的相關(guān)性又能學(xué)到各個(gè)域特有的知識(shí)。
加強(qiáng)版的encoder和decoder模塊
在GLMP的基礎(chǔ)上,encoder和decoder 將混合域隱節(jié)點(diǎn)和特有域隱節(jié)點(diǎn)的拼接后融合成?
?,其中?
?指shared, ?
?指 domain-specific

?
具體加強(qiáng)方式

動(dòng)態(tài)融合
作者認(rèn)為加強(qiáng)版的encoder和decoder即使融合進(jìn)了不同的域的信息,但是忽略了不同域的細(xì)粒度相關(guān)性。因此設(shè)計(jì)動(dòng)態(tài)融合的架構(gòu)是:
各個(gè)域數(shù)據(jù)首先各自先GLMP,從而獲得所有域中各自域的特定特征
私有特征都由動(dòng)態(tài)domain-specific特征融合模塊進(jìn)行融合, 作者借鑒了Mixture-of-Experts mechanism (MoE) 混合專家機(jī)制,可以看出預(yù)測屬于某私域的概率分布,實(shí)質(zhì)上看起來就是一個(gè)加了一個(gè)輔助任務(wù)來計(jì)算每個(gè)域的attention
?
?
?

共享特征由動(dòng)態(tài)shared特征融合模塊融合 共享特征的融合就是指將原始encoder和decoder替換為加強(qiáng)版
對(duì)抗學(xué)習(xí)
作者最后為了更好的訓(xùn)練對(duì)模型做了一些調(diào)整,引入了對(duì)抗學(xué)習(xí)來更好的學(xué)習(xí)域之間共有的特征
引入了梯度反轉(zhuǎn)層
最后的loss為?
?,看過GLMP我們也知道?
?也是多個(gè)混合loss組成,?
?是在混合loss的基礎(chǔ)上再混合,真是一個(gè)各種混合的任務(wù),但是,實(shí)驗(yàn)結(jié)果非常強(qiáng),在少量數(shù)據(jù)下,模型的trans能力比之前最好的高了十幾個(gè)點(diǎn)


往期精彩回顧
獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:
https://t.zsxq.com/y7uvZF6
本站qq群704220115。
加入微信群請掃碼:
