清華大學釋出OpenNE:用於網路嵌入的開源工具包

劉曉坤發表於2017-10-28
為了方便大家對網路表示學習(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 選項,請輸入以下命令:

  1. 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」,評估多標籤節點分類任務上的學習表徵,並在這個專案的主目錄上執行以下命令:

  1. 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」,並在多標籤節點分類任務上評估學習表徵,在這個專案的主目錄上執行以下命令:

  1. 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):

  1. edgelist: node1 node2 <weight_float, optional>

  2. adjlist: node n1 n2 n3 ... nk

預設圖為非定向、未加權。這些選項可以通過設定合適的 flag 進行修改。

如果該模型需要額外的特徵,支援的特徵輸入格式如下(feature_i 指浮點):

  1. node feature_1 feature_2 ... feature_n

輸出

帶有 n 個節點的圖的輸入檔案有 n+1 行。第一行的格式為:

  1. num_of_nodes dim_of_representation

下面 n 行的格式為:

  1. node_id dim1 dim2 ... dimd

其中,dim1, ... , dimd 是 OpenNE 學到的 d 維表示。

評估

如果你想評估學得的節點表徵,你可以輸入節點標籤。它將使用一部分節點(預設:50%)來訓練分類器,在剩餘的資料集上計算 F1 得分。

支援的輸入標籤格式為:

  1. 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

清華大學釋出OpenNE:用於網路嵌入的開源工具包

Wiki:2405 節點,17981 邊緣,19 標籤,定向:

  • data/wiki/Wiki_edgelist.txt
  • data/wiki/Wiki_category.txt

清華大學釋出OpenNE:用於網路嵌入的開源工具包

cora:2708 節點,5429 邊緣,7 標籤,定向:

  • data/cora/cora_edgelist.txt
  • data/cora/cora.features
  • data/cora/cora_labels.txt

清華大學釋出OpenNE:用於網路嵌入的開源工具包

引用

如果 OpenNE 對你的研究有用,請考慮引用以下論文:

  1. @InProceedings{perozzi2014deepwalk,

  2.  Title                    = {Deepwalk: Online learning of social representations},

  3.  Author                   = {Perozzi, Bryan and Al-Rfou, Rami and Skiena, Steven},

  4.  Booktitle                = {Proceedings of KDD},

  5.  Year                     = {2014},

  6.  Pages                    = {701--710}

  7. }

  8. @InProceedings{tang2015line,

  9.  Title                    = {Line: Large-scale information network embedding},

  10.  Author                   = {Tang, Jian and Qu, Meng and Wang, Mingzhe and Zhang, Ming and Yan, Jun and Mei, Qiaozhu},

  11.  Booktitle                = {Proceedings of WWW},

  12.  Year                     = {2015},

  13.  Pages                    = {1067--1077}

  14. }

  15. @InProceedings{grover2016node2vec,

  16.  Title                    = {node2vec: Scalable feature learning for networks},

  17.  Author                   = {Grover, Aditya and Leskovec, Jure},

  18.  Booktitle                = {Proceedings of KDD},

  19.  Year                     = {2016},

  20.  Pages                    = {855--864}

  21. }

  22. @article{kipf2016semi,

  23.  Title                    = {Semi-Supervised Classification with Graph Convolutional Networks},

  24.  Author                   = {Kipf, Thomas N and Welling, Max},

  25.  journal                  = {arXiv preprint arXiv:1609.02907},

  26.  Year                     = {2016}

  27. }

  28. @InProceedings{cao2015grarep,

  29.  Title                    = {Grarep: Learning graph representations with global structural information},

  30.  Author                   = {Cao, Shaosheng and Lu, Wei and Xu, Qiongkai},

  31.  Booktitle                = {Proceedings of CIKM},

  32.  Year                     = {2015},

  33.  Pages                    = {891--900}

  34. }

  35. @InProceedings{yang2015network,

  36.  Title                    = {Network representation learning with rich text information},

  37.  Author                   = {Yang, Cheng and Liu, Zhiyuan and Zhao, Deli and Sun, Maosong and Chang, Edward},

  38.  Booktitle                = {Proceedings of IJCAI},

  39.  Year                     = {2015}

  40. }

  41. @Article{tu2017network,

  42.  Title                    = {Network representation learning: an overview},

  43.  Author                   = {TU, Cunchao and YANG, Cheng and LIU, Zhiyuan and SUN, Maosong},

  44.  Journal                  = {SCIENTIA SINICA Informationis},

  45.  Volume                   = {47},

  46.  Number                   = {8},

  47.  Pages                    = {980--996},

  48.  Year                     = {2017}

  49. }

相關文章