斯坦福大學自然語言計算組發起的SQuAD(Stanford Question Answering Dataset)文本了解挑戰賽并不陌生,它也被譽為“機器閱讀了解界的ImageNet”。諸多來自全球學術界和産業界的研究團隊都積極地參與其中,近期在機器閱讀了解上已經取得了不小的突破,是以這兩天剛好有時間,對裡面涉及的一些開源架構進行學習一下。
SQuAD 資料集包含 10 萬個(問題,原文,答案)三元組,原文來自于 536 篇維基百科文章,而問題和答案的建構主要是通過衆包的方式,讓标注人員提出最多 5 個基于文章内容的問題并提供正确答案,且答案出現在原文中。即在給定文檔D,給定問題Q的情況下,答案A是D中的一個text span。
在微軟官方文章(從短句到長文,計算機如何學習閱讀了解)中講明了機器閱讀了解是自然語言處理任務中難度系數較高的一個,如SQuAD問題和答案具有非常豐富的多樣性。這五個問題中可能涉及文章中的某一個人,某一個地點,或是某一個時間等等實體;也有可能會問一些為什麼(Why)、怎麼樣(How)的問題。後者的答案可能實際上是一句話,甚至是一小段話,是以解決這個問題隻會更加棘手。
1、基本原理
今天實踐的算法是微軟提出的r-net,其架構如下所示:

該模型也就分為這樣的四層。
(1)最下面的一層做表示學習,就是給問題和文本中的每一個詞做一個表示,即深度學習裡的向量。這裡研究組使用的是多層的雙向循環神經網絡。從圖上可以看出,它在做Embed 的時候同時使用了 word 和 char 兩種 embedding 以豐富輸入特征,進而可以較好地解決一些問句中不同表述形式的關系。
(2)将問題中的向量和文本中的向量做一個比對,這樣就能找出那些問題和哪些文字部分比較接近。
(3)将這些結果放在全局中進行比對。這些都是通過注意力機制(attention)達到的。
其中(2)和(3)兩步是門控卷積網絡+注意力機制來實作的,對原文中每個詞,計算其關于問題的注意力分布,并使用該注意力分布彙總問題表示,将原文該詞表示和對應問題表示輸入 RNN 編碼,得到該詞的 query-aware 表示。不同的是,在原文詞表示和對應問題表示輸入 RNN 之前,r-net 使用了一個額外的門來過濾不重要的資訊。
(4)針對挑出的答案候選區中的每一個詞彙進行預測,哪一個詞是答案的開始,到哪個詞是答案的結束。這樣,系統會挑出可能性最高的一段文本,最後将答案輸出出來。整個過程就是一個基于以上四個層面的神經網絡的端到端系統
2、實踐測試
找了一個開源代碼https://github.com/unilight/R-NET-in-Tensorflow,進行編譯,環境為tensorflow 1.3, python3.6,對源代碼進行适應性地修改到python3.0的環境下。
(1)資料預處理
執行preprocess.py --gen_seq True
執行完,可以看到data目錄下已經得到了預處理後的資料結果。
(2)訓練
修改代碼,進行訓練。
(3)測試
這個代碼不是微軟公開的,也隻是單個模型,效果ExactMatch (EM) and F1 scores分别為57%和71%,離微軟最終的內建模型還有一定的距離 。
轉載: https://blog.csdn.net/sparkexpert/article/details/79141584