本篇總結涉及到的相關詞匯:
數據集:SQuAD、TriviaQA、MS MARCO
深度學習:R-Net、S-Net、Char-CNN、Glove
本文同時在不斷補充更新中~
一、基於知識圖譜的QA
以知識圖譜構建事實性問答系統,稱之為KBQA,是從知識圖譜中尋找答案。對事實性問答任務而言,這種做法依賴於知識圖譜,准確率比較高,同時也要求我們的知識圖譜是比較大規模的,因為KB-QA無法給出在知識圖譜之外的答案。KB-QA又可以分成兩類:基於符號表示的KB-QA,基於向量表示的KB-QA。
- 基於符號表示的KBQA
這種做法主要是利用語義解析的方法對問題進行解析,把問題轉換成邏輯表達式,再加上一些規則,得到一個結構化的SQL查詢語句,用來查詢知識庫得到答案。
- 語義解析的傳統做法是:問題->短語檢測->資源映射->語義組合->邏輯表達式
- 短語檢測:詞性標注、實體識別
- 資源映射: 實體鏈接、實體消岐、關系抽
- 語義組合:將映射得到的資源進行組合,得到邏輯形式。
- 訓練分類器:計算每一種語義解析結果的概率,再對於問答對計算損失函數。
- 現在的做法一般是:建圖->信息抽取->提取特征->查詢圖特征->分類器
- 建圖:包含知識庫實體(圓角矩形,比如family guy),聚合函數(棱形,比如argmin),中間變量 y 和答案變量 x
-
- 信息抽取:提取問題特征(問題詞,問題焦點,問題主題詞和問題中心動詞),識別命名實體,進行詞性標注來刪除限定詞和介詞。構建查詢圖特征:主題詞鏈接特征,核心推導鏈特征,約束聚合特征,總體特征
- 確定核心推導鏈:將自然語言問題,映射為一個謂語序列
- 增加約束和聚合:增加約束和聚合函數相當於擴展查詢圖,縮小答案范圍
- 分類器:對查詢圖做二分類,只有正確的查詢圖才是正樣本
- 信息抽取:提取問題特征(問題詞,問題焦點,問題主題詞和問題中心動詞),識別命名實體,進行詞性標注來刪除限定詞和介詞。構建查詢圖特征:主題詞鏈接特征,核心推導鏈特征,約束聚合特征,總體特征
- 基於向量表示的KB-QA
- 如何學習問題向量:把問題用LSTM進行建模(因為問題本來就是自然語言)
- 如何學習答案向量:答案不能簡單映射成詞向量,一般是利用到答案實體,答案類型,答案路徑(從問題主題詞到答案的知識庫路徑),答案關系(從主題詞到答案之間的知識庫關系),答案上下文信息(與答案在一定范圍內有連接的知識庫實體),然后把這些特征分別映射成不同的向量,作為答案的其中一個向量(而不是直接拼接起來),最后用這些特征向量依次和問題做匹配,把score加起來作為總的score。
- 進行匹配:計算問題與答案的得分
- 參考方法
- 最簡單的方法:直接進行向量點乘,可以用CNN對這種方式做改進
- Attention:計算答案對問題每一步的Attention
- 訓練目標:進行Margin Loss,極大化對正確目標的score,極小化對錯誤目標的score
- 輔助方法a:Multi-Task Learning + TransE訓練知識庫
- 輔助方法b:記憶網絡
- 比較
- 基於符號的方法
- 缺點:需要加入大量的人工規則,構建難度較大
- 優點:通過規則可以回答更加復雜的問題,有較強的解釋性
- 基於向量的方法
- 缺點:目前只能回答較為簡單的問題
- 優點:不需要人工規則,構建難度比較小
- 基於符號的方法
- 改進(突破)
- 復雜問句:目前end2end的模型只能解決簡單問答
- 多源異構知識庫問答:對於開放域問答,單一知識庫不能完全回答所有問題
- 預料的訓練:知識庫中實體和關系;描述實體的文本信息;結合結構化和非結構化文本
二、基於閱讀理解的問答系統
對非結構化文章進行閱讀理解得到答案,又可以分成匹配式QA,抽取式QA和生成式QA,目前絕大部分是抽取式QA。
- 匹配式QA
給定文章,問題,和一個候選答案集(一般是實體或者單詞),從候選答案中選一個score最高的作為答案。
-
- d document / q query / a answer 求概率最大的候選答案 (詞匯表V 可以定義為 document 和 query 中的所有詞,也可以定義為所有的 entity,或者定義為這篇document里面的詞,而有的會直接提供包括正確答案在內的 N個候選答案。)
- 重點在於求解g(d, q),g是對document和question建模得到的向量,把這個向量變化到詞表空間再進行歸一化可以得到所有候選score
- 方法一:直接把query跟document拼接起來,輸入到雙向LSTM中,最終得到一個向量g(LSTM Reader)
- 方法二:先對query用LSTM進行建模得到問題向量u,然后也對document建模,接下來用u 給document分配attention,去算文章向量r,再結合u和r得到g。相當於每讀完一個問題,然后帶着這個問題去讀文檔(Attentive Reader)
- 方法三:先對query用LSTM進行建模得到問題向量u,然后也對document建模,接下來用u 給document分配attention,去算文章向量r,再結合u和r得到g。相當於每讀完一個問題,然后帶着這個問題去讀文檔,增加了計算量(Impatient Reader)
- 方法四:Gated-Attenttion Reader
- 抽取式QA
數據形式是給定一篇文章,圍繞這篇文章提出一些問題,然后從文章中抽取出答案。
目前已經有的數據集有斯坦福的SQuAD、TriviaQA數據集等。
-
- SQuAD數據集的特點,SQuAD數據集包含10w個樣例,每個樣例大致由一個三元組構成(文章Passage, 相應問題Query, 對應答案Answer), 以下皆用(P,Q,A)表示。
- 生成式QA
目前只有MSRA的MS MARCO數據集答案形式如下:
1)答案完全在某篇原文
2)答案分別出現在多篇文章中
3)答案一部分出現在原文,一部分出現在問題中
4)答案的一部分出現在原文,另一部分是生成的新詞
5)答案完全不在原文出現(Yes / No 類型)
- MSRA發布這個數據集后,也發布了S-Net,在R-Net基礎上使用Multi task Learning,先抽取出答案后,利用這個特征再對文章生成答案。
R-Net在之后的筆記中會做詳細介紹
- 抽取部分
這個模型做了兩個任務,預測答案id以及對文檔進行排序
-
- 左下角是預測答案id
- 右下角是對文章進行建模
- 右上角是對文章進行排序(對問題和答案計算得出score然后進行排序)
- 生成部分
將答案標注出來后,將其作為一個特征信息疊加到文章向量中,然后對這段文章和問題重新進行encoder建模得到一個綜合的語義向量,然后輸入到decoder中生成答案,這就是一個簡單的seq2seq模型(專欄作者認為問題所用的lstm可以與之前的抽取模型中的問題lstm進行共享,這樣就不在需要進行重新的問題lstm)
參考鏈接
知乎專欄QA小結 https://zhuanlan.zhihu.com/p/35667773
R-Net解讀 https://zhuanlan.zhihu.com/p/36855204
Char-CNN解讀 https://blog.csdn.net/liuchonge/article/details/70947995
Glove(Global Vectors for Word Representation)詳解 http://www.fanyeong.com/2018/02/19/glove-in-detail/