这里写目录标题

  • 概念
    • Loss Function
    • Cost Function
    • Objective Function
  • 正则化
  • 损失函数
    • 交叉熵损失函数nn.CrossEntropyLoss()
      • 自信息
      • 熵(信息熵)
      • 相对熵(KL散度)
      • 交叉熵
        • 二分类
        • 多分类
        • 学习过程
        • 同MSE(Mean Squared Error)相比的优势
        • 工程实现中的问题与措施
        • softmax的缺点
        • PyTorch中 CEloss应用
      • PyTorch中的其他损失函数
        • nn.BCELoss
        • nn.BCEWithLogitsLoss

概念

Loss Function

计算一个样本的损失:

Cost Function

整个训练集(或者batch)的损失平均值

Objective Function

目标函数是一个更广泛的概念,在机器学习中,目标函数包含Cost和Regularization(正则项):

  • 正则化:惩罚较大的参数,参数的值越小,通常对应于越光滑的函数,也就是更加简单的函数。因此 就不易发生过拟合的问题。
  • 常用的有L1正则化和L2正则化
  • L1更适用于更适用于特征选择;L2更适用于防止模型过拟合
  • 更多细节参考 正则化的描述

正则化

方差的概念参考:方差

正则化策略的目的就是降低方差,减小过拟合的发生。

常用的手段有:L1正则化、L2正则化、Dropout、提前终止(早停)、数据扩增。
正则化这个话题比较大,待开一篇文章专门描述。

损失函数

交叉熵损失函数nn.CrossEntropyLoss()

  • 交叉熵损失函数常常用于分类任务
  • 交叉熵是衡量两个概率分布之间的差异。所以交叉熵值越低表示两个分布越近

自信息

自信息用于衡量单个事件的不确定性,其公式为:

熵(信息熵)

熵指的是信息熵,是自信息的期望。用来描述一个事件的不确定性,一个事件越不确定熵越大。熵是整个概率分布的不确定性,用来描述整个概率分布

伯努利分布的信息熵:

当事件的概率为0.5(如抛硬币)时,其信息熵最大,这也表示事件的不确定性最大,其熵最大值为0.69;如事件“明天太阳从东方生气”(概率极大),其信息熵比较小

相对熵(KL散度)

相对熵也称为KL散度,相对熵用于衡量两个分布之间的差异,也就是两个分布之间的距离,虽然相对熵可以计算两个分布之间的距离,但是相对熵不是一个距离函数,因为距离函数具有对称性,对称性指的是P到Q的距离等于Q到P的距离,但是相对熵不具备距离函数的对称性。

交叉熵

交叉熵、KL散度、信息熵的关系:
公式中的P是真实的概率分布,也就是训练集中样本的分布,Q是模型输出的分布,因为训练集是固定的,所以H ( P ) 是一个常数,所以交叉熵在优化的时候是优化相对熵。
下面看两个交叉熵具体计算的例子:
参考交叉熵损失函数

二分类

多分类

学习过程

交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数。此外,由于交叉熵计算中需要输入属于某一类的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。
我们用神经网络最后一层输出的情况,来看一眼整个模型预测、获得损失和学习的流程:

  • 神经网络最后一层得到每个类别的得分scores
  • 该得分经过sigmoid(或softmax)函数获得概率输出
  • 模型预测的类别概率输出与真实类别的one hot形式进行交叉熵损失函数的计算。

同MSE(Mean Squared Error)相比的优势

首先来看sigmoid+MSE的缺点:

  • 一句话总结:分类问题中,使用sigmoid/softmx得到概率,配合MSE损失函数时,采用梯度下降法进行学习时,会出现模型一开始训练时,学习速率非常慢的情况
  • 具体来说,在sigmoid层的的输入较大或者较小时,激活函数输出接近于1或者0,导致Loss相对于W的梯度接近0,学习困难。

sigmoid+ CELoss的优点

如公式所示,Loss关于最后一层的w梯度中,si表示sigmoid的输入,yi为label,xi为sigmoid之前的全连接层的输入。
xi -> 全链接层 -> si -> sigmoid层 -> CEloss层。
公式表明,当激活函数层的输出同label差异较大时,L关于w的梯度会较大,从而快速学习。[同生活中“因为明显的犯错可以快速地学习到正确的东西”比较一致]

工程实现中的问题与措施

  • softmax自身导致的数值问题
  • Softmax loss = softmax和交叉熵(cross-entropy loss)loss组合而成。
  • 所以全称是softmax with cross-entropy loss。
  • 在caffe,tensorflow等开源框架的实现中,直接将两者放在一个层中,而不是分开不同层,可以让数值计算更加稳定,因为正指数概率可能会有非常大的值
  • 参考 softmax数值稳定性 softmax数值稳定性2

softmax的缺点

前面说到,softmax一般配合CEloss一起使用。但是softmax这个操作具体什么含义呢。

  • softmax与hardmax

在CNN的分类问题中,我们的ground truth是one-hot形式,下面以四分类为例,理想输出应该是(1,0,0,0),或者说(100%,0%,0%,0%),这就是我们想让CNN学到的终极目标。
网络输出的幅值千差万别,输出最大的那一路对应的就是我们需要的分类结果。通常用百分比形式计算分类置信度,最简单的方式就是计算输出占比,这种最直接最最普通的方式,相对于soft的max,在这里我们把它叫做hard的max。

而现在通用的是soft的max,将每个输出x非线性放大到exp(x)

这样做有什么区别呢,看下面的例子:

相同输出特征情况,soft max比hard max更容易达到终极目标one-hot形式,或者说,softmax降低了训练难度,使得多分类问题更容易收敛。同时Softmax鼓励真实目标类别输出比其他类别要大,但并不要求大很多。对于人脸识别的特征映射(feature embedding)来说,Softmax鼓励不同类别的特征分开,但并不鼓励特征分离很多,如上表(5,1,1,1)时loss就已经很小了,此时CNN接近收敛梯度不再下降。

  • Softmax训练的深度特征,会把整个超空间或者超球,按照分类个数进行划分,保证类别是可分的,这一点对多分类任务如MNIST和ImageNet非常合适,因为测试类别必定在训练类别中。封闭集任务有效
  • Softmax并不要求类内紧凑和类间分离,这一点非常不适合人脸识别任务,因为训练集的1W人数,相对测试集整个世界70亿人类来说,非常微不足道,而我们不可能拿到所有人的训练样本,更过分的是,一般我们还要求训练集和测试集不重叠。
  • 所以需要改造Softmax,除了保证可分性外,还要做到特征向量类内尽可能紧凑,类间尽可能分离,常见的有L-softmax等

PyTorch中 CEloss应用

PyTorch中 CrossEntropyLoss 等价于 LogSoftmax + NLLLoss

CrossEntropyLoss 等价于 LogSoftmax + NLLLoss

PyTorch中的其他损失函数

nn.BCELoss

功能:二分类交叉熵;

nn.BCEWithLogitsLoss

BCEWithLogitsLoss就是把Sigmoid-BCELoss合成一步

更多loss参考PyTorch中更多loss说明

PyTorch 入坑十一: 损失函数、正则化----深刻剖析softmax+CrossEntropyLoss相关推荐

  1. PyTorch 入坑七:模块与nn.Module学习

    PyTorch 入坑七 模型创建概述 PyTorch中的模块 torch模块 torch.Tensor模块 torch.sparse模块 torch.cuda模块 torch.nn模块 torch.n ...

  2. PyTorch入坑(一)~(三): Tensor的概念,基本操作和线性回归

    PyTorch 一文入门 PyTorch 入坑一:数据类型与Tensor的概念 PyTorch数据类型 Tensor的概念 Tensor与Variable Variable Tensor Tensor ...

  3. PyTorch 入坑四 梯度、链式法则、计算图与反向传播

    PyTorch 一文入门 PyTorch 入坑四:计算图与反向传播 导数.梯度与最优化 方向导数与梯度 最优化 复合函数求梯度 计算图 PyTorch实战 PyTorch中的动态图机制 PyTorch ...

  4. PyTorch 入坑五 autograd与逻辑回归

    torch.autograd 深度学习模型的训练就是不断更新权值,权值的更新需要求解梯度,梯度在模型训练中是至关重要的.       然而求解梯度十分繁琐,pytorch提供自动求导系统.我们不需要手 ...

  5. PyTorch 入坑九:权重初始化

    这里写目录标题 Pytorch提供的十种权值初始化方法 为什么要进行权重初始化设计:从梯度消失与爆炸说起 常用的几种权重初始化方法 不考虑激活函数 饱和型激活函数 xavier_uniform方法 非 ...

  6. PyTorch 入坑八:卷积与转置卷积

    卷积 操作 略 输入输出尺寸变化 略 PyTorch实现 nn.Conv2d(in_channels,out_channels,kernel_size,stride=1.padding=0,dilat ...

  7. PyTorch 入坑六 数据处理模块Dataloader、Dataset、Transforms

    深度学习中的数据处理概述 深度学习三要素:数据.算力和算法 在工程实践中,数据的重要性越来越引起人们的关注.在数据科学界流传着一种说法,"数据决定了模型的上限,算法决定了模型的下限" ...

  8. 微信小程序入坑教程二十一:使用wx.saveImageToPhotosAlbum保存图片时通过检测scope.writePhotosAlbum权限来提醒用户是否需要授权

    摘要: 在昨天的文章<微信小程序入坑教程二十:生成海报前使用wx.downloadFile或wx.getImageInfo时潜在的坑>中提到了用户授权一事,scope.writePhoto ...

  9. 传奇工程师卡马克入坑 AI:徒手一周实现反向传播和 CNN

    约翰 · 卡马克是何方神圣? 谁是约翰 · 卡马克? 他是一位集传奇工程师.大神.疯狂程序员.黑客之神.第一人称射击游戏之父.业界活化石.一代玄学码神所有称号为一身的老牌程序员,一举一动都牵动人心. ...

最新文章

  1. 九宫格抽奖转盘源码分析
  2. android html 换行_Android中Strings资源加空格,换行符,@等方法示例
  3. 闪电网络介绍以及试用 (上)
  4. boost::container模块实现检查相等的容器的测试程序
  5. Linux:ubuntu设置交换分区
  6. 表格外粗内细怎么设置_金游艇复刻机芯-N厂灰游艇价格 | 复刻表评测
  7. 容器编排技术 -- Kubernetes 声明网络策略
  8. 数组实例的entries(),keys() 和 values()方法
  9. php root权限执行命令,如何使用PHP执行需要root权限的系统命令
  10. Javascript jquery css 写的简单进度条控件
  11. java future模式 所线程实现异步调用
  12. 常用工具下载及在线地址
  13. paip.互联网产品要成功的要素
  14. 直播源列表转换php,电视直播源列表制作、转换工具Telelist(可以DPL、M3U、TXT等互转)...
  15. 演讲者模式投影到幕布也看到备注_PPT制作技巧:如何实现ppt放映不同界面(演讲者模式)?...
  16. 百度世界大会全新打开方式!VR会场“希壤”上线
  17. 【Android】Instant Run原理解析
  18. 关于运行项目时 vue-pdf 插件依赖报错的问题及解决办法
  19. 运维工程师是桥的护栏_运维工程师职务说明书
  20. 多尺度R-CNN(2): Inside-Outside Net: Detecting Objects in Context with Skip Pooling and Recurrent Neural

热门文章

  1. Unity3D基础28:Invoke计时函数与碰撞销毁
  2. bzoj 1647: [Usaco2007 Open]Fliptile 翻格子游戏(枚举)
  3. pytorch 中网络参数 weight bias 初始化方法
  4. [Python] 字典 items()方法:同时对字典的键和值进行遍历
  5. matlab2c使用c++实现matlab函数系列教程-poisspdf函数
  6. [原创]游戏合服时如何避免主键冲突
  7. win10 安装msys2 和 ruby
  8. Mac 10.12安装数据库管理工具MySQL Workbench
  9. 在 Azure Web 应用中创建 PHP 应用程序
  10. shell(九)几个字符转换命令