今日,谷歌 TensorFlow 宣佈推出神經結構學習(NSL)開源框架,它使用神經圖學習方法來訓練帶有圖和結構化數據的神經網絡。
據谷歌 TensorFlow 博客介紹,NSL 是一個新手和高級開發人員都可以用來訓練具有結構化信號神經網絡的簡易框架,可用於構建精確且穩健的視覺、語言理解和預測模型。
- 項目地址:https://github.com/tensorflow/neural-structured-learning
結構化數據包含樣本之間豐富的關係信息,許多機器學習任務都得益於此。例如,建模引用網絡、句子語言學結構的知識圖推斷與推理,以及學習分子指紋,這些都需要模型來學習結構化輸入,而不只是個別樣本。
這些結構可以是明確給出的(例如,作爲圖形),或者隱式推斷的(例如,作爲對抗性示例)。在訓練階段利用結構化信號可以使開發人員獲得更高的模型準確度,尤其是當標記數據量相對較小時。谷歌的研究表明,使用結構化信號進行訓練也可以帶來更穩健的模型。
圖網絡學習的一般流程。
使用這些技術,谷歌極大的提升了模型性能,例如學習圖像語義嵌入。
神經結構學習(NSL)是一種用於訓練具有結構化信號深度神經網絡的開源框架。它實現了谷歌在論文《Neural Graph Learning: Training Neural Networks Using Graphs》中介紹的神經圖學習,使開發人員能夠使用圖訓練神經網絡。
這裏的圖可以是多樣的,例如知識圖、醫療記錄、基因組數據或多模式關係(例如,圖像 - 文本對)。此外,NSL 還可以應用到對抗性學習,也就是說輸入樣本之間的結構可以是使用對抗性擾動動態構建的。
NSL 讓 TensorFlow 用戶能夠輕鬆地結合各種結構化信號來訓練神經網絡,且適用於不同的學習場景:監督、半監督和無監督(表示)設置。
NSL 如何工作
在 NSL 框架中,結構化信息(如可以定義爲圖的數據或隱性的對抗樣本),都可以被用來歸一化神經網絡的訓練,使得模型學習精確地進行預測(通過最小化監督損失)。同時,保證從同一種結構中的所有輸入保持同樣的相似度(通過最小化近鄰損失)。這種技術是可以泛化的,可以使用在神經網絡架構上,如前向神經網絡、卷積神經網絡和循環神經網絡等。
NSL 的基本架構。
用 NSL 建立一個模型
有了 NSL,建立一個使用結構化數據的模型就會很容易,而且非常直觀。給定一個圖(有具體結構)和訓練樣本,NSL 提供了相關的工具,用於將這些樣本輸入到 TFRcords 中,用於降採樣操作。
具體代碼如下,可以使用相關的命令行工具將圖和數據進行輸入:
python pack_nbrs.py --max_nbrs=5 \ labeled_data.tfr \ unlabeled_data.tfr \ graph.tsv \ merged_examples.tfr
之後,NSL 提供了一些 API,可以將定製化的模型「打包起來」,將處理過的樣本輸入進去,使用圖結構進行歸一化操作。以下爲具體代碼:
import neural_structured_learning as nsl # Create a custom model — sequential, functional, or subclass. base_model = tf.keras.Sequential(…) # Wrap the custom model with graph regularization. graph_config = nsl.configs.GraphRegConfig( neighbor_config=nsl.configs.GraphNeighborConfig(max_neighbors=1)) graph_model = nsl.keras.GraphRegularization(base_model, graph_config) # Compile, train, and evaluate. graph_model.compile(optimizer=’adam’, loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[‘accuracy’]) graph_model.fit(train_dataset, epochs=5) graph_model.evaluate(test_dataset)
只需要額外的 5 行代碼(包括註釋),NSL 就可以將一個神經模型和圖信號結合起來。從數據上來說,使用圖結構可以讓模型在訓練中使用更少的標註數據,而且不會損失太多的準確率(和原有的監督學習相比只少 10% 甚至是 1%)。
使用沒有顯式結構的圖進行訓練
如果沒有顯形結構的圖、或者不是作爲輸入的情況下,NSL 怎麼訓練呢?NSL 提供了相關的工具,用於從原始數據中建立一個圖。另外,NSL 提供了相關的工具,用於從隱性結構信號中「推導」出對抗樣本。對抗樣本用於故意誘導模型,使得訓練出的模型對於小的輸入擾動更爲魯棒。以下爲相關代碼:
import neural_structured_learning as nsl # Create a custom model — sequential, functional, or subclass. base_model = tf.keras.Sequential(…)# Wrap the custom model with graph regularization. graph_config = nsl.configs.GraphRegConfig( neighbor_config = nsl.configs.GraphNeighborConfig(max_neighbors=1)) graph_model = nsl.keras.GraphRegularization(base_model, graph_config) # Compile, train, and evaluate. graph_model.compile(optimizer=’adam’, loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[‘accuracy’]) graph_model.fit(train_dataset, epochs=5) graph_model.evaluate(test_dataset)
通過少於額外 5 行代碼(包括註釋),就能獲得一個使用帶有隱性結構對抗樣本訓練的神經模型。根據經驗,在沒有對抗性樣本的情況下,當將具有惡意但人類無法檢測出的擾動數據添加到輸入時,模型會遭受顯著的準確度損失(例如,低 30%),加入對抗樣本進行訓練則可以避免這樣的問題。