1. 程式人生 > >用卷積神經網路和自注意力機制實現QANet(問答網路)

用卷積神經網路和自注意力機制實現QANet(問答網路)

歡迎大家關注我們的網站和系列教程:http://www.tensorflownews.com/,學習更多的機器學習、深度學習的知識!

在這篇文章中,我們將解決自然語言處理(具體是指問答)中最具挑戰性但最有趣的問題之一。我們將在Tensorflow中實現Google的QANet。就像它的機器翻譯對應的Transformer網路一樣,QANet根本不使用RNN,這使得訓練/測試更快。

 

我假設你已經掌握了Python和Tensorflow的一些知識。

 

Question Answering是電腦科學在過去幾年中取得了一些快速進展的領域。問答的一個典型例子是IBM的Watson在2011年參加的著名智力競賽節目Jeopardy!,與傳奇冠軍布拉德魯特和肯詹寧斯同臺競技,並贏得了第一名。

 

在這篇文章中,我們將重點關注開放領域的閱讀理解,其中的問題可以來自任何領域,從美國流行歌星到抽象概念。閱讀理解是一種問答,我們給出了一個段落,並且提出專門選出可以從段落中回答的問題。

IBM Watson在Jeopardy與Ken Jennings(左)和Brad Rutter(右)競爭!在2011年。來源:https://blog.ted.com/how-did-supercomputer-watson-beat-jeopardy-champion-ken-jennings-experts-discuss/

 

資料集(SQuAD)

 

我們將在這篇文章中使用的資料集稱為斯坦福問答資料集(SQUAD)。 SQuAD有一些問題我們將回過頭來看,它可能不是機器閱讀理解的最佳資料集,但卻是最廣泛被研究的。如果您對可用於閱讀理解的不同資料集感到好奇,還可以檢視這個很棒的NLP資料集列表。

 

SQUAD的一個特點是問題的答案在於段落裡面。以下是SQuAD格式的示例。

斯坦福問題問答資料集的一個例子。

資料來源:https://rajpurkar.github.io/SQuAD-explorer/

 

正如我們從上面的例子中可以看到的那樣,無論問題多麼容易或困難,這個問題的答案總是在段落本身內。

 

但首先,讓我們來看看我們期望解決的各種問題和答案。通常情況下,問題本身已經是段落段的釋義版本。例如,

 

P: “Computational complexity theory is a branch of the theory of computation in theoretical computer science that focuses on classifying computational problems according to their inherent difficulty, and relating those classes to each other. A computational problem is understood to be a task that is in principle amenable to being solved by a computer, which is equivalent to stating that the problem may be solved by mechanical application of mathematical steps, such as an algorithm.”

Q: “What is the term for a task that generally lends itself to being solved by a computer?”

A: “computational problem”

 

從用粗體突出顯示的詞語中可以清楚地看出,這個問題是從該段落中解釋的。此屬性使SQuAD問題本身比開放域問題回答問題更容易。因為我們現在需要做的就是從段落中找到一個句子,該句子在語義上與問題匹配,並從上下文中提取共同的語義或句法因素。雖然我們仍然需要解決語義和句法提取,但這比從可能有數萬個單詞的字典中找到答案要容易得多。

 

SQUAD的負面問題

上面提到的屬性讓我們使用一些技巧來輕鬆預測給定段落的答案。然而,這也給使用SQuAD訓練的模型帶來了一些問題。因為這些模型在很大程度上依賴於從段落中找到正確的句子,所以它們容易受到插入段落的對抗性句子的影響,這些句子類似於問題,但旨在欺騙網路。這是一個例子,

SQuAD的對抗性示例。資料來源:https://arxiv.org/pdf/1707.07328.pdf

 

以藍色突出顯示的句子是為欺騙網路而插入的對抗性示例。對於人類讀者來說,它沒有改變問題的答案:“超級碗XXXIII中38歲的四分衛的名字是什麼?”,因為對抗性的判決正在談論冠軍盃XXXIV。然而,對於網路而言,對抗性句子與問題的對比情況要好於基本真實句子。

 

模型網路(QANet)

我們選擇QANet模型的原因是這個模型簡單。由於其簡單的架構,它可以輕鬆實現,並且比大多數網路更快地進行相同任務的訓練。 QANet架構可以從下圖中看到:

網路架構概述。資料來源:https://openreview.net/pdf?id = B14TlG-RW

模型網路可以分為大約3個部分。

 

1.詞嵌入

2.編碼器

3.注意力機制

 

詞嵌入是將文字輸入(段落和問題)轉換為密集低維向量形式。這是通過類似於本文的方法完成的。

字元感知語言建模。資料來源:https://arxiv.org/pdf/1508.06615.pdf

 

我們的方法非常相似。唯一的區別是我們的卷積濾波器使用固定的核心大小5。在將它們放到高速網路之前,我們還將單詞表示與最大池化字元表示連線起來。

 

編碼器是模型的基本構建塊。編碼器模組的細節可以從上圖的右側看到。編碼器由位置編碼,層標準化,深度可分離1d卷積,自注意力機制和前饋層組成。

 

最後,自注意力層是網路的核心構建塊,在這裡問題和段落之間發生融合。 QANet使用BiDAF 中使用的三線性注意功能(trilinear attention function)。

 

讓我們開始吧!

 

實現

為簡單起見,我們跳過資料處理步驟並直接進行神經網路。

 

詞嵌入

首先,我們定義輸入佔位符。一旦我們定義了佔位符,我們就會用詞嵌入作為單詞輸入,並使用字元嵌入作為字元輸入。

然後我們將它們通過1層1維卷積神經網路,最大池化,連線詞+ 字元表示,最後通過2層高速網路。我們在“卷積”和“高速網路”功能中加入“重用”引數的原因是我們希望對段落和問題使用相同的網路。“卷積”和“高速網路”功能是我們Tensorflow實現的卷積神經網路和高速網路。

我們將嵌入層的輸出放入編碼器層以生成相應的上下文和問題表示。殘差塊實現位置編碼 - > 層正則化- >深度可分離卷積 - >自注意力機制 - >前饋網路。

 

現在我們有了上下文和問題表示,我們使用稱為三線性注意力機制(trilinear attention)的注意力函式將它們融合在一起。融合輸出現在具有關於該問題的上下文的豐富資訊。同樣,我們將上下文-問題和問題-上下文資訊與上下文連線起來,並作為編碼器層的下一個輸入。

最後,我們有輸出層,它接收注意力層輸出並將它們編碼成一個密集的向量。這是SQuAD的特性有用的地方。因為我們知道答案在段落的某個地方,所以對於段落中的每個單詞,我們只需要計算單詞作為答案的概率。實際上,我們計算兩個概率。相應單詞屬於答案開頭的概率和相應單詞屬於答案結尾的概率。這樣,我們不需要從大字典中找出答案,並且有效地計算概率。

結束了!

 

訓練和演示

與其他基於RNN的模型相比,QANet訓練相對較快。與流行的BiDAF網路相比,QANet的效能提升約5~6倍。我們用 60,000次全域性步驟訓練網路,在GTX1080 GPU上大約需要6個小時。

 

在Tensorboard中視覺化結果。頂部圖是驗證集結果,底部是訓練集結果。 “em”完全匹配,“f1”是F1得分。

 

這是非常簡約的方法,但我希望它能幫助您理解基於神經網路的問答!如果您對他們有疑問,請發表評論,我會盡力回答您的問題。

 

感謝您的閱讀,請在評論中留下問題或反饋!

 

英文原文連結:

https://medium.com/@minsangkim/implementing-question-answering-networks-with-cnns-5ae5f08e312b

 

專案連結:

 

https://github.com/NLPLearn/QANet

 

以上為原文,以下是實測訓練截圖:

 

訓練時間和文章中提到的基本一致,使用 GTX 980 時間稍微長一些。

 

本篇文章出自http://www.tensorflownews.com,對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站!