【NLP笔记】文本生成?还不快上知识库
來自 |?知乎
地址 | https://zhuanlan.zhihu.com/p/163343976
作者 | 三和廠妹
編輯 |?機器學(xué)習(xí)算法與自然語言處理公眾號
本文已獲得作者授權(quán),未經(jīng)許可禁止二次轉(zhuǎn)載
本文本來是寫ACL2020一篇對話系統(tǒng)論文《Dynamic Fusion Network for Multi-Domain End-to-end Task-Oriented Dialog》筆記,發(fā)現(xiàn)需要太多的前序知識,于是順便按時間順序整理了一下記憶網(wǎng)絡(luò)和知識庫任務(wù)導(dǎo)向的幾篇經(jīng)典論文。
【知識庫導(dǎo)向】
知識庫任務(wù)導(dǎo)向可以融合進很多任務(wù)中,如ERNIE就是在bert的基礎(chǔ)上利用了知識庫;之前在一個信息抽取的比賽任務(wù)冠軍方案中,看到加入知識庫也是一個上分點,在抽取人物或者作品的時候,知識庫能幫你確認(rèn)這是什么類型;另外,比如知識庫在對話文本生成的場景中,如果不結(jié)合外部知識庫,生成的任務(wù)語義都只能源于訓(xùn)練數(shù)據(jù),無法獲得一些常識性知識,如:
”我想喝星巴克“ ”附近沒有星巴克呢,有其他咖啡店請問你需要么“如果你的訓(xùn)練數(shù)據(jù)中沒有”星巴克“是”咖啡店“的知識,那捕獲不到這種語義,而依賴知識庫,相當(dāng)于給一個已經(jīng)十歲的孩子再教育,比剛生出來開始教爬容易多了。
【記憶網(wǎng)絡(luò)】
MemNN也是NLP的一個分支,它最大的特點是不像普通的編碼結(jié)構(gòu)如LSTM和CNN之類的會對信息壓縮成hidden state,從hidden state中抽取特征,這類方法產(chǎn)生的記憶太小了,在壓縮過程中損失了很多有用信息,MemNN是將所有的信息存在一個外部memory中,和inference一起聯(lián)合訓(xùn)練,得到一個能夠存儲和更新的長期記憶模塊,最大限度的保存有用信息。
通過幾篇論文具體了解一下:
1. MemNN記憶網(wǎng)絡(luò)原理簡介
MemNN主要包括2種操作:
embedding:sentence經(jīng)embedding過程產(chǎn)生2個矩陣:input(圖中 embedding A) 和output matrix (embedding B)
inference: 計算得到和上述內(nèi)部向量之間的相關(guān)性,具體是三個步驟。
input memory representation過程會計算問題向量Embedding B 和input matrix (Embedding A )的點積后歸一化,得到和input matrix維度一致的概率向量p,即問題和各記憶向量的相關(guān)程度;
output memory representation過程將output matrix(Embedding c)按概率向量p進行加權(quán)求和,得到輸出向量o,相當(dāng)于選取了相關(guān)性最高的記憶向量組合;
output calculation是將輸出向量轉(zhuǎn)化為所需答案的格式,得到各單詞相對答案的概率,運算是全連接型的矩陣乘累加;
inference是通過多層神經(jīng)網(wǎng)絡(luò)來推斷語句和問題的相關(guān)性(圖中右邊的多個疊加)
MemNN 存在的問題
MemNN對輸入內(nèi)容的保存沒有經(jīng)過大幅度的壓縮(參數(shù)都是embedding),信息完整性很高,這樣在問答推理上相比RNN等壓縮模型很有優(yōu)勢,不過帶來的問題就是存儲空間會隨著內(nèi)容的增大而線性增加,內(nèi)存帶寬需求的增加。
由于MemNN計算的特點是從sentence生成的多個向量中選擇相關(guān)性最大的產(chǎn)生答案,因此中間結(jié)果矩陣會是一個很稀疏的矩陣,只有相關(guān)性較強的部分才有值,其他不相關(guān)的幾乎都是0,因此密集運算加速器(如GPU等)效果就不好了,需要軟件和硬件著重考慮如何進行稀疏性的優(yōu)化。
2. KV-MemNN 字典型記憶網(wǎng)絡(luò)
在MemN2N中把context線性變換成了一個整體的embedding作為memory,而KV-MemNN的不同之處在于引入了外部知識源,將其中的memory變成了(key, value)鍵值對。
主要包括下面三個步驟:
Key Hashing:使用的是倒排索引的方法,選擇一個大小為N的k-v對集合,從知識庫中選出潛在的候選記憶,在消除停用詞的情況下保證key對應(yīng)的單詞在query中出現(xiàn);
Key Addressing:階段主要是利用Hashing的結(jié)果(候選記憶)去和query經(jīng)過線性變換后的結(jié)果計算一個相關(guān)概率(relevance probability), 與MemNN中 的inner product 類似
?
其中??是query, ??是特征篩選器,??是矩陣, 初始時
?
value reading: key被設(shè)計的和query相關(guān)(圖中藍(lán)色矩陣),value被設(shè)計的和answer相關(guān)(圖中黃色部分),所以使用Addressing得到的probability和kv中的v進行weight sum操作 ?
表示即根據(jù)query的偏重注意力從中讀取出來知識源中有價值的記憶,
記憶會多跳循環(huán)更新,雖然這部是無監(jiān)督的,但是多跳更新直觀上與推理能對應(yīng)上??的多跳更新
?
?的更新
?
最后label與model的輸出點乘后softmax后求loss
?
文中作者還嘗試了很多K-V的表示形式, 感興趣大家可以讀原文;
3. Mem2seq 記憶網(wǎng)絡(luò)文本生成
Mem2Seq是一個使用帶有指針網(wǎng)絡(luò)思想的多跳注意力機制的生成模型,這種方法有效的結(jié)合了KB的信息且Mem2Seq學(xué)習(xí)如何生成動態(tài)的查詢來控制memory的訪問。它與KV-MemNN的區(qū)別在于知識源的表達(dá)形式以及它是在應(yīng)用在seq的生成中,decoder的每一步都用到了記憶并對記憶更新。
Encoder:上圖中a部分是encoder的核心,??表示第k跳記憶,query要經(jīng)過K-hop的更新,類似從歷史對話中找到這是真正的query是什么,從上面幾種方案中可以看出,這個也是memNet的常規(guī)操作;
Decoder:?上圖b部分描述解碼,每一個時刻,將產(chǎn)生兩個分布:詞表分布??和記憶部分分布??記憶部分分布是指對話歷史以及KB的信息。
計算如下:
上式表明,當(dāng)生成的詞與記憶存儲器中的詞相等時,使用記憶存儲器的詞,即完成復(fù)制功能,當(dāng)生成的詞不在記憶存儲器中時,??指向一個特殊字符,模型將使用詞表分布??來生成輸出。
4. GLMP-任務(wù)型對話中全局到局部的記憶指針網(wǎng)絡(luò)
GLMP是最接近我們要看的這篇論文的內(nèi)容了,仔細(xì)介紹一下:
解決的問題是如何有效地在任務(wù)型對話系統(tǒng)中嵌入知識庫
Mem2Seq的改進在于將decoder變成了PointNetwork,將copy以及生成思想和記憶網(wǎng)絡(luò)結(jié)合在一起,有效的實現(xiàn)了任務(wù)型對話知識庫嵌入;
動態(tài)的大量的知識庫的嵌入無疑相當(dāng)于對模型引入一個巨量噪聲,而且加大模型計算等方面的開銷(知識庫難于編碼以及解碼),為了有效地在任務(wù)型對話系統(tǒng)中嵌入知識庫,原文提出了全局到局部的記憶指針網(wǎng)絡(luò)(GLOBAL-TO-LOCAL MEMORY POINTER NETWORKS,GLMP, 全局到局部的記憶指針網(wǎng)絡(luò));
2. GLMP結(jié)構(gòu)
【Encoder部分】
Global Memory Encoder編碼對話歷史,輸出的兩個量:全局上下文表示和全局記憶指針
全局上下文表征
編碼上下文?使用了一個context rnn(其實就是雙向GRU)來編碼用戶的一句話,得到每一個時間步?
編碼記憶?每一hop的可訓(xùn)練嵌入矩陣與Mem2Seq相似?
上下文與記憶的鏈接?為了克服MN的弊端--建模記憶之間相關(guān)性比較困難,因此將得到的隱狀態(tài)加到dialogue memory representation中,即
encoder端的輸入為:??, 其中??表示的是上文提到的三元組;(B是歷史對話信息,X是三元組,m對話也轉(zhuǎn)成3元 組信息, 統(tǒng)一表達(dá)形式,n+l 外部三元組和歷史對話拼接起來的字?jǐn)?shù))
終于得到了全局上下文的表達(dá)為:
全局上下文表征??的是??(??雙向GRU最后隱狀態(tài))經(jīng)過K-hop迭代產(chǎn)生的)
2.?全局記憶指針(Global Memory Pointer)
全局記憶指針用來過濾其余知識庫的噪聲
首先使用編碼器的最后一個隱層狀態(tài)??查詢外部知識直到最后一跳(只是最后一條計算吧),做內(nèi)積相似度計算,執(zhí)行Sigmoid函數(shù)(0-1的值),最后獲得的memory分布即為全局內(nèi)存指針G,最終它被傳遞給解碼器使用。
訓(xùn)練全局記憶指針的生成需要添加額外的輔助任務(wù),使用標(biāo)簽為??來檢查??中的 Object詞是否在對應(yīng)的真實響應(yīng)??中出現(xiàn),如果出現(xiàn)則為1,沒有為0。
最終交叉熵loss為:
因為Sigmoid是一個二分類的函數(shù),非真即假,添加額外的輔助任務(wù)訓(xùn)練全局記憶指針就是為了過濾知識庫,保留有用的知識傳遞給decoder來實例化slot, 那就得到了一個全局記憶的指針;
【decoder部分】
decoder使用了粗略空槽的RNN(sketch rnn),先用一個占位符占著, 然后利用全局記憶指針過濾掉的外部知識庫來尋找槽位具體相關(guān)信息 ,最后使用局部記憶指針(local memory point)來實例化未填充的slot值,這個slot的值可能是知識庫中的信息或者生成的內(nèi)容。
首先有產(chǎn)生一個粗糙(sketch)帶有未填充slot值(但是有slot標(biāo)簽)的響應(yīng) , sketch RNN 是一個單層的GRU,但是它的生成單詞表中有Sketch Tag,例如 會產(chǎn)生“@poi is @distance away”來替代“Starbucks is 1 mile away.”
在每一個時間步,sketch RNN 的隱狀態(tài)有兩個作用:
如果判斷結(jié)果是生成而非copy, 那h的作用預(yù)測(生成)下一個詞(就是decoder的用法),使用??(t時間步d維的隱狀態(tài))的計算公式為生成下一個詞可以表示為:
?
loss表示為
2. 作為外部知識庫的查詢向量,當(dāng)生成的結(jié)果是Tag時,之前編碼的全局記憶指針就會遞給外部知識庫,來確定這個tag填什么,起到過濾外部知識庫作用;
?作為查詢向量來與過濾后的外部知識庫做PointNetwork,產(chǎn)生的分布就是局部記憶指針(Local memory pointer,L)
計算如下(copy point 原理部分,有生成目標(biāo)就生成,沒有就copy):
用幾句話描述GLMP
引入了知識庫和記憶網(wǎng)絡(luò)結(jié)合
decoder引入了pointer Net
encoder 編碼記憶網(wǎng)絡(luò)和上下文(包括知識庫實體)并生成全局的關(guān)注點指針(用于過濾噪聲),decoder部分借鑒pointerNet, 用隱狀態(tài)生成局部指針來確定copy時指向那個實體
DFU:多領(lǐng)域端到端任務(wù)導(dǎo)向的動態(tài)融合對話網(wǎng)絡(luò)
終于到了這篇Dynamic Fusion Network for Multi-Domain End-to-end Task-Oriented Dialog 主角了,其實有了GLMP的前序知識,這篇看起來就簡單多了。
相對GLMP這篇文章要解決的主要問題是:在任務(wù)型對話中如何快速在不同領(lǐng)域遷移學(xué)習(xí)。任務(wù)型對話是領(lǐng)域強相關(guān)的,不同領(lǐng)域數(shù)據(jù)和模型相差巨大,作者設(shè)計了一個基于GLMP的架構(gòu)DF-Net,既能自動學(xué)習(xí)到不同領(lǐng)域的相關(guān)性又能學(xué)到各個域特有的知識。
加強版的encoder和decoder模塊
在GLMP的基礎(chǔ)上,encoder和decoder 將混合域隱節(jié)點和特有域隱節(jié)點的拼接后融合成??,其中??指shared, ??指 domain-specific
?
具體加強方式
動態(tài)融合
作者認(rèn)為加強版的encoder和decoder即使融合進了不同的域的信息,但是忽略了不同域的細(xì)粒度相關(guān)性。因此設(shè)計動態(tài)融合的架構(gòu)是:
各個域數(shù)據(jù)首先各自先GLMP,從而獲得所有域中各自域的特定特征
私有特征都由動態(tài)domain-specific特征融合模塊進行融合, 作者借鑒了Mixture-of-Experts mechanism (MoE) 混合專家機制,可以看出預(yù)測屬于某私域的概率分布,實質(zhì)上看起來就是一個加了一個輔助任務(wù)來計算每個域的attention
???
共享特征由動態(tài)shared特征融合模塊融合 共享特征的融合就是指將原始encoder和decoder替換為加強版
對抗學(xué)習(xí)
作者最后為了更好的訓(xùn)練對模型做了一些調(diào)整,引入了對抗學(xué)習(xí)來更好的學(xué)習(xí)域之間共有的特征
引入了梯度反轉(zhuǎn)層
最后的loss為??,看過GLMP我們也知道??也是多個混合loss組成,??是在混合loss的基礎(chǔ)上再混合,真是一個各種混合的任務(wù),但是,實驗結(jié)果非常強,在少量數(shù)據(jù)下,模型的trans能力比之前最好的高了十幾個點
總結(jié)
以上是生活随笔為你收集整理的【NLP笔记】文本生成?还不快上知识库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NLP】图解 BERT 预训练模型!
- 下一篇: 【NLP】BERT蒸馏完全指南|原理/技