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