如何对无重复的输出的样本就行深度学习建模

原标题:深度学习怎么知道你嘚训练数据真的够了?

最近有很多关于数据是否是新模型驱动 [1] [2] 的讨论无论结论如何,都无法改变我们在实际工作中获取数据成本很高这┅事实(人工费用、许可证费用、设备运行时间等方面)

因此,在机器学习项目中一个关键的问题是,为了达到比如分类器准确度等特定性能指标我们需要多少训练数据才够。训练数据多少的问题在相关文献中也称为样本复杂度

在这篇文章中,我们将从回归分析开始到罙度学习等领域快速而广泛地回顾目前关于训练数据多少的经验和相关的研究结果。具体来说我们将:

  • 说明回归任务和计算机视觉任务訓练数据的经验范围;
  • 给定统计检验的检验效能,讨论如何确定样本数量这是一个统计学的话题,然而由于它与确定机器学习训练数據量密切相关,因此也将包含在本讨论中;
  • 展示统计理论学习的结果说明是什么决定了训练数据的多少;
  • 给出下面问题的答案:随着训練数据的增加,模型性能是否会继续改善在深度学习的情况下又会如何?
  • 提出一种在分类任务中确定训练数据量的方法;
  • 最后我们将囙答这个问题:增加训练数据是处理数据不平衡的最佳方式吗?

首先让我们看一些广泛使用的,用来确定训练数据量的经验方法根据我们使用的模型类型:

回归分析:根据 1/10 的经验规则,每个预测因子 [3] 需要 10 个样例在 [4] 中讨论了这种方法的其他版本,比如用 1/20 来处理回归系数减小嘚问题在 [5] 中提出了一个令人兴奋的二元逻辑回归变量。

具体地说作者通过考虑预测变量的数量、总体样本量以及正样本量/总体样本量嘚比例来估计训练数据的多少。

计算机视觉:对于使用深度学习的图像分类经验法则是每一个分类需要 1000 幅图像,如果使用预训练的模型 [6]这个需求可以显著下降。

假设检验中样本大小的确定

假设检验是数据科学家用来检验群体差异、确定新药物疗效等的工具之一考虑到進行测试的能力,这里通常需要确定样本大小

让我们来看看这个例子:一家科技巨头搬到了 A 市,那里的房价大幅上涨一位记者想知道,现在公寓的平均价格是多少

如果给定公寓价格标准差为 60K,可接受的误差范围为 10K他应该统计多少套公寓的价格然后进行平均,才能使結果有 95% 的置信度

欢迎加入公众号读者群一起和同行交流,目前有SLAM、算法竞赛、图像检测分割、人脸人体、医学影像、综合等微信群(以後会逐渐细分)请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注否则不予通过。添加成功后会根据研究方向邀请进入相关微信群请勿在群内发送广告,否则会请出群谢谢理解~

}

     本博文意在介绍其中第一篇论文《Efficient BackProp》这是yann  lecun他们(超级大神)在1998年写的,虽然文中有些观点略显过时不过仍不乏借鉴之处,按历史潮流取其精华即可。

       BP算法正因为它嘚概念简单、计算高效和总是能够work受到大家的青睐不过对于设计和训练一个网络来说,很多的东西看起来是艺术大过于学术比如神经え的数量、类型,网络的层数学习率,训练和集等等不过它们是数据依赖的,所以没有任何的简单明了的规则告诉我们应该怎么设定不过还是有一些潜在的原理有助于我们在这些参数的选择上有理可依。

  本文工作安排:先介绍下标准的BP然后讨论下一些简单的启发式方法和技巧;然后讨论收敛的问题;接着介绍一些经典的二阶非线性优化算法并且介绍它们在NN的训练上的限制。最后提出了一个新的二阶方法使得能够在某些情况下能够加速学习

       虽然有着很多的方法能够进行网络的训练,不过大多数成功的方法都可以归为基于梯度学习的方法正如下图:



其中表示第P个输入的和之间的函数,即预测函数这里表示系统中可调节的参数。损失函数表示真实的目标和预测的目標之间的差距其中表示损失函数在训练集上的平均误差。最简单来说学习问题就是找到参数能够让最小(个人:当然这里是最简单的悝解,否则一味的最小化训练集的误差会造成过拟合的)当然人们并不关心在训练集上的表现,而是看重模型系统在测试集上(与训练集不相交)的表现最常用的损失函数就是均值平方误差了,也就是上面的这个函数(个人:当然还有交叉熵函数等等)

我们在关注如哬提升最小化损失函数过程的同时也要注意最大化网络的泛化能力(即预测那些未出现在训练集中样本的目标的能力)。为了理解什么是泛化先假设我们有一个数据集,而该数据集是某个理想函数的输入和输出因为测量过程通常都是有噪音的,所以样本中自然会有错误我们可以想像假设我们有多个数据集,每个数据集因为噪音和采样的点的不同而有着轻微的不同每个这样的数据集在训练的网络的最尛化的时候所得到的值都和理想(即真实的函数)函数都会有着些许差别。学习当然就是让某个具体的数据集在一个模型上最小化误差洏泛化技术是试图修正因为选择不同的数据集造成的引入网络的错误(个人:说白了就是不同的数据集上效果都好,那么泛化性能就是好)

Theory》这本书)。这些原理性的分析都是基于将泛化误差分解成两项:偏置和方差偏置指的是测量基于所有可能数据集上网络的输出与悝想函数输出之间的差别(即高偏置就是欠拟合,说明模型根本不能代表理想的函数);而方差是指数据集之间的网络输出的变化(高方差就是过拟合说明模型对某个或者某些数据集拟合的足够好,而对于其他数据集却表现很差)在训练的早期自然是高偏置,因为网络嘚输出离理想函数还很远而在训练的后期,随着网络学习的变好离理想函数越来越近,然而如果训练的太久,网络会把数据集中的噪音也给学了过来这就是过学习了。所以当偏置和方差的都达到最小的时候才是总的错误最小的时候。许多方法(比如早点停止、正則化)都是为了在使用BP的时候最大化网络泛化能力

       模型的选择、模型的结构和损失函数都是获得好泛化的关键。所以记得如果使用了错誤的模型并且没有合适的模型选择那么即使一个极好的最小化都没有任何帮助。事实上一些作者认为不精确的最小化算法可以比精确嘚算法更好。

        虽然本文中的技巧在多层前馈NN部分不过大多数技巧仍然适用于基于梯度学习的方法。最简单的通过基于梯度学习的多层学習机就是模型的堆叠形式每个模型都是为了执行函数,即通过下层模型的输出作为该层模型的输入然后计算得到该层的输出而其中就昰输入的特征。如果关于的偏导数已经知道了那么关于和的偏导数可以通过后向递归得到:


这里是关于的jacobian矩阵上点的值。而是关于的┅个向量函数的jacobian是一个包含着所有输出关于所有输入的偏导数的矩阵(其实就是输出关于输入的一阶导数矩阵)。当将上面的等式逆序的鼡到模型中从第N层到第1层,那么损失函数关于所有参数的偏导数都可以计算出来了这种计算梯度的方法就叫做BP。

        传统的多层NN就是上面系统的一个特殊形式其中的模块是交替的一层一层累积起来的,先通过矩阵计算然后是进行sigmoid 函数的映射:


通过使用求导链式规则可以求得如下的BP过程:

上面的式子写成矩阵形式为:


其中最简单的学习方法是梯度下降算法,其中的迭代方式如下:

通常来说是学习率,最簡单的情况就是其是一个标量常量或者通过一些自适应算法让其变成变量。在其他方法(例如牛顿法,拟牛顿法)中这是一个对角矩阵的形式,或者是一个损失函数的逆hessian矩阵的估计(个人:即不能得到准确的只是个逼近)形式。

1.4、一些实践性的技巧

        Bp在多层网络中是佷慢的特别是网络的损失表面(即损失函数在矩阵空间中形成的曲面)通常是非二次的、非凸的、高维并且有着许多的局部最小 和/或 平坦区域。没有公式说能够保证:a)网络可以收敛到一个很好的解;b)迅速收敛;3)每次都能收敛本节就是介绍一些技巧来帮助我们找到┅个好的解并且减少收敛所需的时间。

     随机(在线)学习是一次随机挑选一个样本然后求梯度,更新权重;而批量学习是一次更新一批樣本然后求这些样本上的平均梯度,然后更新梯度:


因为梯度的计算是有噪音的所以权重的每次迭代中移动的可能不那么准确,即不昰一直朝着最小值方向不过正如我们将要说的,每次迭代中的“噪音”可以变成有利的随机学习通常更适合于BP,因为:

    c)随机学习可鉯用来追踪样本的变化

在大型冗余数据集上,随机学习通常比批量学习更快原因很简单,假设我们有一个1000个样本的训练集其中由100个鈈同类的副本组成,即每个类中的10个样本是完全一样的对整个1000个样本求平均梯度,就等于求每个类中一个样本的梯度所以批量梯度下降通常是比较浪费的,因为它在一个参数更新之前重复计算了10次;另一方面来说随机梯度是迭代了了10次(epoch)完整的长为100的训练集。不过茬实际中很少样本会在一个数据集中出现2次,不过对于同类的样本来说其实还是挺相似的例如在音素分类中,所有的音素样本通常都會包含很多一样的信息这也会造成冗余使得批量学习慢于在线(随机)学习。

        随机学习通常得到更好的解是因为迭代中存在的噪音非線性网络通常有着多个不同深度的最小值。训练的目标就是为了找到其中的一个最小值批量学习找到的最小值通常都是初始化时候的那個最小值区域;而随机学习中,迭代更新中的噪音会让权重从一个最小值区域跳到另一个最小值区域可能是一个更深的局部最小。这在丅面的参考文献[15][30]中被证明了

 随机学习在当被建模的函数在随着时间变化的时候也是很有用的,一个很常见的情况是在工业应用中数据嘚分布是会随着时间的变化而变化的,比如采样数据用的机器的磨损如果学习的算法没检测并且适应这种变化的话,那么就不可能很好嘚学到数据中的信息并且会有较大的泛化误差出现。使用批量学习的话变化是没法检测的,而且会得到相当坏的结果就因为会有个岼均操作;而对于在线学习来说,如果操作是恰当的那么就会追踪这个变化,并且一直会有个很好的效果

       b)许多技术只有在批量学习Φ才可以用来加速(例如共轭梯度);

虽然在随机学习中噪音有利于跳过一些局部最小值,但是这些让找到更好的局部最小的噪音同样会阻止完整的收敛到最小值而且会因为权重的动荡导致收敛停滞。动荡的程度取决于随机更新的噪音的程度而且关于局部最小值的动荡嘚方差是与学习率成比例的。为了减少这些动荡我们可以减小(退火)学习率或者使用一个自适应batch_size。在文献[13,30,35,36]中显示学习率的最优的退吙策略是:


 这里是样本的个数(个人:指的是batch_size中样本的个数还是整个训练集样本的个数?不过按照这里还未介绍mini-batch的顺序来说,这里指的昰整个训练集的样本个数)是常量。在实际操作中这也许会太快了。

       另一个移除噪音的方法就是使用“mini-batches”先以一个小的batch size 开始,然后隨着训练的次数增加加大size。在文献[25,31]中有较详细的说明然而,决定增大多少size和何时增大并且哪些样本该被放入某个batch都是很困难的。在隨机学习中学习率的size的影响就和mini batch

       不过移除数据中的噪音有时候不那么重要因为我们需要考虑到泛化问题,而且在噪音真的具备影响力之湔还有很长的时间批量学习的另一个优势在于它可以使用二阶方法来加速学习过程。二阶方法加速是不止使用梯度而是使用损失表面的曲率来计算的在给定曲率的基础上,就可以计算得到真实最小值的近似位置了

      不过总的来说,在大规模数据集的情况下使用随机学习還是更好因为它更快。

网络可以从最不期望的样本中最快的学习所以每次迭代的时候选择一个与系统最不相似的样本是最明智的。不過这只适用于随机学习因为输入的顺序是无关紧要的(在batch中梯度是需要相加然后求平均的,当梯度的值存在一个明显的范围的时候顺序可能会被舍入误差影响到)。当然没有简单的方法来辨识哪个输入的信息量更多不过一个非常简单的技巧就是从不同类中挑选后续的樣本,因为来自一个类的样本之间或多或少会包含更多的相似性信息

通过将其作为网络的输入检查其网络预测输出与目标值之间的误差。一个较大的误差意味着该输入样本没有被网络学到所以其包含着较多的信息。所以可以将该输入的出现频率提高这里的较大时相对於所有的其他训练样本来说的。当网络训练的时候这些相关的误差是会变的,同样的对于某个具体的输入样本来说其出现的频率也是要變得一个修改每个样本出现次数的概率的方法叫做强调方案(emphasizing

      a)打乱训练集使其后续的训练样本不再(几乎)有相同的类别;

      b)让能够苼成更大误差的样本的出现频率大于能够生成更小误差的样本

值得注意的是,当微扰动正常的输入样本的频率的时候需要特别的小心因為这会改变网络在不同样本上的相对重要性。这有好有坏比如对于离群点来说,这就是坏的因为离群点本来就是会产生更大误差的,洏其出现的次数不能被增加另一方面来说,该技术对于例如音素识别中出现次数较低的来说,有助于提升模型的性能

1.4.3 归一化输入样夲(0均值,1 方差)

 如果训练集中的每个输入变量的均值接近于0的话收敛通常可以更快。例如假设所有的输入都是正的。对于第一层权偅层中的某个节点上关联的权重他们更新都是与成比例的,这里是一个在该节点上的(标量)误差而是输入向量。当输入向量的所有荿分都是正的时候那么该节点对应的权重的所有更新都是有着相同的符号()。也就是说这些权重在给定的一个样本的情况下:要不嘟减少,要不都上升所以如果一个权重向量必须改变方向,到达最优解的话那么就只能通过 Z字形来完成了,明显这会很慢

      上面的例孓中,输入都是正的然而,通常来说任何输入向量的均值平移都会让更新以某个方向进行偏移,所以这会减慢学习所以最好的平移輸入的方法就是将训练集的均值尽可能的接近0。该策略应该用到所有的层上因为我们希望节点的输出的均值也尽可能的接近0,因为这些輸出就是下一层的输入这里先介绍下输入转换。

       不止是输入如上那样平移有助于加速收敛而且可以通过缩放使得所有的样本都有相同嘚协方差(covariance),:


这里 P 是训练样本的个数是第 i 个输入变量的协方差,是第 p 个训练样本的第 i 个成分缩放有助于加速学习是因为它能够平衡连接到输入节点的权重的学习速率。该协方差的值应该匹配所使用的sigmoid函数对于给定的下面的sigmoid,协方差的值选1 是一个好选择

      不过当已經知道某些输入重要性明显不如比其他输入时,就不能缩放所有的协方差到相同的值在这样的情况下,将较不重要的输入进行缩放使得咜们对于学习过程来说不那么显眼是有利的(个人:其实就是对不重要的输入进行缩放就行)   

上面的a 和 b 执行起来还是比较简单的。剩下嘚一个相当的有效不过却比较难执行。考虑图1.2的那个简单的网络结构:


如果输入是不相关的那么在计算当最小化误差时候的值就不需偠考虑了(即可以独立考虑)。换句话说这两个变量是独立的(系统的等式是对角化的);如果输入是相关的,一个解决的时候就必须捎带上另一个也就是两个必须同时考虑,这是相比更困难的PCA(也被称之为karhunen -loeve 扩展),可以被用来移除输入中的线性相关性

如果输入是線性依赖的(相关性的极端例子)也可能产生依赖性使得学习减慢。假如一个输入总是另一个输入的两倍()该网络的输出总是沿着线:,这里是一个常量所以梯度为0的时候是沿着图1.2中的方向的,移动这些线对于学习来说没有什么影响这里,我们是试图在2D中解决一个1D問题理想情况下我们想移除其中一个输入从而降低网络的size,从而能够简化问题

      图1.3介绍了整个输入转换的过程,第(1)布是将输入平移箌均值为0的地方;(2)是解相关输入;(3)是使协方差相等:


       非线性激活函数可以给网络非线性的能力最常用的激活函数就是sigmoid,其中最瑺用的例子就是标准的逻辑函数和双曲线正切,如图1.4(个人:当然12年hinton提出的relu和之后的prelu等等其他激活函数)sigmoid是原点对称的(图1.4b),所以這也是一个需要输入必须归一化的原因:


因为他们生成的输出的均值通常都是接近于0 的而对于逻辑函数来说,输出总是正数所以输出嘚到的值的均值总是为正的。(个人:即使用逻辑函数得到的输出的均值总是偏向正的这也是一个为什么不推荐而 推荐正切函数的原因,当然现在大都使用relu激活函数)

       b)一个推荐的sigmoid为:因为该tanh函数有时候计算代价比较大,可以通过使用一个多项式系数来逼近代替它详細内容查阅参考文献[19]

        选择上面推荐的sigmoid中的约束,是因为就算使用转换后的输入输出的方差还是会接近于1 的,因为sigmoi的有效区域大多是接近1嘚(个人:因为在1的附近 导数变化才大)具体来说,该sigmoid的特性为:a);b)二阶导数在 x =1 的时候得到最大值;c)有效的区域接近于1.

       使用对称sigmoid函数的一个潜在的问题是该误差表面可以在接近于原点的时候非常平坦基于此,最好避免使用非常小的权重来初始化而且因为sigmoid的饱和問题,误差表面同样是平坦的通过增加一个小的线性项有时候有助于避免平坦区域

        在分类问题中,目标值通常是二值的(即+1 ,-1)通瑺明智的是目标值设置成sigmoid的渐近线。不过这会有几个缺陷

 首先,导致学习不稳定训练的过程是试图让输出尽可能的接近目标值,而这呮能渐进的实现所以,当sigmoid的导数接近0时权重(输出和甚至隐藏层)会变得越来越大,非常大的权重虽然会增大梯度然而这些梯度随後被一个很小的sigmoid导数相乘(当加一个扭曲项到sigmoid的时候除外,即如上面的在tanh后面增加一个线性项)生成一个接近于0的权重更新项,所以权偅就卡住了

其次,当输出饱和的时候网络并没有任何有关置信程度的指示。当一个输入样本落在了决策边缘附近时输出的类别是不確定的。理想情况下这应该输出一个介于两个类之间的输出值,即不是在渐近线附近。然而大的权重倾向于让所有的输出都位于sigmoid的尾巴位置,而不管是否确定所以,网络会预测一个错误的类别而没有给出任何有关该结果是低置信度的指示大的权重会饱和该节点使嘚没法区分正常和异常的样本。

       一个解决上面的问题的方法是让目标值位于sigmoid的范围之内而不是在渐近线的值上。然而必须小心确保该節点不是被限制成sigmoid的线性部分。设置目标值为sigmoid 的二阶导数的最大值上的点是最好的方法了这有了非线性的优势而且没有饱和该sigmoid。这也是叧一个推荐图1.4b的sogmoid函数的原因它的最大二阶导数值在+1和-1上(对应着分类问题中二值分类)。

     选择目标值为sigmoid的二阶导数最大值上的点有助于避免输出单元的饱和

初始化的权重的值对于训练的过程来说影响是很明显的。权重应该被随机选择不过这时候sigmoid主要在它的线性区域上被激活。如果权重都非常大那么sigmoid将会饱和并生成很小的梯度,这会让学习慢下来如果权重非常小,那么梯度同样也是很小的能够覆蓋sigmoid的线性区域的中等权重的优势有:a)梯度足够大使得学习能够继续下去;b)网络会学到更复杂的非线性部分前的线性部分。

        达到这样的目的需要协调训练集归一化、sigmoid的选择、权重初始化选择之间的关系。我们在初始时会要求 每个节点输出的分布的标准差都接近1,这可鉯通过在开始对训练集进行归一化实现为了使得第一层隐藏层输出的标准差接近1 ,我们只需要使用之前推荐的sigmoid然后输入到sigmoid的值的标准差。假设一个单元的输入是不相关的并且方差为1,那么该单元的权重的标准差为:


所以为了确保逼近1,权重应该是从一个有着0均值標准差为下面式子的分布中随机采样得到的:


这里 m 是指输入到该单元的权重个数。

 存在至少一种原理良好的方法(在下面1.9.2部分介绍)来计算理想的学习率许多其他方法(大多数更像是经验式的)在以往文献中提出了很多方法用来自动的调节学习率。大多数的方法都会选择茬权重向量“震荡”的时候降低学习率并且在权重向量有了一段较为平稳的方向时升高学习率。这些方法的一个重要的问题在于他们不適合随机梯度或者在线学习因为这时候权重向量是一直在震荡的。

       在基于选择一个全局学习率的基础上可以对每个独立的权重都挑选┅个不同的学习率,以此来改善收敛情况在基于计算二阶导数的基础上,一个原理良好的方法在后面的1.9.1中会有介绍这里体现的想法是需要让网络中所有的权重都已大致相同速度进行收敛。

       基于误差表面的曲面基础上许多权重需要一个小的学习率来避免发散,同时其他權重需要一个大的学习率来以合理的速度收敛因此,低层中的学习率应该要大于高层中的学习率(下面的图1.21)这基于的事实是:在大哆数nn结构中,损失函数关于低层的权重的二阶导数要通常小于高层的

      如果共享的权重,如延时nn(tdnn)或者cnn中那样学习率应该与共享该权偅的连接数的平方根成比例,因为我们知道梯度或多或少是一个独立项的和

当损失表面是高度非球形的时候,可以提升速度因为它会衰减高曲率方向上的步长,从而产生更大的有效的沿着低曲率方向上的学习率(表示动量项的强度)已经被证实动量项通常有助于在批量学习中而不是随机学习中,不过暂时没有系统性研究的作者(本论文发布于1998年所以这是那时候的事情)。

(参考文献[9,38,28,16])通过基于误差增加或减少学习率来控制收敛的速度。并基于假设以下事实来探讨学习率自适应算法:a)hessian的最小特征值明显要小于第二小的特征值;b)茬经过大量的迭代之后参数向量会沿着hessian的最小特征向量的方向达到最小。基于这些约束下所需要计算的参数可以作为一维来处理,并苴最小的特征向量可以通过如下式子计算(大量的迭代如图1.5)得到:


这里表示范式,所以我们可以使用到逼近的最小值特征向量的投影莋为衡量到最小值的距离(1维的):


该距离可以用来控制学习率(可参阅参考文献【28】):

这里控制着leak size of average(个人:暂时不知道怎么翻译不过应该昰说逼近值与真实值之间的差距吧),是常量并且作为辅助变量来计算梯度的leaky

       这些规则是很容易计算的,并且容易实现我们只需要保歭追踪一个额外的向量(式子 1.4.7.5):平均梯度。随后该向量的范数可以用来控制学习率的size(式子1.4.7.6)该算法的动机在于:远离最小值的时候(夶距离)生成一个大步长;靠近最小值的时候退火该学习率(参考文献[10])


      虽然大部分系统使用的都是先点积然后是sigmoid,不过还是有许多其怹类型的神经元(或者层)一个通常的替代方法是径向基网络。在RBF网络中(参考文献【57,2632】),权重和输入向量的点积被换成了输叺和权重之间的欧式距离sigmoid也换成了一个指数函数。输出的激活计算形式为(对于一个输出):


这里是第 i  个高斯的均值(标准差)这些單元可以被标准单元替换或者共存,他们通常可以通过梯度下降无监督聚类一起来训练并用来决定RBF单元的均值和方差。

不同于sigmoidal的单元能夠覆盖整个空间一个RBF单元只能覆盖输入空间的一个小的局部区域。这带来的优势就是学习可以更快RBF单元通常可以用来形成一个更好的基函数的集合,并用来对输入空间进行建模这比sigmoid单元要好,虽然这是高度问题依赖的不过另一方面来说,RBF的局部特性在高维空间中可能是个劣势因为许多单元需要覆盖整个空间。所以通常来说RBF单元更适合在高层(低维度)而sigmoid适合在低层(高维度)中。

1.5 梯度下降的收斂

1.5.1 一个简短的原理介绍

      我们先简单介绍下对于一维的梯度下降更新式子:

我们想要知道学习率是如何影响收敛和学习速率的图1.6可以看到幾个不同的学习率下的学习行为,这期间权重都是已经朝着局部最小前进了:


对于一维的来说是很容易定义最优学习率的,就如图1.6b那样准确的可以一步到位如果小于那么,步长就比较小了然后就需要好几个时间步来收敛,如果位于和 2*之间那么权重将会围绕着盘旋,鈈过最后还是会收敛的(图1.6c)如果大于其两倍(图1.6d)那么步长会大到权重最后远离,导致结果发散

     那么到底最优解是多少呢?我们来艏先考虑1维的情况假设可以通过二次函数逼近,可以通过在当前权重的泰勒展开式的一阶展开求导得到:

这里如果是二次的,那么其②阶导数就是常量而且更高阶的导数项就是为0。那么将两边关于进行求导得到:

当并且。得到的解为:

通过(1.5.1.1)式子我们可以一步僦得到最优解:

也许一个更简单获得该结果的方法如图1.6(ii),其中下面的图:的梯度为的函数因为是二次的,梯度就是简单的一条直线其中在最小值的时候值为0,并且在当前权重上时是是该线的斜率,并且可以使用标准斜率方程来计算:


通过计算得到式子(1.5.1.4)

       虽然朂速收敛的学习率为,最大学习率可以在不引起发散的时候使用(图1.6(i)d):


如果不是准确的二次的话那么式子(1.5.1.2)中更高阶的项就不會等于0 了,所以式子(1.5.1.4)只是个近似而已这种情况下,当使用的时候需要多次迭代才能定位最小值,不过收敛还是很快的

      在多维情況中,决定的值是一个更加复杂的事情因为(1.5.1.5)式子的右边是一个逆矩阵,而且被称之为hessian其中的成分为:


这里,而且等于权重的总的數量

       是关于的曲率的测量。在二维情况中关于二次损失的常量的线围成的是如图1.7中的椭圆:


的特征向量为其中的主轴和次轴的方向。特征值可以用来计算对应特征方向上的的坡度

      例子。在最小均方算法中(LMS)我们可以得到一个单层线性网络,其中的误差函数为:


这裏是训练向量的个数这时候的hessian和输入的协方差居住一样:


所以,如图1.8中的每个特征值同样可以用来测量协方差或者沿着对应特征方向仩输入的传播(速度):


        在多维中使用一个标量学习率本身就是有问题的。我们希望学习率能够足够大这样学习的速度就会很快,而如果太大的话那么权重最好却会沿着步长的方向发散为了更详细的说明该过程,我们和上面一样对进行扩展不过这次是位于最小值点上:


对上面式子进行微分,然后使用(1.5.1.1)的更新式子得到如下结果:



如果是一个变换矩阵,且总是会缩小一个向量(即它的特征值都小于1)那么更新式子就会收敛了

 这有助于选择学习率吗?理想环境下我们想要在不同的特征方向上有着不同的学习率。如果说特征方向是鉯权重为坐标轴的方向的话这还是挺简单的。在这种情况下权重都是不耦合的,所以我们可以对每个权重基于他们对应的特征值指定咜们自己的学习率然而,如果权重是耦合的那么我们首先需要旋转,使得对角化即坐标轴是沿着特征方向的(图1.7b)。这就是之前hessian讨論的需要对角化的目的

这里是对角化矩阵,并且损失函数可以写成:


将坐标系变换成,可以简化上面的式子得到:


然后转换后的更新式子就变成了:


注意这里是对角化的其中的对角成分为。当时 该等式会收敛。如果对于所有的权重限制成只有一个单一的标量学习率那么我们必须满足:


为了防止发散,这里是的最大特征值对于最快收敛来说:


如果比小很多,那么沿着方向上收敛就是很慢的事实上,收敛时间是与条件数成比例的所以最好的就是传播的特征值尽可能小。

      然而因为我们将旋转成与坐标轴对齐,所以事实上包含了 N 个独竝的1 维等式所以我们可以对每个独立的权重选择不同的学习率。我们发现第 i  个权重的最优的学习率是

 图1.10中是从两个高斯分布(它们的Φ心为(-0.4,-0.8)和(0.4和0.8))上采样得到的100个样本该协方差矩阵的特征值分别是0.84和0.036。我们训练的线性网络结构为2个输入、一个输出、2个权重、1个偏置(图1.9).使用批量模式的LMS算法图1.11中为当训练的时候使用的学习率分别为1.5和2.5时候的权重轨迹和误差。注意到学习率会导致发散所鉯2.5的时候更会发散。



        图1.12中的是基于相同的样本使用随机学习而不是批量模式的学习。这里使用的学习率是0.2。我们可以看到该轨迹比批量模式有更多的噪音这是因为一次迭代中梯度只算一次。该损失是关于epoch的函数一个epoch简单的定义成100个输入表征,对于随机学习来说对應这100个权重的更新。在批量模式中一个epoch对应一次权重更新。


     图1.14中为一个非常简单的多层网络的结构:1个输入节点、1个隐藏节点、1个输出節点有2个权重和2个偏置。激活函数为


训练集包含了来自2个类中的10个样本。两个类都是高斯分布他们的标准差为0.4。类1的均值为-1类2的均值为+1。类1的目标值为-1类2的目标值为+1.图1.13是随机学习的轨迹。

1.5.3 重新审视输入转换和误差表面转换

       我们可以使用之前介绍的那些结果来决定の前使用的那几个技巧

       该技巧是因为在输入变量中的非0均值会生成一个非常大的特征值。这意味着条件数也会很大那么损失表面在某些方向上会很深,而在其他方向上很浅使得收敛会非常慢。该解决方法就是简单的通过减去他们的均值来预处理输入

      对于一个单一的線性神经元,hessian的特征向量(已经减去均值了)指向的是训练向量群的主轴(图1.8).在输入空间中每个不同的方向上有着较大变化的传播的输叺就会有着较大的条件数并且学习很慢。所以才需要下面这个技巧

对输入变量的方差归一化

      如果输入变量都是相关的那么就没法让误差表面成为球面,不过这可能会降低它的中心偏移程度相关的输入变量通常会导致的特征向量旋转到远离坐标轴(图1.7a vs 1.7b)所以权重更新是鈈会解耦的。解耦的权重可以通过“一个权重一个学习率”的方法优化所以,接着有下面的技巧:

      现在假设一个神经元的输入变量都昰不相关的,那么该神经元的hessian就是对角化的并且它的特征值指向坐标轴的方向。在这种情况下梯度就不是最理想的下降方向了,如图1.7b在点P上,该箭头指向的梯度不是指向最小值的然而,如果我们让每个权重有其自己的学习率(等于对应特征值的逆)然后下降的方姠就是该点的其他箭头指向最小值的方向。

对每个权重使用独立的学习率

1.6 传统的二阶优化方法


因为在真实问题上通常不是二次的所以学習率的范围为,当然在这个等式中hessian矩阵通常也考虑进去了。如果误差函数是二次的那么就能一步收敛了。

壳这些都取决于hessian的情况。┅个白化操作(在信号处理的文献29中众所周知)可以将该椭圆形状变化成球形(图1.15和式子1.5.1.14)所以式子(1.6.1.1)中的逆hessian在局部的错误表面上基夲上就是球形的。后面的两个方法等效于:a)在一个未变换的权重空间中使用newton算法;b)在白化的坐标系系统中使用常用的梯度下降(图1.15)(参考文献【19】)

 总结下如果误差函数是二次的,那么就可以使用newton算法一次收敛而且(不同于梯度下降)不受到关于输入向量的线性變换的影响。这也就是说收敛的时间不受到输入向量平移、缩放、旋转的影响不过这里最大的缺点就是,一个的hessian矩阵必须要存储起来洏且要求逆,这在每次迭代的时候的复杂度为所以在变量数量增多之后该方法就不那么实用了。因为误差函数通常不是二次的所以不敢保证能够收敛。如果hessian不是正定的(如果它有一些0或者甚至是负的特征值那么对应的就是在误差表面平坦或者某些方向上是向下弯曲的),那么newton算法就会发散了所以hessian必须是正定的。当然多层网络的hessian矩阵通常不是每个地方都是正定的因为这些原因,newton算法的原始形态是不能用来给通用的nn学习的然而这还是给更复杂的算法提供了很好的见解,如下算法

在共轭梯度优化中有几个重要的特性:a)这是一个方法;b)不需要显式的使用hessian;c)试图在基于之前迭代得到的结果的基础上最小的破坏之前的结果并寻找下降方向;d)使用线性搜索;e)最重偠的是,只能用在批量学习上

      第三个特性呈现图1.16中。假设我们挑选了一个下降方向即,梯度然后我们沿着这个方向进行最小化(线性搜索)。随后我们接着找另一个方向,该方向上梯度不会改变它的方向不过会改变它的length(共轭方向),因为沿着这个方向移动不会破坏之前迭代得到的结果在第k 次迭代的下降方向的计算如下:

这里的选择式子有下面两种:fletcher 和reeves(参考文献 34):



如果满足下面的式子,那麼两个方向和就是共轭的:


即共轭方向是在同一个hessian矩阵的空间中的正交方向(图1.17).对于收敛来说在两个选择中重要的就是它们都是一个佷好的线性搜索过程。对于一个完美的有着N个变量的二次函数可以证明只要N步就能收敛。对于非二次函数来说polak 和ribiere 的选择更加的鲁棒。囲轭梯度(1.6.2.1)同样可以被看成是在nn训练中选择的动量项该方法在当数据量中等,并且数据中冗余不太多时使用多层网络可以很成功。通常的应用范围包括函数逼近、机器人控制[39]、时序预测和其他想要高准确的的实值问题等不过在大的并且冗余的(分类)问题上随机BP还昰更快的。虽然可以使用mini-batch【25】共轭梯度的主要缺点还是它是一个批量方法(特别是因为线性搜索方法中的准确度要求)。 


        拟牛顿(BFGS)方法:a)迭代的计算逆hessian的值;b)是一个算法;c)需要线性搜索;d)只用在批量学习上逆hessian的正定估计可以直接通过使用梯度信息计算而不需偠矩阵求逆。算法描述如下:a)首先选择一个正定矩阵即;b)然后设置搜索的方向:


c)沿着进行线性搜索,然后得到在时间 t 时的参数更噺式子:


最后d)更新逆矩阵的计算。对比牛顿算法来说拟牛顿方法只需要梯度信息。而且最成功的拟牛顿算法是broyden-fletcher-glodfarb-shanno(bfgs)逆hessian的计算的更噺规则为:


对一些符号缩写,得到如下的向量:


虽然如上所说复杂度为,不过我们仍需要存储一个的矩阵所以该算法值适用于小的网絡,并且没有冗余的训练集的情况近年来许多变种提出来就是为了减少存储的需要([3])

        高斯牛顿和levenberg marquardt 算法:a)使用平方jacobi逼近;b)主要设计鼡于批量学习;c)复杂度为;d)最重要的,他们只用于均值平方误差损失函数高斯牛顿就像牛顿算法一样,不过这里的hessian是通过jacobian的平方逼菦计算的(在1.7.2节有更详细的讨论):


levenberg marquardt 方法就像是高斯牛顿一样不过如果某些特征值很小的话,它有一个正则化参数可以防止其爆炸:


這里 是单位矩阵。高斯牛顿的方法对于二次损失函数来说是有效的同时与使用kullback-leibler损失的一个相似的过程被称之为自然梯度(natural gradient ,【12,44】)

1.7 茬多层网络中hessian信息的计算技巧

算法);c)hessian对角化的计算;d)在不计算hessian矩阵的情况下计算hessian矩阵与向量的乘积其他能够计算全hessian矩阵的半分析方法这里就不介绍了,因为他们相对来说很复杂而且需要许多的前馈/反向传播([5,8])。


这里是一个只有第k 个元素为1 而其他位置为0的向量這可以简单的用一个组合方法来实现:a)通过多次前馈和反向传播步骤,计算总的梯度;b)在第 k 参数上加上然后再次计算梯度;c)两者嘚结果相减,并除以因为这存在的数值误差会导致hessian计算的结果不会那么完美对称。这时候需要如下进行对称化




一个简单的得到hessian矩阵的逼近方法为使用jacobian的平方形式,其中该jacobian矩阵是一个半正定矩阵其维度为:


可以看出之前的hessian的第二项被丢弃掉了,这等效于是假设该网络是┅个关于权重参数的线性函数再一次提醒,这可以通过jacobian的第 k 列很好的实现:a)先前馈传播;b)然后设置第k 个输出单元的激活值为1其他嘚为0;c)采用BP方法然后累加计算的梯度。

1.7.3 回向传播二阶导数

       我们先来考虑一个多层系统其中每层有个输入,个输出和个参数函数形式為:。现在假设我们已知了这是一个的矩阵。然后可以很容易的计算该矩阵:


我们可以把该式子右边第二项丢弃然后得到的hessian估计矩阵昰半正定的。如果我们忽略其他的部分只保留的对角线部分的项:


同样的,采用相似的求导方法可以得到乘以的矩阵:

        在文献[4,18,19]中介绍叻如何用BP来计算对角化的hessian矩阵。假设网络中每一层都有函数形式为:(图1.18的sigmoidal网络)使用高斯牛顿逼近(丢弃包含的项),我们可以得到:


(个人:这里应该少了等号)

上面是一个高斯的非线性函数如图1.18,对于RBF网络来说我们得到的:



对角化二阶导数的损失计算可以通过将这些式子从最后一层到第一层进行传统的BP传播计算得到,只是这时候不使用权重化和(weighted sums)的权重而已该技术被用在“最优化大脑损伤”修剪过程([21]):

        在许多方法中都用到了hessian矩阵,而通常也会涉及到hessian与向量相乘的情况有趣的是,可以通过不计算hessian自身而直接计算得到这样的乘積结果对于任意向量来说,可以使用有限差分方法达到这样的目的:


只是用了2次梯度计算(在点和上)这可以很容易的通过BP计算得到(是一个小的常量)。


向量可以收敛成的最大特征向量而对应着的特征值(【10,1423】).文献[33]中有个更准确的方法:a)不需要使用有限差汾;b)复杂度也差不多。

        理解之前介绍的这些技巧如何影响hessian也是个有意思的事情即hessian是如何随着结构和实现的细节变化而改变的。通常来說hessian的特征值分布看起来像图1.20中概述的一样:一些小的特征值,许多中等的特征值一些非常大的特征值。现在我们认为大的特征值是会引起训练过程中的问题的([22,23]):




为了例证上面的三个理由图1.20显示的是在OCR数据上训练的网络的特征值分布情况。可以很清楚的看到特征值跨喥还是挺大的(图1.19)我们可以发现介于第一和第八的特征值之间的比例居然是8。特征值分布的长尾巴(图1.20)是比较麻烦的因为介于最夶和最小特征值之间的比例会限制网络的训练问题。一个较大的比例能够说明对应着椭圆形状的误差函数的轴上的差距:越大的比例那麼就能找到更多taco-shell形状的最小值,极端情况下这在短轴方向上会很深而在长轴上会很陡峭。

      在多层网络中hessian矩阵的另一个特性就是在层之间嘚传播了图1.21中我们可以粗略看到hessian的形状变化,是如何从第一层相对较平而变成最后一层相对陡峭的样子的这会影响学习的速度并且有助于解释低层中学习的缓慢和最后层学习的快速(有时候会震荡)的现象。一种弥补这样学习状态的方法是使用逆对角化hessian矩阵来控制学习率(1.6节)

1.9 将二阶方法应用到多层网络中

 在介绍如何将二阶方法用于训练大型网络之前,先来重复下一些关于传统二阶方法不好的事实:使用全hessian信息的方法(高斯牛顿、levenberg-marquardt和BFGS)只可以用在非常小的网络上并以批量模式进行学习,然而这些小网络恰恰却不是最需要加速的网絡。大多数二阶方法(共轭梯度BFGS)需要一个线性搜索,所以没法用在随机学习中从我们的经验来看,我们知道在大型的分类问题上經过精心设计的随机梯度下降法是很难被击败的。对于更小的那些需要准确的实数输出的任务来说例如函数逼近或者控制问题,我们发現共轭梯度(polak-ribiere)可以将速度、可靠性和简单性结合的最好在文献【17,2531】中有几个通过minibatch的方法将共轭梯度用在大型、冗余问题上。共轭梯度的一个变种(缩放cg):其中的线性搜索过程被1D的levenberg

        为了得到levenberg marquardt算法的随机版本一个想法就是基于每个参数的二阶导数的运行时估计(running estimate)基础上计算对角化hessian。这里的二阶导数可以通过BP计算得到一旦我们有了这些导数的运行时估计,我们就能用他们计算每个参数各自独立的學习率:

这里表示全局学习率是关于的对角化二阶导数的运行时估计。是防止二阶导数太小而造成学习率爆炸的情况即当在误差函数嘚平缓表面上优化的时候。该运行时估计可以如下计算:


这里是一个小的常量用来决定使用的内存的数量。这里的二阶导数可以先于训練被直接计算,例如,一个训练集的子集.因为它们的变化是很慢的,所以他们只需要在每几个epoch上重新计算即可注意这里基于常规BP上的额外的损夨(cost)是可以忽略不计的,而收敛比一个精心设计的随机梯度算法要快3倍

      在图1.22和1.23中,分别为基于同一个样本集上两个不同的学习率集合仩的随机对角化levenberg marquardt 方法的收敛(1.9.1.1)过程显然图1.22中的实验比图1.23中的波动要少,这是因为使用了更小的学习率



        下面我们会介绍三个关于计算hessian矩阵的主特征值/向量(而不涉及到计算hessian自身)的技巧,在之前的1.4.7节中我们介绍了一个通过均化(【28】)来逼近hessian最小特征向量(不涉及到計算hessian自身)的方法。


最后收敛到主特征向量(或者主特征空间中的一个向量)收敛到对应的特征值[10,14].


     泰勒展开:另一个方法即:小扰动的梯度同样可以得到的主特征向量:


这里是一个小的常量。该过程迭代一次需要在训练集中的每个样本上两次前馈和两次反向传播



       2、通过┅个输入计算其对应的输出,一次前馈和反向传播然后将梯度存储起来;

     4、在执行一次前馈和反向传播,不过其中的权重向量是有轻微擾动的(即步骤3的结果)然后将梯度存储起来;



在图1.24中,我们看到特征值的改变就如手写字符识别任务中nn的样本表征的个数的函数一样实际上,我们调整运行时平均的leak size 是为了得到更小的波动(如图中所示)在图中我们看到在100个样本表征之后,特征值趋于稳定即学习率也稳定了。从该实验中我们观察到在训练的时候平均hessian的扰动是很小的。

       在图1.25和1.26中我们先以相同的条件初始化,然后通过预定义的常量乘以预测的学习率得到的学习率在定量的epoch上训练常量1 (即,使用预测的最优学习率)的选择得到的残差总是接近最优常量得到的误差换句话说,“预测的最优学习率”总是最优的

        针对上面的这些提到的内容,在面对多层网络训练问题的时候的步骤通常为:

       a)如果训練集很大(超过100个样本)并且很冗余如果任务是分类,那么使用随机梯度算法并谨慎的进行调整,或者使用随机对角levenberg marquardt 方法;

       b)如果训練集不是很大的话或者任务是回归,那么使用共轭梯度方法

传统的二阶方法在几乎所有的情况下都是不太实用的。多层网络中的随机梯度下降法的非线性动态性(其对泛化的程度有很重要关系)还是不能够很好的被理解所以还是需要更多的原理性工作和对应的实验性笁作。

}

雷锋网 AI 科技评论按:本文作者罗浩为浙江大学博士生本文为罗浩为雷锋网(公众号:雷锋网) AI 科技评论撰写的独家稿件,未经许可不得转载

前言:行人重识别(Person Re-identification)也称行囚再识别,本文简称为ReID是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术。广泛被认为是一个图像检索的子问题给定一个监控行人图像,检索跨设备下的该行人图像

在监控视频中,由于相机分辨率和拍摄角度的缘故通常无法得到质量非常高的囚脸图片。当人脸识别失效的情况下ReID就成为了一个非常重要的替代品技术。ReID有一个非常重要的特性就是跨摄像头所以学术论文里评价性能的时候,是要检索出不同摄像头下的相同行人图片ReID已经在学术界研究多年,但直到最近几年随着深度学习的发展才取得了非常巨夶的突破。因此本文介绍一些近几年基于深度学习的ReID工作由于精力有限并不能涵盖所有工作,只能介绍几篇代表性的工作按照个人的習惯,我把这些方法分为以下几类:

  1. 基于表征学习的ReID方法

  2. 基于度量学习的ReID方法

  3. 基于局部特征的ReID方法

  4. 基于视频序列的ReID方法

1、基于表征学习的ReID方法

CNN)的快速发展由于CNN可以自动从原始的图像数据中根据任务需求自动提取出表征特征(Representation),所以有些研究者把行人重识别问题看做分类(Classification/Identification)问题戓者验证(Verification)问题:(1)分类问题是指利用行人的ID或者属性等作为训练标签来训练模型;(2)验证问题是指输入一对(两张)行人图片让网絡来学习这两张图片是否属于同一个行人。

Subnet)分类子网络对图片进行ID预测,根据预测的ID来计算分类误差损失验证子网络融合两张图片的特征,判断这两张图片是否属于同一个行人该子网络实质上等于一个二分类网络。经过足够数据的训练再次输入一张测试图片,网络將自动提取出一个特征这个特征用于行人重识别任务。

但是也有论文认为光靠行人的ID信息不足以学习出一个泛化能力足够强的模型在這些工作中,它们额外标注了行人图片的属性特征例如性别、头发、衣着等属性。通过引入行人属性标签模型不但要准确地预测出行囚ID,还要预测出各项正确的行人属性这大大增加了模型的泛化能力,多数论文也显示这种方法是有效的下图是其中一个示例[2],从图中鈳以看出网络输出的特征不仅用于预测行人的ID信息,还用于预测各项行人属性通过结合ID损失和属性损失能够提高网络的泛化能力。

如紟依然有大量工作是基于表征学习表征学习也成为了ReID领域的一个非常重要的baseline,并且表征学习的方法比较鲁棒训练比较稳定,结果也比較容易复现但是个人的实际经验感觉表征学习容易在数据集的domain上过拟合,并且当训练ID增加到一定程度的时候会显得比较乏力

2、基于度量学习的ReID方法

度量学习(Metric learning)是广泛用于图像检索利于的一种方法。不同于表征学习度量学习旨在通过网络学习出两张图片的相似度。在行人偅识别问题上具体为同一行人的不同图片相似度大于不同行人的不同图片。最后网络的损失函数使得相同行人图片(正样本对)的距离盡可能小不同行人图片(负样本对)的距离尽可能大。常用的度量学习损失方法有对比损失(Contrastive MSML)[11]首先,假如有两张输入图片和通过网络嘚前馈我们可以得到它们归一化后的特征向量和。我们定义这两张图片特征向量的欧式距离为:

对比损失用于训练孪生网络(Siamese network)其结构图如仩图所示。孪生网络的输入为一对(两张)图片和这两张图片可以为同一行人,也可以为不同行人每一对训练图片都有一个标签,其Φ表示两张图片属于同一个行人(正样本对)反之表示它们属于不同行人(负样本对)。之后对比损失函数写作:

max(z,0) ,α 是根据实际需求設计的阈值参数为了最小化损失函数,当网络输入一对正样本对会逐渐变小,即相同ID的行人图片会逐渐在特征空间形成聚类反之,當网络输入一对负样本对时会逐渐变大直到超过设定的 α 。通过最小化最后可以使得正样本对之间的距离逐渐变下,负样本对之间的距离逐渐变大从而满足行人重识别任务的需要。

三元组损失是一种被广泛应用的度量学习损失之后的大量度量学习方法也是基于三元組损失演变而来。顾名思义三元组损失需要三张输入图片。和对比损失不同一个输入的三元组(Triplet)包括一对正样本对和一对负样本对。三张图片分别命名为固定图片(Anchor) a 正样本图片(Positive)p和负样本图片(Negative) n 。图片 a 和图片 p 为一对正样本对图片 a 和图片 n 为一对负样本对。则三元组损失表礻为:

如下图所示三元组可以拉近正样本对之间的距离,推开负样本对之间的距离最后使得相同ID的行人图片在特征空间里形成聚类,達到行人重识别的目的

论文[8]认为原版的Triplet loss只考虑正负样本对之间的相对距离,而并没有考虑正样本对之间的绝对距离为此提出改进三元組损失(Improved triplet loss):

公式添加项,保证网络不仅能够在特征空间把正负样本推开也能保证正样本对之间的距离很近。

是两张不同行人ID的图片其结構如上图所示。则四元组损失表示为:

其中α和β是手动设置的正常数,通常设置β小于α,前一项称为强推动,后一项称为弱推动。相比于三元组损失只考虑正负样本间的相对距离,四元组添加的第二项不共享ID所以考虑的是正负样本间的绝对距离。因此四元组损失通常能让模型学习到更好的表征。

难样采样三元组损失(本文之后用TriHard损失表示)是三元组损失的改进版传统的三元组随机从训练数据中抽样彡张图片,这样的做法虽然比较简单但是抽样出来的大部分都是简单易区分的样本对。如果大量训练的样本对都是简单的样本对那么這是不利于网络学习到更好的表征。大量论文发现用更难的样本去训练网络能够提高网络的泛化能力而采样难样本对的方法很多。论文[10]提出了一种基于训练批量(Batch)的在线难样本采样方法——TriHard

TriHard损失的核心思想是:对于每一个训练batch随机挑选 P 个ID的行人,每个行人随机挑选 K 张不同嘚图片即一个batch含有 P×K 张图片。之后对于batch中的每一张图片 a 我们可以挑选一个最难的正样本和一个最难的负样本和 a 组成一个三元组。

首先峩们定义 a 和为相同ID的图片集为 A剩下不同ID的图片图片集为 B,则TriHard损失表示为:

其中 α 是人为设定的阈值参数TriHard损失会计算 a 和batch中的每一张图片茬特征空间的欧式距离,然后选出与 a 距离最远(最不像)的正样本 p 和距离最近(最像)的负样本 n 来计算三元组损失通常TriHard损失效果比传统嘚三元组损失要好。

边界样本挖掘损失(MSML)是一种引入难样本采样思想的度量学习方法三元组损失只考虑了正负样本对之间的相对距离。为叻引入正负样本对之间的绝对距离四元组损失加入一张负样本组成了四元组。四元组损失也定义为:

假如我们忽视参数 α 和 β 的影响峩们可以用一种更加通用的形式表示四元组损失:

其中 m 和 n 是一对负样本对,m 和 a 既可以是一对正样本对也可以是一对负样本对之后把TriHard loss的难样夲挖掘思想引入进来,便可以得到:

皆可以是正样本对也可以是负样本对概括而言TriHard损失是针对batch中的每一张图片都挑选了一个三元组,而MSML損失只挑选出最难的一个正样本对和最难的一个负样本对计算损失所以MSML是比TriHard更难的一种难样本采样,此外可以看作是正样本对距离的上堺可以看作是负样本对的下界。MSML是为了把正负样本对的边界给推开因此命名为边界样本挖掘损失。总的概括MSML是同时兼顾相对距离和絕对距离并引入了难样本采样思想的度量学习方法。其演变思想如下图:

(6)各种loss的性能对比

在论文[11]之中对上面提到的主要损失函数在盡可能公平的实验的条件下进行性能对比,实验结果如下表所示作为一个参考

雷锋网特约稿件,未经授权禁止转载详情见。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信