作者:yueji0j1anke
首发于公号:剑客古月的安全屋
字数:3973
阅读时间: 15min
声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。本文章内容纯属虚构,如遇巧合,纯属意外
目录
-
前言
-
图
-
图嵌入
-
图神经网络
-
图模型代码demo
-
总结
0x00 前言
本期为大家带来图神经网络的专题。图神经网络在安全模型中存在大量的应用,不论是风控还是反入侵,深入学习并理解其是在算法一道上不可或缺的一步。
0x01 图的基本概念
1.1 图定义
图是节点和连接节点的边的集合的表示
1.2 图表示的基本概念
临接矩阵(Adjacency Matrix)和度矩阵(Degree Matrix)是图论中常见的两种矩阵表示方式
邻接矩阵:表示图中节点之间是否存在边
A B C -------A | 0 1 1B | 1 0 0C | 1 0 0
A[0][1] = 1
表示 A 与 B 相连
A[0][2] = 1
表示 A 与 C 相连
度矩阵:表示每个节点连接了多少条边
A B C -------A | 2 0 0B | 0 1 0C | 0 0 1
D[0][0] = 2
表示 A 连接了 2 条边
D[1][1] = 1
表示 B 连接了 1 条边
1.3 图的应用
图(Graph)被广泛应用于处理结构化关系数据,尤其在社交网络、生物信息、推荐系统、金融风控、交通网络、自然语言处理等场景中具有重要意义
图能够自然表示对象之间的关系。例如:
-
社交网络中用户之间的“关注”或“好友”关系
-
商品之间的共购关系
-
文章之间的引用关系
-
生物分子中的化学键
-
图中相临像素
-
句子中各单词关系
1.4 图的分类
-
无向图 | 有向图
-
有权图 | 无权图
-
重构图 | 异构图
这里讲解一下第三组
根据图的边和点是否具有多种类型,可以将图分为同构图和异构图
同构图:
-
示例:社交网络图节点:用户边:好友关系所有节点/边类型一样
(User) —— (User) —— (User)
异构图:
-
示例:学术网络图节点类型:作者、论文、机构边类型:撰写、发表、所属机
[Author] —writes→ [Paper] —published_in→ [Venue] ↘ affiliated_with ↙ [Institution]
0x02 图嵌入
1.图嵌入概念
Graph Embedding,将图表示为低维向量,类似于NLP里面分词以后,把单词变为Embedding输入给encoder一样
通过图嵌入,将节点/图编码为稠密、低维、有语义的向量,更利于下游任务使用
2.图嵌入分类
1.基于矩阵分解
通过分解图的邻接矩阵或相似度矩阵来获取嵌入
代表方法:Laplacian Eigenmaps、HOPE
核心思想:图中的节点连接关系可用邻接矩阵 $A$ 或相似度矩阵 $S$ 表示,然后将其分解为低秩矩阵:
例如:S≈UΣVT
2.基于随机游走
模拟在图中游走,统计节点共现
将节点序列视作“句子”进行词嵌入(如 Word2Vec)
代表方法:
-
DeepWalk:类比 Word2Vec,学习节点上下文
-
Node2Vec:改进 DeepWalk,引入灵活的游走策略(DFS/BFS)
-
LINE:保留一阶与二阶邻接关系
例如以下无向图
A —— B —— C | | —— D ——
节点集合:{A, B, C, D}
边集合:{(A,B), (A,D), (B,C), (C,D)}
临接关系如下
A: B, D B: A, C C: B, D D: A, C
我们设定一个游走长度为 5(也就是走 5 步),从节点 A
开始,每次随机选择一个相邻节点走过去。
-
起点:A
-
第一步:从 A 可选 → [B, D],随机选中 B
-
第二步:从 B 可选 → [A, C],随机选中 C
-
第三步:从 C 可选 → [B, D],随机选中 D
-
第四步:从 D 可选 → [A, C],随机选中 A
-
第五步:从 A 可选 → [B, D],随机选中 D
最终路径为:A → B → C → D → A → D
现在我们多次游走+其他做起始点
会得到一个序列
游走1(从A):A → D → C → D → A → D → ...游走2(从B):B → A → B → C → D → ...游走3(从D):D → A → B → C → D → ...
这些序列可以看做句子,节点就像单词,喂给word2vec训练即可
3.基于图神经网络
使用神经网络传播邻居信息,学习表示
可以处理属性信息和图结构
常见模型:
-
GCN(Graph Convolutional Network)
-
GAT(Graph Attention Network)
-
GraphSAGE(Sample and Aggregate)
-
GIN(Graph Isomorphism Network)
图神经网络通过消息传递(Message Passing)+ 聚合(Aggregation)实现嵌入学习。
3.图嵌入和GNN区别
1.前者是向量表示转换方法,后者是深度学习模型框架
2.输入都是图结构或节点,前者输出是带有节点关系、图结构的向量,后者则是分类、回归的结果
3.后者直接端到端
0x03 GNN
1.什么是GNN
图神经网络的核心思想是通过消息传递机制 + 聚合 来整合邻居信息,更新节点当前特征表达。最终每个节点将包含自己以及其他节点的特征信息。
GNN的基本组成包括
1.节点特征矩阵:表示每个节点初始特征
2.邻接矩阵:图中节点连接关系
3.图卷积层: 聚合邻居信息并更新,引入线性变换和非线性激活
4.输出层:输出预测结构
2.GNN的应用
GNN的应用有很多
图神经网络通过建模用户与用户之间的复杂关系,提高对网络入侵、洗钱、欺诈案例的识别效果。适用于传统机器学习难以捕捉的图结构模型
通过GNN,我们可以
利用交易图、社交图等关系网络
捕捉欺诈团伙、资金链、伪装行为
增强样本之间的上下文信息表示
包括自动驾驶、推荐系统
这里举个例子
1. 欺诈用户识别
-
构建图:节点为用户,边为交易、设备共用、手机号共享、IP 相同等
-
使用 GNN 聚合邻居信息,识别共谋欺诈团伙
-
模型输出:某用户为欺诈账户的概率
2. HIDS入侵行为检测
-
构建图:节点是进程、文件、系统调用,边表示调用关系或时间序列顺序
-
GNN 学习正常调用图结构,识别异常进程行为(如木马、勒索软件)
3.GNN分类
1.RecGNNs
Recurrent graph neural networks,递归图神经网络
假设为:图中一个节点不断与邻居节点交换消息,直至趋于稳定
假设有图如下:
A --- B --- C
-
初始特征:A=[1,0], B=[0,1], C=[1,1]
-
状态更新函数:平均邻居状态 + 自身状态 → 全连接层
步骤:
-
第0轮:
-
hA(0)=[1,0]
-
hB(0)=[0,1]
-
hC(0)=[1,1]
-
第1轮(更新 B):
-
邻居 A,C 状态平均:([1,0] + [1,1])/2 = [1,0.5]
-
拼接自身特征 [0,1] → 送入 MLP → 得到新 hB(1)
多轮递归后,所有节点的状态逐渐融合邻居信息,最终形成嵌入。
2.GCN
Convolutional graph neural networks,卷积图神经网络
其目标是学习节点在图中的表示,核心思想为 节点的表示 = 自身特征 + 邻居信息加权聚合,及通过聚合节点自身的特征xv和邻居的特征xu来生成节点v的表示
大概流程如下
输入:节点特征 X,邻接矩阵 A1. 加自环:A + I → 使节点可以保留自身信息2. 归一化:让每个节点的聚合过程“均衡”3. 第一层卷积:聚合邻居特征 → 线性变换 → 激活函数4. 第二层卷积:再聚合一次 → 得到最终节点嵌入
还有其他许多方法构造复杂GNN模型,比如说
1.基于谱的方法
基于谱的方法通过从图信号处理的角度引入滤波器来定义图卷积,其中图卷积操作被解释为从图信号中去除噪声。
图可以看成一个信号载体,每个节点的特征视为“图信号”。
基于谱的方法使用 图拉普拉斯矩阵(Laplacian Matrix)来进行傅里叶变换(Graph Fourier Transform),在频域上定义卷积:
就像传统信号中会过滤噪音,这里可以通过加滤波器来去除图节点中的高频扰动(不一致性)
2.基于空间的方法
继承了递归图神经网络思想,通过信息传播定义图卷积
3.GAES
Graph AutoDecorder,图自动编码器,是一种无监督学习框架,前面也讲过我们用AE神经网络建模训练异常交易数据的案例。
其核心是将图结构转换为嵌入向量,再进行重构
4.STGNNs
Spatial-temporal graph neural networks (STGNNs),时空图神经网络
其是专门处理空间依赖性和时间依赖性的图神经网络
STGNN = 图神经网络(空间建模) + 时间建模(RNN、CNN、Transformer等)
比如
输入数据 X: [T x N x F] 时间步 x 节点数 x 特征数流程: 时间卷积/GRU ↓ 图卷积(GCN) ↓ 时间卷积/GRU ↓ 输出预测 Y
4.GNN训练方式
根据数据集和学习任务,我们可以分为以下三种
1.节点级分类的半监督学**习**
在只有少量有标签的节点下,利用图结构和节点特征来预测所有节点的标签 —— 这就是半监督节点分类
2.图级监督学习
给定一堆图(Graph),每张图都有一个整体的标签,我们要训练一个模型,来预测整个图的类别。
3.图嵌入无监督学习
除了我们之前讲的GAE,还有一个比较火的,就是负抽样方法
在图学习中,常常会有:
-
正样本:图中存在的边(如节点对 A–B)
-
负样本:图中不存在的边(如节点对 A–C),假设它们没有连接
负抽样的目标:让模型区分哪些节点对是“真实存在的连接”,哪些不是
0x04 图神经网络实战Demo
这里安装 相关库
https://blog.csdn.net/weixin_70816415/article/details/145971987
构建这样一个无向图
data
是 torch_geometric.data.Data
类型的图数据结构。
keys()
显示当前图中有哪些属性。
-
x
:节点特征矩阵。 -
edge_index
:边的连接关系(二维张量,形状[2, num_edges]
)。
接下来了解一下图的相关api
# 打印节点数print("num_nodes:", data.num_nodes) # 节点数:3# 打印边数print("num_edges:", data.num_edges) # 边数:4# 打印每个节点的特征数(维度)print("num_node_features:", data.num_node_features) # 特征数:1# 是否有孤立节点(无边连接)print("has_isolated_nodes:", data.has_isolated_nodes()) # False(每个节点都连接)# 是否有自环(即 i->i 的边)print("has_self_loops:", data.has_self_loops()) # False(没有自环)# 是否是有向图print("is_directed:", data.is_directed()) # True(边是单向存储)# 将数据转移到 GPUdevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')data = data.to(device)print("data device:", data.x.device) # 打印数据现在在哪个设备上(cuda 或 cpu)
0x05 总结
本期从图结构入手,深入讲解图嵌入和图神经网络,包括分类和训练方法,最后给出图模型的基础api调用,后续将为大家带来项目实战
参考文章 https://blog.csdn.net/cyj972628089?type=blog
原文始发于微信公众号(剑客古月的安全屋):ai攻防基础篇-图神经网络GNN从入门到实战
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论