Open rayrayraykk opened 4 years ago
希望能够解答一下 谢谢@yangsiran @alinamimi
并且我使用
python -m tf_euler \
--data_dir ppi \
--max_id 56944 --feature_idx 1 --feature_dim 50 --label_idx 0 --label_dim 121 \
--model scalable_gcn --mode train --fanouts 10,10
训练之后,再使用
python -m tf_euler \
--data_dir ppi --id_file ppi/ppi_test.id \
--max_id 56944 --feature_idx 1 --feature_dim 50 --label_idx 0 --label_dim 121 \
--model scalable_gcn --mode evaluate --fanouts 10,10
得到PPI F1 是0.76左右,远远高于你们wiki上写的0.57而我使用fanouts 10,10,10 F1却只有0.59
最近花时间看完了Euler,来说下自己的理解: ) Motivation 首先,简单说下为什么需要缓存。对于中心节点来说,我们每个mini-batch都会计算它的各层图卷积表达(记作:H_1,..,H_k),其中H_k用于支持分类任务,H1,...,H{k-1}作为中间表达。对于经典GCN来说,我们分了mini-batch之后最大的挑战是,计算中心节点的H_1,...,H_k时需要依赖邻居节点的H1, .., H{k-1},这带来了指数级增长的计算需求。 Euler缓存的原理 Euler有2类缓存:store和gradient_store。store中按层缓存了全部节点的H1, .., H{k-1},先来说下store的更新逻辑:
那么我们为什么需要gradient_store呢? 这是因为,邻居节点的H1, .., H{k-1}均从store中直接pull出来的,并不是重新计算的,导致中心节点的supervised loss在bp的时候,梯度并不能传递到邻居节点的相关参数(邻居节点的node embedding,各层图卷积的权重W1,..,W{k-1})上。 下面说下gradient_store的更新逻辑,这里就涉及到楼主问的问题了,原谅我的长篇大论: )
As the scalablegcn code shows: