五行代碼用圖提升模型表現,TensorFlow開源NSL神經結構學習框架
今日,谷歌 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%),加入對抗樣本進行訓練則可以避免這樣的問題。