补充知识:
hinge loss
ℓ ( y ) = max ( 0 , 1 − t ⋅ y ) \ell(y) = \max(0, 1-t \cdot y) ℓ(y)=max(0,1−t⋅y)
释义: 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:
-
pairwise ranking loss
-
生成匹配对,具有标签,标签表达正负样本,
-
在抽样时有多重策略,以防训练过程在easy样本对上浪费时间
-
pair hinge loss,
pair wise hinge loss是基于样本对之间的距离来得到loss函数,m是margin。具体而言:当样本对是正例时,其样本对的距离越大则 L L L值遇到;当是负例时则反之,但距离越大越好,但若超过一定阈值 m m m则该样本对对模型带来的影响就微乎其微,因此直接设置为零。用下图来形象表示其含义:
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)的距离变大。
对公式变形,得:
-
-
triplet ranking loss
这是针对三元组的文本对损失函数,在二元组中,正样本与负样本被分开单独的与锚点样本(anchor)组成单个sample,而在三元组中,每个样例格式为 < a , p , n > <a,p,n> <a,p,n>既包含正样例,又包含负样例,模型通过最大化 < a , p > <a,p> <a,p>与 < a , n > <a,n> <a,n>之间的距离来匹配样本对。
目标函数如下:
梳理:
->探究如何基于现有数据采样生成匹配对
动机: 探究生成文本对构建训练数据集以用于模型训练,以及采用各种损失函数的效果。
loss类:
-
ContrastiveLoss:遍历数据集,将当前样本作为anchor,随着生成正负类label,根据label决定其匹配样本是p还是n,p是就从同一类中选择其他样本,n是从其他类选择样本,最终得到的是与数据集规模相同的训练集,不保证每个样本都有正例样本对。
-
TripletLoss:类似于ContrastiveLoss,但是使用三元组。
-
OnlineContrastiveLoss:上述的两种采样方式是在全部数据输入前进行,而这个是以数据流的方式每次取一个batch,在这个batch上采样得到pair,然后计算损失函数。 具体过程如下: - 将原始文本通过模型进行编码,得到其文本表示。 - 在计算loss函数中,根据输入的label进行采样,得到匹配对。其中在采样中可加入一定的筛选策略(因为已经有了初步的文本表示向量,可以算一个相似度),根据相似度进行排序。找到所谓的“hard”样本作为负例对。 - 在得到的匹配对上计算损失函数,而此时的数据规模被大幅扩增,因为每个样本会产生多个正负例。
数据采样类:
-
SiameseMNIST:二元样本对 ...
模型:
-
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 其他类似...