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适用于多分类任务,函数会输出一个向量,表示单个样本在某一类别上的概率。
-
在二分类上与逻辑回归差不多:
- 同时逻辑回归通过非线性映射,大大减小离分类平面较远的点的权重,提升了与分类最相关的数据点的权重。
- 两者的根本目的一样。
- 两者都可以添加不同的正则化选项,如L1,L2。
- 多次试验证明两者结果相似。
-
Hinge Loss 经常用于SVM中, 逻辑回归与SVM对比 :
- 逻辑回归相对来说模型更简单,实现起来更方便,特别是进行大规模线性分类时;
- SVM更加复杂化,但理论基础更加牢固;
- 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函数的泛化版本。
- 其不仅可以接收预测的每个样本在每类中的概率信息,还接收信息增益矩阵信息;
- 当信息增益矩阵为单位矩阵时,两者等价。
-
例如赌桌上表情越多,信息增益也大,信息熵用于表示事件的不确定性的大小,有以下形式
- 单调性:概率越高的事件,所携带的信息熵越低;
- 累加性:多随机事件同时发生存在的总不确定性的亮度可以表示各事件不确定性的量度的总和;
- 非负性
-
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:无监督学习的编码,聚类中经常使用。