一文道尽softmax loss及其变种

2023-05-16

1 softmax loss

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

这里我们将其数学推导一起回顾一遍。

令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的改进,下面一一道来。

2 weighted softmax loss【1】

假如有一个二分类问题,两类的样本数目差距非常之大。比如图像任务中的边缘检测问题,它可以看作是一个逐像素的分类问题。此时两类的样本数目差距非常之大,明显边缘像素的重要性是比非边缘像素大的,此时可以针对性的对样本进行加权。

 

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

当然,这个权重,我们还可以动态地计算让其自适应。比如每一张图中,按照像素的比例进行加权。

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

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

何提出的Focal loss【10】其实就是加权log loss的一个变种,它的定义如下

 

上面式子对正负样本进行了分开的表达,f(x)就是属于标签1的概率。

focal loss是针对类别不均衡问题提出的,它可以通过减少易分类样本的权重,使得模型在训练时更专注于难分类的样本,其中就是通过调制系数  来实现。

对于类别1的样本,当f(x)越大,则调制项因为此时基于该样本是一个容易样本的假设,所以给予其更小的loss贡献权重。通过 [公式] 的设置,可以获得自适应地对难易样本进行学习的能力。

3 soft softmax loss【2】

首先我们看下面的式子。

 

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

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

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

4 Large-Margin Softmax Loss【3】

 

softmax loss擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。文【3】中提出了Large-Margin Softmax Loss,简称为L-Softmax loss。

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

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

 

由于 [公式] 是全连接层的输出,所以它可以写成  的形式,将内积更具体的表现出来,就是  。

我们看二分类的情况,对于属于第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来共同实现,可参考代码。

5 angular softmax loss【4】

在人脸分类任务中,如果在large margin softmax loss的基础上添加了限制条件||W||=1和b=0,使得预测仅取决于W和x之间的角度θ,则得到了angular softmax loss,简称A-softmax loss。

 

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

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

6 L2-constrained softmax loss【5】与NormFace【6】

在A-softmax中,对权重进行了归一化的约束,那么,特征是否也可以做归一化的约束呢?作者观测到好的正面的脸,特征的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层,作者还计算出了该值的下界,具体可自行参考。特征归一化后,人脸识别计算特征向量的相似度时,不管使用L2距离还是使用cos距离,都是等价的,计算量也相同,所以再也不用纠结到底用L2距离还会用cos距离。权值和特征归一化使得CNN更加集中在优化夹角上,得到的深度人脸特征更加分离。

7 large margin cosine margin【7】

与L-softmax loss和A-softmax loss不同,CosineFace直接在余弦空间中最大化分类界限,定义如下;

 

cosine loss中,特征和权值都被归一化。关于cosine loss的解释,在于它相比soft Max loss,L-softmax loss等,更加明确地约束了角度,使得特征更加具有可区分度。

8 additive margin softmax loss【8】 additive angular margin loss【9】

定义如下

 

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

 

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

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

我们看一个公式如下

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

additive angular margin loss【9】则是与AM-softmax loss极其相似的另外一个形式,只是将m的减号换成了加号。

定义如下:

 

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

 

到此可以说为了改进softmax loss用尽了手段了,至于有没有用,具体效果大家去尝试吧,附上未完整的GitHub链接。先写到这里,后续再充实实验结果和更多原理。

longpeng2008/Caffe_Long​github.com图标

【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 H, Wang Y, Zhou Z, et al. CosFace: Large margin cosine loss for deep face recognition[J]. arXiv preprint arXiv:1801.09414, 2018.

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

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

【10】Lin T Y, Goyal P, Girshick R, et al. Focal loss for dense object detection[J]. IEEE transactions on pattern analysis and machine intelligence, 2018.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文道尽softmax loss及其变种 的相关文章

  • Ubuntu 磁盘分区方法

    Ubuntu作为代码版本控制仓库时 xff0c 那么就需要很大的空间 xff0c 默认20G配置一般是不够用的 xff0c 那Ubuntu怎么样和Windows一样做磁盘管理 xff0c 分盘扩容呢 xff1f 很简单 xff0c 可以安装
  • git push 遇见的两个错误

    文章目录 more than 10000 commits and skip validation not setprohibited by Gerrit update for creating new commit object not p
  • TGP无限验证码怎么办?

    使用账号密码登陆TGP时 xff0c 遇到了这样的一个情况 xff1a 不管验证码输入正确与否 xff0c 它都要求你再次输入 xff0c 可谓无限验证码 两个解决办法 1 先登录QQ xff0c 再使用QQ登陆 2 找到英雄联盟的安装目录
  • 怎么阅读论文,写心得体会

    收集资料 xff1a 阅读学术论文的心得体会 xff01 如何阅读学术论文 和上一篇类似大牛写论文的心得几年的写论文和审稿心得 文献阅读心得体会格式 xff1a 1 看论文题目 xff0c 做出论文类别判别 新理论 新方法 解决新问题 最高
  • tigerVNC的简单使用教程(CentOS的远程桌面连接)[解决Authentication Failure问题]

    参照教程 http blog csdn net daydreamingboy article details 8196747 开始连接CentOS远程桌面连接 但是出现Authentication Failure的情况 解决办法 xff1a
  • 基于docker的python faster-rcnn caffe环境搭建+提取目标特征实验

    文章目录 1 环境配置前言2 下载caffe镜像3 下载bottom up attention代码以及编译4 修改代码进行目标特征提取4 1 数据准备4 2 修改generate tsv py 起初是为了使用faster rcnn的目标提取
  • Tushare原学习文档(二投资参考数据)

    转tushare原网址 xff1a http tushare org trading html id2 import tushare as ts 1 分配预案 xff08 每到季报 年报公布的时段 xff0c 就经常会有上市公司利润分配预案
  • 通达OA系统故障解决案例记录

    案例1 xff1a 现象 xff1a 在人员访问量大的时候OA系统经卡死 xff0c 并且经常宕机 xff0c 需要启动apache服务 优化配置如下 xff1a D MYOA conf http conf 修改参数如下 xff1a lt
  • CentOS7系统安装KVM并配置网桥

    原文链接 CentOS7系统安装KVM并配置网桥 文章目录 一 安装虚拟化软件二 配置网桥 一 安装虚拟化软件 xff08 1 xff09 首先检查系统是否支持虚拟化 span class token function grep span
  • openEuler安装GNOME图形化桌面

    原文链接 openEuler安装GNOME图形化桌面 xff08 1 xff09 安装 GNOME 桌面 dnf groupinstall y GNOME xff08 2 xff09 安装 GNOME 应用 dnf span class t
  • Ubuntu----Ubuntu系统如何设置分辨率供VNC远程访问

    原文链接 Ubuntu Ubuntu系统如何设置分辨率供VNC远程访问 xff08 1 xff09 通过VMWare安装的Ubuntu虚拟机 xff0c 当通过VNC访问时 xff0c 默认情况下分辨率是不对的 xff0c 比如当VNCVi
  • 3D打印gcode命令大全及解析

    G0 xff1a 快速移动 G1 xff1a 控制移动 坐标轴XYZE移动控制 xff08 G0和G1一样 xff09 例子 xff1a G0 F2000 X30 Y30 Z30 E3 G2 xff1a 顺时针画弧 G3 xff1a 逆时针
  • 添加VNC开机启动

    1 添加开机启动文件 sudo nano etc init d tightvncserver 2 添加文件内容 bin sh BEGIN INIT INFO Provides tightvncserver Required Start sy
  • 以太网链路聚合&交换机堆叠集群

    随笔一篇 xff0c 以便日后翻阅 xff0c 如有问题欢迎指正 目录 前言 链路聚合技术原理一 基本原理二 基本术语及概念1 聚合组2 成员接口 amp 成员链路3 活动接口 amp 活动链路4 非活动接口 amp 非活动链路5 聚合模式
  • C#使用Setting保存用户自定义窗体位置

    1 首先引用原文 C 中使用Setting保存用户自定义窗体位置 C 中使用Setting保存用户自定义窗体位置 2008 11 06 步骤一 xff1a 打开项目属性窗口 xff0c 切换到设置 Settings 标签 xff0c 如下图
  • Keil5点击编译正常,烧录和调试直接闪退

    我在WIN11的环境下 xff0c 安装了目前ST官网上最新的MDK538 xff0c 刚刚下载好的前两天一切正常 xff01 但是就在刚刚出现了Keil编译正常 xff0c 使用正点原子的STLink烧录器下载却直接给我闪退 xff0c
  • Shell变量 —— 变量的赋值与引用

    Shell 变量的赋值与引用 变量用于存储数据由字母 数字或下划线组成 xff0c 并且只能以字母或下划线开头 xff0c 大小写的意义是不同的弱类型的语言 xff0c 变量存储的一切值都是字符串 到那时必要的时候 xff0c 是要是由数值
  • 利用USRP探索软件无线电(3)

    1 引言 上一篇描述了利用GQRX查看频谱和记录信号文件的过程 xff0c 本篇将实际录制和分析AM和FM信号 AM和FM虽然历史悠久 xff0c 且均为简单的模拟调制信号 xff0c 但是生命力很强 xff0c 目前仍有很多业务在使用 常
  • Linux安装配置FTP(pure-ftpd)

    1 默认的yum源没有提供pure ftpd xff0c 所以需要先安装epel release扩展源 然后使用yum命令安装pure ftpd yum span class token function install span epel
  • Linux文件检测和坏道检测(fsck、badblocks)

    文章目录 一 文件系统检测fsck二 磁盘坏道检测badblocks 一 文件系统检测fsck 命令功能fsck t dev sda1指定文件系统格式 xff0c 现在linux系统可以自动识别文件系统 xff0c 通常不需要此参数 fsc

随机推荐

  • VMware安装Centos8系统(中文图形化模式)

    文章目录 一 软件 系统镜像二 创建虚拟机三 安装CentOS8四 登录系统五 配置固定IP便于远程管理 一 软件 系统镜像 软件 xff1a VMware 14 镜像 xff1a CentOS8 镜像官网下载地址 xff1a http m
  • centos7系统kdump.service启动失败的解决方法

    1 查看系统启动的服务状态 systemctl list units type span class token operator 61 span service 2 编辑 etc default grub 文件 xff0c 修改crash
  • Linux磁盘故障和文件系统修复(救援模式Centos7、Centos8)

    文章目录 问题一 xff1a 文件系统分区变成只读文件系统 xff0c 无法写入新文件 新数据 问题二 xff1a 在Linux运行过程中 xff0c 有时会因为误操作导致磁盘故障 xff0c 系统无法启动 Linux救援模式 问题一 xf
  • linux安装最新版docker(centos7、centos8)

    文章目录 一 安装docker二 安装Docker镜像加速站三 下载docker镜像 xff08 以centos为例 xff09 xff0c 创建centos容器 xff0c 查看运行容器的IP四 容器设置固定的IP地址五 一款Docker
  • Linux安装最新版Nginx,配置解析php(centos7)

    文章目录 Nginx介绍一 安装编译工具及库文件二 安装PCRE xff0c 作用是让Nginx支持Rewrite功能三 安装Nginx四 测试Nginx五 Nginx常用命令六 安装PHP xff0c 配置nginx解析php Nginx
  • yum安装软件,提示没有可用的软件包解决方法(Centos 7、Centos8)

    文章目录 一 问题描述 xff08 以nginx为例 xff09 二 解决的方法 xff1a 安装epel release软件包三 EPEL简介 一 问题描述 xff08 以nginx为例 xff09 Centos 7下安装nginx xf
  • linux安装zabbix4,添加监测客户机(centos7)(一)

    文章目录 一 linux系统配置二 yum安装zabbix server三 配置zabbinx server四 登陆zabbix server xff0c 设置中文语言五 被监控客户端部署zabbix agent六 添加被监测客户机 软件版
  • linux安装使用git(centos7、centos8)

    文章目录 一 Git简介二 安装Git三 Git全局配置四 创建Git本地仓库五 Git版本回退 一 Git简介 Git是分布式版本控制系统 xff0c svn是集中式 集中式VS分布式 xff1a 集中式版本控制系统 xff0c 版本库集
  • 搜索和下载英文文献常用的网站

    最近导师要求对我们的研究课题进行一个综述整理以及ppt展示 xff0c 中文文献可以到知网上去查找 xff0c 不过知网上的外国文献基本上都很滞后 xff0c 无法拿来作为参考 xff0c 所以就滋生了对于国外期刊和会议论文的需求 搜索以下
  • zabbix监控方式(agent)(二)

    一 zabbix agent方式 xff08 被动模式 xff09 1 被动模式工作流程 xff1a zabbix server打开一个tcp连接 xff1b zabbix server放送一个key为agent ping n的请求 xff
  • MakBookAir系统(macOS Mojave10.14.2)安装双系统方法(win10)

    掉过的坑 1 W官网下载的64位ISO镜像内 xff0c 镜像解压后包含的单个文件大于4G xff0c 当使用BootCamp助理写入U盘时 xff08 U盘会被格式成FAT32 xff0c 不支持大于4G的单个文件拷贝 xff09 xff
  • SUMO文档016:XML文件验证

    XMLValidation xff08 XML验证 xff09 1 XML输入的验证 所有的SUMO应用程序都支持对输入的XML验证 为了实现功能 xff0c 以下的选项可以使用 xff1a Option Description X lt
  • SUMO应用工具:SUMO-GUI

    1 概览 sumo gui和sumo有着相同的功能 xff0c 仅仅是拥有图形化的界面 目的 xff1a 仿真一个特定的脚本 系统 xff1a 在Linux windows上测试过 xff0c 打开一个窗口 输入 xff1a sumo的配置
  • SUMO应用工具:DUAROUTER

    DUAROUTER 作者注 xff1a 原文链接 xff1a http sumo dlr de wiki DUAROUTER 1 简介 DAUrouter导入不同的需求定义 xff0c sumo计算车辆的路径得到最短的计算路径 当调用DUA
  • SUMO文档补充:OSMWebWizard

    Tutorials OSMWebWizard 原文地址 xff1a http sumo dlr de wiki Tutorials OSMWebWizard 1 简介 OSM Web Wizard 是开始sumo最简单的方式 可以选取区域进
  • SUMO文档:有关需求建模(Demand Modelling)

    Demand Introduction to demand modelling in SUMO 在生成了路网后 xff0c 我们可以在sumo gui上查看 xff0c 但是路网上并没有车辆运行 我们还需要一些有关车辆的描述 我们称之为 交
  • SUMO文档028:来源于观测点的路径

    Demand Routes from Observation Points 原文链接 xff1a http sumo dlr de wiki Demand Routes from Observation Points 自从0 9 5开始 x
  • 深度学习框架下群组行为识别算法综述

    源自 xff1a 电子学报 作者 xff1a 邓海刚 王传旭 李成伟 林晓萌 摘 要 群组行为识别目前是计算机视觉领域的一个研究热点 xff0c 在智能安防监控 社会角色理解和体育运动视频分析等方面具有广泛的应用价值 本文主要针对基于深度学
  • pci和pcie的区别

    原文地址 xff1a https blog csdn net u013253075 article details 80835489 最近在学习驱动开发过程中涉及到PCI相关知识 xff0c 在网上看了很多文章 xff0c 良莠不齐 xff
  • 一文道尽softmax loss及其变种

    1 softmax loss softmax loss是我们最熟悉的loss之一 xff0c 在图像分类和分割任务中都被广泛使用 Softmax loss是由softmax和交叉熵 cross entropy loss loss组合而成 x