代码
数据集CORA
组成
2708 paper
1433 features
1433个词,不包含词频小于10的词
7 laber
Case_Based
Genetic_Algorithms
Neural_Networks
Probabilistic_Methods
Reinforcement_Learning
Rule_Learning
Theory
cora.content
节点信息
<paper_id> <word_attributes>+ <class_label>
例子
31336 (0 or 1)*1433 Neural_Networks
cora.cites
节点关系
<ID of cited paper> <ID of citing paper>
paper2->paper1
例子
35 1033
ID为35的论文 被 ID为1033的论文引用
GCN更多信息
http://tkipf.github.io/graph-convolutional-networks/
train.py中的参数
no-cuda
不使用显卡
fastmode
每个epoch训练完之后,测试
seed!
manual_seed
是一个随机数种子,主要就是为了固定结果,它会让你初始化结果一样,这样的话最终结果就一样了
epochs
训练的次数
lr
设置优化器的lr学习率
weight_decay!
设置优化器的权重衰减(L2 参数损失)
hidden
隐藏层的特征维度
dropout
防止过拟合
对应的参数计算对应公式
归一化的 A+I_N = 归一化 \widetilde{A} = \widehat{A} = \widetilde{D}^{-\frac{1}{2}}\widetilde{A}\widetilde{D}^{-\frac{1}{2}}
adj = array([[0.16666667, 0. , 0. , ..., 0. , 0. ,
0. ],
[0. , 0.5 , 0. , ..., 0. , 0. ,
0. ],
[0. , 0. , 0.2 , ..., 0. , 0. ,
0. ],
...,
[0. , 0. , 0. , ..., 0.2 , 0. ,
0. ],
[0. , 0. , 0. , ..., 0. , 0.2 ,
0. ],
[0. , 0. , 0. , ..., 0. , 0. ,
0.25 ]])
H^0 = X 归一化的结点的特征集
features 2708*1433 每个结点有1433个特征
labels 结点的标签
labels 2708*1 每个结点有一个label 例如 0 表示 Case_Based
idx 结点原始ID 2708
35 163
1033 402
edges
边的形式
被引用结点原始ID对应的索引163 引用结点原始ID对应的索引402
公式9
GCN模型
def forward(self, x, adj): # 公式9
x = self.gc1(x, adj) # 2708 * 16
x = F.relu(x)
x = F.dropout(x, self.dropout, training=self.training) # 防止过拟合
x = self.gc2(x, adj)
x = F.log_softmax(x, dim=1)
return x
self.gc1(x, adj)
使用
def forward(self, input, adj):
support = torch.mm(input, self.weight) # GraphConvolution forward。input*weight = H * W
output = torch.spmm(adj, support) # adj = \widehat{A}, support = H * W
if self.bias is not None:
return output + self.bias
else:
return output
参数
H^0 = X,
adj = \widehat{A}
W_0 = weights torch.Size([1433, 16])
tensor([[ 0.1911, 0.2075, -0.0586, ..., 0.0339, 0.1205, -0.0353],
[ 0.1927, 0.0370, -0.1167, ..., -0.2469, 0.2258, -0.2124],
[ 0.1930, 0.0416, -0.0812, ..., -0.1093, 0.1443, 0.0447],
...,
[ 0.1707, 0.2397, 0.0111, ..., 0.1867, -0.1786, -0.2166],
[ 0.0162, 0.0835, 0.0571, ..., 0.2088, 0.1388, -0.1208],
[-0.0173, -0.2395, 0.0652, ..., -0.0162, -0.1948, 0.0027]],
requires_grad=True)
hideen = 16
bias = tensor([-0.2232, -0.0295, -0.1387, 0.2170, -0.1749, -0.1551, 0.1056, -0.1860,
-0.0666, -0.1327, 0.0212, 0.1587, 0.2496, -0.0154, -0.1683, 0.0151],
requires_grad=True)
意义
是 \widehat{A} * H^0 * W_0 = [2708,1433]
Q&A
关于优化器 自适应矩估计(adaptive moment estimation)
https://pytorch.org/docs/stable/generated/torch.optim.Adam.html?highlight=adam#torch.optim.Adam
参数
params (iterable)
– 可迭代的参数 以优化或 dicts 定义 参数组
lr (float, optional)
– 学习率 (default: 1e-3)
betas (Tuple[float, float], optional)
– 用于计算梯度及其平方的运行平均值的系数(默认值:(0.9,0.999))
eps (float, optional)
– 项 添加到 分母以提高数值稳定性(默认值:1e-8)
weight_decay (float, optional)
– 权重衰减(L2正则化项)的权重因子(默认值:0)
amsgrad (boolean, optional)
– 是否使用论文 On the Convergence of Adam and Beyond 中的该算法的 AMSGrad 变体(默认值:False)
maximize (bool, optional)
– 根据目标最大化参数,而不是最小化(默认值:False)
关于优化器 中的weight_decay
定义
在损失函数中,weight_decay是放在正则项(regularization)前面的一个系数,
正则项一般指示模型的复杂度,
若weight_decay很大,则复杂的模型损失函数的值也就大。
作用
调节模型复杂度对损失函数的影响,防止过拟合
L2 Regularization = weight decay(权重衰减)
L2范数正则化又叫权重衰减。权重衰减通过惩罚绝对值较大的模型参数为需要学习的模型增加了限制,防止过拟合
关于误差
误差=偏差+方差+噪声之和;
偏差Bias
度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力;
方差Variance
度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;
高方差,也就是过拟合现象
噪声Noise
则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界;
关于seed的使用
code:
args.seed = 42
torch.manual_seed(args.seed) # 固定随机出现的结果
for i in range(100):
print(torch.rand(args.seed))
output:
tensor([0.2110, 0.2774, 0.3902, 0.1116, 0.3451, 0.4116, 0.5040, 0.8055, 0.0257,
0.9064, 0.4957, 0.1972, 0.5427, 0.0463, 0.0589, 0.4129, 0.0712, 0.7272,
0.9034, 0.2796, 0.3256, 0.4319, 0.1392, 0.7334, 0.6037, 0.4484, 0.1026,
0.8229, 0.9346, 0.2459, 0.2079, 0.4565, 0.1011, 0.8485, 0.1555, 0.2057,
0.4573, 0.5372, 0.6468, 0.2077, 0.7972, 0.0364])
tensor([0.8745, 0.2766, 0.9558, 0.9277, 0.8983, 0.0385, 0.3283, 0.9134, 0.8288,
0.3350, 0.8755, 0.9949, 0.0481, 0.8819, 0.7185, 0.9360, 0.0205, 0.8779,
0.9743, 0.2788, 0.9718, 0.8809, 0.8837, 0.1761, 0.8711, 0.1745, 0.5796,
0.1464, 0.8071, 0.2951, 0.7301, 0.5666, 0.9747, 0.7516, 0.7836, 0.3144,
0.5695, 0.5139, 0.9900, 0.9229, 0.1805, 0.5648])
##关于pyGCN中的归一化
论文中使用的 归一化 -Symmetric normailzed Laplacian
名称 对称归一化的拉普拉斯矩阵
\widetilde{D}^{-\frac{1}{2}}
\widetilde{A} \widetilde{D}^{-\frac{1}{2}}
对称矩阵
代码中使用的 简单的 归一化
名称 随机游走的归一化的拉普拉斯矩阵 -Random walk normailzed Laplacian
\widetilde{D}^(-1) * \widetilde{A}
非对称矩阵
解释
在代码中
adj是对称的矩阵 乘以 D^(-1) 进行归一化 还是对称矩阵
feature不一定是对称的矩阵 乘以 D^(-1) 进行归一化 不一定是对称矩阵
两种方法等效
关于pyGCN中使用的损失函数
pyGCN中使用的
nll_loss()
论文中使用
nn.CrossEntropyLoss
nn.functional.cross_entropy
原因
CrossEntropyLoss()=log_softmax() + NLLLoss()
NLLLoss的输入是一个对数概率向量和一个目标标签.
它不会为我们计算对数概率.
适合网络的最后一层是log_ _softmax.
损失函数 nn.CrossEntropyLoss()与NLLLoss()相同,唯一-的不同是 它为我们去做softmax.
注意
链接:https://www.zhihu.com/question/66782101/answer/579393790
nn.functional.xxx是函数接口,而nn.Xxx是nn.functional.xxx的类封装,
nn.Xxx和nn.functional.xxx的实际功能是相同的,
运行效率也是近乎相同。
##关于[:, 1:-1],[i, :],[:, 0],[:, -1]
import numpy as np
X = np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]) # 定义二维数组
print(X[:,0]) # 取数组X 二维数组中每一个的0号下标对应的值 [0 4 8 12]
print(X[1,:]) # 取数组X一维数组中的第一组全部数值 [0 1 2 3]
print(X[:,1:3]) # 取所有数据的第1列到3-1列数据,从第0列开始计算,结果如下:
'''
[[1 2]
[5 6]
[9 10]
[13 14]]
'''
##关于两层隐藏层 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qEVgYO4F-1651928093995)(figure.png)]
训练集、验证集和测试集,
这三个集合不能有交集,常见的比例是8:1:1
训练集
训练集用来训练模型,即确定模型的权重和偏置这些参数,通常我们称这些参数为学习参数。
验证集
用于模型的选择,不参与学习参数的确定,
没有参与梯度下降的过程。为了选择超参数,比如网络层数、网络节点数、迭代次数、学习率这些都叫超参数。
比如在k-NN算法中,k值就是一个超参数。所以可以使用验证集来求出误差率最小的k。
测试集
而仅仅使用于模型的评价。
|