ranking loss

补充知识:

hinge loss

ℓ ( y ) = max ⁡ ( 0 , 1 − t ⋅ y ) \ell(y) = \max(0, 1-t \cdot y) (y)=max(0,1ty)

释义: t t t是目标值, y y y是预测值,1是margin,当 t t t y y y的符号相同时,则代表类别一样,此时 t t t y y y的相似度与高则loss值越小,当相似度超过一个阈值时如1,则loss值为零,即模型在训练过程中不再对该对样本产生兴趣,该样本的结果也不会对训练参数产生影响。而当二者符号相反是,表示类别分错,此时loss值一定大于1,这些是模型感兴趣的训练数据。

pair math

在文本对匹配任务中,主要就是构建样本对,根据样本对的相似度来判定两者是否属于同一类别。这类应用有找到图片所对应的标题(picture~caption)、问答等任务。而hinge loss正好是一种基于两个样本之间相似度计算loss值的损失函数。因此其各种变形便构成了ranking loss家族。

ranking loss:

  1. pairwise ranking loss

    • 生成匹配对,具有标签,标签表达正负样本,
      ranking loss_第1张图片

    • 在抽样时有多重策略,以防训练过程在easy样本对上浪费时间

    • pair hinge loss,

    在这里插入图片描述

    pair wise hinge loss是基于样本对之间的距离来得到loss函数,m是margin。具体而言:当样本对是正例时,其样本对的距离越大则 L L L值遇到;当是负例时则反之,但距离越大越好,但若超过一定阈值 m m m则该样本对对模型带来的影响就微乎其微,因此直接设置为零。用下图来形象表示其含义:
    ranking loss_第2张图片

    n n n(negative)样本可以分布在图中的任意区域,与 a a a(anchor样本,被 p , n p,n p,n的参照样本)的距离代表二者的相似度,距离越远相似度越小,模型的目标就是让正样例样本对( p   a p~a p a)之间的距离变小,负样例样本对( n   a n~a n a)的距离变大。

    对公式变形,得:
    模型公式

  2. triplet ranking loss

    这是针对三元组的文本对损失函数,在二元组中,正样本与负样本被分开单独的与锚点样本(anchor)组成单个sample,而在三元组中,每个样例格式为 < a , p , n > <a,p,n>既包含正样例,又包含负样例,模型通过最大化 < a , p > <a,p> < a , n > <a,n>之间的距离来匹配样本对。

    ranking loss_第3张图片

    目标函数如下:
    在这里插入图片描述

梳理:

->探究如何基于现有数据采样生成匹配对

动机: 探究生成文本对构建训练数据集以用于模型训练,以及采用各种损失函数的效果。

loss类:

  1. ContrastiveLoss:遍历数据集,将当前样本作为anchor,随着生成正负类label,根据label决定其匹配样本是p还是n,p是就从同一类中选择其他样本,n是从其他类选择样本,最终得到的是与数据集规模相同的训练集,不保证每个样本都有正例样本对。
    
  2.  TripletLoss:类似于ContrastiveLoss,但是使用三元组。
    
  3.  OnlineContrastiveLoss:上述的两种采样方式是在全部数据输入前进行,而这个是以数据流的方式每次取一个batch,在这个batch上采样得到pair,然后计算损失函数。
     具体过程如下:
     - 将原始文本通过模型进行编码,得到其文本表示。
     - 在计算loss函数中,根据输入的label进行采样,得到匹配对。其中在采样中可加入一定的筛选策略(因为已经有了初步的文本表示向量,可以算一个相似度),根据相似度进行排序。找到所谓的“hard”样本作为负例对。
     - 在得到的匹配对上计算损失函数,而此时的数据规模被大幅扩增,因为每个样本会产生多个正负例。
    

数据采样类:

  1. SiameseMNIST:二元样本对
    ...
    
    

模型:

  1. EmbeddingNet:基础模型框架
    SiameseNet:内含一个EmbeddingNet模型,两个输入的文本都会经过该模型进行编码,得到各自的输出表示。
    	class SiameseNet(nn.Module):
        def __init__(self, embedding_net):
            super(SiameseNet, self).__init__()
            self.embedding_net = embedding_net
    
        def forward(self, x1, x2):
            output1 = self.embedding_net(x1)
            output2 = self.embedding_net(x2)
            return output1, output2
    其他类似...
    

参考文献
siamese-triplet
ranking loss

你可能感兴趣的:(基础知识)