[GCN] 从数据角度分析实验 of Semi-supervised classification with graph convolutional networks

Cora数据集信息

Cora数据集有2708个样本点,每个样本点表示一篇论文。所有样本点分为7个类别。

类别信息

7个类别依次为:

  • Case_Based
  • Theory
  • Genetic_Algorithms
  • Probabilistic_Methods
  • Neural_Networks
  • Reinforcement_Learning
  • Rule_Learning

样本信息

每篇论文都由一个1433维的词向量表示,即每个样本点具有1433个特征。词向量的每个元素都对应一个词,且该元素只有0或1两个取值。取0表示该元素对应的词不在论文中,取1表示在论文中。所有的词来源于一个具有1433个词的字典。


图的性质

每篇论文都至少引用了一篇其他论文,或者被其他论文引用。即,样本点构成的图是一个连通图,不存在孤立点。

关于连通图的知识,引用大佬的一点见解:

严格上说,GCN是基于拉普拉斯矩阵的谱模型。拉普拉斯矩阵是针对连通图来定义的,虽然运行起来好像也没什么问题。空间模型就没有这些限制,例如GAY GraphSAGE。

补充一点,拉普拉斯矩阵特征值中0的个数就是图的连通分支个数,之前看过一些图聚类算法就是通过控制拉普拉斯矩阵特征值中0的个数来聚类的。

一个连通图的拉普拉斯矩阵特征值都是大于0的。


类别分布

每个类别的样本数如下:

Case_Based :  298
Genetic_Algorithms :  418
Neural_Networks :  818
Probabilistic_Methods :  426
Reinforcement_Learning :  217
Rule_Learning :  180
Theory :  351

具体的类别分布,使用t-SNE算法降维可视化:

在这里插入图片描述

在这里插入图片描述


论文的实验设置

超参数

默认超参数如下:

the settings are as following:
no_cuda : False
fastmode : False
seed : 42
epochs : 200
lr : 0.01
weight_decay : 0.0005
hidden : 16
dropout : 0.5
no_visual : False

数据集划分

整个Cora数据集被划分为三个子集:训练集,验证集,测试集。三者的比例为140:300:1000。

三者的类别分布情况如下:

  • 训练集:

    Case_Based :  14
    Genetic_Algorithms :  11
    Neural_Networks :  41
    Probabilistic_Methods :  28
    Reinforcement_Learning :  21
    Rule_Learning :  8
    Theory :  17
    
    Case_Based :  0.0470
    Genetic_Algorithms :  0.0263
    Neural_Networks :  0.0501
    Probabilistic_Methods :  0.0657
    Reinforcement_Learning :  0.0968
    Rule_Learning :  0.0444
    Theory :  0.0484
    
  • 验证集:

    Case_Based :  31
    Genetic_Algorithms :  25
    Neural_Networks :  105
    Probabilistic_Methods :  47
    Reinforcement_Learning :  38
    Rule_Learning :  20
    Theory :  34
        
    Case_Based :  0.1040
    Genetic_Algorithms :  0.0598
    Neural_Networks :  0.1284
    Probabilistic_Methods :  0.1103
    Reinforcement_Learning :  0.1751
    Rule_Learning :  0.1111
    Theory :  0.0969
    
  • 测试集:

    Case_Based :  118
    Genetic_Algorithms :  159
    Neural_Networks :  309
    Probabilistic_Methods :  138
    Reinforcement_Learning :  72
    Rule_Learning :  57
    Theory :  147
        
    Case_Based :  0.3960
    Genetic_Algorithms :  0.3804
    Neural_Networks :  0.3778
    Probabilistic_Methods :  0.3239
    Reinforcement_Learning :  0.3318
    Rule_Learning :  0.3167
    Theory :  0.4188
    

模型架构

使用了 torchsummarX

network architecture: 
==================================================
      Kernel Shape Output Shape  Params  Mult-Adds
Layer                                             
0_gc1   [16, 1433]   [2708, 16]   22944      22928
1_gc2      [7, 16]    [2708, 7]     119        112
--------------------------------------------------
                      Totals
Total params           23063
Trainable params       23063
Non-trainable params       0
Mult-Adds              23040
==================================================

不同损失函数的训练结果

nll_loss

在这里插入图片描述
在这里插入图片描述

CE loss

在这里插入图片描述

在这里插入图片描述

focal loss:γ\gamma=1.5,α\alpha_multiple=2

在这里插入图片描述

在这里插入图片描述

三种损失函数的比较

  • accuracy:

    nll loss:0.8450

    CE loss:0.8450

    focal loss:

    • γ\gamma=2, α\alpha_multiple=2:0.8390
    • γ\gamma=1.5,α\alpha_multiple=2:0.8380
  • epoch=190时,所有样本的pt分布
    在这里插入图片描述

  • epoch = 190时,训练集样本的pt分布
    在这里插入图片描述

结论

三种损失函数的信息

nll loss 和 CE loss 的训练结果完全一致,二者说白了其实是一个损失函数,只是表示的方式不同。

CE loss 的信息如下

loss(x,class)=log(exp(x[class])jexp(x[j])) loss(x,class)=−log(\frac{exp(x[class])}{\sum _jexp(x[j])})

This criterion combines nn.LogSoftmax() and nn.NLLLoss() in one single class.

It is useful when training a classification problem with C classes. If provided, the optional argument weight should be a 1D Tensor assigning weight to each of the classes. This is particularly useful when you have an unbalanced training set.

The input is expected to contain raw, unnormalized scores for each class.

nll loss 信息如下

The negative log likelihood loss. It is useful to train a classification problem with C classes.

If provided, the optional argument weight should be a 1D Tensor assigning weight to each of the classes. This is particularly useful when you have an unbalanced training set.

focal loss 是论文[1708.02002] Focal Loss for Dense Object Detection 提出的损失函数。其公式如下:

在这里插入图片描述

核心思想其实就是γ\gamma项的引入,即 (1p)γ(1-p)^\gammapγp^\gamma 这两项。结果为降低高置信度样本产生的损失,从而使模型更加专注于难分类 (即低置信度) 样本

从训练结果可以看出什么

  1. 样本不平衡带来的影响
    在这里插入图片描述

    上图说明,无论损失函数选择CE、nll或是focal loss,样本类别数最少的一类 (上图中棕色) 是分类正确率最低的一类。这也是为什么说focal loss是处理样本不平衡方法的一种通用方案。因为一般来说,少样本的类别,其样本的置信度普遍不高

  2. CE和nll反映出的样本不平衡

    首先要看,测试集样本占全部样本的比例:

    Case_Based :  0.0470
    Genetic_Algorithms :  0.0263
    Neural_Networks :  0.0501
    Probabilistic_Methods :  0.0657
    Reinforcement_Learning :  0.0968
    Rule_Learning :  0.0444
    Theory :  0.0484
    

    各类别作为训练集的样本比例相差不大,而且样本数最少的类别Rule_Learning (棕色) 比例有0.0444,大致为中间值。即该样本置信度低的原因并不是训练集样本选的少

    从CE和nll的结果来看 (结合训练集样本比例) ,类别的样本数越多,整体的置信度越高 (比如上图,高置信度样本绿色最多,其次是红色和橙色) ;于此相对应的,少样本的类别整体的置信度要低于多样本类别。

  3. focal loss 对模型的影响

    如前所说,focal loss 的核心思想是通过降低高置信度样本产生的损失,从而使模型更加专注于难分类 (即低置信度) 样本

    从实验结果来看,focal loss 模型输出的高置信度样本的数量要远远少于CE,这就反映了focal loss对高置信度样本的抑制 (即认为高置信度 (易分类) 样本对模型提升小,故对其赋予较低的权重) 。

    focal loss的另一个结果是使得第六类 Rule_Learning 的样本的pt整体上浮,即在CE下难以被分类正确的样本在focal loss下更容易被分类正确 (即模型更专注于难分类样本)。


为什么Focal Loss失效了

高置信度样本和低置信度样本的矛盾

这个矛盾简单来说,就是模型更偏向于难样本的同时,并没有对易样本进行保持,这是focal loss的一个副作用。

我们希望易样本一直保持易样本,而使难样本也变成易样本。而在focal loss下,由于对高置信度样本的 γ\gamma 衰减,易样本也会有一部分变为难样本

在这里插入图片描述

即focal loss下,难样本–>易样本、易样本–>难样本,是同时发生的(有待于进一步的实验验证)。反映在实验结果上,即出现pt向中间聚集的情况 (高置信度样本的损失被抑制,低置信度样本的损失被相对放大)。

而这个副作用,实际上被focal loss的提出场景规避了。

这个还要从 focal loss 提出的场景说起。focal loss是针对目标检测中的one-stage方法提出的,意在从大量的负易样本中分类出正难样本。

关于样本的分类,按照正/负难/易可以分为下面四类:

正难( 正易,γ\gamma衰减
负难,α\alpha衰减 负易,α\alphaγ\gamma衰减(

focal loss使得正难样本的分类正确率提高 (即正样本被分类为正样本,我们希望看到的) ,不好的一点是会有一部分原本被分类正确的负样本被分类错误 (即负样本被分类为正样本) 。

这个副作用被规避有两个主要的原因:

  1. 目标检测中的负样本中负易占极大的比例

    这就使得,尽管有focal loss对易样本的抑制,负样本被错分的概率依旧比较小。因为相比于pt较小的负难更可能被错误分类为正样本,pt较大的负易经由focal loss之后大概率还是负易

  2. 正样本的意义 > 负样本的意义

    正样本是要检测的目标,负样本是背景。正样本对我们的意义要大于负样本,即正样本被检测出来越多越好。也就是说,只要检测目标的准确率提高了,哪怕背景有时候会被错分,模型性能也是提高的。

而对于分类问题,这两个原因就不成立了。

  1. 分类任务的各类别都是难易样本混杂的

    分类任务几乎不存在一类都是易样本的情况。这就导致,focal loss带来的副作用更大了。即,会有更多的pt较小的、原本被分类正确的难样本,在经过focal loss优化之后,被分类错误。

  2. 各类别重要性不存在高低之分

    也就是说,某一类别准确率的提高,并不能抵消另一类别准确率的下降。

小训练集的过拟合

损失函数是针对训练集优化的。而对于小训练集的而言,训练集样本大多都可以称为易样本。

在这里插入图片描述

这样一来,相比于focal loss对难样本的提高,其对易样本的抑制要更为明显。即副作用要更加明显。

发布了148 篇原创文章 · 获赞 70 · 访问量 3万+
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 点我我会动 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览