scheme打开微信扫一扫 启动微信扫一扫_权重

简单记录一下,微信扫一扫的知识点,为以后回顾留一点笔记。

扫一扫识物数据建设

扫一扫识别物体分为两大块,一个是用于模型训练的数据集,另一个是用于用户线上检索的数据集。

图片去重

图片去重优点,第一是为了降低储存压力,第二是为了降低模型训练压力。

常用的去重算法:

  • MD5去重,去除完全相同的图片
  • 哈希去重,对原图上进行简单加工,也可以检测出很高的相似度。上一篇文章,有对dhash做了一下介绍。训练数据库通过dhash算法去重,去掉了30%的图片。


scheme打开微信扫一扫 启动微信扫一扫_scheme打开微信扫一扫_02


检索数据库构建


scheme打开微信扫一扫 启动微信扫一扫_scheme打开微信扫一扫_03


在这里聚类算法用的DBSCAN,分为两个步骤:选择最大的簇作为挑选的样本图片,第二为将噪声中的困难样本捞回,提高训练样本的丰富性。

同款合并:采样混淆矩阵,如果两个类之间混淆的概率很大的话,就认为同一款式的商品进行合并。

扫一扫算法研发

同款检索涉及到三大模块,物体检测,类目预测,同款检索

物体检测:这里物体检测主要是为了去除背景对后续检索的干扰。

类目预测:因为检测数据有限,所以没有直接用检测到的类别。这里主要是为了指定类目的模型进行特征提取和同款检索。这里类别预测由两部分组成,查询最近邻的 top-20 所属的类目,结合检测器的预测类目,来重新加权投票得到物体的最终类目。

同款检索

同款检索难点


scheme打开微信扫一扫 启动微信扫一扫_权重_04


同款检索之分类模型

softmax分类器学习到的特征空间有三大特征

  • 特征空间呈现扇形分布,因而用余弦距离检索会优于欧式距离,后面我们会固定采用余弦距离进行同款检索;
  • 不同类目分布不均衡。事实上我们希望同等重视各个类目,他们能均匀的分割整个特征空间,有利于模型泛化能力;
  • 边界样本检索不准确,从特征图可知,边界样本距离临近类的余弦距离很可能小于该样本到同类之间的距离,造成检索错误。


scheme打开微信扫一扫 启动微信扫一扫_归一化_05


同款检索之归一化操作

需要对分类权重w进行归一化,有研究表明,训练数据库中样本多的类目对应的 W 的模长也会越长,表征模型越重视该类的分类正确程度,而忽视了其他样本数目少的类目。我们将 W 和 x 都进行归一化,因而决策边界只取决于角度,迫使模型训练收敛后特征分布更加扇形化,有利于余弦检索。但是两者同时归一化,会造成模型难于收敛,大家可以思考一番为何?参考图 23 中的 softmax 特性,由于权重和特征都进行了归一化,分类逻辑值最大为 1,最小为-1,同样的三类分类学习中 gt 类目对应的 softmax 概率最大只到 0.78,远小于 1,导致模型仍有较大 loss,不好收敛。解决方法比价简单,对逻辑值乘以一个尺度值 s 即可,扩大差异化,有利于模型收敛。(这个地方不理解)

同款检索之分类模型改进 2 角度 Margin

增加角度 Margin 的核心目的是让 softmax 分类的扇形分布更加有利于检索。相比乘性 margin,加性 margin 更加容易训练,这是因为乘性 margin 将余弦的单调区间从[0,π]缩小为[0,π/m],梯度更新区间变小了,而加性 margin 单调区间不变,有利于模型收敛。


scheme打开微信扫一扫 启动微信扫一扫_权重_06


scheme打开微信扫一扫 启动微信扫一扫_scheme打开微信扫一扫_07


同款检索之分类模型改进 3 排序损失

分类模型的学习目的是类别可区分,和检索任务还是有一定区别,引入排序损失的目的就是显示的去优化检索任务,即为欧式空间中同类样本的距离要小于不同类。一般排序损失和分类损失叠加使用效果要更好,我们设计的模型结构如下图 27 所示:


scheme打开微信扫一扫 启动微信扫一扫_归一化_08


图 27 中右边展示的是常用的排序损失函数,如 contrastive loss, triplet loss, lifted structure loss 等。图中重点展示了三元组损失函数以及优化的可视化目标,即同类距离要比不同类距离小于一个 margin。

同款检索之分类模型及其改进后性能对比

此处我们对分类模型和其改进版本在商品检索任务上进行性能对比。评测集合是我们收集的 11 大类商品库,其中用户评论图作为查询样本,检索样本为同款商家图和非该款式的噪声集合组成,可以较好的模拟线上检索库。图 28 展示了分类模型及其改进版本在珠宝类目上的性能对比,可知:1)增加归一化和角度加性 margin 后,即为 ArcFace[13],检索性能要优于常用 softmax 分类模型;2)在分类模型基础上增加排序损失,如 Hard Triplet Loss,检索性能优于常用 softmax 分类模型;3)分类+归一化+角度 margin+排序,如最后两行所示,性能进一步提升,但是提升幅度不是特别大。

同款检索之多任务模型

为了进一步提升检索模型的特征表达能力,我们探索让检索特征捕捉更加丰富的商品特性,如在款式的类别上,加上视角、品牌等商品属性,如下图 29 所示。


scheme打开微信扫一扫 启动微信扫一扫_电脑微信扫一扫在哪_09


为了适应多属性标注标注的学习,我们设计如下图 30 的多任务协同学习模型。多任务协同学习模型的好处非常明显,可以更好的利用属性之间的相关性,有利于网络的优化收敛,以及提升模型的泛化能力,这样得到的检索特征更加有利于商品同款检索。这里有个问题,不同任务权重如何设计?当然我们可以手工设置每个任务的权重,但这需要对各个任务理解较为深入加上大


scheme打开微信扫一扫 启动微信扫一扫_电脑微信扫一扫在哪_10


量调参得到,另外的策略是自动得到各个任务的权重,有许多研究者对此进行了研究,这里我们采用验证集趋势算法[14]来自动计算得到各个任务的权重,如下图 31 所示。该算法思想比较直接,即为人工设置高权重用于主任务,如款式分类,其他任务基于其优化难易程度来得到权重,如难优化(损失波动大且绝对值高)的任务权重大,易优化的权重小。使用多任务协同学习后,模


scheme打开微信扫一扫 启动微信扫一扫_归一化_11


型的检索性能相比单任务模型有较大的提升,如下图 32 所示。


scheme打开微信扫一扫 启动微信扫一扫_电脑微信扫一扫在哪_12


同款检索之注意力模型

我们讲述了同款检索的一个巨大的挑战即为相似款对同款检索的混淆。为了更好的区分同款和相似款,我们希望更加关注一些显著的区域,如下图 33 中手表的 logo,刻写的文字,鞋子的 logo,花纹等。常用的注意力模型分为三种[15],有特


scheme打开微信扫一扫 启动微信扫一扫_scheme打开微信扫一扫_13


特征空间注意力,特征通道注意力,以及 2 种注意力相结合。通过实验对比可知,增加特征空间注意力后,模型检索性能提升,但是增加特征通道注意力,检索性能反而下降,如下图 34 所示。我们认为空间注意力有利于强化模型重视显著空间区域,而特征通道注意力可能造成了模型过拟合,性能反而有所下降。


scheme打开微信扫一扫 启动微信扫一扫_scheme打开微信扫一扫_14


同款检索之层级困难感知模型

同样针对同款检索的两大难点和挑战,即类间混淆性和类内差异性,我们采用层级困难感知模型来充分重视这两大难题,如下图 35 所示的包包。尽管是同款,其相似程度可能有很大差异,如该款式包包由于拍摄视角、遮挡等造成的变化,对于非同款的负样本,也有非常相似的其他款式包包,和差异比较大的其他商品入酒类、口红等。


scheme打开微信扫一扫 启动微信扫一扫_权重_15


层级困难感知模型模型[16]结构如下图 36 所示,其排序损失按层级分布,第一层级针对所有的正负样本进行排序学习,第二层负责较为困难的正负样本对,而第三层则负责更加困难的正负样本对,并且对于越困难的样本对,模型网络设计的越深。


scheme打开微信扫一扫 启动微信扫一扫_电脑微信扫一扫在哪_16


层级困难感知模型通过层级设计,匹配正负样本对的层级分布特性,能够有效的提升模型的同款检索性能,如下图 37 的实验所示。


scheme打开微信扫一扫 启动微信扫一扫_scheme打开微信扫一扫_17


(这部分没理解网路是如何设计的)

同款检索之互学习模型

众所周知,一般竞赛中大家都会融合多个模型的结果来提升精度。但是在实际的项目落地,我们需要同时考虑部署模型的精度和速度,融合多个模型会占用更多计算资源,降低前向速度。那么怎么既然融合多个模型结构的优势,又不增加计算资源呢?这就是互学习模型的核心思想,如下图所示,互学习模型通过 KL 散度 loss 来吸收其他模型的结构优势,部署的时候只需要部署一个模型即可,不增加计算资源。


scheme打开微信扫一扫 启动微信扫一扫_scheme打开微信扫一扫_18


实验中,我们利用 resnet152 和 inceptionv4 进行互学习,实际部署采用 resnet152 进行检索,其性能如下图 39 所示。互学习除了增加模型训练时间,对模型上线不增加任何负担,但是精度能够较为显著的增加。


scheme打开微信扫一扫 启动微信扫一扫_权重_19


同款检索之互 k 近邻编码重排序

前面我们讲述的都是优化检索模型,这里我们讲述的是如何进一步优化检索模型的检索结果,即重排序。在重排序里面,我个人非常欣赏互 k 近邻算法[17],非常简单高效。互 k 学习算法最早被提出来用于行人再检索,如下图 43 所示,其核心发现是,对于 query 样本,其检索的 top-10 样本中,正样本(和 query 为同一人)换做查询样本时,其 k 近邻中有原始的 query 样本,而负样本(和 query 非同一个人),其 k 近邻中没有原始 query 样本,基于该发现,作者在马氏距离的基础上,增加了基于互 k 近邻的距离度量,如图中下方所示,基于该度量可以有效的对原排序进行重排序,将正样本挪前,将负样本挪后


scheme打开微信扫一扫 启动微信扫一扫_权重_20


但是实际上,我们无法直接利用该算法用于商品同款检索,原因在于我们的 query 是用户评论图,而检索图是商家图,他们存在很大的差异,造成互 k 近邻会失效,后续我们重点是如何优化特征度量空间,让模型的域差异减小,然后再利用互 k 近邻来进行重排序。

思考

我感觉这篇文章非常好,值得多看几遍,现在有几点疑问,先记录下来。

  • 归一化操作中为什么乘上s,可以提高收敛速度。
  • 像arcface+triplet 联合loss,trplet用的欧式距离计算,arcface用的余弦距离,两个之间会不会冲突。
  • 多任务模型共享一个特征,是什么意思,类别之间互相重复,还是扩充了类别数目。
  • 层级困难感知,网路结构啥样的
  • 互学习模型 KL 散度 loss 来吸收其他模型的结构优势。