文章目录
  1. 1. 图网络介绍
    1. 1.1. 图网络符号定义
    2. 1.2. 图类型划分
    3. 1.3. 图神经网络与图嵌入学习
    4. 1.4. Graph Embedding学习框架
    5. 1.5. Graph Embedding方法汇总
  2. 2. 图表示学习算法
    1. 2.1. Shallow Embedding
    2. 2.2. Deep Embedding
      1. 2.2.1. Neighborhood autoencoder methods
      2. 2.2.2. Neighborhood aggregation and convolutional encoders
    3. 2.3. metapath2vec
  3. 3. 图表示学习应用
    1. 3.1. 向量召回
    2. 3.2. Query改写
    3. 3.3. i2i/u2i标签
  • author: zhouyongsdzh@foxmail.com
  • date: 2018-12-01
  • weibo: @周永_52ML

本章关键词:多层感知机、全连接层、Softmax、激活函数、池化层、BatchNorm、注意力机制、Pooling、Embedding等

图网络介绍

图网络符号定义

符号 含义
$G$ 输入的图网络
$\mathcal{V}, \mathcal{E}$ 分别表示图$G$的节点集合和边集合
$\mathcal{O}, \mathcal{R}$ 分别表示图$G$的_节点类型_集合和_边类型_集合
$\mathcal{A}$ 图$G$的属性集合
$n, m$ 分别表示图$G$的节点数、边数
$r$ 一条边的类型
$\mathcal{v}$ 图中一个节点
$\mathcal{N}$ 一个节点相同边类型下的邻居集合
$h, g$ 表示转换函数
$x$ 一个节点的属性

图类型划分

从图节点的类型和边的类型角度,可以将图划分为如下几类:

图类型 物理意义 数学定义 备注
同构图
(Homogeneous Network)
节点和边均是一种类型 $G=\{\mathcal{V}, \mathcal{E}\}$
$ \Vert \mathcal{O} \Vert + \Vert \mathcal{R} \Vert = 2$
异构图
(Heterogeneous Network)
节点或边的类型大于一种 $G=\{\mathcal{V}, \mathcal{E}\}$
$\Vert \mathcal{O} \Vert + \Vert \mathcal{R} \Vert > 2$
多路异构图
(Multiplex Heterogeneous Network)
节点类型多于1类&&边的类型大于1类 $G=\{\mathcal{V}, \mathcal{E}\}$
$\Vert \mathcal{O} \Vert \ge 2, \Vert \mathcal{R} \Vert \ge 2$
节点带属性的图
(Attributed Network)
节点带属性特征 $G=\{\mathcal{V}, \mathcal{E}, \mathcal{A} \}$
$A = \{x_i \vert v_i \in \mathcal{V} \}$
节点带属性的多路异构图
(Attributed Multiplex Heterogeneous Network, AMHN)
节点带属性&&节点类型多于1类&&边的类型大于1类 $G=\{\mathcal{V}, \mathcal{E}, \mathcal{A}\}$
$\Vert \mathcal{O} \Vert \ge 2, \Vert \mathcal{R} \Vert \ge 2$
$A = \{x_i \vert v_i \in \mathcal{V} \}$

AMHN的场景如推荐系统: 节点类型:user, item; 边类型:点击,收藏,下单等;user属性:性别,年龄,职业等;item属性:类型,标题,评分等;

问题:从图节点和边的类型角度,图网络可以划分为哪些类型?

图神经网络与图嵌入学习

图神经网络与图嵌入学习

表示学习目标是学习一个mapping函数,将图中节点映射到同一个嵌入空间得到向量表示,并且能保留在原图空间中节点之间的相关性。学习到的向量用于下游任务。

图$G = \{\mathcal{V}, \mathcal{E}, \mathcal{A} \}$包含三类信息:

  • 节点信息:欧式结构,可以用矩阵$X$表示,维度$n \times d$,$n$表示节点数,$d$表示特征长度;
  • 结构信息:非欧结构,图特征的边特征,一般用邻接矩阵$A$表示;
  • 属性信息:节点带的属性特征(Graph也可以没有该部分信息);

图嵌入(Graph Embedding)学习的目标是:把$X$和$A$中包含的节点或子图信息映射到$d$维空间$z \in R^d$,并且$d \ll n$。

传统方法都是把mapping当作pre-processing任务,而基于深度学习的图表示学习是把mapping当作任务的一部分,采用data-driven的方法来encode图结构信息。

本章我们主要讨论Graph Embedding。

Graph Embedding学习框架

Graph Embedding(图嵌入学习,简称GE) 是为图中的节点学习隐含关系的表示向量,在一个低维连续向量空间中对节点间的关联关系进行编码,并使向量在低维空间上的距离能够反映节点在图中“近似”程度。 它遵循Encoder-Decoder学习框架。

Encoder-Decoder Framework

将图节点映射到低维嵌入向量空间的学习过程,可以使用Encoder-Decoder Framework来建模。

  • Encoder阶段:把节点$v$编码到低维embedding向量,即$\text{ENC}: \mathcal{V} \rightarrow R^{d}$
  • Decoder阶段:根据实际任务解码embedding到高维表示,即从向量化的信息中重建(reconstruction)图网络结构和节点属性,常用的是pairwise decoder。 即$\text{DEC}: R^d \times R^d \rightarrow R^{+}$

pairwise decoder对于embeddings $(z_i, z_j)$可以计算相似度,如果和原节点$(v_i, v_j)$相似度一样,那么说明我们重建了原图(只不过是在embedding空间中实现了原图的表示),数学表示为:

$$
\text{DEC} (\text{ENC}(v_i), \text{ENC}(v_i)) = \text{DEC}(z_i, z_j) \approx \mathcal{S}_{\mathcal{G}} (v_i, v_j)
$$

其中,$\mathcal{S}_{\mathcal{G}}$是人为设置的一种节点间相关性度量函数。根据similarity function是确定性方法还是概率性方法,可以进一步分为基于矩阵分解的算法(factorization based)和基于随机游走的算法(node2vec,metapath等)。

优化目标

最小化embeddings与原节点相似度差异,即

$$
\mathcal{L} = \sum_{(v_i, v_j) \in \mathcal{D}} \mathcal{l} \left(\text{DEC}(z_i, z_j), \mathcal{S}_{\mathcal{G}}(v_i, v_j) \right)
$$

采样后的样本表示原图,DL模型的损失函数表示encoding前后的差异。

学习组件

Encoder-Decoder学习框架包含以下4个组件,即:

  • pairwise similarity function: 节点间相似度度量函数$\mathcal{S}_{\mathcal{G}}$(即采样、样本生成的过程);
  • encoder function: 训练节点embedding,包含训练参数;
  • decoder function: 根据embedding重建pairwise相似度,一般不包含训练参数;
  • loss function: 损失函数;

总结:图节点embedding向量学习的具体方法都遵循Encoder-Decoder学习框架,原空间到映射空间再重构原空间,decoder都是基于pairwise。不同的图表示学习方法主要体现在以上4个组件的实现差异。

Graph Embedding方法汇总

  • Shallow Embedding
  • Deep Embedding

图表示学习算法

Shallow Embedding

shallow embedding方法有2个共同的特点:

  1. encoder非常简单,就是一层embedding_lookup
  2. decoder都是基于pairwise的方法(区别于deep embedding的decoder实现);

shallow embedding算法之间的差异主要体现在decoder,similarity function以及相应的loss function。

根据similarity function是确定性方法还是概率性方法,可以Shallow embedding进一步分为基于矩阵分解的算法(Factorization based)和基于随机游走的算法(Node2vec,metapath等)。

shallow learning方法的主要区别是采样、样本生成过程的的不同。

Shallow Embedding方法的缺点

  • encoder只是基于node id简单的embedding lookup,没有共享参数(??),复杂度和图节点规模相关($O(\vert V \vert)$);
  • encoder没办法利用节点属性信息
  • transductive--直推式,泛化能力不行,无法得到未出现过node的embedding;

Node2vec Walk

Node2vec是介于DFS和BFS之间的随机游走方式,已经被证明在GE上有很好的效果。

Deep Embedding

Deep Embedding的主要特点是encoder使用DL方法,而不是简单的embedding lookup。

Neighborhood autoencoder methods

代表方法:DNGR, SDNE

Deep Neural Graph Representations(DNGR),Structural Deep Network Embeddings(SDNE)主要解决shallow embedding第1个缺点;

思路:利用DL中经典的autoencoder来学习图自身的特征,使用_Unary Decoder_(注:区别于shallow方法的pairwise decoder)。

$$
\text{DEC}(\text{ENC}(s_i)) = \text{DEC}(z_i) \approx s_i
$$

// TODO 插图

Neighborhood aggregation and convolutional encoders

代表方法:GraphSage, GCN

思路:聚合节点本地邻居的信息来产生节点embedding。

// TODO aggregate插图

Aggregation方法能够利用节点属性信息(side information),可以解决第2个缺点;

因为能利用局部邻居的信息来表达节点embedding,所以也称之为convolutional方法。

Encoder Convolutional方法的重点,包括aggregate和combine方法,详见algorithm1
Decoder&Loss 可以使用shallow方法提到的任意decoder和loss;

// TODO algorithm1算法为代码

Encoder算法解读:求节点$v$第$k$层的表示$h_v^k$:

  • 先求节点$v$邻居的第k层表示$h_{\mathcal{N}(v)}^k$,即aggregate所有第k-1层邻居$u$的表示$h_{u}^{k-1}$;
  • 再combine节点$v$邻居的第k层表示$h_{\mathcal{N}(v)}^k$和节点$v$第k-1层表示$h_v^{k-1}$。

整体是一个K轮迭代,每轮迭代,节点从他们的局部邻居聚合信息,并且随着多轮迭代,节点会从越来越远的地方获得信息。

因为aggregate函数和参数矩阵在生成所有节点的embedding中都是共享的,所以aggregation方法对节点的泛化性更好,可以解决shallow方法第3个缺点。

不同方法的区别主要在于algorithm1中的aggregate和combine方法的改进。

GraphSage

// TODO

metapath2vec

对异构图来说,常见的处理策略是:对不同类型的边使用不同的encoder;decoder对不同类型的边 学习各自的参数;

$$
\text{DEC}_{\eta}(z_i, z_j) = z_i^T A_{\eta} z_j
$$

其中,$\eta$表示不同的边类型,$A_{\eta}$表示根据不同的边类型学习不同的参数。

另一种处理策略是metapath, 可以简单复用很多同构图的算法。

metapath是数据挖掘韩家炜团队提出的一种异构图挖掘方法,metapath根据节点类型定义了一条采样路径,节点类型A到节点类型B的跳转概率由连接B的数量的倒数决定。见论文《》

metapath2vec是Deepwalk的扩展,适用于异构网络。为了构建随机漫游,metapath2vec使用基于元数据的漫游来捕获不同类型节点之间的关系。对于来自随机游走序列的学习表示,他们提出异构skip-gram,其在模型优化期间考虑节点类型信息。

问题:metapath对比randomwalk的优势是什么?

答:随机游走从局部上一定程度保持了节点与它邻居之间的连接性,即网络结构信息;然而对于异构信息网络来说,由于节点与连接的异质性的存在,所以异构network embedding最大的难点在于如何有效地在多种类型节点之间保存“节点上下文”的概念

metapath基于预先指定的元路径进行随机游走,构造路径,从而能够保持“节点上下文”的概念。

问题:metapath2vec和metapath2vec++的区别?

在得到随机游走路径后,就可以进行skip-gram建模。metapath2vec与metapath2vec++唯一的不同是skip-gram不同。在metapath2vec中,softmax值是在所有节点无论什么类型上进行归一化;而metapath2vec++,softmax值是在相同类型节点上进行归一化。

图表示学习应用

向量召回

异构图构建

注意⚠:item node必须要添加品类、店名等属性特征,否则各种关系学不出来,会被假定为模型无效。 异构图数据可以融合更多业务的数据,无需局限于某一部分。

节点类型 量级 备注
ITEM_NODE 3100W 必需加属性特征
QUERY_NODE 2800W
节点类型 量级 备注
ITEM_ITEM_EDGE(coclick) 2亿 用户行为边
QUERY_ITEM_EDGE 2.2亿(首页曝光) 仅考虑点击,只有4200W
QUERY_QUERY_EDGE(cosession) 2.2亿 session query cnt < 2过滤后,剩余5000W;
用户行为边

最后完成数据清洗后,异构图包含约5000万节点,8亿条边;

图数据采样参数以及样本量:

1
2
3
4
5
query_query_sample_num: 20,
query_poi_sample_num: 2000,
ITEM_ITEM_sample_num: 20,
num_epochs = 1,
样本量:172亿

训练情况:参数量180亿,资源50worker,20ps;耗时10小时;

图学习-样本构造

目标:基于异构图,生成训练样本(即对图进行采样) ,即$随机游走 \rightarrow 滑动窗口生成 \rightarrow 负采样negs$

问题:样本构造过程是对应encoder阶段吗???

答:并不是,是图相似度度量过程,采样得到的训练样本仍然是异构图数据。图节点node到embedding的过程才是encoder阶段。

方法1:采用基于Node2Vec论文中提出的随机游走方法进行采样(正例)

  • 对每一个源节点和它的特定一种出边类型,进行固定长度的随机游走,然后通过滑动窗口的方式生成$<\text{node}_{src}, \text{node}_{pos}>$的pair结构样本;
  • 训练的优化目标:最大化$<\text{node}_{src}, \text{node}_{pos}>$的概率,可以采用Negative Sampling来计算Softmax。在Negative Sampling时,负例根据$\text{node}_{pos}$的类型,在全局同类型节点上进行采样得到,每个$<\text{node}_{src}, \text{node}_{pos}>$采样5个负例(最好是同类型&&同品类),得到最终的训练样本:$$<\text{node}_{src}, \text{node}_{pos}, \text{node}_{neg0}, \text{node}_{neg1}, \cdots, \text{node}_{neg4}>$$

由于在node特征方面使用了品类特征,如果$\text{node}_{pos}$和$\text{node}_{neg}$的品类不同,模型会轻易地学到使用品类特征区分正负例,弱化了其他特征的学习程度,导致了模型能轻易地区分不同品类的节点,而在同品类节点中区分度不好。为了防止这个问题,在负例采样时,限定$\text{node}_{neg}$的品类必须和$\text{node}_{pos}$一致(弱相关性保证)。另外,负采样时使用节点的权重进行Alias采样,保证与正例分布一致(分不一致性)

问题:GraphSage生成训练数据的逻辑是怎样的?

答:embedding学习不仅使用了自身node信息,也使用了邻居节点信息,那么在embedding学习时对邻居节点进行了考虑(aggregator,combine方法);

可以在采样构造样本时填充邻居信息(具体实现时,考虑考虑提前拿到每一个node的邻居信息,然后与采样后的样本进行join,得到最终的样本,再训练图模型???)

图采样参数:

1
2
random walk length: 8
window size: 4

模型结构

异构图建模思路可以很直接,即在encoder阶段对每种节点和边的类型都构建相应的一个网络,以便更好的学习到节点的表示。

所以,模型的基础结构为多塔DNN,对于$(node_{src}, node_{pos}, node_{neg0}, node_{neg1}, \cdots, node_{neg4}>$这样一条样本,每个节点通过DNN网络生成一个向量,最后最大化$<node_{src}, node_{pos}$的概率。即:

$$
\begin{align}
X &= \exp(cos(vector_{src}, vector_{pos})) \\\
Y &= \exp(cos(vector_{src}, vector_{pos})) + \sum_{i=0}^4 \exp(cos(vector_{src}, vector_{neg i})) \\\
P(pos|src) &= \frac{X}{Y} \\\
loss &= -\frac{1}{N} \sum \log(P(pos|src))
\end{align}
$$

其中,src节点包括Query和Item两种类型,

  • 对于$src_{query}$节点,有两种出边类型,分别是${edge}_{query}$和${edge}_{poi}$;
  • 对于$src_{poi}$节点,有两种出边类型,分别是${edge}_{query}$和${edge}_{poi}$;

对每种类型的src节点和其对应的出边类型,都构建一个单独的DNN网络,所以src节点的网络一共有4个,分别是:$DNN_{query, {edge}_{query}}^{src}, DNN_{query, {edge}_{poi}}^{src}, DNN_{poi, {edge}_{query}}^{src}, DNN_{poi, {edge}_{poi}}^{src}$

pos节点和neg节点也包括Query和Poi两种类型,但为了让src节点的DNN网络学习的向量能够映射到统一的空间,没有考虑边类型,所以一共有两种DNN网络:$DNN_{query}^{target}, DNN_{poi}^{target}$

许多Graph Embedding方法仅使用nodeid进行embedding,会遇到冷启动问题,并且节点权重的的不同也会导致冷门节点在采样和训练过程中不充分,导致生成的向量偏差较大。所以这里可以考虑不使用nodeid而是使用每个node对应的泛化特征,比如item节点有品类、地域等特征,Query有单字、分词等特征,使用这些泛化特征可以有效缓解冷门节点问题,并解决了冷启动问题,即异构图中未出现的节点,可以根据它的泛化特征立即生成向量。

同时,每种类型的节点对应的特征种类不同,具体的DNN结构也可以不同。

  • Query原节点:基于字粒度和词粒度的LSTM-RNN网络(unigram/bigram/trigram level lstm+ 2-layers fc (128维));
  • Item原节点:采用Embedding+MLP的网络,特征方面使用itemid、类别id、top搜索短语、top搜索词等特征(embedding + 2-layers fc(relu, 128维));
  • Query目标节点:queryid -> sparse embedding;
  • Item目标节点:itemId, 类别id等 -> embedding sum polling;

因为每个src节点对应不同的出边类型学习单独的DNN网络,比如Query节点有两个DNN网络,$DNN_{query, {edge}_{query}}^{src}$和$DNN_{query, {edge}_{poi}}^{src}$,两个网络分别生成单独的向量,每种类型的向量可以在不同维度刻画相关性,这里我们使用attention方式将多个向量融合成一个向量。

具体attention的方式为,每种边类型有一个权重向量,$weight_{query}$和$weight_{poi}$,以Query节点为例,$DNN_{query, {edge}_{query}}^{src}$和$DNN_{query, {edge}_{poi}}^{src}$生成的向量分别为$vector_{query,{edge}_{query}}$和$vector_{query,{edge}_{poi}}$,最后attention融合成的向量为:

$$
\begin{align}
vector_{query} &= \alpha_{edge_{query}} \cdot vector_{query, {edge}_{query}} + \alpha_{edge_{poi}} \cdot vector_{query, {edge}_{poi}} \\\
W_{query} &= exp(weight_{query}^T \cdot vector_{query, {edge}_{query}}) \\\
W_{poi} &= exp(weight_{poi}^T \cdot vector_{query, {edge}_{poi}}) \\\
\alpha_{edge_{query}} &= \frac{W_{query}}{W_{query} + W_{poi}} \\\
\alpha_{edge_{poi}} &= \frac{W_{poi}}{W_{query} + W_{poi}}
\end{align}
$$

注意:Hexo不支持3层大括号的解析,应改为\alpha_{edge_{query}}

训练优化

不同于基于TensorFlow DataSet的数据读取流程,图学习需要使用采样来产生训练数据,常用的采样训练方式为${op}_{sample} \rightarrow {op}_{train}$。

由于采样和训练是同步操作,采样速度严重制约训练性能。而TensorFlow Dataset内部使用异步读取机制,将数据读取和训练异步化,可以大大加快训练效率。为了将采样和训练异步化,我们使用TensorFlow提供的Queue机制将采样和训练隔离,即${op}_{sample} \rightarrow Queue \rightarrow {op}_{train}$,采样产生的数据写入Queue,训练Op从Queue里读取数据,两者使用不同的线程异步执行,有效解决了采样瓶颈导致的训练效率下降问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 核心代码逻辑
queue = tf.RandomShuffleQueue(
capacity=capacity,
min_after_dequeue=min(int(0.1*capacity), 10*batch_size),
dtypes=[tf.int64, tf.int64, tf.int64],
shapes=[[1], [1], [5]], # 分别表示src,pos,neg0,...,neg4 数据shape
shared_name='queue')
src_sample, pos_sample, negs_sample = self.random_walk()
enqueue = queue.enqueue_many([src_sample, pos_sample, negs_sample])
qr = tf.train.QueueRunner(queue, [enqueue] * 4)
tf.train.add_queue_runner(qr)
src, pos, negs = queue.dequeue_many(batch_size)
loss = model_forward(src, pos, negs) # encoder,decoder,loss实现
opt = tf.train.AdamOptimizer(learning_rate=0.0001)
train_op = opt.minimize(loss)

效果评估

  • 评估指标可以是AUC,可以在Query-Poi相关性数据集上计算auc(label为相关或不相关);或者在ctr数据上计算单特征auc。
  • 也可以采用检索排序的MRR指标(?)。

线上架构逻辑

  • 向量索引:使用faiss建立向量索引;
  • 预估阶段:抽取query特征,调用saved model的模型,走Query网络得到query向量;
  • 检索阶段:通过faiss提供的相似度近似计算,获取与query向量相似度最高的topK个item;设定相关性门槛过滤掉低分item;

不同的业务对于相关性门槛的要求不同,通常$相关性_{搜索广告}>相关性_{推荐广告}$。

基于LsHNE模型的向量召回

参考阿里妈妈Euler LsHNE实现:LsHNE模型

模型特点:属于shallow embedding,因为node2vec采样,图节点embedding是基于本节点自身的特征得到,缺乏对邻居节点信息的有效利用

模型效果(_使用Tensorflow提供的向量可视化工具对抽样数据进行观察_):

  • poi-poi关系非常好,成簇分布;(使用TF向量检索可视化);
  • query-query关系大部分可以,由少量case,session query cnt过滤后,效果略好;
  • query-poi 综合整体较好,跨品类case少,美食三级品类效果不佳;

基于GraphSage的向量召回

  • _出发点_:相对LsHNE模型,图节点embedding学习充分使用了邻居信息,从而更好的学习异构图的结构信息,产生的向量在离线评估指标和小流量实验均得到了验证。

使用邻居信息的模型主要有Graph Convolutional Network(GCN)和Graphsage。GCN使用卷积将邻居信息带权加和,而Graphsage模型在邻居家信息汇总的方式上更加灵活,包括mean aggregater, sum pooling aggregator, lstm aggregator等。

Graphsage生成embedding的方法:使用节点的特征,通过DNN模型生成每个节点向量,然后将每个节点3阶以内的邻居的向量汇聚(aggregator方法),将汇聚后的邻居向量与本节点向量拼接(combine方法),通过FC网络生成最终向量。

注意:建模时,邻居节点仅对src网络生效,无需对target节点使用邻居信息

离线评估:只有query-item相关性auc指标与线上指标有正相关关系,其它的auc指标与线上效果不一致。

_query-item相关性auc指标_:统计一段时间内query-item pair的点击率,截取ctr高的部分作为正类,截取ctr低的部分作为负类,中间部分丢弃。

_向量可视化_:item向量使用TF PCA降维后可视化对比,marge-softmax相比softmax可以是的poi不同簇间分割距离更大,效果看似会更好。

margin-softmax ??? (总结至《深度学习》chapter2)

1
2
3
Neighbor aggregator参数:
汇聚层数:2跳内邻居;
每层采样邻居数目:6

基于GraphSage的Query改写

异构图可以用Query和Item两种节点,用session,click, co-click描述节点之间的关系,采用随机游走(如node2vec)的方式构造样本,最终模型学习到每个节点的向量表示。

_向量内积可以刻画节点间相关性:向量召回使用的是Query-Item的向量内积,Query改写则使用的是Query-Query向量内积,因为Query生成向量的模型是基于字粒度的LSTM,泛化性比较好,改写node也可以生成一个向量表示,所以可以计算Query与候选Node的相关性。_

基于多任务联合学习的向量召回

出发点:基于用户行为去构建异构图时,图中节点会丢失当时的上下文信息,比如Query节点不能包含Query检索时的时间/地点/用户等信息,导致_基于图模型的向量召回无法随上下文变化去召回不同的广告_,所以,可以尝试对图模型引入上下文信息,提升向量召回的动态召回能力,进而提升召回质量。

  • 图模型特点

多路异构图,多种相关性定义;但是样本丢失context信息(Query时间,城市等);很好的刻画与context无关的静态相关性;

  • 双塔模型特点

曝光点击数据,相关性单一;偏向学习CTR,相关性较差;样本包含context信息;可以学到context动态相关性;

  • 联合学习:综合图模型与双塔模型的优点

    • 异构图学习context无关的多种静态相关性;
    • 双塔模型基于图的静态相关性,继续finetune,学习context下的动态相关性;
  • 联合训练

    • 图模型预训练+双塔模型微调。问题:双塔模型容易微调过度,导致最终更偏向于CTR学习;
    • 同时训练:MTL任务,需要考虑优化目标是否兼容,loss设计等;
  • 技术方案

图模型学习出的向量表示,在相关性刻画上比较好,但向量中不包含上下文等动态变化的特征,属于_静态向量_。双塔模型是基于曝光点击数据训练,能够在模型中包含上下文动态特征,但双塔学习出的向量更偏向于_召回点击率高的item_,在搜索场景下,不满足相关性的标准。因此,这里尝试使用多任务联合学习的方法,将双塔模型与图模型联合学习,在保证相关性的同时能够引入上下文特征。

  1. 首先,由图模型输出Query向量和Item静态向量;
  2. 然后,Query向量再结合上下文特征的embedding,通过双塔DNN生成一个包含上下文信息的动态Query向量;
  3. 最后,与POI静态向量计算双塔模型的logloss。

联合学习的损失函数:图模型的logloss+双塔logloss。

  • 模型训练

仍使用整体数据构造异构图,图模型仍是Graphsage。双塔部分使用一周自然数据,context特征可以使用时间、GeoHash和用户特征。

50worker+20ps,6epoch,耗时4day。_主要耗时在于每条样本的Query和Item会在途中采样多跳的邻居向量并汇总_。(问题:是否可以提前采样,将邻居信息放在采样样本中,再训练图模型)

_Graphsage模型产生的节点向量因为涉及邻居节点,无法在线实时预测_,可以离线计算好保存在redis中,线上只需要实时预测动态Quuery向量即可。

  • 离线评估

_召回率_:使用自然曝光一天数据评估,对于每个请求,计算$\frac{交集(向量top10,自然曝光top10)} {num(曝光top10)}$,反映了向量召回的正例召回能力;
_NDCG@10_:NDCG@10(向量top10,自然曝光top10),反映了向量召回的相关性排序情况。

召回率:Graphsage0.3784, MTL0.3778;
NDCG@10:Graphsage0.7892, MTL0.8084

向量召回有效补充已有召回策略

  • 曝光请求+10.5%;
  • 曝光广告量+4.9%;
  • 所有请求密度2.2,有向量召回策略的请求密度2.58;

Query改写

常见的Query改写策略有:NER改写、短语改写、同义词改写、CF改写、W2V改写以及与业务相关的GeoHash改写等。基于大规模异构图产生的多种节点的相关性,其中query-item相关性可用于向量召回,query-query之间的相关性可以用于线上Query改写(产生一份改写词典),通过提升召回率来提升广告系统变现效率。

主要工作有:

  1. 初始node集合:基于广告日志一个月的历史query和node词,通过共同展现item,为每个query挖掘出候选node;
  2. 过滤:通过query和node的二级品类初步过滤掉品类不匹配的node;
  3. 相关性计算:调用异构图Graph Embedding模型中的query-query相关性部分,预测<query, node>的相关性分数;
  4. 根据相关性阈值对node过滤,为每个query选出分数最高的Top20 node用于线上改写;
  5. 线上应用:新增GraphEmbeddingDict词典用于线上query改写(需要设定matchLevel等级)。

业务目标:在保持ctr不降的前提下,提升item召回率,进一步提高RPS;

i2i/u2i标签

相对于共现/协同过滤,GE做i2i/u2i标签的优势有哪些?

  1. GE更能利用图的结构信息。共现与协同过滤仅考虑了图中一二阶关系,GE可以通过随机游走的等采样方法,更好挖掘图中的结构信息(三阶or更高阶);
  2. GE特征更佳丰富。共现与CF只考虑id特征,比较稀疏,GE可以融入更佳丰富的特征,有效提升泛化能力;
  3. GE扩展性更好。共现与CF是一种比较直观的优化,GE可以结合业务场景设计适合的模型,扩展性更好。
文章目录
  1. 1. 图网络介绍
    1. 1.1. 图网络符号定义
    2. 1.2. 图类型划分
    3. 1.3. 图神经网络与图嵌入学习
    4. 1.4. Graph Embedding学习框架
    5. 1.5. Graph Embedding方法汇总
  2. 2. 图表示学习算法
    1. 2.1. Shallow Embedding
    2. 2.2. Deep Embedding
      1. 2.2.1. Neighborhood autoencoder methods
      2. 2.2.2. Neighborhood aggregation and convolutional encoders
    3. 2.3. metapath2vec
  3. 3. 图表示学习应用
    1. 3.1. 向量召回
    2. 3.2. Query改写
    3. 3.3. i2i/u2i标签