您現在的位置是:首頁 > 武術
谷歌推出新框架:只需5行程式碼,就能提高模型準確度和魯棒性
- 由 量子位 發表于 武術
- 2022-03-11
谷歌構架是幹嘛的
曉查 發自 凹非寺
量子位 出品 | 公眾號 QbitAI
今天,谷歌推出了新開源框架——
神經結構學習
(NSL),它使用神經圖學習方法,來訓練帶有圖(Graph)和結構化資料的神經網路,可以帶來更強大的模型。
現在,透過TensorFlow就能獲取和使用。
NSL有什麼用?過去我們使用單獨的圖片來訓練計算機視覺神經網路,這些訓練樣本之間彼此是孤立的,然而樣本之間包含著豐富的關係資訊。
如果用上這些資料的結構化資訊,就能實現更高的模型精度,或者用更少的樣本來訓練模型,特別是在標記樣本數量相對較少的情況。
另外,NSL也能用於抵禦對抗攻擊,因為對抗樣本往往是在原來樣本上做的一種微擾,利用這一層關係,可以提高模型在對抗攻擊下的魯棒性。
谷歌表示,這種NSL技術是通用的,可以應用於任意神經架構,包括前饋神經網路、CNN和RNN。NSL可以為計算機視覺模型、NLP訓練模型,並在醫療記錄或知識圖譜等圖形化資料集上進行預測。
谷歌已經將這項技術用於研究中,在今年2月發表的一篇學習影象語義嵌入的文章中,谷歌用它來提高模型的精度。
NSL原理
NSL用到了訓練樣本之間的
結構化訊號
,它通常用於表示標記或未標記的樣品之間的關係或相似性。
這種結構化訊號有時是以圖的方式顯式地包含在資料集中,有時是透過人為構造出來的,前面說到的用微擾生成對抗攻擊樣本,就是一種隱式表達結構化訊號的方式。
如何讓結構化訊號包含在神經網路之中呢?2018年,谷歌在提交的一篇關於“神經圖學習”的論文中,構造了一種考慮資料結構關係的損失函式。
這個損失函式不僅包含常規的監督學習損失項,還引入了一項最近鄰損失,如下圖所示。透過在訓練中讓後一項最小化,來保持來自同一結構的輸入之間的相似性。
使用方法
在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