1. 如何处理不平衡数据(一)——欠采样
一、重采样
1、欠采样
欠采样就是一个随机删除一部分多数类(数量多的类型)数据的过程
# Shuffle the Dataset. 进行一个数据集打乱的操作
shuffled_df = credit_df.sample(frac=1,random_state=4)
# Put all the fraud class in a separate dataset. 欺诈类 就是数量少的类
fraud_df = shuffled_df.loc[shuffled_df['Class'] == 1]
#Randomly select 492 observations from the non-fraud (majority class) 选取过多的类进行一个抽取
non_fraud_df=shuffled_df.loc[shuffled_df['Class']== 0].sample(n=492,random_state=42)
# Concatenate both dataframes again 生成一个均衡类
normalized_df = pd.concat([fraud_df, non_fraud_df])
#plot the dataset after the undersampling 下面是画图操作
plt.figure(figsize=(8, 8))
sns.countplot('Class', data=normalized_df)
plt.title('Balanced Classes')
plt.show()
2. 如何处理数据不平衡问题
基于上一篇文章,面试被虐成渣,所以来整理和记录下第一个问题,关于数据不平衡的问题。
以下内容参考:
https://www.cnblogs.com/charlotte77/p/10455900.html https://www.leiphone.com/news/201706/dTRE5ow9qBVLkZSY.html
数据不平衡也可称作数据倾斜。在实际应用中,数据集的样本特别是分类问题上,不同标签的样本比例很可能是不均衡的。因此,如果直接使用算法训练进行分类,训练效果可能会很差。
解决实际应用中数据不平衡问题可以从三个方面入手,分别是对数据进行处理、选择合适的评估方法和使用合适的算法。
1)过采样:
主动获取更多的比例少的样本数据。由于样本比例不均衡,在条件允许的情况下可以尝试获取占比少的类型的样本数据。(PS:这就是为什么我几乎没有遇到过数据不平衡的问题。每次测试使用的数据集都尽可能的完美均衡) 也可以通过使用 重复 、 自举 或 合成 少数类过采样等方法(SMOTE)来生成新的稀有样品。
直接简单复制重复的话,如果特征少,会导致过拟合的问题。经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本 (数据增强)。
2)欠采样:
数据量足够时,可以通过保留比例小的样本数据和减少比例大的样本数据来平衡数据集。缺点是会丢失多数类中的一些重要信息。
3)改变权重:
对不同样本数量的类别赋予不同的权重(通常会设置为与样本量成反比)
4)使用K-fold交叉验证
值得注意的是,使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么在过度采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。
K-fold交叉验证就是把原始数据随机分成K个部分,在这K个部分中选择一个作为测试数据,剩余的K-1个作为训练数据。交叉验证的过程实际上是将实验重复做K次,每次实验都从K个部分中选择一个不同的部分作为测试数据,剩余的数据作为训练数据进行实验,最后把得到的K个实验结果平均。
此外,还应注意训练集和测试集的样本的概率分布问题。若实际数据不平衡,将采样平衡后的数据集作为训练集训练后,模型应用在测试集上效果仍会不好。因此,实际应用中尽可能 保持训练和测试的样本的概率分布是一致的。
1)谨慎选择AUC作为评价指标:对于数据极端不平衡时,可以观察观察不同算法在同一份数据下的训练结果的precision和recall,这样做有两个好处,一是可以了解不同算法对于数据的敏感程度,二是可以明确采取哪种评价指标更合适。针对机器学习中的数据不平衡问题,建议更多PR(Precision-Recall曲线),而非ROC曲线,具体原因画图即可得知,如果采用ROC曲线来作为评价指标,很容易因为AUC值高而忽略实际对少量样本的效果其实并不理想的情况。
2)不要只看Accuracy:Accuracy可以说是最模糊的一个指标了,因为这个指标高可能压根就不能代表业务的效果好,在实际生产中更关注precision/recall/mAP等具体的指标,具体侧重那个指标,得结合实际情况看。
1)选择对数据倾斜相对不敏感的算法。如树模型等。
2)集成学习。即多模型Bagging。首先从多数类中独立随机抽取出若干子集,将每个子集与少数类数据联合起来训练生成多个基分类器,再加权组成新的分类器,如加法模型、Adaboost、随机森林等。
3)转化成异常检测或者一分类问题。(具体内容后续有时间再跟进学习)
补充:什么是数据增强(Data Augmentation)?
参考链接:https://www.jianshu.com/p/3e9f4812abbc
数据增强让有限的数据产生更多的数据,增加训练样本的数量以及多样性(噪声数据), 提升模型鲁棒性, 一般用于训练集。神经网络需要大量的参数,许许多多的神经网路的参数都是数以百万计,而使得这些参数可以正确工作则需要大量的数据进行训练,但在很多实际的项目中,我们难以找到充足的数据来完成任务。随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力。
数据增强方法:
例如,我们可以对图像进行不同方式的裁剪,让物体以不同的实例出现在图像的不同位置,这同样能够降低模型对目标位置的敏感性。此外,调整亮度、对比度、饱和度和色调 等因素来降低模型对色彩的敏感度。再有,随机裁剪、随机反转、随机对比度增强、颜色变化等等。一般来讲随机反转和一个小比例的random resize,再接随机裁剪比较常用。NLP中将字和词连接起来就形成了一个新样本,也属于数据增强。
数据增强的分类:
数据增强可以分为两类,一类是离线增强,一类是在线增强。
· 离线增强 : 直接对数据集进行处理,数据的数目会变成增强因子乘以原数据集的数目,这种方法常常用于数据集很小的时候。
· 在线增强 : 这种增强的方法用于,获得批量(batch)数据之后,然后对这个批量(batch)的数据进行增强,如旋转、平移、翻折等相应的变化,由于有些数据集不能接受线性级别的增长,这种方法长用于大的数据集,很多机器学习框架已经支持了这种数据增强方式,并且可以使用 GPU 优化计算。
3. [翻译]处理样本不均衡的8个方法
本文主要翻译自 8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset .
当某一类别的数据量远大于另一类别的样本数量时,我们就称其样本不均衡。数据类别样本本不均衡是机器学习中非常常见的一个问题,最常见的例子可能莫过于异常检测了。在异常检测中绝大部分样本都是正常类型的,只有极少部分属于异常。
此外,当我们数据中某一类别(这里及后面都以二分类为例)的数据量比例大于90%时,我们模型的准确率可能很简单的达到较好的准确率(90%以上),但是此时并不能说明我们的模型好,因为此时模型的预测结果可能只输出一个类别,而即便如此,其准确率依然能达到90%以上。很明显,这显然不是我们想要的。
下面我们将讨论8个用来解决数据不均衡的方法。
咋一听可能会觉得这可能是废话,但是事实上收集更多的数据这一方法常常被忽略。收集更多的数据不仅能有效解决过拟合问题,收集更多的少类别样本更能够解决数据不均衡的问题。所以,遇到样本不均衡问题时,我们应该首先思考能否收集更多的数据。
如上面说到的,当类别样本不均衡的时候,使用准确率作为评估标准往往很容易产生误导。此时我们可以采用别的评估方法,如kappa系数,ROC曲线,混淆矩阵,Recall,Precision,F1 Score等,更多可参见 Classification Accuracy is Not Enough: More Performance Measures You Can Use .
通过重采样,我们可以得到更多的数据样本已得到一个平衡的数据集。常用的采样方法有两种:
这些方法都很简单而且易于实现。通常可以将这两种方法都进行尝试,看哪种方法得到的结果更好来做决定采用哪种方法。更多的可以参考 Oversampling and undersampling in data analysis .
一些经验:
一个简单的合成样本的方法是随机的从数据量少的类别实例中随机挑选属性来生成样本。
你可以在数据集中凭经验对它们进行采样,或者也可以使用像Naive Bayes这样的方法,它可以在反向运行时独立地对每个属性进行采样。你将拥有更多不同的数据,但可能无法保留属性之间的非线性关系。
当然也可以使用系统算法生成合成样本。最流行的此类算法称为SMOTE (Synthetic Minority Over-sampling Technique). 正如它的名字一样,SMOTE是一个over-sampling方法,他通过样本数据较少类别的数据来合成新的数据而非简单的复制数据。该算法选择两个或更多个类似的实例(使用距离测量),并且对于差异内的相邻实例一次随机扰动实例一个属性。更多的关于SMOTE算法的内容,可以参考论文 SMOTE: Synthetic Minority Over-sampling Technique .
在Python中,在 UnbalancedDataset 包中实现了SMOTE算法。
不同算法可能适用于不同的问题,因此对于同一个问题可以尝试使用不同的算法试试。话虽如此,决策树通常在不平衡的数据集上表现良好,用于创建树的类变量的拆分规则可有效解决这个问题。
附加罚分模型使用相同的算法但是提供了不同的视角。对于样本数较少的类别,罚分模型添加额外的损失(加大损失),这使得模型更加重视少样本类别的分类。
通常,类惩罚或权重的处理专用于学习算法。存在惩罚版本的算法,例如惩罚的SVM和惩罚的LDA。
当你的算法无法使用重采样来解决数据不平衡问题或结果很差时,使用罚分模型是非常有必要的。他提供了另一种处理数据不均衡的方法。然而,设置罚分矩阵很复杂,常常需要尝试很多次才能找到最佳策略。
现在有很多关于样本不均衡问题的研究,他们都有自己的算法、评估方法、或者技术等。从不同的角度来思考数据不均衡问题可能带给我们不一样的结果。
两个可能需要考虑的是异常检测和变化检测。
异常检测是罕见事件的检测,这可能是由于偶然事件或由系统调用序列指示的程序的恶意活动而指示的机器故障。与正常操作相比,这些事件很少见。这种思维转变将次要类别视为异常类,这可能有助于考虑分离和分类样本的新方法。
变化检测类似于异常检测,除了寻找异常之外,它正在寻找变化或差异。这可能是使用模式或银行交易所观察到的用户行为的变化。
这两种转变都对分类问题采取了更为实际的立场,可能会为我们提供一些思考问题的新方法,也许还有一些尝试的技巧。
更加深入的思考所遇到的问题然后将问题分成一个个更容易解决的小问题。可以参考“ In classification, how do you handle an unbalanced training set? ”和 “ Classification when 80% of my training set is of one class “.
其实,样本不均衡就是不同类别的数据不同使得模型学习时候偏向各个类别的权重不同,而我们要做的,其实就是如何均衡各个类别的权重,无论是上采样,下采样,抑或是更改loss,给数据量少的类别的loss给多权重,更直接的,在某些库的分类器中我们可以看到给某些样本直接赋予权重,这些虽然看起来不同,但是其实都是为了均衡权重这一目的而来的。
这些方法都不需要太多的数学理论知识,你所需要做的仅仅只是挑出一种方法,然后开始尝试,直到找到最好的方法。
在看宗成庆老师的《统计自然语言处理》时,书中讲到文本情感分类数据不平衡时谈到了几个已有的方法,感觉还不错,因此摘过来。
该方法包括以下几个步骤对不平衡数据的标注样本进行训练:
该方法借鉴中心向量充分利用‘多类’里面所有样本的分类信息,可获得比传统采样方法更好的结果。
该方法有如下两个特点:
去掉其非监督标注部分,其实此方法就是在数据较多的类别中多次取样然后与少数据的类别一起训练多个分类器(每个分类器有一个类别的样本不同,然后分类时各个分类器又使用不同的特征),其思想与随机森林较为相像。
4. 数据的算法都有哪些……
A*搜寻算法
俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的 NPC的移动计算,或线上游戏的 BOT的移动计算上。该算法像 Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。
Beam Search
束搜索(beam search)方法是解决优化问题的一种启发式方法,它是在分枝定界方法基础上发展起来的,它使用启发式方法估计k个最好的路径,仅从这k个路径出发向下搜索,即每一层只有满意的结点会被保留,其它的结点则被永久抛弃,从而比分枝定界法能大大节省运行时间。束搜索于20 世纪70年代中期首先被应用于 人工智能领域,1976 年Lowerre在其称为 HARPY的语音识别系统中第一次使用了束搜索方法。他的目标是并行地搜索几个潜在的最优决策路径以减少回溯,并快速地获得一个解。
二分取中查找算法
一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。这种搜索算法每一次比较都使搜索范围缩小一半。
Branch and bound
分支定界算法是一种在问题的解空间树上搜索问题的解的方法。但与回溯算法不同,分支定界算法采用广度优先或最小耗费优先的方法搜索解空间树,并且,在分支定界算法中,每一个活结点只有一次机会成为扩展结点。
数据压缩
数据压缩是通过减少计算机中所存储数据或者通信传播中数据的冗余度,达到增大数据密度,最终使数据的存储空间减少的技术。数据压缩在文件存储和分布式系统领域有着十分广泛的应用。数据压缩也代表着尺寸媒介容量的增大和网络带宽的扩展。
Diffie–Hellman密钥协商
Diffie–Hellman key exchange,简称“D–H”,是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。
Dijkstra’s 算法
迪科斯彻算法(Dijkstra)是由荷兰计算机科学家艾兹格·迪科斯彻发明的。算法解决的是有向图中单个源点到其他顶点的最短路径问题。举例来说,如果图中的顶点表示城市,而边上的权重表示着城市间开车行经的距离,迪科斯彻算法可以用来找到两个城市之间的最短路径。
动态规划
动态规划是一种在 数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。 动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。比较着名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等。这里也有一篇文章说得比较详细。
欧几里得算法
在 数学中,辗转相除法,又称 欧几里得算法,是求 最大公约数的算法。辗转相除法首次出现于 欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至 东汉出现的《九章算术》。
快速傅里叶变换(FFT)
快速傅里叶变换(Fast Fourier Transform,FFT),是离散傅里叶变换的快速算法,也可用于计算离散傅里叶变换的逆变换。快速傅里叶变换有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程等等。
哈希函数
HashFunction是一种从任何一种数据中创建小的数字“指纹”的方法。该 函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。好的散列 函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
堆排序
Heapsort是指利用堆积树(堆)这种 数据结构所设计的一种排序算法。堆积树是一个近似完全二叉树的结构,并同时满足堆积属性:即子结点的键值或索引总是小于(或者大于)它的父结点。
归并排序
Merge sort是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
RANSAC 算法
RANSAC 是”RANdom SAmpleConsensus”的缩写。该算法是用于从一组观测数据中估计 数学模型参数的迭代方法,由Fischler and Bolles在1981提出,它是一种非确定性算法,因为它只能以一定的概率得到合理的结果,随着迭代次数的增加,这种概率是增加的。该算法的基本假设是观测数据集中存在”inliers”(那些对模型参数估计起到支持作用的点)和”outliers”(不符合模型的点),并且这组观测数据受到噪声影响。RANSAC 假设给定一组”inliers”数据就能够得到最优的符合这组点的模型。
RSA加密算法
这是一个公钥加密算法,也是世界上第一个适合用来做签名的算法。今天的RSA已经 专利失效,其被广泛地用于 电子商务加密,大家都相信,只要密钥足够长,这个算法就会是安全的。
并查集Union-find
并查集是一种树型的 数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
Viterbi algorithm
寻找最可能的隐藏状态序列
等等这些,算法很多。
5. 数据处理方法有哪些
数据处理方法有:
1、标准化:标准化是数据预处理的一种,目的的去除量纲或方差对分析结果的影响。作用:消除样本量纲的影响;消除样本方差的影响。主要用于数据预处理。
2、汇总:汇总是一个经常用于减小数据集大小的任务。汇总是一个经常用于减小数据集大小的任务。执行汇总之前,应该花一些时间来清理数据,尤其要关注缺失值。
3、追加:追加节点将结构类似的表,选取一个主表,将另外的表追加在主表后面(相当于增加行记录)。注意:要追加文件,字段测量级别必须相似。例如,名义字段无法附加测量级别为连续的字段,即字段类型的相同。
4、导出:用户可以修改数据值并从现有数据中派生出新字段。可以根据一个或多个现有字段按6种方式创建出一个或者多个相同的新字段。
5、分区:分区节点用于生成分区字段,将数据分割为单独的子集或样本,以供模型构建的训练、测试和验证阶段使用。通过用某个样本生成模型并用另一个样本对模型进行测试,可以预判此模型对类似于当前数据的大型数据集的拟合优劣。
6. 目标检测中的样本不平衡处理方法——OHEM, Focal Loss, GHM, PISA
GitHub
CSDN
目前。计算机视觉中的性能最好的目标检测方法主要分为两种: one-stage 和two-stage 方法。two-stage方法分为两步,第一步为候选区域生成阶段(Proposal stage),通过如Selective Search、EdgeBoxes等方法可以生成数量相对较小候选目标检测框;第二步为分类与回归阶段,对第一阶段生成的 Candiate Proposal 进行分类和位置回归。one-stage 代表性的方法是R-CNN系列,如 R-CNN, Fast R-CNN, Faster R-CNN。 而one-stage 方法直接对图像的大量 Candiate Proposals 进行分类与回归。
这两类方法中均存在类别不平衡问题,two-stage 方法通过第一步已经将当量的候选区域降低到一个数量较小的范围,同时又在第二步通过一些启发式原则,将正负样本的比例降低到一定程度。而 one-stage 优于没有这降低候选框的步骤,因此,候选区域的数量大大超过 two-stage 方法,因此,在精度上,two-stage 仍然优于 one-stage 方法,但是在速度和模型复杂度上, one-stage 占优势。
类别不平衡会使检测器评估 的候选位置,但是通常只有少量的位置存在目标,这回导致两个问题:
因此,解决样本不平衡问题是提高目标检测精度的一个关键技术之一。
论文题目: Training Region-based Object Detectors with Online Hard Example Mining
OHEM 是通过改进 Hard Example Mining 方法,使其适应online learning算法特别是基于SGD的神经网络方法。Hard Example Mining 通过交替地用当前样本集训练模型,然后将模型固定,选择 False Positive 样本来重新组建用于下一次模型训练的样本集。但是因为训练神经网络本事就是一个耗时的操作,这样在训练中固定模型,这样会急剧降低模型的训练进程。
Hard Examples Mining通常有两种方法:
OHEM算法的大致流程是: 首先计算出每个ROI的loss, 然后按loss从高到低来排列每个 ROI, 然后为每张图片选择 个损失最高的 ROI 作为Hard Examples,其中 B 表示总的 ROI 数量, 表示batch-size 的大小,在 Fast R-CNN 中, N=2, B=128时,效果很好。
但是如果直接按照 loss 对所有的 ROI 进行选择,会有一个缺点,由于 ROI 很多,这样 很多 ROI 的位置就会相关并重叠,如果和某个高 Loss 的 ROI 重合度很高的其它 ROI很多, 这样, 这些 ROI 的 Loss 通常也会很多,这样这些样本都会被选择,但是它们可以近似认为时同一个,这样就会给其它较低 Loss 的 ROI 更少的选择余地,这样就会存在冗余。为了消除这种冗余,作者提出先使用 NMS (non-maximum suppression) 删除部分重合度很高的 ROI, 在使用上述方法进行 选择 Hard Example。
实现技巧:
论文,作者将该方法是现在 Fsat R-CNN 目标检测方法中。最简单做法是更改损失函数层,损失函数层首先计算所有 ROI 的 loss, 然后根据 loss 对 ROI 进行排序,并选择 hard RoIs, 让 那些 non-RoIs的损失变为0. 这种方法虽然很简单,但是非常不高效,因为还需要为所有的 RoIs 分配进行反向传播时需要的内存空间。
为了克服这个缺点,作者对下面的 Figure 1 进行改进, 如下面的 Figure 2.该改进时使用两份同样的 RoI network。 其中一个是只读的(readonly), 即只进行前向计算,不进行反向传播优化,所以只需要为前向传播分配内存,它的参数实时保持和另一个 RoI network(regular RoI network)保持一样。在每次迭代时,首先使用 readonly RoI network 对每个 ROI 计算起 loss,然后用上面描述的选择 hard RoIs 的方法选择 hard RoIs. 然后利用 regular RoI network来对选择的 hard RoIs 进行前向和后向计算来优化网络。
论文题目 Focal Loss for Dense Object Detection
在改论文中,作者认为样本类别的不平衡可以归结为难易样本的不平衡,从而更改交叉熵损失函数,重新对样本赋予不同的权值,之前的模型这些样本都是同等重要的,从而使模型训练更加关注 hard examples。
首先引入交叉熵的公式:
其中, ,表示真实类别, 表示我们预测的概率,为了方便,我们定义:
因此, ,该方法在 较大时,该loss是一个较小的量级, 如下图的连线所示所示,因为存在大量的易分类样本,相加后会淹没正样本的loss。
一个常见的解决类别不平衡的方式是引入一个加权因子 来表示正样本的权重, 表示负样本的权重。我们按照定义 的方法重新定义 为 , 定义如下:
虽然可以平衡 positive和negative的重要性,但是对 easy/hard 样本还是无法区分, Focal loss 通过更 Cross loss来达到区分easy/hard的目的:
上图展示了不同 取值对应的 loss,通过分析上述公式,我们发现,当 非常小时,即样本被分类错误,此时 接近1, loss几乎不受影响,当 接近于1时,即样本被分类正确,此时 接近0,此时降低了该样本的权重,比如,取 , 当时 时,该样本的 loss 会降低100倍,
在实际应用中,作者使用了该 Focal loss的变体,即加入了 平衡因子:
作者提出,对于二分类,一般模型的模型初始化会同概率的对待正负样本,由于类别不平衡,负样本的 loss 会占主导,作者提出在训练初始阶段对正样本的概率估计“prior”的概念,用 表示, 通过设置它来达到正样本的输出概率低的效果,比如为0.01,从而使模型更加关注正样本。实际操作中,出了最后一个用于分类的卷积层,其余卷积层的参数初始化为bias ,而最后一层 , 实验中设置为 0.01.
两个实现细节
论文题目: Gradient Harmonized Single-stage Detector
改论文提出 Focal Loss 存在两个缺点:
该论文有一句概括该篇论文的核心思想的一句话: 类别的不平衡可以归结为难易样本的不平衡,难易样本的不平衡可以归结为梯度的不平衡原话如下:
如下图所示:
左边是样本数量关于梯度的分布,中间表示各个修正后的函数的梯度(使用了log scale)对原始梯度的,右边表示所有样本集的梯度贡献的分布。
定义 是模型未经过 sigmoid 之前的输出, 则 ,得出该损失函数对 的梯度为:
定义梯度的模长(norm) 为:
训练样本的梯度密度(Gradient Density)定义如下:
其中, 是第 k 个样本的gradient norm,
这个公式可以理解为,以梯度 为中心,宽度为 的区域内的样本密度。
梯度密度协调参数:
分母是对梯度位于 范围的部分样本进行归一化,如果所有样本的梯度时均分分布,那么对于任意 都有 .(这里不是很理解为什么N,可以理解它们相等)
通过将梯度密度协调参数将 GHM 嵌入到损失函数中,则 GHM-C Loss 为:
计算公式11时,求和有一个N,再求 时会遍历所有的样本,因此该公式的时间复杂度为 .如果并行的化,每个计算单元也有N的计算量。对gradient norm进行排序的最好的算法复杂度为 ,然后用一个队列去扫描样本得到梯度密度的时间复杂度为 n 。基于排序的方法即使并行也不能较快的计算,因为N往往是 甚至 ,仍然是非常耗时的.
作者提出的近似求解的方法如下:
根据上述定义,得出近似梯度密度函数为:
利用上面的公式,由于我们可以事先求好 , 在求和时只需查找 即可,因此时间复杂度为 .
因为loss的计算是基于梯度密度函数,而梯度密度函数根据一个batch中的数据得到,一个batch的统计结果是有噪声的。与batch normalization相同,作者用Exponential moving average来解决这个问题,也就是
将模型鱼的的偏移量定义为 , 将真实的偏移量定义为 ,回归loss采用 Smooth L1 loss:
其中
则 关于 的梯度为:
从公式可以看出,当样本操作 时, 所有样本都有相同的梯度 1, 这就使依赖梯度范数来区分不同样本是不可能的, 一种简单的替代方法时直接使用 作为衡量标准,但是该值理论上无限大,导致 无法实现,
为了将 GHM 应用到回归损失上,作者修改了原始的 损失函数:
该函数和 具有类似的属性,当d的绝对值很小时,近似 L2 loss, 当d的绝对值比较大时, 近似 L1 loss, 关于d的梯度为:
这样就将梯度值限制在
定义 , 则 GHM-R Loss 为:
论文题目: Prime Sample Attention in Object Detection
PISA 方法和 Focal loss 和 GHM 有着不同, Focal loss 和 GHM 是利用 loss 来度量样本的难以程度,而本篇论文作者从 mAP 出法来度量样本的难易程度。
作者提出提出改论文的方法考虑了两个方面:
Prime Samples 是指那些对检测性能有着巨大影响的样本。作者研究表明样本的重要程度依赖于它和ground truth 的 IoU值,因此作者提出了一种 IOU-HLR 排序。
在目标检测中时如何定义正样本(True Positive)的呢?
剩余的标注为负样本。
mAP 的原理揭露了对目标检测器更重要的 两个准则 :
基于上述分析,作者提出了一种称为 IoU-HLR 的排序方法,它既反映了局部的IoU关系(每个ground truth目标周围),也反映了全局的IoU关系(覆盖整个图像或小批图像)。值得注意的是,不同于回归前的边界框坐标,IoU-HLR是根据样本的最终定位位置来计算的,因为mAP是根据回归后的样本位置来计算的。
该排序方法的大致流程如下图所示,其原理如下:
IoU-HLR遵循上述两个准则。首先,它通过局部排序(即上面的步骤2)将每个单独的 GT 的 对应的样本中 IoU 较高的样本放在前面,其次通过重采样和排序(步骤3, 4)将不同 GT 的 对应的样本中, 将 IoU 较高的放在了前面。
作者提出Prime Sample Attention,一种简单且有效的采样策略,该采样策略将更多的注意力集中到 Prime examples 上, PISA 由两部分组成: Importance- based Sample Reweighting(ISR)和Classification Aware Regression Loss(为CARL).
PISA 的训练过程是基于 prime samples 而不是同等对待所有样本。
作者提出一种基于 soft sampling 的方法: Importance-based Sample Reweighting (ISR), 他给不同样本根据重要性赋予不同的权重。首先它将Iou-HLR排序转化为线性映射的真实值。 IoU-HLR在每个类中分别进行计算。对于类 , 假设总共有 个样本, 通过 IoU-HLR 表示为 . 其中 ,使用一个线性转换函数将 转换为 , 表示第 类中的第 个样本的重要程度:
采用指数函数的形式来京一部将样本重要性 转换为 loss 的权值 , 表示对重要样本给予多大的优先权的程度因子, 决定最小样本权值的偏差(感觉就是一个决定最小的权值大小的一个变量)。
根据上面得到的权重值,重写交叉熵:
其中 n 和 m 分别表示真样本和负样本的数量, 和 分别表示预测分数和分类目标,需要注意的是,如果只是简单的添加 loss 权值将会改变 loss 的值,并改变正负样本的比例,因此为了保持正样本的总的 loss 值不变, 作者将 归一化为
(这里不是很理解,欢迎大家解惑)
5.3.1 已经介绍如何染个分类器知道 prime samples, 那么如何让回归其也知道 prime sample,作者提出了 Classification-Aware Regression Loss(CARL) 来联合优化分类器和回归其两个分支。CARL可以提升主要样本的分数,同时抑制其他样本的分数。回归质量决定了样本的重要性,我们期望分类器对重要样本输出更高的分数。两个分支的优化应该是相互关联的,而不是相互独立的。
作者的方法是让回归器知道分类器的分数,这样梯度就可以从回归器传播到分期其分支。公式如下:
表示相应类别的预测分数, 表示输出的回归偏移量。利用一个指数函数将 转化为 ,随后根据所有样本的平均值对它进行缩放。为了保持损失规模不变,对具有分类感知的 进行归一化。 是常用的smooth L1 loss。
关于 的梯度与原回归损失 成正比。 p_i mathcal{L}(d_i, hat d_i) mathcal{L}(d_i, hat d_i)$ 反映了样本i的定位质量,因此可以认为是一个IoU的估计,进一步可以看作是一个IoU-HLR的估计。可以近似认为,排序靠前的样本有较低的回归损失,于是分类得分的梯度较小。对于CARL来说,分类分支受到回归损失的监督。 不重要样本的得分被极大的抑制掉,而对重要样本的关注得到加强。
待续。。。
上面的方法大致可以分为两种:
Focal Loss认为正负样本的不平衡,本质上是因为难易样本的不平衡,于是通过修改交叉熵,使得训练过程更加关注那些困难样本,而GHM在Focal Loss的基础上继续研究,发现难易样本的不平衡本质上是因为梯度范数分布的不平衡,和Focal Loss的最大区别是GHM认为最困难的那些样本应当认为是异常样本,让检测器强行去拟合异常样本对训练过程是没有帮助的。PISA则是跳出了Focal Loss的思路,认为采样策略应当从mAP这个指标出发,通过IoU Hierarchical Local Rank (IoU-HLR),对样本进行排序并权值重标定,从而使得recall和precision都能够提升。
7. 5种数据科学家必知的采样算法
原文链接:The 5 Sampling Algorithms every Data Scientist need to know
假设有1000名学生,其中300名是男生,700名是女生。如果从中抽取出100名,可以对1000名随机采样,也可以从男生中选30名,女生中选70名,这就是分层采样。
假设有一个未知长度的流数据,只能遍历一遍,如何从中等概率地选出n个元素
基本想法是维护一个n长的列表,在遍历流数据的过程中,以一定的概率将流数据中当前遍历到的元素添加到列表中,或者替换列表中已有的元素。
那么,问题就是,这个“一定的概率”需要是多少,才能保证每个选中的元素都是等概率的。
我们把问题简化一下,假设有一个长度为3的流数据,我们从中选择2个,那么每个元素被选中的概率都是2/3。采用如下的步骤:
第3个元素替换1的概率是1/3,替换2的概率也是1/3,这样,每个元素被选中的概率都是2/3。
在处理高度不平衡的数据集的时候,经常会用户重采样方法,重采样有降采样和过采样两种。降采样是从样本多的类别中删除样本,过采样是向样本少的类别中添加样本。
imbalanced-learn(imblearn)是一个处理非平衡数据集的Python包。
Tomek Links 是一组从属于不同类别的相邻样本对。我们可以将这些相邻的样本对都删除,来为分类器提供一个更清晰的分类边界。
SMOTE (Synthetic Minority Oversampling Technique) 对样本少的类别合成样本,这些合成的样本位于已有样本的临近位置上。
在 imblearn 包中还有其他的算法,比如: