Cora数据集有2708个样本点,每个样本点表示一篇论文。所有样本点分为7个类别。
7个类别依次为:
每篇论文都由一个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
==================================================
accuracy:
nll loss:0.8450
CE loss:0.8450
focal loss:
nll loss 和 CE loss 的训练结果完全一致,二者说白了其实是一个损失函数,只是表示的方式不同。
CE loss 的信息如下:
l o s s ( x , c l a s s ) = − l o g ( e x p ( x [ c l a s s ] ) ∑ j e x p ( x [ j ] ) ) loss(x,class)=−log(\frac{exp(x[class])}{\sum _jexp(x[j])}) loss(x,class)=−log(∑jexp(x[j])exp(x[class]))
This criterion combines
nn.LogSoftmax()
andnn.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 γ项的引入,即 ( 1 − p ) γ (1-p)^\gamma (1−p)γ 和 p γ p^\gamma pγ 这两项。结果为降低高置信度样本产生的损失,从而使模型更加专注于难分类 (即低置信度) 样本。
上图说明,无论损失函数选择CE、nll或是focal loss,样本类别数最少的一类 (上图中棕色) 是分类正确率最低的一类。这也是为什么说focal loss是处理样本不平衡方法的一种通用方案。因为一般来说,少样本的类别,其样本的置信度普遍不高。
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的结果来看 (结合训练集样本比例) ,类别的样本数越多,整体的置信度越高 (比如上图,高置信度样本绿色最多,其次是红色和橙色) ;于此相对应的,少样本的类别整体的置信度要低于多样本类别。
focal loss 对模型的影响
如前所说,focal loss 的核心思想是通过降低高置信度样本产生的损失,从而使模型更加专注于难分类 (即低置信度) 样本。
从实验结果来看,focal loss 模型输出的高置信度样本的数量要远远少于CE,这就反映了focal loss对高置信度样本的抑制 (即认为高置信度 (易分类) 样本对模型提升小,故对其赋予较低的权重) 。
focal loss的另一个结果是使得第六类 Rule_Learning 的样本的pt整体上浮,即在CE下难以被分类正确的样本在focal loss下更容易被分类正确 (即模型更专注于难分类样本)。
这个矛盾简单来说,就是模型更偏向于难样本的同时,并没有对易样本进行保持,这是focal loss的一个副作用。
我们希望易样本一直保持易样本,而使难样本也变成易样本。而在focal loss下,由于对高置信度样本的 γ \gamma γ 衰减,易样本也会有一部分变为难样本。
即focal loss下,难样本–>易样本、易样本–>难样本,是同时发生的(有待于进一步的实验验证)。反映在实验结果上,即出现pt向中间聚集的情况 (高置信度样本的损失被抑制,低置信度样本的损失被相对放大)。
而这个副作用,实际上被focal loss的提出场景规避了。
这个还要从 focal loss 提出的场景说起。focal loss是针对目标检测中的one-stage方法提出的,意在从大量的负易样本中分类出正难样本。
关于样本的分类,按照正/负和难/易可以分为下面四类:
难 | 易 | |
---|---|---|
正 | 正难(少) | 正易, γ \gamma γ衰减 |
负 | 负难, α \alpha α衰减 | 负易, α \alpha α, γ \gamma γ衰减(多) |
focal loss使得正难样本的分类正确率提高 (即正样本被分类为正样本,我们希望看到的) ,不好的一点是会有一部分原本被分类正确的负样本被分类错误 (即负样本被分类为正样本) 。
这个副作用被规避有两个主要的原因:
目标检测中的负样本中负易占极大的比例
这就使得,尽管有focal loss对易样本的抑制,负样本被错分的概率依旧比较小。因为相比于pt较小的负难更可能被错误分类为正样本,pt较大的负易经由focal loss之后大概率还是负易。
正样本的意义 > 负样本的意义
正样本是要检测的目标,负样本是背景。正样本对我们的意义要大于负样本,即正样本被检测出来越多越好。也就是说,只要检测目标的准确率提高了,哪怕背景有时候会被错分,模型性能也是提高的。
而对于分类问题,这两个原因就不成立了。
分类任务的各类别都是难易样本混杂的
分类任务几乎不存在一类都是易样本的情况。这就导致,focal loss带来的副作用更大了。即,会有更多的pt较小的、原本被分类正确的难样本,在经过focal loss优化之后,被分类错误。
各类别重要性不存在高低之分
也就是说,某一类别准确率的提高,并不能抵消另一类别准确率的下降。
损失函数是针对训练集优化的。而对于小训练集的而言,训练集样本大多都可以称为易样本。
这样一来,相比于focal loss对难样本的提高,其对易样本的抑制要更为明显。即副作用要更加明显。