Skip to content

Euler Model

Siran Yang edited this page Jan 16, 2019 · 1 revision

本节介绍tf_euler中实现的所有图表征学习模型。用户可以直接在TensorFlow中使用这些模型。

基本类型

所有的图表征学习模型均继承基类Model,而Model进一步的继承LayerLayertf_euler中封装的基本单位。Layer及其子类有三个主要函数:

class Layer(object):

  def __init__(self, name=None, **kwargs):
    """初始化元信息,以及对象所包含的其他Layer"""
    pass
  
  def build(self, input_shape):
    """初始化该对象自身会用到的模型权重,会在__call__()首次执行时被调用"""
    pass

  def call(self, inputs):
    """将该对象应用到输入中,会在__call__()执行时调用"""
    pass

所有的Model子类的call方法接受一组源顶点:1-D tf.Tensor,返回一个四元组ModelOutput,其定义为:

ModelOutput = collections.namedtuple(
    'ModelOutput', [
        'embedding', # 2-D tf.Tensor,表示输入所对应的embedding
        'loss', # 标量 tf.Tensor,表示输入所对应的loss
        'metric_name', # str,表示该模型所用评估指标名称
        'metric' # 标量 tf.Tensor,表示模型的评估指标(streaming)
    ])

所有的非监督图表征学习模型继承自类UnsupervisedModel,其本身继承Model

class UnsupervisedModel(Model):
  def __init__(self,
               node_type, # int,顶点类型,用于负采样
               edge_type, # tf.Tensor,采样目标顶点边类型(多值)
               max_id, # int,图中的最大id
               num_negs=5, # int,每个源点的负采样个数
               **kwargs):
    pass

UnsuperVisedModelcall函数对源点使用tf_euler.sample_neighbor采样正例,使用tf_euler.sample_node采样负例。然后再使用具体的encode / decode方法计算loss。

所有的监督图表征学习模型继承自SupervisedModel,其本身继承Model

class SupervisedModel(Model):
  def __init__(self,
               label_idx, # int,label在稠密特征中的编号
               label_dim, # int,label在稠密特征中的维度
               num_class=None, # int,分类个数,label为标量时必须
               sigmoid_loss=False, # bool,使用sigmoid或者softmax作为损失函数
               **kwargs):
    pass

SupervisedModelcall函数使用tf_euler.get_dense_feature从图中抽取顶点标签进行顶点分类。然后使用具体的encode / decode方法计算loss。

具体模型

tf_euler目前实现了六个常用的图表征学习算法和两个用于异构图上的表征学习算法,包含在以下的几个具体类中:

tf_euler.models.LINE( # 非监督
    node_type, edge_type, max_id, # 同基类
    dim, # int,embedding维度
    order# 1 / 2, 一阶模型 / 二阶模型,默认1
)

tf_euler.models.Node2Vec( # 非监督
    node_type, edge_type, max_id, # 同基类
    dim, # int,embedding维度
    walk_len, # int,游走长度,默认3
    walk_p, # int,回采参数,默认1
    walk_q, # int,外采参数,默认1
    left_win_size, # int,左滑动窗口长度,默认1
    right_win_size # int,右滑动窗口长度,默认1
)

tf_euler.models.GraphSage( # 非监督
    node_type, edge_type, max_id, # 同基类
    metapath, # Python列表,成员为 1-D int64 tf.Tensor,每步的边类型集合(多值)
    fanouts, # Python列表,成员为 int,每阶的采样个数
    dim, # embedding维度
    aggregator, # 汇聚类型,默认mean
    concat, # 汇聚方法,默认False
    feature_idx, # 稠密特征的编号,默认-1
    feature_dim, # 稠密特征维度,默认0
    use_feature, # 是否使用稠密特征,默认True
    use_id # 是否使用顶点id,默认False
)

tf_euler.models.SupervisedGraphSage( # 监督
    label_idx, label_dim, # 同基类
    metapath, # Python列表,成员为 1-D int64 tf.Tensor,每阶采样的边类型集合(多值)
    fanouts, # Python列表,成员为 int,每阶的采样个数
    dim, # embedding维度
    aggregator, # 汇聚类型,mean / meanpool / maxpool,默认mean
    concat, # 汇聚方法,默认False
    feature_idx, # 稠密特征的编号,默认-1
    feature_dim, # 稠密特征维度,默认0
)

tf_euler.models.ScalableGCN( # 监督
    label_idx, label_dim, # 同基类
    edge_type, # 1-D int64 tf.Tensor,边类型集合(多值)
    fanout, # int,相邻顶点采样个数
    num_layers, # int,GCN模型层数
    dim, # embedding维度
    aggregator, # 汇聚类型,默认mean
    concat, # 汇聚方法,默认False
    feature_idx, # 稠密特征的编号,默认-1
    feature_dim, # 稠密特征维度,默认0
)
# ScalableGCN需要在应用到输入后调用:
scalable_gcn.make_session_run_hook()
# 并将返回的tf.train.SessionRunHook加到tf.train.MonitoredTrainingSession当中

tf_euler.models.GAT( # 监督
    label_idx, label_dim, # 同基类
    feature_idx, # 稠密特征的编号,默认-1
    feature_dim, # 稠密特征维度,默认0
    max_id, # int,图中的最大id,默认-1
    hidden_dim, # int,隐层宽度,默认128
    nb_num, # int,相邻顶点采样数,默认5
    edge_type # int,采样的边类型集合,默认0
)
Clone this wiki locally