array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 深度学习新的采样方式和损失函数--论文笔记 - 爱码网

深度学习新的采样方式和损失函数--论文笔记

论文《Sampling matters in deep embedding learning》

论文地址:https://arxiv.org/pdf/1706.07567.pdf

该论文为2017年6月上传至arxiv。主要研究的是深度嵌入学习(deep embedding learning)中的采样问题和损失函数的问题。作者分析了contrastive loss和triplet loss,提出了一种新的采样方式(distance weighted sampling)和一种新的loss function(margin based loss)。证明了训练模型时,数据的采样方式和loss function的形式对结果有着同样重要的影响。实验证明,该工作提出的方法在多个数据集上都能够得到最好的效果。

在机器学习领域,对loss function的研究已经有很多了,loss function的好坏,直接影响到模型的训练结果。作者在本文中只讨论深度嵌入学习,可以简单理解为基于深度模型的学习,之所以叫嵌入学习(embedding learning)是因为该类模型的核心思想是:建立一个嵌入空间,在该空间中,相似的样本距离近,不相似的样本距离远。

传统loss function

设f(xi)为嵌入空间中的数据点,我们的目标是使得嵌入空间中相似的点距离近,不相似的点距离远。设两样本的欧氏距离为:

深度学习新的采样方式和损失函数--论文笔记 对于正样本对,有yij=1,对于负样本对,则有yij=0。

Contrastive loss

其目标函数如下:

深度学习新的采样方式和损失函数--论文笔记

该loss的问题在于,它需要定义一个固定的a,这其实就默认了所有每类样本的分布都相同,这其实是一个很强的假设。

Triplet loss

其目标函数如下:

深度学习新的采样方式和损失函数--论文笔记

它使得正负例样本之间的距离尽可能接近于a,这就不管数据的分布了。它能够补足contrastive loss的缺点,使得嵌入空间可以任意扭曲。作者总结称,triplet loss超越constrative loss的原因有两个:1)constrative loss有一个固定的a,而triplet loss能够灵活适应各种空间形状,一定程度上能够抵御噪声的影响;2)triplet loss只要求正例与正例的距离小于正例与负例的距离即可,而constrative loss则还要尽量使所有的正例集中在一起,而这点是不必要的。

对于contrastive loss来说,使用hard negative mining的方法,能够使得模型收敛得更快;然而,如果使用的是triplet loss,hard negative mining很可能会模型坍塌。这里所说的hard negative mining是指:对于某些任务,比如人脸检测,直接进行采样,训练出的模型效果不会太好,因为模型可能会检测出很多假正例;因此,可以取置信度很高的为正例的真负例,与正例一起训练,这些负例就被称为hard negative mining。对于模型坍塌的问题,可以这样解释,设一个anchor样本a,负例样本n,如果对负例样本f(xn)求梯度,可得:

深度学习新的采样方式和损失函数--论文笔记

其中

深度学习新的采样方式和损失函数--论文笔记

Hard negative样本通常离anchor的距离较小,即han较小,这时如果有噪声,那么这种采样方式就很容易受到噪声的影响,从而造成训练时的模型坍塌。

由于模型坍塌的问题,FaceNet[1]提出了一种semi-hard negative mining的方法:给定一个anchor样本a,一个正例样本p,对于负例的采样,使用以下公式:

深度学习新的采样方式和损失函数--论文笔记

这样采样出来的负例,不至于过于hard。

Distance Weighted sampling

在现实状态下,如果同类样本是均匀分布在其各自的簇中的,如果我们对所有的样本进行两两采样,计算其距离,最终得到的点对距离分布(distribution of pairwise distances)有着如下关系:

深度学习新的采样方式和损失函数--论文笔记

而且,最佳的采样状态是对于分散均匀的负样本,进行均匀地采样。具体证明,可以参考论文[2]。因此,作者提出了一种新的采样方法Distance weighted sampling。给定一个anchor样本a,负例样本的选择方法如下:

深度学习新的采样方式和损失函数--论文笔记

如图1所示,为各种采样方法在一个模拟数据集上的结果,纵轴为数据梯度的方差。从图中可以看出,hard negative mining方法采样的样本都处于高方差的区域,如果数据集中有噪声的话,采样很容易受到噪声的影响,从而导致模型坍塌。随机采样的样本容易集中在低方差的区域,从而使得loss很小,但此时模型实际上并没有训练好。Semi-hard negative mining采样的范围很小,这很可能导致模型在很早的时候就收敛,loss下降很慢,但实际上此时模型也还没训练好;而本文提出的方法,能够实现在整个数据集上均匀采样。

深度学习新的采样方式和损失函数--论文笔记

图1 各种采样结果在模拟数据集上的采样结果

Margin based loss

如图2所示,为不同loss function取不同样本时损失的曲线图。可以根据constractive loss和triplet loss的公式,来理解2a和2b。这里主要观察2b,如果采样的时候采的都是hard negative 样本,即Dan的值很小,从图中可以看出,负例的梯度会非常小(也可以对目标函数进行求导,得出相同的结论),此时就会导致模型坍塌。一个简单的改进方法就是,将triplet loss中的二次项换成一次项,这时目标函数的导数固定为1,能够解决梯度消失的问题,这里其实可以类比深度学习中应用广泛的RELU**函数。

深度学习新的采样方式和损失函数--论文笔记

图2 loss vs pairwise distance

作者提出了一个新的目标函数Margin based loss,这个函数设计的目标是:1)能像triplet loss一样灵活;2)能够自适应不同的数据分布;3)能够像contrastive loss一样计算高效。

首先,定义一个自适应的margin:

深度学习新的采样方式和损失函数--论文笔记

我们称anchor样本与正例样本之间的距离为正例对距离;称anchor样本与负例样本之间的距离为负例对距离。公式中的参数beta定义了正例对距离与负例对距离之间的界限,如果正例对距离Dij大于beta,则损失加大;或者负例对距离Dij小于beta,损失加大。A控制样本的分离间隔;当样本为正例对时,yij为1,样本为负例对时,yij为-1。如图2d所示,为该目标函数的损失曲线图,与2a比较,它放松了对正例的约束。将其与2c比较,在有损失的地方,它们的导数都是1,具有良好的性质,且2d的形状不受限于数据集本身,而只与a和beta有关。

为了实现像triplet loss一样的灵活性,可以将beta设置为与样本有关的值:

深度学习新的采样方式和损失函数--论文笔记

其中, beta(class)称为样本偏置, beta(img)称为类别偏置。这里需要注意,第一个beta(0)是人工定义的初始值,利用梯度下降,不断调整beta(class)和beta(img)的值(就如同调整神经网络的参数)以在训练集上达到最优,这时能够得到最优的beta(class)和beta(img)(每个类一个beta(class),每个样本一个beta(img))。在调整beta的值的时候,可以对其整体求导

深度学习新的采样方式和损失函数--论文笔记

用来指导beta值的调整。从公式可以看出,beta的值似乎越大越好,其值越大,负例离anchor点的距离也就越大,不容易受到噪声的影响(上文已经提到了具体细节)。为了对beta进行规划化,需要给它一个限制,作者引入了一个超参数v,并定义:

深度学习新的采样方式和损失函数--论文笔记

这个v参数能够调整margin两边,违反margin数据点的数量,具体原理可见[3]中的v-trick。

实验结果

数据集:Stanford Online Products, CARS196, CUB200-2011, CASIA-WebFace, LFW.

实验:图片检索和图片聚类(Stanford Online Products, CARS196, CUB200-2011),人脸验证(CASIA-WebFace, LFW)。

模型:ResNet-50[4]

初始化参数:beta(0)=1.2,beta(class)=0,beta(img)=0.

首先,在Stanford Online Products数据集上进行实验,来测试不同loss function和采样方式对结果的影响,ResNet-50模型从头开始训练。结果如表1所示,在semi-hard采样方法中,constrastive loss和triplet loss的性能类似,而如果使用随机采样,constrastive loss的性能要差很多(triplet loss不能随机采样),这其实反证了一个结论:triplet loss的性能不仅仅来自于其自身的函数结构,也与采样方式有很大的关系。

深度学习新的采样方式和损失函数--论文笔记


Distance weighted采样方法对于除了constrastive loss之外的所有loss function都有加强的效果。作者称该采样方法在constrastive loss上结果差的原因是它对于超参数特别敏感,无法找到一个合适的参数。

作者也实验了pre-trained的模型效果,提升了大概10%的效果。

由于pre-trained模型效果更好,因此接下来的时候均使用该模型。如图3所示,为图片搜索的结果,可以看到本文基于margin的方法要优于triplet loss方法。

深度学习新的采样方式和损失函数--论文笔记

图3 图片搜索结果

作者还对比了固定的beta和本文灵活的beta对结果的影响。由表2的结果可知,灵活的beta对于结果的确是有提升的。注意,这里作者只说了beta(class),得到了更好的效果,他也试验了beta(img),但结果很不稳定,很有可能是过拟合的原因。因此,在实验的时候,可以只考虑beta(class),去除beta(img)。

深度学习新的采样方式和损失函数--论文笔记

如图4所示,作者对loss function的稳定性进行了实验,将batch中图片的数量分为改为2和10,有结果可知,本文基于margin的方法要比triplet loss方法稳定很多。

深度学习新的采样方式和损失函数--论文笔记

图4 Margin loss和triplet loss稳定性对比

如图5所示,是对收敛速度的实验,其中本文算法收敛最快且效果最好,triplet loss其次,contrastive loss就要差很多了。

深度学习新的采样方式和损失函数--论文笔记

图5 不同loss的收敛速度对比

本文还与目前最好的图片搜索和聚类方法进行了比较,结果如表3、4、5所示,可以看到本文算法效果最好。

深度学习新的采样方式和损失函数--论文笔记


深度学习新的采样方式和损失函数--论文笔记

表6是人脸验证的结果,本文算法accuracy结果依然最好。

深度学习新的采样方式和损失函数--论文笔记

总结

本文主要对contrastive loss、triplet loss目标函数和各种采样策略进行了分析,结合分析结果,提出了一种新的采样方式distance weighted sampling和一种新的损失函数margin-based loss。这两种方法能够显著提高模型各方面的性能,取得了在多个数据集上至今最好的结果。有一点吐槽一下,文章的题目只提到“sampling matters”,但实际上文章的算法共两个部分:采样和损失函数。这样取名字仅仅是因为目前该领域损失函数的工作太多,采样的工作太少么?

参考文献

[1]Facenet: A unified embedding for face recognition and clustering.(CVPR2015)

[2]The sphere game in n dimensions. http://faculty.madisoncollege.edu/alehnen/sphere/hypers.htm. Accessed: 2017-02-22.

[3]New support vector algorithms. Neural computation, 2000.

[4]Deep residual learning for image recognition.(CVPR 2016)


相关文章: