Page 293 - 《软件学报》2024年第6期
P. 293
周光有 等: 基于关系图卷积网络的代码搜索方法 2869
2.3 基于多视角匹配函数的节点层面匹配策略
GraphSearchNet 的第 1 个不足是没有对代码图和文本图的节点做任何交互匹配操作, 为了得到代码图和文本
图之间更细粒度的匹配关系, GraphCS 提出了基于多视角匹配函数的节点层面匹配策略. 为了捕捉文本图和代码
图节点之间的细粒度语义匹配关系, 需要对它们进行跨图匹配操作. 跨图匹配是对图中的一个节点和另一个图的
整体嵌入表示进行多视角匹配操作. 首先, 本文定义了一个多视角匹配函数 f m 来计算两个输入向量 ⃗ x 1 和 ⃗ x 2 的相
似性向量.
⃗ h[k] = f m ⃗ x 1 ,⃗ x 2 , ⃗ w k = cos ⃗ x 1 ⊙ ⃗ w k ,⃗ x 2 ⊙ ⃗ w k , k = 1,...,d ˜ (5)
(
)
(
)
e
⊙ 表示 ⃗ e k d ′ k 个视角的
其中, element-wise 乘法操作, h[k] ∈ R 表示第 个视角的输出相似度得分, ⃗ w k ∈ R 表示表示第
{ } ˜ d d ′ × ˜ d
可学习权重向量. 当考虑多视角匹配函数所有的 d ˜ 个视角时, 可训练的权重矩阵将变为 W m = ⃗ w k k=1 ∈ R . 输入
h ∈ R , 它衡量了两个输入向量的相关性. 值得注意的是,
向量 ⃗ x 1 和 ⃗ x 2 经过多视角匹配函数后就能得到 d ˜ 维向量 ⃗ e ˜ d
所提出的 f m 本质上与多头注意力机制 [20] 具有相似的精神. 二者的显著区别在于, 多头注意力机制使用 d ˜ 个可训练
权重矩阵, 而 f m 使用 d ˜ 个可训练权重向量代替, 也就是一个 d ˜ 维权重矩阵. 本文的方法使用更少的训练参数, 这可
以减少潜在的过度拟合.
为了进行跨图匹配操作, 还需要得到图的整体嵌入表示. 这里不是孤立地在一个图中聚合自身的全局上下文
信息, 而是计算两个图节点细粒度匹配之后得到的整体嵌入表示. 以得到代码图的整体嵌入表示为例, 具体操作的
表述如下.
首先, 计算文本图 G q 的任一节点 q i 与代码图 G p 中的所有节点的跨图注意力分数.
( )
α i,j = cos q i , p j ,∀ j = 1,...,N (6)
p j 的权重, 计算代码图的所有节点嵌入的加权平均, 就得到了从文本图的某个节点视
其中, α i,j 作为代码图的节点
⃗ h , 也就是聚合了文本图节点信息和代码图自身信息的图嵌入. 此处节点之间
˜ i
角, 代码图的整体嵌入表示的向量
P
的细粒度匹配操作传递了文本图节点的信息到代码图中, 丰富了代码图节点信息的表示.
⃗ ˜ i 1 N ∑ (7)
h =
P α i,j p j , p j ∈ V p
N
j
代码图的整体嵌入表示获得后即可应用多视角匹配函数 f m , 对文本图的节点 q i 和代码图的整体嵌入表示向
⃗ ˜ i
量 h 进行对齐比较, 得到了文本图的节点 q i 跨图匹配后的向量表示 ˆ q i .
P
( )
⃗ ˜ i
ˆ q i = f m q i ,h ,w m ,q i ∈ V q (8)
P
ˆ p j . 在对文本图和代码图的所有节点之间进行上述细粒度匹
相应地, 代码图的节点跨图匹配后的向量表示为
M (M, ˜ d) { } N (N, ˜ d) ˜ 是
配操作后, 更新后的文本图节点嵌入和代码图节点嵌入分别为 H q = {ˆq i } ∈ R 和 H p = ˆp j j=1 ∈ R . 其中 d
i=1
N 表示文本图和代码图的节点个数. 更新后的节点嵌入表示在一定
更新后的节点维度, 也即 f m 的视角参数. M 和
程度上衡量了两张图中每对节点之间的对齐信息, 有利于之后的相似度得分计算.
2.4 相似度得分计算
对代码图和文本图进行代码搜索需要比较它们的相似度得分. 基于上面更新后的图节点嵌入, 可以得到代码
图或文本图的最终整体嵌入表示. 本文没有采用平均池化操作, 而是采用另一种聚合方法 FCMax, 即全连接层变
换后的最大池化操作. 因为最大池化操作可以容易地比较并找出文本图和代码图节点的相似性或不相似性, 而平
均池化操作会扁平化地聚合节点信息, 可能会忽视重要的节点.
( ( ))
( ) M
S q = FCMax H q = maxpooling FC {ˆq i } i=1 (9)
( ( ))
( ) { } N
ˆ (10)
S p = FCMax H p = maxpooling FC p j j=1
有了文本图的整体嵌入表示 S q 和代码图的整体嵌入表示 S p , 很容易计算它们的相似度分数. 这里我们使用