五行代碼用圖提升模型表現(xiàn),TensorFlow開源NSL神經(jīng)結(jié)構(gòu)學(xué)習(xí)框架
今日,谷歌 TensorFlow 宣布推出神經(jīng)結(jié)構(gòu)學(xué)習(xí)(NSL)開源框架,它使用神經(jīng)圖學(xué)習(xí)方法來訓(xùn)練帶有圖和結(jié)構(gòu)化數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)。

據(jù)谷歌 TensorFlow 博客介紹,NSL 是一個(gè)新手和高級(jí)開發(fā)人員都可以用來訓(xùn)練具有結(jié)構(gòu)化信號(hào)神經(jīng)網(wǎng)絡(luò)的簡易框架,可用于構(gòu)建精確且穩(wěn)健的視覺、語言理解和預(yù)測模型。
- 項(xiàng)目地址:https://github.com/tensorflow/neural-structured-learning
結(jié)構(gòu)化數(shù)據(jù)包含樣本之間豐富的關(guān)系信息,許多機(jī)器學(xué)習(xí)任務(wù)都得益于此。例如,建模引用網(wǎng)絡(luò)、句子語言學(xué)結(jié)構(gòu)的知識(shí)圖推斷與推理,以及學(xué)習(xí)分子指紋,這些都需要模型來學(xué)習(xí)結(jié)構(gòu)化輸入,而不只是個(gè)別樣本。
這些結(jié)構(gòu)可以是明確給出的(例如,作為圖形),或者隱式推斷的(例如,作為對(duì)抗性示例)。在訓(xùn)練階段利用結(jié)構(gòu)化信號(hào)可以使開發(fā)人員獲得更高的模型準(zhǔn)確度,尤其是當(dāng)標(biāo)記數(shù)據(jù)量相對(duì)較小時(shí)。谷歌的研究表明,使用結(jié)構(gòu)化信號(hào)進(jìn)行訓(xùn)練也可以帶來更穩(wěn)健的模型。

圖網(wǎng)絡(luò)學(xué)習(xí)的一般流程。
使用這些技術(shù),谷歌極大的提升了模型性能,例如學(xué)習(xí)圖像語義嵌入。
神經(jīng)結(jié)構(gòu)學(xué)習(xí)(NSL)是一種用于訓(xùn)練具有結(jié)構(gòu)化信號(hào)深度神經(jīng)網(wǎng)絡(luò)的開源框架。它實(shí)現(xiàn)了谷歌在論文《Neural Graph Learning: Training Neural Networks Using Graphs》中介紹的神經(jīng)圖學(xué)習(xí),使開發(fā)人員能夠使用圖訓(xùn)練神經(jīng)網(wǎng)絡(luò)。
這里的圖可以是多樣的,例如知識(shí)圖、醫(yī)療記錄、基因組數(shù)據(jù)或多模式關(guān)系(例如,圖像 - 文本對(duì))。此外,NSL 還可以應(yīng)用到對(duì)抗性學(xué)習(xí),也就是說輸入樣本之間的結(jié)構(gòu)可以是使用對(duì)抗性擾動(dòng)動(dòng)態(tài)構(gòu)建的。
NSL 讓 TensorFlow 用戶能夠輕松地結(jié)合各種結(jié)構(gòu)化信號(hào)來訓(xùn)練神經(jīng)網(wǎng)絡(luò),且適用于不同的學(xué)習(xí)場景:監(jiān)督、半監(jiān)督和無監(jiān)督(表示)設(shè)置。
NSL 如何工作
在 NSL 框架中,結(jié)構(gòu)化信息(如可以定義為圖的數(shù)據(jù)或隱性的對(duì)抗樣本),都可以被用來歸一化神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,使得模型學(xué)習(xí)精確地進(jìn)行預(yù)測(通過最小化監(jiān)督損失)。同時(shí),保證從同一種結(jié)構(gòu)中的所有輸入保持同樣的相似度(通過最小化近鄰損失)。這種技術(shù)是可以泛化的,可以使用在神經(jīng)網(wǎng)絡(luò)架構(gòu)上,如前向神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)等。

NSL 的基本架構(gòu)。
用 NSL 建立一個(gè)模型
有了 NSL,建立一個(gè)使用結(jié)構(gòu)化數(shù)據(jù)的模型就會(huì)很容易,而且非常直觀。給定一個(gè)圖(有具體結(jié)構(gòu))和訓(xùn)練樣本,NSL 提供了相關(guān)的工具,用于將這些樣本輸入到 TFRcords 中,用于降采樣操作。
具體代碼如下,可以使用相關(guān)的命令行工具將圖和數(shù)據(jù)進(jìn)行輸入:
- python pack_nbrs.py --max_nbrs=5 \
- labeled_data.tfr \
- unlabeled_data.tfr \
- graph.tsv \
- merged_examples.tfr
之后,NSL 提供了一些 API,可以將定制化的模型「打包起來」,將處理過的樣本輸入進(jìn)去,使用圖結(jié)構(gòu)進(jìn)行歸一化操作。以下為具體代碼:
- 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 就可以將一個(gè)神經(jīng)模型和圖信號(hào)結(jié)合起來。從數(shù)據(jù)上來說,使用圖結(jié)構(gòu)可以讓模型在訓(xùn)練中使用更少的標(biāo)注數(shù)據(jù),而且不會(huì)損失太多的準(zhǔn)確率(和原有的監(jiān)督學(xué)習(xí)相比只少 10% 甚至是 1%)。
使用沒有顯式結(jié)構(gòu)的圖進(jìn)行訓(xùn)練
如果沒有顯形結(jié)構(gòu)的圖、或者不是作為輸入的情況下,NSL 怎么訓(xùn)練呢?NSL 提供了相關(guān)的工具,用于從原始數(shù)據(jù)中建立一個(gè)圖。另外,NSL 提供了相關(guān)的工具,用于從隱性結(jié)構(gòu)信號(hào)中「推導(dǎo)」出對(duì)抗樣本。對(duì)抗樣本用于故意誘導(dǎo)模型,使得訓(xùn)練出的模型對(duì)于小的輸入擾動(dòng)更為魯棒。以下為相關(guān)代碼:
- 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 行代碼(包括注釋),就能獲得一個(gè)使用帶有隱性結(jié)構(gòu)對(duì)抗樣本訓(xùn)練的神經(jīng)模型。根據(jù)經(jīng)驗(yàn),在沒有對(duì)抗性樣本的情況下,當(dāng)將具有惡意但人類無法檢測出的擾動(dòng)數(shù)據(jù)添加到輸入時(shí),模型會(huì)遭受顯著的準(zhǔn)確度損失(例如,低 30%),加入對(duì)抗樣本進(jìn)行訓(xùn)練則可以避免這樣的問題。