假设我们有一个表示为有向无环图(DAG)的文本文档图。文档0与文档1、2和3有一条边,为了实现可视化,这里将利用Graphbook,一个可视化的人工智能建模工具。
我们还为每个文档供应了一些节点特色。将每个文档作为单个[5] 1D文本数组放入BERT中,这样就得到了一个[5,768]形状的嵌入。
为了方便演示,我们只采取BERT输出的前8个维度作为节点特色,这样可以更随意马虎地跟踪数据形状。这样我们就有了毗邻矩阵和节点特色。
GNN层
GNN层的一样平常公式是,对付每个节点,我们取每个节点的所有邻居对特色求和,乘以一个权重矩阵,末了通过一个激活函数得到输出结果。以是这里创建一个以这个公式为标题的空缺块,并将其通报给Adj矩阵和节点特色,我将在块中实现上面说的公式。
我们将节点特色平铺(即广播)为3D形状,也就初始的[5,8]形状的节点特色,扩展成有[5,5,8]形状,个中第0维的每个单元格都是节点特色的重复。以是现在可以把末了一个维度看作是“邻居”特色。每个节点有5个可能的邻居。
由于不能直接将节点特色从[5,8]广播到[5,5,8],我们必须首先广播到[25,8],由于在广播时,形状中的每个维度都必须大于或即是原始维度。以是得到形状的5和8部分(get_sub_arrays),然后乘以第一部分得到25,然后将它们全部连接在一起。将结果[25,8]重塑回[5,5,8],结果可以在Graphbook中验证终极2维中的每个节点特色集是相同的。
下一步便是广播毗邻矩阵到相同的形状。对付第i行和col j的毗邻矩阵中的每一个1,在维数[i, j]上有一行1.0的num_feat。以是在这个毗邻关系中,在第0个单元格中第1、2和3行有一行num_feat 1.0(即[0,1:3,:])。
这里的实现非常大略,只需将毗邻矩阵解析为十进制并从[5,5]形状广播到[5,5,8]。将这个毗邻掩码与平铺节点邻居特色相乘。
我们还想在毗邻矩阵中包含一个自循环,这样当对邻居特色求和时,也包括了该节点自己的节点特色。
这样就得到了每个节点的邻居特色,个中没有被一条边连接的节点(不是邻居)的特色为零。对付第0个节点,它包括节点0到3的特色。对付第三个节点,它包括第三和第四个节点。
下一步便是重塑为[25,8],使每个相邻特色都是它自己的行,并将其通报给具有所需隐蔽大小的参数化线性层。这里隐蔽层大小是32并保存为全局常量,以便可以重用。线性层的输出将是[25,hidden_size]。以是经由重塑就可以得到[5,5,hidden_size]。
末了对中间维度(维度索引为1)求和,对每个节点的相邻特色求和。结果是经由1层的节点嵌入集[5,hidden_size],得到了一个GNN网络。
图把稳力层图把稳层关键是把稳力系数,如上式所示。从实质上讲,在运用softmax之前,我们将边缘中的节点嵌入连接起来,并通过另一个线性层。
然后利用这些把稳系数来打算与原始节点特色对应的特色的线性组合。
我们要做的是为每个邻居平铺每个节点的特色,然后将其与节点的邻居特色连接起来。
这里须要把稳的是mask掩码须要在平铺节点特色之前交流0和1维。
这用结果仍旧是一个[5,5,8]形数组,但现在[i,:,:]中的每一行都是相同的,并且对应于节点i的特色。然后我们就可以利用乘法来创建只在包含邻居时才重复的节点特色。末了便是将其与上面的GNN创建的相邻特色连接起来,天生连接的特色。
现在我们有了连接的特色,须要把它们输入到一个线性层中,以是还须要重塑回到[5,5,hidden_size],这样我们就可以在中间维度上进行softmax产生我们的把稳力系数。
得到了形状为[5,5,hidden_size]的把稳力系数,这实际上是在n个节点的图中每个图边嵌入一次。论文说这些该当被转置(维度交流),我们在ReLU之前已经做过了,现在我对末了一个维度进行softmax,这样它们就可以沿着隐蔽的尺寸维度进行每个维度索引的标准化。
将[5,hidden_size, 5]形状乘以[5,5,8]形状得到[5,hidden_size, 8]形状。然后我们对hidden_size维度求和,终极输出[5,8],匹配我们的输入形状。这样就可以把这个层串起来多次利用。
总结本文先容二零单个GNN层和GAT层的可视化实现。在论文中,他们还阐明了是如何扩展多头把稳方法的,我们这里没有进行演示。
Graphbook是用于AI和深度学习模型开拓的可视化IDE,Graphbook仍处于测试阶段,但是他却是一个很故意思的工具,通过可视化的实现,我们可以理解更多的细节。
作者:David Winer