為了方便大家對網路表示學習(NE/NRL)開展相關的實驗或研究,清華大學電腦科學與技術系的研究人員在 GitHub 上釋出了 NE/NRL 訓練和測試框架 OpenNE,其中統一了 NE 模型輸入/輸出/評測介面,並且修訂和復現了目前比較經典的網路表徵學習模型。該專案還在持續開發中,作者還提供了與未擴充套件模型的比較結果。
專案連結:https://github.com/thunlp/OpenNE
本專案是一個標準的 NE/NRL(Network Representation Learning,網路表徵學習)訓練和測試框架。在這個框架中,我們統一了不同 NE 模型輸入和輸出介面,併為每個模型提供可擴充套件選項。此外,我們還在這個框架中用 TensorFlow 實現了經典 NE 模型,使這些模型可以用 GPU 訓練。
我們根據 DeepWalk 的設定開發了這個工具包, 實現和修改的模型包括 DeepWalk、LINE、node2vec、GraRep、TADW 和 GCN。我們還將根據已公佈的 NRL 論文發表持續實現更多有代表性的 NE 模型。特別地,我們歡迎其他研究者在該框架中構建 NE 模型到這個工具包中,也會公佈專案中的貢獻內容。
配置需求
- numpy==1.13.1
- networkx==2.0
- scipy==0.19.1
- tensorflow==1.3.0
- gensim==3.0.1
- scikit-learn==0.19.0
使用
通用選項
如果想檢視其它可用的 OpenNE 選項,請輸入以下命令:
python src/main.py --help
- input,一個網路的輸入檔案;
- graph-format,輸入圖的格式,類鄰接表或邊表;
- output,表徵的輸出檔案;
- representation-size,用於學習每個節點的隱維數,預設為 128;
- method,NE 模型的學習方法,包括 deepwalk、line、node2vec、grarep、tadw 和 gcn;
- directed,將圖轉換為定向的;
- weighted,將圖加權;
- label-file,節點標籤的檔案;只在測試時使用;
- clf-ratio,節點分類的訓練資料的比例;預設值為 0.5;
- epochs,LINE 和 GCN 的訓練 epoch 數;預設值為 5;
樣例
在 BlogCatalog 網路上執行「node2vec」,評估多標籤節點分類任務上的學習表徵,並在這個專案的主目錄上執行以下命令:
python src/main.py --method node2vec --label-file data/blogCatalog/bc_labels.txt --input data/blogCatalog/bc_adjlist.txt --graph-format adjlist --output vec_all.txt --q 0.25 --p 0.25
在 Cora 網路上執行「gcn」,並在多標籤節點分類任務上評估學習表徵,在這個專案的主目錄上執行以下命令:
python src/main.py --method gcn --label-file data/cora/cora_labels.txt --input data/cora/cora_edgelist.txt --graph-format edgelist --feature-file data/cora/cora.features --epochs 200 --output vec_all.txt --clf-ratio 0.1
特定選項
DeepWalk 和 node2vec:
- number-walks,每個節點起始的隨機行走數目;預設值為 10;
- walk-length,每個節點起始的隨機行走步長;預設值為 80;
- workers,平行處理的數量;預設值為 8;
- window-size,skip-gram 模型的 window-size;預設值為 10;
- q,只用於 node2vec;預設值為 1.0;
- p,只用於 node2vec;預設值為 1.0;
LINE:
- negative-ratio,預設值為 5;
- order,1 為 1 階模型,2 為 2 階模型;預設值為 3;
- no-auto-stop,訓練 LINE 時不使用早期停止法;訓練 LINE 的時候,對每個 epoch 計算 micro-F1。如果當前的 micro-F1 小於上一個,訓練過程將使用早期停止法;
GraRep:
- kstep,使用 k-step 轉移概率矩陣(確保 representation-size%k-step == 0);
TADW:
- lamb,lamb 是 TADW 中控制正則化項的權重的引數;
GCN:
- feature-file,節點特徵的檔案;
- epochs,GCN 的訓練 epoch 數;預設值為 5;
- dropout,dropout 率;
- weight-decay,嵌入矩陣的 L2 損失的權重;
- hidden,第一個隱藏層的單元數量;
輸入
支援的輸入格式是邊表(edgelist)或類鄰接表(adjlist):
edgelist: node1 node2 <weight_float, optional>
adjlist: node n1 n2 n3 ... nk
預設圖為非定向、未加權。這些選項可以通過設定合適的 flag 進行修改。
如果該模型需要額外的特徵,支援的特徵輸入格式如下(feature_i 指浮點):
node feature_1 feature_2 ... feature_n
輸出
帶有 n 個節點的圖的輸入檔案有 n+1 行。第一行的格式為:
num_of_nodes dim_of_representation
下面 n 行的格式為:
node_id dim1 dim2 ... dimd
其中,dim1, ... , dimd 是 OpenNE 學到的 d 維表示。
評估
如果你想評估學得的節點表徵,你可以輸入節點標籤。它將使用一部分節點(預設:50%)來訓練分類器,在剩餘的資料集上計算 F1 得分。
支援的輸入標籤格式為:
node label1 label2 label3...
與其他實現進行對比
執行環境:CPU: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
我們展示了在不同資料集上對不同方法的節點分類結果。我們將表徵維度設定為 128,GraRep 中的 kstep=4,node2vec 中 p=1,q=1。
注意:GCN(半監督 NE 模型)和 TADW 需要額外的文字特徵作為輸入。因此,我們在 Cora 上評估這兩個模型,Cora 的每個節點都有文字資訊。我們使用 10% 的標註資料來訓練 GCN。
BlogCatalog:10312 節點,333983 邊緣,39 標籤,非定向:
- data/blogCatalog/bc_adjlist.txt
- data/blogCatalog/bc_edgelist.txt
- data/blogCatalog/bc_labels.txt
Wiki:2405 節點,17981 邊緣,19 標籤,定向:
- data/wiki/Wiki_edgelist.txt
- data/wiki/Wiki_category.txt
cora:2708 節點,5429 邊緣,7 標籤,定向:
- data/cora/cora_edgelist.txt
- data/cora/cora.features
- data/cora/cora_labels.txt
引用
如果 OpenNE 對你的研究有用,請考慮引用以下論文:
@InProceedings{perozzi2014deepwalk,
Title = {Deepwalk: Online learning of social representations},
Author = {Perozzi, Bryan and Al-Rfou, Rami and Skiena, Steven},
Booktitle = {Proceedings of KDD},
Year = {2014},
Pages = {701--710}
}
@InProceedings{tang2015line,
Title = {Line: Large-scale information network embedding},
Author = {Tang, Jian and Qu, Meng and Wang, Mingzhe and Zhang, Ming and Yan, Jun and Mei, Qiaozhu},
Booktitle = {Proceedings of WWW},
Year = {2015},
Pages = {1067--1077}
}
@InProceedings{grover2016node2vec,
Title = {node2vec: Scalable feature learning for networks},
Author = {Grover, Aditya and Leskovec, Jure},
Booktitle = {Proceedings of KDD},
Year = {2016},
Pages = {855--864}
}
@article{kipf2016semi,
Title = {Semi-Supervised Classification with Graph Convolutional Networks},
Author = {Kipf, Thomas N and Welling, Max},
journal = {arXiv preprint arXiv:1609.02907},
Year = {2016}
}
@InProceedings{cao2015grarep,
Title = {Grarep: Learning graph representations with global structural information},
Author = {Cao, Shaosheng and Lu, Wei and Xu, Qiongkai},
Booktitle = {Proceedings of CIKM},
Year = {2015},
Pages = {891--900}
}
@InProceedings{yang2015network,
Title = {Network representation learning with rich text information},
Author = {Yang, Cheng and Liu, Zhiyuan and Zhao, Deli and Sun, Maosong and Chang, Edward},
Booktitle = {Proceedings of IJCAI},
Year = {2015}
}
@Article{tu2017network,
Title = {Network representation learning: an overview},
Author = {TU, Cunchao and YANG, Cheng and LIU, Zhiyuan and SUN, Maosong},
Journal = {SCIENTIA SINICA Informationis},
Volume = {47},
Number = {8},
Pages = {980--996},
Year = {2017}
}