【技术综述】一文道尽softmax loss及其变种

【损失函数系列】softmax loss损失函数详解 1.损失函数: 损失函数(loss function)是用来评测模型的预测值f(x)与真实值Y的相似程度,损失函数越小,就代表模型的鲁棒性越好,损失函数指导模型学习。根据损失函数来做反向传播修改模型参数。机器学习的目的就是学习一组参数,使得预测值与真值无限接近。 2.softmax loss: 它是损失函数的一种,是softmax和cross-entropy loss组合而成的损失函数。 先看softmax,其函数形式如下:其中zj就是某个神经网络全连... 阅读详情

本文首发于龙鹏的知乎专栏《有三AI学院》

https://zhuanlan.zhihu.com/c_151876233

今天来说说softmax loss以及它的变种

 

01 softmax loss

softmax loss是我们最熟悉的loss之一了,分类任务中使用它,分割任务中依然使用它。softmax loss实际上是由softmax和cross-entropy loss组合而成,两者放一起数值计算更加稳定。这里我们将其数学推导一起回顾一遍。

令z是softmax层的输入,f(z)是softmax的输出,则

单个像素i的softmax loss等于cross-entropy error如下:

展开上式:

在caffe实现中,z即bottom blob,l(y,z)是top blob,反向传播时,就是要根据top blob diff得到bottom blob diff,所以要得到 

下面求loss对z的第k个节点的梯度

可见,传给groundtruth label节点和非groundtruth label节点的梯度是不一样的。

我们看看caffe中Backward的代码。

Dtype* bottom_diff =
bottom[0]->mutable_cpu_diff();
const Dtype* prob_data = prob_.cpu_data();
caffe_copy(prob_.count(), prob_data,
bottom_diff);
const Dtype* label =
bottom[1]->cpu_data();
int dim = prob_.count() / outer_num_;
int count = 0;
for (int i = 0; i < outer_num_; ++i) {
for (int j = 0; j < inner_num_; ++j) {
const int label_value =
static_cast<int>(label[i * inner_num_ + j]);
if (has_ignore_label_ &&
label_value == ignore_label_) {
for (int c = 0; c <
bottom[0]->shape(softmax_axis_); ++c) {
bottom_diff[i * dim + c *
inner_num_ + j] = 0;
}
} else {
bottom_diff[i * dim + label_value *
inner_num_ + j] -= 1;
++count;
}
}
}

作为loss层,很有必要测试一下,测试分两块,forward和backward,我们看看caffe中的代码。

Test_softmax_with_loss_layer.cpp

Forward测试是这样的,定义了个bottom blob data和bottom blob label,给data塞入高斯分布数据,给label塞入0~4。

blob_bottom_data_(new Blob<Dtype>(10, 5, 2, 3))
blob_bottom_label_(new Blob<Dtype>(10, 1, 2, 3))

然后分别ingore其中的一个label做5次,最后比较,代码如下。

Dtype accum_loss = 0;
for (int label = 0; label < 5; ++label) {
layer_param.mutable_loss_param()->set_ignore_label(label);
layer.reset(new
SoftmaxWithLossLayer<Dtype>(layer_param));
layer->SetUp(this->blob_bottom_vec_,
this->blob_top_vec_);
layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_);
accum_loss +=
this->blob_top_loss_->cpu_data()[0];
}
// Check that each label was included all but
once.
EXPECT_NEAR(4 * full_loss, accum_loss, 1e-4);

至于backwards,直接套用checker.CheckGradientExhaustive就行,它自己会利用数值微分的方法和你写的backwards来比较精度。

TYPED_TEST(SoftmaxWithLossLayerTest,
TestGradientIgnoreLabel) {
typedef typename TypeParam::Dtype Dtype;
LayerParameter layer_param;
//
labels are in {0, ..., 4}, so we'll ignore about a fifth of them
layer_param.mutable_loss_param()->set_ignore_label(0);
SoftmaxWithLossLayer<Dtype> layer(layer_param);
GradientChecker<Dtype> checker(1e-2, 1e-2, 1701);
checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_,
this->blob_top_vec_, 0);
}

原始的softmax loss非常优雅,简洁,被广泛用于分类问题。它的特点就是优化类间的距离非常棒,但是优化类内距离时比较弱。

鉴于此,就有了很多对softmax loss的改进,下面一一道来。

 

02 weighted softmax loss【1】

这第一个改进就是weighted,怎么说?假如我们是一个分类问题,只有两类,但是两类的样本数目差距非常之大。比如边缘检测问题,这个时候,明显边缘像素的重要性是比非边缘像素大的,此时可以针对性的对样本进行加权。

wc就是这个权重,像刚才所说,c=0代表边缘像素,c=1代表非边缘像素,则我们可以令w0=1,w1=0.001,即加大边缘像素的权重。

当然,这个权重,我们还可以动态地计算让其自适应。

具体的反向公式推导,就跟上面差不多不再赘述,详细的实现我会在git中给出代码。【1】中用了weighted sigmoid_cross_entropy_loss,原理类似。

固定权重的fixed softmax loss和自适应权重的adapted softmax loss大家可以去git中自行查看。

 

03 soft softmax loss【2】

首先我们看下面的式子。

当T=1时,就是softmax的定义,当T>1,就称之为soft softmax,T越大,因为Zk产生的概率差异就会越小。文【2】中提出这个是为了迁移学习,生成软标签,然后将软标签和硬标签同时用于新网络的学习。

为什么要想到这么用,这是因为当训练好一个模型之后,模型为所有的误标签都分配了很小的概率;然而实际上对于不同的错误标签,其被分配的概率仍然可能存在数个量级的悬殊差距。这个差距,在softmax中直接就被忽略了,但这其实是一部分有用的信息。

文章的做法是先利用softmaxloss训练获得一个大模型,然后基于大模型的softmax输出结果获取每一类的概率,将这个概率,作为小模型训练时soft target的label。

 

04 Large-Margin Softmax Loss【3】

这是文【3】中提出的loss,被称为L-Softmax loss。我们先从一张图来理解下softmax loss,这张图显示的是不同softmax loss和L-Softmax loss学习到的cnn特征分布。第一列就是softmax,第2列是L-Softmax loss在参数m取不同值时的分布。通过可视化特征可知学习到的类间的特征是比较明显的,但是类内比较散。而large-margin softmax loss则类内更加紧凑,怎么做到的呢?

先看一下loss的定义形式如下。

由于 zk 是全连接层的输出,所以它可以写成

的形式,将内积更具体的表现出来,就是

我们看二分类的情况,对于属于第1类的样本,我们希望

如果我们对它提出更高的要求呢?由于cos函数在0~PI区间是递减函数,我们将要求改为

其中m>=1,

在这个条件下,原始的softmax条件仍然得到满足。

我们看下图,如果W1=W2,那么满足条件2,显然需要θ1与θ2之间的差距变得更大,原来的softmax的decision boundary只有一个,而现在类别1和类别2的decision boundary不相同,这样类间的距离进一步增加,类内更近紧凑。

更具体的定义如下:

L-Softmax loss中,m是一个控制距离的变量,它越大训练会变得越困难,因为类内不可能无限紧凑。

作者的实现是通过一个LargeMargin全连接层+softmax loss来共同实现,可参考代码。

 

05 angular softmax loss【4】

也称A-softmax loss。它就是在large margin softmax loss的基础上添加了两个限制条件||W||=1和b=0,使得预测仅取决于W和x之间的角度θ。

上图分别比较了原softmax loss,原softmax loss添加||w||=1约束,以及在L-softmax loss基础上添加||w||=1约束的结果。

为什么要添加|w|=1的约束呢? 作者做了两方面的解释,一个是softmax loss学习到的特征,本来就依据角度有很强的区分度,另一方面,人脸是一个流形,将其特征映射到超平面表面,也可以解释。

 

06 L2-constrained softmax loss【5】

将学习的特征x归一化。作者观测到好的正面的脸,特征的L2-norm大,而特征不明显的脸,其对应的特征L2-norm小,因此提出这样的约束来增强特征的区分度。

上面式就是将其归一化到固定值α。实际训练的时候都不需要修改代码,只需要添加L2-norm层与scale层,如下图。

为什么要加这个scale层?NormFace【6】中作出了解释。

该文章指出了直接归一化权重和特征,会导致loss不能下降。因为就算是极端情况下,多类样本,令正样本|wx|=1取最大值,负样本|wx|=-1取最小值,这时候分类概率也是

当类别数n=10,p=0.45;n=1000,p=0.007。当类别数增加到1000类时,正样本最大的概率还不足0.01,而反向求导的时候,梯度=1-p,会导致一直传回去很大的loss。

所以,有必要在后面加上scale层,作者还计算出了该值的下界,具体可自行参考。

 

07 additive margin softmax loss【7】

定义如下

看明白了吧,就是把L-Softmax的乘法改成了减法,同时加上了尺度因子s。作者这样改变之后前向后向传播变得更加简单。其中W和f都是归一化过的,作者在论文中将m设为0.35。

值得注意的是,normalization是收敛到好的点的保证,同时,必须加上scale层,scale的尺度在文中被固定设置为30。

那到底什么时候需要normalization什么时候又不需要呢?这实际上依赖于图片的质量。

我们看一个公式如下

其中α就是向量x的模,它说明模值比较小的,会有更大的梯度反向传播误差系数,这实际上就相当于难样本挖掘了。不过,也要注意那些质量非常差的,模值太小可能会造成梯度爆炸的问题。

 

08 argface additive angular margin【8】

定义如下:

在定义这个loss的时候,作者干脆做了一个表把现有基于softmax loss及其改进的loss的二分类决策边界条件都列了出来。

说累了,一句话,有效。。。。

到此可以说为了改进softmax loss用尽了手段了,至于有没有用,具体效果大家去尝试吧,附上未完整的GitHub链接。

https://github.com/longpeng2008/Caffe_Long

先写到这里,后续再充实实验结果和更多原理。

 

参考文献

【1】Xie S, Tu Z.Holistically-nested edge detection[C]//Proceedings of the IEEE international conference on computer vision. 2015: 1395-1403.

【2】Hinton G,Vinyals O, Dean J. Distilling the knowledge in a neural network[J]. arXiv
preprint arXiv:1503.02531, 2015.

【3】Liu W, Wen Y,Yu Z, et al. Large-Margin Softmax Loss for Convolutional Neural
Networks[C]//ICML. 2016: 507-516.

【4】Liu W, Wen Y,Yu Z, et al. Sphereface: Deep hypersphere embedding for face
recognition[C]//The IEEE Conference on Computer Vision and Pattern Recognition
(CVPR). 2017, 1.

【5】Ranjan R, Castillo C D, Chellappa R. L2-constrained softmax loss for discriminative face verification[J]. arXiv preprint arXiv:1703.09507, 2017.

【6】Wang F, Xiang X, Cheng J, et al. NormFace: $ L_2 $ Hypersphere Embedding for Face Verification[J]. arXiv preprint arXiv:1704.06369, 2017.

【7】Wang F, Liu W,Liu H, et al. Additive Margin Softmax for Face Verification[J]. arXiv preprint arXiv:1801.05599, 2018.

【8】Deng J, Guo J, Zafeiriou S. ArcFace: Additive Angular Margin Loss for Deep Face
Recognition[J]. arXiv preprint arXiv:1801.07698, 2018.

同时,在我的知乎专栏也会开始同步更新这个模块,欢迎来交流

https://zhuanlan.zhihu.com/c_151876233

注:部分图片来自网络

—END—

感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI!

 

 

 

一文讲懂召回中的 NCE & NEG & sampled softmax loss 深度学习中与分类相关的问题都会涉及到softmax的计算。当目标类别较少时,直接用标准的softmax公式进行计算没问题,当目标类别特别多时,则需采用估算近似的方法简化softmax中归一化的计算。 阅读详情

相关推荐

【机器学习】tf.nn.softmax

1、概念 softmax是一个激活函数。 tf.nn.softmax( logits, # 输入:全连接层(往往是模型的最后一层)的值,一般代码中叫做logits axis = None, name = None dim = None ) 作用:softmax函数的作用就是归一化。 输入:全连接层(往往是模型的最后一层)的值,一般代码中叫做logits 输出:归一化的值,含义是属于该位置的概率,一般代码叫做probs,例如输出[0.4, 0.1, 0.2, 0..

littlemichelle 5521

一文看懂softmax loss

本文针对softmax函数、交叉熵损失函数、softmax loss损失函数(重点)、带有temperature参数的softmax loss进行了详细的讲解,目的是更好的理解softmax loss。

自己在学习过程中的总结 4419

CS231n笔记1--Softmax Loss 和 Multiclass SVM Loss

Softmax Loss 和 Multiclass SVM LossSoftmax Loss给出 (xi,yi)(x_i, y_i) ,其中 xix_i 是图像,yiy_i 是图像的类别(整数),s=f(xi,W)s = f(x_i,W),其中ss 是网络的输出,则定义误差如下: P(Y=k|X=xi)=esk∑jesjLi=−logP(Y=yi|X=xi)P(Y = k|X = x_i) =

u012767526的专栏 8699

『损失函数』softmax loss

softmax loss介绍

sinat_39783664的博客 989

深度探索softmax及其变种的分类策略与优化

本文还有配套的精品资源,点击获取 简介:softmax函数是机器学习中常用的分类激活函数,但在处理大规模数据和高维特征时存在梯度消失和低计算效率等问题。本文汇总并探讨了softmax的多个变种,包括Label Smoothing、Temperature Scaling、Focal Loss、AMSoftmax、A-Softmax、SphereFace、CosFace和Ada...

weixin_36184718的博客 1578

小红书x-mini签名逆向实战:Frida动态Hook与算法还原

在移动App协议分析中,请求签名机制是保障接口安全的核心技术,其本质是客户端对请求参数、时间戳、设备指纹等要素进行加密认证的过程。理解签名原理需掌握Native层加密流程、JNI调用机制及密钥动态派生逻辑。Frida作为主流动态插桩工具,能绕过符号剥离、字符串加密和控制流混淆等反分析手段,在函数执行瞬间捕获寄存器状态、内存数据与调用上下文,实现签名算法的完整还原。该技术广泛应用于合规内容监测、API自动化调用与竞品协议研究等工程场景。本文聚焦小红书x-mini签名这一典型样本,详解从JNI_OnLoad定位

weixin_31264565的博客 463

一文道尽softmax loss及其变种

1 softmax loss softmax loss是我们最熟悉的loss之一,在图像分类和分割任务中都被广泛使用。Softmax loss是由softmax和交叉熵(cross-entropy loss)loss组合而成,所以全称是softmax with cross-entropy loss,在caffe,tensorflow等开源框架的实现中,直接将两者放在一个层中,而不是分开不同层,可以让数值计算更加稳定,因为正指数概率可能会有非常大的值。 这里我们将其数学推导一起回顾一遍。 令z是soft

Bruce_0712的博客 1427

GD32F303定时器配置:实现两路互补PWM输出与相位控制

本文详细解析了基于GD32F303定时器实现两路互补PWM输出与精确相位控制的方法。通过配置TIMER2的中间对齐模式,结合REMAP功能解决引脚复用问题,从硬件层面稳定生成相位差180度的互补PWM信号,适用于电机驱动、开关电源等对时序要求苛刻的应用场景。

weixin_29182481的博客 307

Softmax 和 Softmax-loss的推演

Softmax 和 Softmax-loss的推演记录Softmax 函数σ(z)=(σ1(z),...σm(z))\sigma(z)=(\sigma_1(z),...\sigma_m(z))定义如下: σi(z)=exp(z)Σmj=1exp(zj),i=1,...,m\sigma_i(z)={exp(z)\over\Sigma_{j=1}^m exp(z_j)} , i = 1,...,m它在

时光杂货店 5145

RK3568 解决MIPI屏幕开机只显示uboot logo的问题

之前写过一篇文章介绍了RK3568驱动MIPI屏幕的方法,这次产品迭代,硬件改版,选型的新的屏幕了。所以再次开启调试屏幕的过程。本以为会和上次一样会轻车熟路,事情总是事与愿违,同样的路,遇到新的坑。

fhqlongteng的博客 5427

幸狐RV1106开发板运行Yolo8示例

rknn_model_zoo 是瑞芯微官方提供的 RKNPU 支持的各种主流算法的部署示例,目前对 Luckfox Pico 所使用的 RV1103/RV1106 有限支持,最新的示例支持 mobilenet 模型部署和 yolo 模型部署,本章以部署 yolov8修改版本为例介绍 rknn_model_zoo 示例的使用。:可选项,用于指定 RKNN 模型的保存路径,默认保存在 ONNX 模型同一目录下,名称为 ‘yolov8.rknn’例如“rv1106”。

qq_42730522的博客 3225

softmax loss及其变种

loveliuzz的博客 1261

从“看不懂Sansen”到亲手搭建:一个Class AB输出级+浮动电压源的保姆级设计复盘

本文详细记录了从理论困惑到实践突破的Class AB输出级与浮动电压源设计全过程。通过电流镜调试、恒定跨导优化及版图匹配等关键步骤,作者实现了高性能运放设计,并分享了从仿真到实测的宝贵经验,为模拟电路初学者提供实用指导。

weixin_33737774的博客 869

10分钟,关于softmax,softmax loss理解

最近在开荒一篇商汤科技使用AutoML方法设计的Loss函数的文章《AM-LFS AutoML for Loss Function Search》,其中以常用的损失函数Softmax损失函数以及变种进行了分析,为了开荒方便,先对Softmax进行一个梳理总结。 【1、softmax函数介绍】 softmax是一个函数,其输出值是一个向量并取值为[0,1],公式见下,其中代表总类别数,表示输...

码农的科研笔记 8558

VS2015+C++实战:手把手教你用海康MVS里的Demo搞定多相机同步采图与保存

本文详细解析了在VS2015+C++环境下,利用海康威视MVS工业相机SDK实现多相机同步采图与保存的全流程。从环境准备、SDK选择到多相机初始化、同步采图方案,再到异常处理与性能优化,提供了实战技巧和代码示例,帮助开发者快速掌握工业相机二次开发的核心技术。

weixin_29170327的博客 283

【机器学习】随机森林(Random Forest,简称 RF):预测光伏电站功率 || 缺失数据处理 || 重复行处理...

【机器学习】随机森林(Random Forest,简称 RF):预测光伏电站功率。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1652

Softmax和Softmax-Loss函数及梯度计算

1. 结合Logistic Regression 分析 Softmax 训练集由 mmm 个已标记的样本构成:{(x(1),y(1)),...,(x(m),y(m))}\{(x^{(1)}, y^{(1)}), ... , (x^{(m)}, y^{(m)})\}{(x(1),y(1)),...,(x(m),y(m))},其中输入的第 iii 个样例 x(i)∈ℜn+1x^{(i)} \in \R...

SmileLing的专栏 5343

锂电池充放电管理-单片机通用模版

- **①两节锂电池通过电阻分压检测ADC,再根据电压划分电量等级;** - **②充电使用的是锂电池充电IC方案,可通过硬件电阻参数调节充电电流,并可以通过STAT引脚检测充电和满电状态(充电注意会抬高电压);** - **③放电根据ADC_BAT检测电池电量进行等级划分(注意大负载电压骤降瞬间);** - **④充放电过程注意在电量划分等级临界值来回抖动现象;**

a6662580的博客 1490

机器学习中的损失函数 (着重比较:hinge loss vs softmax loss)

1. 损失函数损失函数(Loss function)是用来估量你模型的预测值 f(x)f(x) 与真实值 YY 的不一致程度,它是一个非负实值函数,通常用 L(Y,f(x))L(Y,f(x)) 来表示。损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数的重要组成部分。模型的风险结构包括了风险项和正则项,通常如下所示: θ∗=argminθ1N∑i=1NL(yi,

Vinicier的专栏 8万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

softmax变种或增强1:Large-Margin Softmax Loss for Convolutional Neural Networks

本博文转载自:https://blog.youkuaiyun.com/shaoxiaohu1/article/details/53325945参考文献: Liu W, Wen Y, Yu Z, et al. Large-Margin Softmax Loss for Convolutional Neural Networks[C]//Proceedings of The 33rd International ...

u010532666的博客 1298

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

损失函数改进之Large-Margin Softmax Loss

最近几年网络效果的提升除了改变网络结构外,还有一群人在研究损失层的改进,这篇博文要介绍的就是较为新颖的Large-Margin softmax loss(L-softmax loss)。Large-Margin softmax loss来自ICML2016的论文:Large-Margin Softmax Loss for Convolutional Neural Networks 论文链接:htt

AI之路 3万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【深度学习】详解 Softmax Cross Entropy Loss

Softmax Cross Entropy Loss = Softmax + Cross Entropy Loss

闻韶 1万+

Softmax loss 之 Large Margin Softmax(L-softmax)

关于softmax、softmaxloss的详细介绍可见于:https://blog.youkuaiyun.com/u014380165/article/details/77284921 large margin softmax论文中说道,softmax+cross-entropy loss是CNNs中最为常见的代价组合,效果不错,但是没有对特征有区别的学习。所以论文基于它提出L-Softmax,强化特征的类内紧凑和类间疏离。 Softmax loss 1. 定义 Gamma公式展示 Γ(n)=(n−1)!∀n∈N\G

caicai的博客 1763

卷积神经网络系列之softmax,softmax loss和cross entropy的讲解

我们知道卷积神经网络(CNN)在图像领域的应用已经非常广泛了,一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等。虽然现在已经开源了很多深度学习框架(比如MxNet,Caffe等),训练一个模型变得非常简单,但是你对这些层具体是怎么实现的了解吗?你对softmax,softmax loss,cross entropy了解吗?相信很多人不一定清楚。虽然网上的资料很多,但是...

AI之路 18万+

SphereFace: A-Softmax Loss

《SphereFace: Deep Hypersphere Embedding for Face Recognition》 2017,Weiyang Liu et al. A-softmax loss(angular softmax loss) 源码:https://github.com/wy1iu/sphereface 参考:https://blog.youkuaiyun.com/qq_14845119/...

小花生的博客 3681
上一篇: 【mxnet速成】mxnet图像分类从模型自定义到测试
下一篇: 【技术综述】如何Finetune一个小网络到移动端(时空性能分析篇)
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值