- V:点
- E:边
- U:图
图的邻接矩阵
-
表示领居之间的关系
-
文本数据也可做图形式
- Graphs - are - all around - us
-
传统模型需要特征固定的大小输入,GNN数据不用固定
- 如分子结构等
-
任务分类
- Graph级别:任务可以自己设计,例如这个分子有没有环路,这个分子是啥
- Node和Edge级别:预测这个点是谁?这个边在做什么动作等
-
一般邻接矩阵不是N*N的。
信息传递
- 每个点的特征更新时,既要考虑自身,也要考虑邻居
-
聚合操作可以当做全连接层
-
结合邻居与自身信息: m i ^ = G ( W j ⋅ x j : j ∈ N i ) \hat{m_i}=G({W_j·x_j:j∈N_i}) mi^=G(Wj⋅xj:j∈Ni)
- W j W_j Wj是点 x j x_j xj的一个权重参数,可学习参数,表示与邻居的关系
-
汇总: h i = σ ( W 1 ⋅ h i + ∑ j ∈ N i W 2 ⋅ h j ) h_i=\sigma(W_1·h_i+\sum_{j∈N_i}W_2·h_j) hi=σ(W1⋅hi+∑j∈NiW2⋅hj)
- ∑ j ∈ N i W 2 ⋅ h j \sum_{j∈N_i}W_2·h_j ∑j∈NiW2⋅hj:表示每一个邻居的信息。
- W 1 ⋅ h i W_1·h_i W1⋅hi:自身的信息。
- σ \sigma σ:激活函数。
- 特征每次的更新,由自身与其邻居所决定。
-
更新方式有很多,上述为求和,也有:
-
M e a n = ∑ j ∈ N i W j ⋅ x j ∣ N i ∣ Mean=\frac{\sum_{j∈N_i}W_j·x_j}{|N_i|} Mean=∣Ni∣∑j∈NiWj⋅xj
-
M a x = m a x j ∈ N i ( { W j ⋅ x j } ) Max=\underset {j∈N_i}{max}(\{W_j·x_j\}) Max=j∈Nimax({Wj⋅xj})
-
M i n = m i n j ∈ N i ( { W j ⋅ x j } ) Min=\underset {j∈N_i}{min}(\{W_j·x_j\}) Min=j∈Nimin({Wj⋅xj})
-
多层GNN
- GNN可以有多层,其本质就是更新各部分特征
- 其中输入是特征,输出也是特征,邻接矩阵也不会变的
GCN图卷积
-
通常交给GCN两个东西:1. 各节点输入特征;2. 网络结构图(邻接矩阵)
-
Semi-supervised learning
- 不需要全部标签
- 用少量标签也能训练
- 计算损失时只用有标签的
-
GCN的基本思想
- 计算橙色节点的特征,平均其邻居特征(包括自身)后传入神经网络
-
网络层数
- GCN也可以多层,每一层输入的还是节点特征
- 然后将当前特征与网络结构图传入下层继续不断的计算
- 最后输出的是每个点对应的向量
- 不需要做太多层,图中的关系不会太庞大
-
图基本组成
- Adjacency matrix A:邻接矩阵,表示图中节点的关系
- Degree matrix D:节点的度
- Feature vector X:特征向量,权重值
-
特征计算方法
- 邻接矩阵与特征矩阵相乘,表示聚合邻居信息
- 计算时需要考虑自身, A ^ = A + λ I N \hat{A}=A+λI_N A^=A+λIN,加上一个对角矩阵
- 对度矩阵进行 D ^ − 1 \hat{D}^{-1} D^−1 ,即取倒数,就相当于平均的感觉
- 然后公式就变为: D ^ − 1 ( A ^ X ) \hat{D}^{-1}(\hat{A}X) D^−1(A^X) ,也可以为 ( D ^ − 1 A ^ ) X (\hat{D}^{-1}\hat{A})X (D^−1A^)X
- 因为是对角矩阵,相当于对每一行做归一化,即 1/2 * 只乘第一行
- 同样的,左乘之后对行做归一化,右乘对列做归一化
- 公式: D ^ − 1 A ^ D ^ − 1 X \hat{D}^{-1}\hat{A}\hat{D}^{-1}X D^−1A^D^−1X
- 但相当于做了两次归一化,我们需要改一下为: D ^ − 1 / 2 A ^ D ^ − 1 、 2 X \hat{D}^{-1/2}\hat{A}\hat{D}^{-1、2}X D^−1/2A^D^−1、2X ,即开一个根号