您現在的位置是:首頁 > 武術

谷歌推出新框架:只需5行程式碼,就能提高模型準確度和魯棒性

  • 由 量子位 發表于 武術
  • 2022-03-11
簡介曉查 發自 凹非寺量子位 出品 | 公眾號 QbitAI今天,谷歌推出了新開源框架——神經結構學習(NSL),它使用神經圖學習方法,來訓練帶有圖(Graph)和結構化資料的神經網路,可以帶來更強大的模型

谷歌構架是幹嘛的

曉查 發自 凹非寺

量子位 出品 | 公眾號 QbitAI

今天,谷歌推出了新開源框架——

神經結構學習

(NSL),它使用神經圖學習方法,來訓練帶有圖(Graph)和結構化資料的神經網路,可以帶來更強大的模型。

現在,透過TensorFlow就能獲取和使用。

NSL有什麼用?過去我們使用單獨的圖片來訓練計算機視覺神經網路,這些訓練樣本之間彼此是孤立的,然而樣本之間包含著豐富的關係資訊。

谷歌推出新框架:只需5行程式碼,就能提高模型準確度和魯棒性

如果用上這些資料的結構化資訊,就能實現更高的模型精度,或者用更少的樣本來訓練模型,特別是在標記樣本數量相對較少的情況。

另外,NSL也能用於抵禦對抗攻擊,因為對抗樣本往往是在原來樣本上做的一種微擾,利用這一層關係,可以提高模型在對抗攻擊下的魯棒性。

谷歌表示,這種NSL技術是通用的,可以應用於任意神經架構,包括前饋神經網路、CNN和RNN。NSL可以為計算機視覺模型、NLP訓練模型,並在醫療記錄或知識圖譜等圖形化資料集上進行預測。

谷歌推出新框架:只需5行程式碼,就能提高模型準確度和魯棒性

谷歌已經將這項技術用於研究中,在今年2月發表的一篇學習影象語義嵌入的文章中,谷歌用它來提高模型的精度。

NSL原理

NSL用到了訓練樣本之間的

結構化訊號

,它通常用於表示標記或未標記的樣品之間的關係或相似性。

這種結構化訊號有時是以圖的方式顯式地包含在資料集中,有時是透過人為構造出來的,前面說到的用微擾生成對抗攻擊樣本,就是一種隱式表達結構化訊號的方式。

如何讓結構化訊號包含在神經網路之中呢?2018年,谷歌在提交的一篇關於“神經圖學習”的論文中,構造了一種考慮資料結構關係的損失函式。

這個損失函式不僅包含常規的監督學習損失項,還引入了一項最近鄰損失,如下圖所示。透過在訓練中讓後一項最小化,來保持來自同一結構的輸入之間的相似性。

谷歌推出新框架:只需5行程式碼,就能提高模型準確度和魯棒性

使用方法

在TensorFlow中使用NSL,首先需要安裝虛擬環境,設定完虛擬環境後,用pip安裝:

pip install ——upgrade neural_structured_learning

使用NSL,讓我們用結構化訊號構建模型變得簡單而直接。對於給定圖(顯式結構)和訓練樣本的情況,NSL提供了一個工具來處理這些樣本並將其組合到TFRecords中進行接下來的訓練:

python pack_nbrs。py ——max_nbrs=5 \

labeled_data。tfr \

unlabeled_data。tfr \

graph。tsv \

merged_examples。tfr

對於用圖表示的結構訊號的資料,呼叫NSL中的API,只需新增不超過5行程式碼就可以訓練一個新的神經網路模型。

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)

這種方法可以使用較少標記的資料進行訓練,而不會損失太多精度,一般不超過原始監督資料的10%甚至1%。

然而大部分資料是沒有圖作為顯式結構訊號的,這種情況應該怎麼辦?谷歌在NSL中提供了從原始資料構建圖形的工具,NSL透過API構造對抗樣本,以此作為隱式結構訊號。

import neural_structured_learning as nsl

# Create a base model — sequential, functional, or subclass。

model = tf。keras。Sequential(…)

# Wrap the model with adversarial regularization。

adv_config = nsl。configs。make_adv_reg_config(multiplier=0。2, adv_step_size=0。05)

adv_model = nsl。keras。AdversarialRegularization(model, adv_config)

# Compile, train, and evaluate。

adv_model。compile(optimizer=’adam’,

loss=’sparse_categorical_crossentropy’, metrics=[‘accuracy’])

adv_model。fit({‘feature’: x_train, ‘label’: y_train}, epochs=5) adv_model。evaluate({‘feature’: x_test, ‘label’: y_test})

同樣新增程式碼不超過5行!這種透過微擾新增對抗樣本的訓練模型,已被證明可以抵禦惡意攻擊。而沒有新增對抗樣本的模型在攻擊下準確度會損失30%。

傳送門

TensorFlow介紹頁面:

https://www。tensorflow。org/neural_structured_learning/

程式碼地址:

https://github。com/tensorflow/neural-structured-learning

Top