|时态图网络:即使很久不发朋友圈,也能知道你的新兴趣( 二 )


当一个新节点出现时 , 我们相应地添加一个初始化为零的状态向量 。 此外 , 由于每个节点的内存只是一个状态向量(而不是一个参数) , 所以当模型接收到新的交互时 , 节点在测试时间也可以进行更新 。
消息函数 。 消息函数是内存更新的主要机制 。 给定在t时刻节点i和节点 j之间的交互 , 信息函数计算出两条消息用于更新内存(一条用于节点i , 另一条用于节点 j) 。 这类似于在消息传递图神经网络中计算的消息 , 这一消息是在交互出现前的 t?时刻节点i和节点 j的内存、交互出现的时间t、边缘特征这三个变量的函数:
|时态图网络:即使很久不发朋友圈,也能知道你的新兴趣
本文插图

|时态图网络:即使很久不发朋友圈,也能知道你的新兴趣
本文插图

内存更新程序 。 内存更新程序的作用是使用新消息更新内存 。 此模块通常使用一个RNN网络来实现 。
|时态图网络:即使很久不发朋友圈,也能知道你的新兴趣
本文插图

|时态图网络:即使很久不发朋友圈,也能知道你的新兴趣
本文插图

考虑到节点的内存是一个随时间更新的向量 , 那么最直接的方法是直接将其作为节点嵌入来使用 。
然而 , 由于过期问题 , 这一方法实践起来也有弊端:由于节点只有在参与交互时才会更新其内存 , 那么节点长时间不活动就会导致其内存过期 。
举个例子 , 假设一个用户好几个月都没有登录Twitter , 当他(她)重新登录时 , 他(她)可能已经在这段时间里发展出了新的兴趣 , 导致存储着此用户过去活动的内存不再和他(她)现在的兴趣相关 。 因此 , 我们需要一种更好的方法来计算嵌入 。
嵌入 。 一个解决方案是查找临近的节点 。 为了解决过期问题 , 嵌入模块通过在与目标节点时空邻近的节点上执行图聚合来计算目标节点的时间嵌入 。
即使一个节点在一段时间内处于非活动状态 , 但与它临近的一些节点却很可能处于活动状态 , 因此通过聚合临近节点的内存 , TGN可以计算出目标节点的最新嵌入 。
在我们所举的例子中 , 即使用户一段时间不登录Twitter , 但他的朋友仍然在Twitter上保持活跃 , 所以当用户重新登录Twitter时 , 相比用户自己的历史记录 , 用户的朋友的最近活动可能与其当前兴趣更相关 。
|时态图网络:即使很久不发朋友圈,也能知道你的新兴趣
本文插图

图嵌入模块通过在与目标节点时间临近的节点上执行聚合来计算目标节点的嵌入 。 在上图中 , 当在某个时刻t(t大于t?、 t? 和 t? ,但小于 t?)计算节点1的嵌入时 , 时间临近的节点将只包括在时刻t之前出现的边 。 因此 , 节点5的边不参与计算 , 因为它是在时刻t之后才出现 。 然而 , 嵌入模块是通过聚合临近点2、3和4的特征(v)和内存(s)以及边缘上的特征来计算节点1的表征 。 在我们的实验中 , 表现最好的图形嵌入模块是图注意力(graph attention) , 它能够根据临近节点的内存、特征和交互时间来得出哪些是最重要的临近节点 。
如下图所示是TGN对一批训练数据进行的总体计算:
|时态图网络:即使很久不发朋友圈,也能知道你的新兴趣
本文插图

图示为TGN对一批训练数据进行的计算 。 一方面 , 嵌入模块使用时间图和节点内存(1)生成嵌入 , 然后使用嵌入来预测批处理交互作用并计算损失(2 , 3) 。 另一方面 , 这些预测出的交互被用来更新内存(4 , 5) 。
看了上面的图, 你可能很好奇内存相关模块(消息函数、消息聚合器和内存更新器)是如何训练的 , 因为它们似乎不会直接影响损失值 , 因此也不会接收到梯度 。


推荐阅读