caffe总结(七)损失函数

导言

在有监督的机器学习中,需要有标签数据,与此同时,也需要有对应的损失函数(Loss Function)。

在Caffe中,目前已经实现了一些损失函数,包括最常见的L2损失函数,对比损失函数,信息增益损失函数等等。在这里做一个笔记,归纳总结Caffe中用到的不同的损失函数,以及分析它们各自适合的使用场景。

对比损失函数(Contrastive loss)

在caffe的孪生神经网络(siamese network)中,采用的就是Contrastive loss,对应的层是Contrastive_loss_layer;

  • 目的: 验证一对输入是否为同类;
    在这里插入图片描述


代表两个样本特征的欧氏距离,y为两个样本是否匹配的标签,y=1代表两个样本相似或者匹配;

  • 观察函数表达式可以发现,这一损失函数既可用于样本的匹配程度,也可以用于训练以提取特征的模型;当y=1时,损失函数只剩下前一项,即原来相似的样本,如果在特征空间的欧氏距离较大,则说明当前模型不好,因此需要加大损失。
layer {
  name: "loss"
  type: "ContrastiveLoss"
  bottom: "feat"   
  bottom: "feat_p"
  bottom: "sim"    
  top: "loss"
  contrastive_loss_param{
    margin:1
  }
}
  • 三个输入:2个特征的输入、1个标签的输入(sim)
    在这里插入图片描述
  • 适合场景:进行相似性判定,可以用来训练Siamese网络

多项式逻辑损失函数(Multinomial Logistic Loss)

  • 在多项式损失函数中,如果将softmax层与multinomial_logistic_loss多项式、损失函数对应层连接在一起,从数学理论上讲等同于一个softmax_loss;
    在这里插入图片描述
layer {
  name: "loss"
  type: "Softmax"
  bottom: "ip1"   
  top: "softmax"
}
layer {
  name: "loss"
  type: "MultinomialLogisticLoss"
  bottom: "softmax"   
  bottom: "label" 
  top: "loss"
}

将SoftmaxWithloss操作拆成了两步,但这样计算结果不太理想,一般很少用。

Sigmoid 交叉熵损失函数(Sigmoid Cross Entropy Loss)

Sigmoid Cross Entropy损失函数被用来处理一张图片具备多个二分类属性的场景。
例如苹果的颜色红不红,味道甜不甜,口感脆不脆,这一情况就是3个二分类的联合分布情况。

  • 使用 Sigmoid Cross Entropy Loss 一定不能出现其中某个属性是多分类的情况, 对于这种多分类,需要使用多任务的构建方式完成。

在这里插入图片描述

layer {
  name: "loss"
  type: "SigmoidCrossEntropyLoss"
  bottom: "fc3"    #预测结果
  bottom: "label3"    #标签值
  top: "loss"
}

Softmax+损失函数(Softmax With Loss)

  • Softmax_loss函数是目前主流的深度学习分类任务最常使用的loss函数,只能用来分类
    在这里插入图片描述
layer {
  name: "loss"
  type: "SoftmaxWithloss"
  bottom: "ip1"    #预测结果
  bottom: "label3"    #标签值
  top: "loss"
}

欧式距离损失函数(Euclidean Loss)

欧式损失函数相对非常好理解,在检测任务中常用,对检测框进行精细化处理时会用到。

  • 核心思想:将相似的距离拉近;
    在这里插入图片描述
    适合场景:回归,特别是其回归的值是实数值的时候。比如人脸检测和人脸关键点定位等。
layer {
  name: "loss"
  type: "EuclideanLoss"
  bottom: "ip1"   #预测值
  bottom: "label"   #标签
  top: "loss"
}

铰链损失函数(Hinge Loss)

  • Hinge Loss适用于多分类任务,函数会输出一个向量,表示单个样本在某一类别上的概率

  • 在二分类上与逻辑回归差不多

    1. 同时逻辑回归通过非线性映射,大大减小离分类平面较远的点的权重,提升了与分类最相关的数据点的权重。
    2. 两者的根本目的一样。
    3. 两者都可以添加不同的正则化选项,如L1,L2。
    4. 多次试验证明两者结果相似。
  • Hinge Loss 经常用于SVM中逻辑回归与SVM对比

    1. 逻辑回归相对来说模型更简单,实现起来更方便,特别是进行大规模线性分类时;
    2. SVM更加复杂化,但理论基础更加牢固;
    3. SVM在进行复杂核函数计算时优势更加明显,可以大大简化模型与计算量;

在这里插入图片描述

# L1 Norm
layer {
  name: "loss"
  type: "HingeLoss"
  bottom: "pred"  
  bottom: "label"   
}
# L2 Norm
layer {
  name: "loss"
  type: "HingeLoss"
  bottom: "pred"  
  bottom: "label"
  top: "loss"
hinge_loss_param{
    norm:L2
  }   
}
  • 预测值代表着预测各类中的得分(注:CHW表示着在网络设计中,不一定要把预测值进行向量化,只有其拉直后元素的个数相同即可)。
  • 在SVM中, 是 D 维特征,和学习到的超平面参数内积的结果。
    所以,一个网络如果仅仅只有全连接层 + 铰链损失函数,而没有其它的可学习的参数,那么它就等价于SVM
  • 标签值:是一个整数类型的数 其代表在各类中的正确的标签。

损失函数计算默认是 L1 范数
L2 范数,正如在 L2-SVM中一样,也有实现。

信息增益损失函数(InformationGain Loss)

  • InformationGain Loss函数是Multinomial Logistic Loss函数的泛化版本。
    1. 其不仅可以接收预测的每个样本在每类中的概率信息,还接收信息增益矩阵信息;
    2. 当信息增益矩阵为单位矩阵时,两者等价

在这里插入图片描述

  • 例如赌桌上表情越多,信息增益也大,信息熵用于表示事件的不确定性的大小,有以下形式

    1. 单调性:概率越高的事件,所携带的信息熵越低;
    2. 累加性:多随机事件同时发生存在的总不确定性的亮度可以表示各事件不确定性的量度的总和;
    3. 非负性
  • infogain_loss函数的核心理念是从概率的意义出发,通过分布不确定程度的差异进行损失函数的计算。

  • 适用场景:无监督学习的编码,聚类中经常使用。当然分类中也可以使用。

layer {
  name: "infogainloss"
  type: "InfogainLoss"
  bottom: "topofprevlayer"  
  bottom: "label"
  top: "infogainloss"
infogain_loss_param{
    source:"infogainH.binaryproto"
  }   
}

小结

  • 欧式距离损失函数:一般适用于回归问题,特别是回归的值是实数的时候。
  • 对比损失函数:用来训练siamese网络时候。
  • Hinge loss:在一对多的分类中应用,类似于SVM。
  • 多项式逻辑损失函数:一般在一对多的分类任务中应用,直接把预测的概率分布作为输入。
  • sigmoid交叉熵损失函数:预测目标概率分布。
  • softmax+损失函数:在一对多分类中的应用。
  • InformationGain Loss:无监督学习的编码,聚类中经常使用。
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Python层Caffe实现Bhattacharyya损失函数前,需要先了解Bhattacharyya距离和Bhattacharyya系数,它们是计算Bhattacharyya损失函数的基础。 Bhattacharyya距离是一种用于度量两个概率分布相似性的方法,其定义为: ![](https://cdn.jsdelivr.net/gh/1076827098/CDN/blog/nlp-chatbot/bhattacharyya_distance.png) 其中,P(x)和Q(x)分别为两个概率分布函数,x为概率变量。 Bhattacharyya系数是Bhattacharyya距离的指数形式,其定义为: ![](https://cdn.jsdelivr.net/gh/1076827098/CDN/blog/nlp-chatbot/bhattacharyya_coefficient.png) 在了解了Bhattacharyya距离和Bhattacharyya系数后,我们可以开始实现Bhattacharyya损失函数。下面是一个使用Python层Caffe实现Bhattacharyya损失函数的示例代码: ```python import caffe import numpy as np class BhattacharyyaLossLayer(caffe.Layer): def setup(self, bottom, top): if len(bottom) != 2: raise Exception("Need two inputs to compute Bhattacharyya loss.") # 检查输入数据维度是否匹配 if bottom[0].count != bottom[1].count: raise Exception("Inputs must have the same dimension.") self.diff = np.zeros_like(bottom[0].data, dtype=np.float32) self.epsilon = 1e-6 # 避免除数为0 def reshape(self, bottom, top): top[0].reshape(1) def forward(self, bottom, top): # 计算Bhattacharyya系数 self.diff[...] = bottom[0].data - bottom[1].data self.distance = np.sum(np.sqrt(np.abs(self.diff))) + self.epsilon self.bc = np.exp(-self.distance) # 计算Bhattacharyya损失 self.loss = -np.log(self.bc + self.epsilon) top[0].data[...] = self.loss def backward(self, top, propagate_down, bottom): if propagate_down: bottom[0].diff[...] = -(1 / (self.bc + self.epsilon)) * np.sign(self.diff) * np.exp(-self.distance / 2) / np.sqrt(np.abs(self.diff)) bottom[1].diff[...] = (1 / (self.bc + self.epsilon)) * np.sign(self.diff) * np.exp(-self.distance / 2) / np.sqrt(np.abs(self.diff)) ``` 在上面的代码中,我们定义了一个名为BhattacharyyaLossLayer的自定义层,实现了Bhattacharyya损失函数。在setup()函数中,我们首先检查输入的数据维度是否匹配,然后初始化diff和epsilon变量。在reshape()函数中,我们指定输出数据的维度。在forward()函数中,我们计算了Bhattacharyya系数和Bhattacharyya损失,并将损失值保存到top[0]中。在backward()函数中,我们计算了梯度,并将梯度值保存到bottom[0]和bottom[1]中。 需要注意的是,在计算梯度时,我们使用了符号函数和指数函数,这是由于Bhattacharyya距离的定义中包含了绝对值,导致其不可导。因此,我们使用了符号函数来代替导数的符号,使用指数函数来代替导数的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值