N_Gram_Graph论文
简要概述:
这篇论文简要叙述了利用自然语言处理中n_gram的方法对分子进行特征提取和表示。文章指出,自然语言可以看作是一维的图,而分子可扩展到二维。以一个分子作为输入,最终输出分子的特征向量,利用该特征向量可以对分子进行回归和分类。
具体过程:
在对数据集预处理中整理出分子的邻接矩阵 A A A,以及分子中每个原子的性质one-hot编码 h h h。
n_gram_graph对分子的embedding过程分为两个阶段:node_embedding和graph_embedding。
-
node_embedding:
对分子的原子性质 X X X,利用CBoW神经网络求出一个权重矩阵 W W W,使得用 f i = W h i f_i=Wh_i fi=Whi来代表一个原子的特征矩阵,关于该神经网络 g ( h j , j ∈ C i ) = h i ^ , ( C i 为 原 子 i 的 邻 居 ) g(h_j,j\in C_i)=\hat{h_i},(C_i为原子i的邻居) g(hj,j∈Ci)=hi^,(Ci为原子i的邻居),简单来说是利用分子中某个原子的邻居原子的特征矩阵来预测该原子的性质 X X X,神经网络损失函数为 c r o s s − e n t r o p y ( h i , h i ^ ) cross-entropy(h_i,\hat{h_i}) cross−entropy(hi,hi^)
图中步骤1是将邻居原子的特征矩阵聚合,步骤2是一个全连接神经网络预测原子的性质。
node_embedding的关键是要取出权重矩阵 W W W,后续则用 f i = W h i f_i=Wh_i fi=Whi来代表一个原子。
-
graph_embedding:
这里是整片论文的关键,也是运用到n_gram的地方。这里涉及到一个n_gram_graph的算法。
p是n_gram的一次取值的集合,例如n=3,原子{1,2,3}是关联的,也就是{1,2,3}形成连通分支,则{1,2,3}形成一次n_gram取值。f p = f 1 ∗ f 2 ∗ f 3 f_p=f1*f2*f3 fp=f1∗f2∗f3,这里的乘法是元素之间相乘,最终将整个分子中所有n=3的n_gram取值得到的 f p f_p fp求和,从而形成最终 f G f_G fG的一个维度。
算法等价于:
F ( i ) A F_{(i)}A F(i)A其实是这样的,由于 A A A是邻接矩阵,有0和1构成,若 F = [ f 1 , f 2 , ⋯ , f m ] F=[f_1,f_2,\cdots ,f_m] F=[f1,f2,⋯,fm],则 F A FA FA等于
[ ∑ j ∈ C 1 f j , ∑ j ∈ C 2 f j , ⋯ , ∑ j ∈ C m f j ] , 其 中 C i 为 原 子 i 的 邻 居 原 子 的 编 号 集 合 [\sum_{j\in C_1}f_j,\sum_{j\in C_2}f_j,\cdots,\sum_{j\in C_m}f_j],\\其中C_i为原子i的邻居原子的编号集合 [j∈C1∑fj,j∈C2∑fj,⋯,j∈Cm∑fj],其中Ci为原子i的邻居原子的编号集合
此处对于的代码为:tilde_node_attribute_matrix = model.embeddings(node_attribute_matrix) #求出f_i=Wh_i walk = tilde_node_attribute_matrix v1 = torch.sum(walk, dim=1) walk = torch.bmm(adjacent_matrix, walk) * tilde_node_attribute_matrix v2 = torch.sum(walk, dim=1) walk = torch.bmm(adjacent_matrix, walk) * tilde_node_attribute_matrix v3 = torch.sum(walk, dim=1) walk = torch.bmm(adjacent_matrix, walk) * tilde_node_attribute_matrix v4 = torch.sum(walk, dim=1) walk = torch.bmm(adjacent_matrix, walk) * tilde_node_attribute_matrix v5 = torch.sum(walk, dim=1) walk = torch.bmm(adjacent_matrix, walk) * tilde_node_attribute_matrix v6 = torch.sum(walk, dim=1) embedded_graph_matrix = torch.stack([v1, v2, v3, v4, v5, v6], dim=1)
最终利用embedded_graph_matrix来进行学习,文章中运用了rf和xgb两种模型对数十个数据集进行回归和分类,取得不错的效果。