关于pyGCN的理解

代码

数据集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。
测试集
    而仅仅使用于模型的评价。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值