图卷积神经网络(GCN)

GCN引入原因

GCN在文本分类中的应用
首先,文本数据中的结构信息量少。严格来说,文本数据通常是没有什么结构的,一般能够有的结构可能只是“标题”、“正文”、“评论”这样区分文本来源的结构,除此以外一般就没有更多的结构信息了。
其次,文本内容的信息量不确定。与无结构化相伴随的,是文本数据在内容的不确定性,这种不确定性体现在内容和数量上
通过图卷积网络处理文本分类。首先是根据训练数据构建大型文本图谱,以词(word)和文档(document)作为顶点,建立词与词的边(word-word edges)以及文档与词的边(document-word edges)。然后根据前面定义的图谱,建立邻接矩阵A ,将我们的文本语料构建拓扑图,改图的节点由文档和词汇组成,即图中节点数|v|=|doc|+|voc| 其中|doc|表示文档数,|voc|表示词汇总量,对于特征矩阵X,我们采用单位矩阵I表示,即每个节点的向量都是one-hot形式表示

GCN的本质目的就是用来提取拓扑图的空间特征
欧几里德结构数据
在日常生活中,最常见到的媒体介质莫过于是图片视频语音了,这些数据有一个特点就是:“排列整齐”。什么叫做排列整齐呢?举例子来说,图片可以用矩阵来表达其像素
对于某个像素点,我们很容易可以找出其邻居节点,就在旁边
。而且,图片数据天然的,节点和邻居节点有着统计上的相关性,因此能够找出邻居节点意味着可以很容易地定义出卷积这个操作出来,而我们在深度学习的过程中知道,卷积这个操作是提取局部特征以及层次全局特征的利器,因此图片可以很容易定义出卷积操作出来,并且在深度网络中进行进一步操作。而且,因为这类型的数据排列整齐,不同样本之间可以容易的定义出“距离”这个概念出来。我们且思考,假设现在有两个图片样本,尽管其图片大小可能不一致,但是总是可以通过空间下采样的方式将其统一到同一个尺寸的,然后直接逐个像素点进行相减后取得平方和,求得两个样本之间的欧几里德距离是完全可以进行的

非欧几里德结构数据
就是抽象意义上的拓扑图。对于数据中的某个点,难以定义出其邻居节点出来,或者是不同节点的邻居节点的数量是不同的 ,这个其实是一个特别麻烦的问题,因为这样就意味着难以在这类型的数据上定义出和图像等数据上相同的卷积操作出来,而且因为每个样本的节点排列可能都不同,因此难以定义出其欧几里德距离出来,这个是和我们的欧几里德结构数据明显不同的。因此这类型的数据不能看成是在欧几里德样本空间中的一个样本点了,而是要想办法将其嵌入(embed)到合适的欧几里德空间后再进行度量。而我们现在流行的GCN便可以进行这类型的操作。
图的基本特征
一是每个节点都有自己的特征信息。比如针对上图,我们建立一个风控规则,要看这个用户的注册地址、IP地址、交易的收货地址是否一样,如果这些特征信息不匹配,那么系统就会判定这个用户就存在一定的欺诈风险。这是对图节点特征信息的应用。
二是图谱中的每个节点还具有结构信息。如果某段时间某个IP节点连接的交易节点非常多,也就是说从某个IP节点延伸出来的边非常多,那么风控系统会判定这个IP地址存在风险。这是对图节点结构信息的应用。
总的来说,在图数据里面,我们要同时考虑到节点的特征信息以及结构信息,如果靠手工规则来提取,必将失去很多隐蔽和复杂的模式,那么有没有一种方法能自动化地同时学到图的特征信息与结构信息呢?——图卷积神经网络

原因 (1)CNN无法处理非欧几里得结构的数据,学术上的表达是传统的离散卷积 在Non Euclidean Structure的数据上无法保持平移不变性。通俗理解就是在拓扑图中每个顶点的相邻顶点数目都可能不同,那么当然无法用一个同样尺寸的卷积核来进行卷积运算。
(2)由于CNN无法处理Non Euclidean Structure的数据,又希望在这样的数据结构(拓扑图)上有效地提取空间特征来进行机器学习,所以GCN成为了研究的重点。
(3)读到这里大家可能会想,自己的研究问题中没有拓扑结构的网络,那是不是根本就不会用到GCN呢?其实不然,广义上来讲任何数据在赋范空间内都可以建立拓扑关联,谱聚类就是应用了这样的思想(谱聚类(spectralclustering)原理总结)。所以说拓扑连接是一种广义的数据结构,GCN有很大的应用空间。
在这里插入图片描述

GCN的数学推导 在这里插入图片描述

图像上的卷积运算是加权求和,图上的卷积运算也是加权求和,一种加权和对应一种加权求和的方式(图上的使用把数学中的傅里叶变换迁移到图中,利用拉普拉斯矩阵的特征值和特征向量作为权值以及拉普拉斯算子最终求得卷积核)

怎么构建自己的数据集

了自己数据集的nodes和edges,你要用GCN,只需要输入的大图邻接矩阵、顶点nodes特征矩阵、每个顶点的类别one-hot向量矩阵。 它这个大图邻接矩阵一开始是用字典来存的,你只要将你的数据转换成""“将三元组数据,转换为graph,按字典存储:{0:[],1:[],2:[],…}
a dict in the format {index: [index_of_neighbor_nodes]}
“”” 比如,你的顶点node1,与他相关的顶点有node23/node33/node43,那么这个顶点按照字典的形式放入graph_dict中,当取值graph_dict[node1]时,它的值为:[node23,node33,node43]。 你仔细看看gcn的graph生成过程,模仿一下它的数据处理格式,就可以直接将你的数据直接套用GCN代码中了。

如何理解图卷积算法?
第一步:发射(send)每一个节点将自身的特征信息经过变换后发送给邻居节点。这一步是在对节点的特征信息进行抽取变换。
第二步:接收(receive)每个节点将邻居节点的特征信息聚集起来。这一步是在对节点的局部结构信息进行融合。
第三步:变换(transform)把前面的信息聚集之后做非线性变换,增加模型的表达能力。
GCN学习笔记:第一部分,手把手用Numpy实现GCN

卷积神经网络在自然语言处理的应用

如何应用
当我们听到卷积神经网络(CNNs)时,往往会联想到计算机视觉。CNNs在图像分类领域做出了巨大贡献,也是当今绝大多数计算机视觉系统的核心技术,从Facebook的图像自动标签到自动驾驶汽车都在使用。最近我们开始在自然语言处理(NLP)领域应用CNNs,并取得了一些引人注目的成果。
NLP任务的输入不再是像素点了,大多数情况下是以矩阵表示的句子或者文档。矩阵的每一行对应于一个分词元素,一般是一个单词,也可以是一个字符。也就是说每一行是表示一个单词的向量。通常,这些向量都是word embeddings(一种底维度表示)的形式,如word2vec和GloVe,但是也可以用one-hot向量的形式,也即根据词在词表中的索引。若是用100维的词向量表示一句10个单词的句子,我们将得到一个10x100维的矩阵作为输入。这个矩阵相当于是一幅“图像”。
在计算机视觉的例子里,我们的滤波器每次只对图像的一小块区域运算,但在处理自然语言时滤波器通常覆盖上下几行(几个词)。因此,滤波器的宽度也就和输入矩阵的宽度相等了。尽管高度,或者区域大小可以随意调整,但一般滑动窗口的覆盖范围是2~5行。综上所述,处理自然语言的卷积神经网络结构是这样的
用于句子分类器的卷积神经网络(CNN)结构示意图。这里我们对滤波器设置了三种尺寸:2、3和4行,每种尺寸各有两种滤波器。每个滤波器对句子矩阵做卷积运算,得到(不同程度的)特征字典。然后对每个特征字典做最大值池化,也就是只记录每个特征字典的最大值。这样,就由六个字典生成了一串单变量特征向量(univariate feature vector),然后这六个特征拼接形成一个特征向量,传给网络的倒数第二层。最后的softmax层以这个特征向量作为输入,用其来对句子做分类;我们假设这里是二分类问题,因此得到两个可能的输出状态。
应用实例
最适合CNNs的莫过于分类任务,如语义分析、垃圾邮件检测和话题分类
在不同的分类数据集上评估CNN模型,主要是基于语义分析和话题分类任务。
kpif github代码
涉及到论文中的主要内容和实验详解

发布了142 篇原创文章 · 获赞 0 · 访问量 2609

猜你喜欢

转载自blog.csdn.net/yunxiu988622/article/details/104941472