知識圖和神經網路:如何有效讀取圖節點屬性
公眾號/AI前線
作者 | David Mack
譯者 | 無明
編輯 | Vincent
AI 前線導讀:我們經常會問“什麼時候與朋友會面”或“超市什麼時候開門”之類的問題。這些問題問的是有關世界中某個物件的屬性。這篇文章將介紹如何使用知識圖和神經網路來回答這類問題。
這個可以使用資料庫來實現,非常簡單。為簡單起見,我們假設問題是圖中的一個節點。在 Neo4j 圖資料庫中,可以進行簡單的查詢:
但在本文中,我們將採用神經網路方法。我們可以使用神經網路做一些傳統資料庫無法做到的事情,當然,我們需要編寫更多的程式碼,並解決一些有趣的挑戰。
文中的程式碼可以從 GitHub(https://github.com/Octavian-ai/gqa-node-properties)上獲取。
為什麼要用神經網路來解決這個問題?
既然資料庫引擎已經可以輕鬆地獲取節點屬性,為什麼要設計一個更復雜的基於神經網路的解決方案呢?
本文的靈感來自我們構建的 MacGraph,MacGraph 是一個複雜的知識圖問答系統,完全基於神經網路。這種方法可以做到傳統資料庫引擎無法做到的事情:
- 以自然語言(如英語)問題作為輸入;
- 儲存、處理和輸出概率資料;
- 處理語言和語義相似性;
- 從問答示例中學習演算法;
- 從知識圖中提取和組合多種資訊,而這種方式使用查詢是難以做到的。
通過神經網路從圖中提取節點屬性,整個推理系統可以是單個可微分函式(如一個 TensorFlow 圖),而且可以使用梯度下降和監督學習進行訓練。
最後,使用神經網路構建這個系統本身是一項有趣的挑戰!
我們將使用的資料集:CLEVR-graph
在構建機器學習解決方案時,如果沒有達到高準確率就很難知道模型是否存在缺陷,或者資料是否包含固有的噪聲和模糊性。
為了消除這種不確定性,我們採用了合成數據集。這是我們根據自己的規則生成的資料。得益於資料的顯式結構,我們可以確信一個好的模型可以達到 100%的準確率。在比較不同的架構時,這確實很有用。
CLEVR-graph(https://medium.com/octavian-ai/clevr-graph-a-dataset-for-graph-based-reasoning-5e4e64f28ffb)包含了一組關於程式生成的運輸網路圖的問題和答案。下面是其中一個運輸網路的示例以及一些示例問題和答案:
CLEVR-graph 中的每個問題都帶有一個答案和一個獨特的程式生成圖。
圖形 – 問題 – 答案三元組被編譯成 TFRecords。如果不存在,訓練指令碼將自動下載資料集的編譯版本(https://storage.googleapis.com/octavian-static/download/gqa-node-properties/tfrecords.zip)。
CLEVR-graph 可以生成很多不同型別的問題。在本文中,我們只生成與站點屬性相關的那些。總共有十二個(例如,X 有多幹淨?Y 在播放什麼音樂?),並且它們與每個圖形中隨機選擇的站點相結合,以提供問答配對。由於只有十二種不同的問題模板,因此訓練資料將缺少一些多樣性。這使資料集就更容易處理。我們將語言多樣性作為未來的延伸挑戰,並希望看到讀者的解決方案!
我們將使用的技術
我將簡要介紹一下我們所使用的技術,因為可能有些讀者不熟悉它們。
知識圖
簡單地說,知識圖儲存了實體和實體之間關係的資訊。我們可以很自然地畫出一個家庭成員間的關係:
這是一種圖結構,其中每個實體可以與其他實體具有任何數量的關係,高度靈活,並且可以用來表示世界中的很多事物(例如運輸網路、社交網路、伺服器、維基百科)。
谷歌在構建自己的“知識圖”時,這個詞才開始流行起來,現在儲存了超過 700 億個事實資料。他們用它來幫助回答人們向谷歌搜尋引擎和“Ok Google”提出的搜尋問題。
知識圖的一大好處是它們可以儲存很多型別的資訊。通過新增更多實體並在現有實體和新實體之間新增關係連線就可以輕鬆擴充套件知識圖。
TensorFlow
對於這個系統的機器學習部分,我們將使用 TensorFlow。TensorFlow 是一個模型構建和訓練框架,可用它構建模型並在我們的資料上進行訓練。TensorFlow 已迅速成為最受歡迎的機器學習庫之一。
TensorFlow 可以節省大量的開發時間。在 TensorFlow 中構建模型後,相同的程式碼可用於實驗、開發和生產部署。現在有很多平臺(如 FloydHub、Google CloudML 和 AWS SageMaker)可用於訓練和部署 TensorFlow 模型。
系統概覽
這個系統採用 TensorFlow 構建,可在合成數據集挑戰中實現 100%的準確率。
以下是該系統概覽:
系統首先將輸入問題轉換為整數標記,然後被作為向量嵌入。
接下來,控制單元對標記向量執行 attention 操作。這將生成用於後續單元的控制訊號。
然後,讀取單元使用控制訊號從圖節點列表中提取節點。然後它提取該節點的一個屬性。我們稍後將更詳細地解釋這個單元。
最後,輸出單元將讀取單元的輸出轉換為答案標記(例如對映到字典中英文單詞的整數)。
我們已經展示了模型的概覽,接下來讓我們描述每個部分的工作原理。我將解釋模型的不同部分,並提供相關連結,畢竟在一篇文章中很難完全解釋所有細節和背景。
解析輸入問題
第一步是將英語問題轉換為可供模型使用的資訊:
- 將文字拆分為一系列“標記”(常用詞和特殊字元,如問號和空格);
- 為每個唯一標記分配一個整數 ID;
- 將每個標記(例如,單詞、特殊字元)作為嵌入向量。
處理這個過程的程式碼位於 GitHub 儲存庫中的 build.py 中(https://github.com/Octavian-ai/gqa-node-properties)。
對文字進行標記是必要的,因為我們的序列編碼器需要操作一系列值。我們對輸入問題、知識圖中的資料和答案輸出使用了相同的標記方案。這樣網路就可以使用輸入問題中的單詞來查詢知識圖中的節點。
為了便於引用問題中的站點,站點以 1 到 70 之間的隨機整數進行命名。問題中的站點整數被視為標記,並被分配一個整數 ID(通常與站點號不同)。
在被標記化為整數後,這些標記就會被嵌入。這會將每個標記整數對映到該整數對應的特定向量。它使網路能夠學習標記的有用表示(例如,經常扮演相同語言角色的標記可能最終會導致相似的嵌入)。
控制單元
下一步是從問題標記中提取資訊,以便幫助讀取單元從知識圖中讀取正確的資料。這將生成控制訊號。
我們通過對嵌入問題標記進行 attention 操作來實現。這將輸出一個組合了嵌入問題標記向量的訊號。
對於我們正在使用的資料集,控制單元傾向於從問題中提取站點名稱標記向量。然後用在讀取單元中,用來從圖中提取站點節點。
控制單元對嵌入問題執行經典的 attention 操作。通過訓練變數來生成查詢,然後將其與每個問題標記向量組合起來生成點積分數。這些分數再通過 softmax 進行傳遞。最後,將問題標記向量相加在一起,並通過它們的分數進行加權。
讀取單元
讀取單元是網路的核心,它與知識圖形進行實際的互動。你可以將讀取單元視為我們自己的微型資料庫引擎。
讀取單元格做了三件事:
- 將詞嵌入應用於知識圖資料;
- 從知識圖中提取節點;
- 從節點中提取單個屬性。
首先,讓我們解釋知識圖是如何儲存和表示我們的網路的。
編碼知識圖
對於這個模型,我們只需要圖中的節點。
我們將其表示為一個二維表。每行都是一個節點。每列都是不同節點的屬性。表格中的每一個值都是表示標記的整數。以下是這種結構的示例,為了可讀性,使用了字串而不是標記整數:
讀取單元的工作原理
讀取單元以層級的方式執行兩次 attention 操作。第一個 attention 操作提取節點,第二個 attention 操作提取節點的屬性,然後生成讀取訊號。
節點提取採用了“基於的值 attention”。通常,網路使用控制訊號從問題中提取站點名稱,然後將其與查詢操作中的表的名稱列以及提取的相關節點進行比較。
屬性提取採用了“基於索引的 attention”。知道這個操作的人並不多,所以我們在這裡解釋一下。查詢輸入(控制訊號)通過密集層轉換為向量,在值列表中每個專案對應一個元素(節點屬性列表)。然後對其進行 softmax 操作,並將這些分數用於生成值列表的加權和。
這個操作起到的作用是網路可以指定從節點中提取哪一列,與列中的值無關。這很有用,因為問題本身只包含關於期望值的弱資訊,但可用於指導模型需要提取的屬性列。
輸出單元
最後一步是將讀取訊號轉換為答案標記,並將其輸出。與分類網路的標準一樣,輸出的是概率分佈。由於我們的詞彙表中有 128 個不同的標記,因此輸出訊號是 128 寬的向量,它被傳給用於訓練的交叉熵損失函式和用於預測的 argmax。
模型訓練和效能
模型已經使用 Adam 優化器進行訓練,學習率為 0.001,梯度削減為 0.4。標記嵌入寬為 64,批次大小為 32。
要自己訓練網路,可以從我們的 GitHub 克隆程式碼,使用 pipenv install 安裝依賴項,使用 pipenv shell 進入虛擬環境,然後執行 train.sh。
經過 8000 訓練步驟之後,網路的準確率達到了 99%以上。這符合我們的預期,因為資料集不包含噪聲和模糊性。
通過執行 tensorboard –logdir output/ 可以看到訓練進度:
你也可以呼叫 predict.sh 在預測模式下觀察網路的內部工作情況。這個指令碼將列印每個預測以及 attention 操作的內容:
下一步
我們已經成功地展示瞭如何在知識圖上執行基本查詢,並希望能夠為你提供一些可以用於解決其他問題的想法。
有很多有趣的方法可用來擴充套件這個網路:
- 從圖中讀取邊;
- 處理更廣泛的問題型別和語言可變性;
- 處理模糊 / 相對節點引用;
- 提取並組合多個節點屬性。
英文原文:
https://medium.com/octavian-ai/graphs-and-neural-networks-reading-node-properties-2c91625980eb