机器学习中的各种损失函数解析:若博文有不妥之处,望加以指点,笔者一定及时修正。

文章目录

  • ① 损失函数
    • 1、Softmax Loss
    • 2、交叉熵(Cross Entropy)
    • 3、相对熵(KLD散度、Relative entropy)
    • 3、平方损失函数、均方误差(MSE,Mean Squared Error)
    • 4、均方误差与Softmax Loss的区别
    • 5、平方绝对误差(MAE,Mean Absolute Error)
    • 6、最大均值差异(MMD,Maximum mean discrepancy)
  • ② 参考博客

① 损失函数

损失函数:计算一个样本的误差;
代价函数:整个训练集上所有样本误差的平均;
目标函数:代价函数+正则化项


方差:衡量随机变量或者一组数据的离散程度。方差越大,数据越离散。
标准差:方差的算术平方根,反映组类个体之间的离散程度。


1、Softmax Loss

SoftmaxSoftmaxSoftmax :将特征图扁平化后的输出映射到(0,1)之间,给出每个类的概率。假设最后一层特征图尺度是:5∗5∗10005*5*10005∗5∗1000 。再将这些特征输入给扁平化 为 [NNN X 111] 个向量(这里的 NNN 是 5∗5∗1000=250005*5*1000=250005∗5∗1000=25000)。下面扁平化的 [ NNN X 111] 的向量进入全连接层,全连接层的参数权重是 WWW[TTT X NNN](这里的 TTT 表示分类的类别数),经过全连接层处理就会得到一个 [TTT x 111] 的向量,但是这个向量里面都每个数值的大小都没有限制,或许是无穷大,也有可能是无穷小,均有可能。因此多分类时候,往往在全连接层后面接个 SoftmaxSoftmaxSoftmax 层。这个层的输入是 [TTT x 111] 的向量,输出也是 [TTT x 111] 的向量。但是输出的每个向量都归一化到 [0,1][0,1][0,1] 之间。这里的 SoftmaxSoftmaxSoftmax 输出的向量是该样本属于每一类的概率

SoftmaxSoftmaxSoftmax公式:
Pj=eaj∑k=1TeakP_j=\frac{e^{a_j}}{\sum_{k=1}^{T}{e}^{a_k}}Pj​=∑k=1T​eak​eaj​​
上面公式中的 aja_jaj​ 表示这 [TTT x 111] 个向量中的第 jjj 个值,而下面分母表示所有值的求和。上式成功的把 PjP_jPj​ 归一化到 (0,1)(0,1)(0,1) 之间。优化目标:属于正确标签的预测概率最高。

下面介绍 SoftmaxLossSoftmax \ LossSoftmax Loss:
L=−∑j=1Tyilog⁡pjL=-\sum_{j=1}^{T}{y_i} \ {\log{p_j}}L=−j=1∑T​yi​ logpj​上式中的 pjp_jpj​ 表示 SoftmaxSoftmaxSoftmax 层输出的第 jjj 的概率值。yyy 表示一个 [111 x TTT] 的向量,里面的 TTT 列中只有一个为1,其余为0(真实标签的那个为1,其余不是正确的为0)。这个公式有一个更简单的形式是:
L=−log⁡pjL=-\log p_jL=−logpj​其中的 jjj 是指当前样本的真实标签。logloglog函数是个递增的函数,你预测错的概率会比你预测对的概率要大,因为前面加了一个负号。

所以分类里面常用 SoftmaxLossSoftmax \ LossSoftmax Loss。


2、交叉熵(Cross Entropy)

p(x)p(x)p(x) 为真实分布,根据真实分布 p(x)p(x)p(x) 来衡量识别一个样本的所需要的编码长度的期望(平均编码长度)为:H(p)=∑xp(x)log⁡1p(x)H(p)=\sum_{x}{p(x) \log \frac{1}{p(x)}}H(p)=x∑​p(x)logp(x)1​ 而交叉熵是使用预测的分布来表示来自真实分布的平均编码长度。也就是评估当前训练得到的概率分布与真实分布的差异情况,也就是使用错误分布来表示真实分布的平均编码程度。H(p,q)=−∑xp(x)log⁡21q(x)H(p,q)=-\sum_x{p(x) \log_2 \frac{1}{q(x)} }H(p,q)=−x∑​p(x)log2​q(x)1​其中 p(x)p(x)p(x) 为真实分布,q(x)q(x)q(x) 是模型通过数据计算出来分布的概率。
减少交叉熵损失就是在提高模型的准确率。
预测的分布q(x)q(x)q(x)得到的平均编码长度H(p,q)H(p,q)H(p,q) > 真实分布p(x)p(x)p(x)得到的平均编码长度 H(p)H(p)H(p)。
我们定义:由q(x)q(x)q(x)得到的平均编码长度比由p(x)p(x)p(x)得到的平均编码长度多出的部分称为 相对熵


3、相对熵(KLD散度、Relative entropy)

DKL(p,q)=H(p,q)−H(p)=∑xp(x)log⁡p(x)q(x)D_{KL}(p,q)=H(p,q)-H(p)=\sum_{x}{p(x)} \log\frac{p(x)}{q(x)}DKL​(p,q)=H(p,q)−H(p)=x∑​p(x)logq(x)p(x)​它表示两个函数或者概率分布的差异性:差异性越大则相对熵越大,反之,差异越小,相对熵越小。这个量来衡量近似分布相比原分布究竟损失了多少信息量,而不是两个分布在空间中的远近距离,所以散度不是距离,DKL(p,q)≠DKL(q,p)D_{KL}(p,q) \ne D_{KL}(q,p) DKL​(p,q)̸​=DKL​(q,p)不具有交换性。


3、平方损失函数、均方误差(MSE,Mean Squared Error)

通过对真实值和预测值的差求平方,直接测量输出与输入之间的距离,这就是线性回归的损失函数,常常用于回归中。定义输入为yiy_iyi​,输出为y^i\hat y_iy^​i​。那么平方损失函数定义为:(这边假设最终结果都服从于高斯分布)
L(x)=1N∑i=1N(yi−y^i)2L(x)=\frac{1}{N} \sum_{i=1}^N{ ( y_i - \hat y_i)^2} L(x)=N1​i=1∑N​(yi​−y^​i​)2


4、均方误差与Softmax Loss的区别

均方误差用于多分类的时候,对每一类输出结果都很看重,交叉熵函数只对正确的分类结果看重。使用的一般原则:如果致力于解决的问题是回归问题的连续变量,使用均方误差比较合适;如果是分类问题的离散One−hotOne-hotOne−hot 向量,则交叉熵损失函数较合适。

举个例子,对于一个模型的输出为:(x,y,z)(x,y,z)(x,y,z),真实结果是(0,1,0)(0,1,0)(0,1,0),那么这个损失函数可以描述为:
SoftmaxLoss:LS=−0∗logx−1∗logy−0∗logz=−logySoftmax \ Loss:L_S =-0*logx-1*logy-0*logz=-logySoftmax Loss:LS​=−0∗logx−1∗logy−0∗logz=−logyMSE:LMSE=(x−0)2+(y−1)2+(z−0)2=x2+(y−1)2+z2MSE:L_{MSE}=(x-0)^2 +(y-1)^2+(z-0)^2=x^2+(y-1)^2+z^2 MSE:LMSE​=(x−0)2+(y−1)2+(z−0)2=x2+(y−1)2+z2我们可以看出均方误差只是将正确的分类尽可能大,其余让错误分类变得更加平均。这对回归问题特别重要,对分类作用不大。


5、平方绝对误差(MAE,Mean Absolute Error)

L(x)=1N∑i=1N∣yi−y^i∣L(x)=\frac{1}{N} \sum_{i=1}^N{ |y_i - \hat y_i|} L(x)=N1​i=1∑N​∣yi​−y^​i​∣
绝对损失函数的意义与均方误差差不多,只不过没有取平方,而是取绝对值,差距不会被平方放大。利用均方误差更容易求解,但是平方值误差对于异常值更为稳健。


6、最大均值差异(MMD,Maximum mean discrepancy)

参考链接:https://blog.csdn.net/a529975125/article/details/81176029, 十分推荐!
MMD 是迁移学习,尤其是预适应(domainadaptation)(domain \ adaptation)(domain adaptation)中应用广泛的一种损失函数。主要度量两个不同但相关的分布的距离。这两个分布的距离定义为:
MMD(X,Y)=∣∣1n∑i=1nϕ(xi)−1m∑j=1mϕ(yj)∣∣H2MMD(X,Y)=||\frac{1}{n}\sum_{i=1}^{n}\phi(x_i) - \frac{1}{m}\sum_{j=1}^{m}{\phi(y_j)}||_{H}^2MMD(X,Y)=∣∣n1​i=1∑n​ϕ(xi​)−m1​j=1∑m​ϕ(yj​)∣∣H2​这边的HHH表示这个距离是由 ϕ()\phi()ϕ() 将数据映射到再生希尔伯特空间(RKHS)(RKHS)(RKHS)中进行度量的

为什么要使用MMD

域适应的目的:将源域中学到的知识可以应用到不同但相关的目标域本质和关键上要找到一个变换函数,使变换后的源域数据与目标域数据的距离是最小的。那么如何度量两个域中数据分布差异的问题,因此也用到了 MMD

MMD的理论推导:寻找一个变换函数,但是这个变换函数在不同的任务中都不是固定的。并且这个映射可能是高维空间中的映射,所以很难去选取和定义。 如果这个映射函数 ϕ()\phi()ϕ() 未知,那 MMDMMDMMD 如何求取呢?
将 MMDMMDMMD 展开:
MMD(X,Y)=∣∣1n2∑i,i′nϕ(xi)ϕ(xi′)−2nm∑i,jnϕ(xi)ϕ(yj)+1m2∑j,j′nϕ(yi)ϕ(yi′)∣∣H2MMD(X,Y)=||\frac{1}{n^2}\sum_{i,i^{'}}^{n}{\phi(x_i)\phi(x_{i^{'}})}-\frac{2}{nm}\sum_{i,j}^{n}\phi(x_i)\phi(y_j)+\frac{1}{m^2}\sum_{j,j_{'}}^{n}\phi({y_i})\phi({y_i}^{'})||^2_{H}MMD(X,Y)=∣∣n21​i,i′∑n​ϕ(xi​)ϕ(xi′​)−nm2​i,j∑n​ϕ(xi​)ϕ(yj​)+m21​j,j′​∑n​ϕ(yi​)ϕ(yi​′)∣∣H2​展开后就出现 ϕ(xi)ϕ(xi′)\phi({x_i})\phi({x_i}^{'})ϕ(xi​)ϕ(xi​′)的形式,这里面的 ϕ()\phi()ϕ()就类似于 SVMSVMSVM 的核函数 k(∗)k(*)k(∗),就可以直接跳过 ϕ()\phi()ϕ() 的部分,直接求 k(xi)k(xi′)k({x_i})k({x_i}^{'})k(xi​)k(xi​′)。这里 MMDMMDMMD 又可以表示为:
MMD(X,Y)=∣∣1n2∑i,i′nk(xi)k(xi′)−2nm∑i,jnk(xi)k(yj)+1m2∑j,j′nk(yi)k(yi′)∣∣H2MMD(X,Y)=||\frac{1}{n^2}\sum_{i,i^{'}}^{n}{k(x_i)k(x_i^{'})}-\frac{2}{nm}\sum_{i,j}^{n}k(x_i)k(y_j)+\frac{1}{m^2}\sum_{j,j_{'}}^{n}k({y_i})k({y_i}^{'})||^2_{H}MMD(X,Y)=∣∣n21​i,i′∑n​k(xi​)k(xi′​)−nm2​i,j∑n​k(xi​)k(yj​)+m21​j,j′​∑n​k(yi​)k(yi​′)∣∣H2​
这里的核函数 k(∗)k(*)k(∗) 一般用高斯核函数k(u,v)=e−∣∣u−v∣∣2σk(u,v)=e^{\frac{-||u-v||^2}{\sigma}}k(u,v)=eσ−∣∣u−v∣∣2​,因为使用高斯核函数可以映射到无穷维空间
代码参考:https://blog.csdn.net/zkq_1986/article/details/86747841
我跑编码器实验的时候用的就是这个函数,亲证有效:

import torchdef guassian_kernel(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None):'''将源域数据和目标域数据转化为核矩阵,即上文中的KParams:source: 源域数据(n * len(x))target: 目标域数据(m * len(y))kernel_mul:kernel_num: 取不同高斯核的数量fix_sigma: 不同高斯核的sigma值Return:sum(kernel_val): 多个核矩阵之和'''n_samples = int(source.size()[0])+int(target.size()[0])# 求矩阵的行数,一般source和target的尺度是一样的,这样便于计算total = torch.cat([source, target], dim=0)#将source,target按列方向合并#将total复制(n+m)份total0 = total.unsqueeze(0).expand(int(total.size(0)), int(total.size(0)), int(total.size(1)))#将total的每一行都复制成(n+m)行,即每个数据都扩展成(n+m)份total1 = total.unsqueeze(1).expand(int(total.size(0)), int(total.size(0)), int(total.size(1)))#求任意两个数据之间的和,得到的矩阵中坐标(i,j)代表total中第i行数据和第j行数据之间的l2 distance(i==j时为0)L2_distance = ((total0-total1)**2).sum(2)#调整高斯核函数的sigma值if fix_sigma:bandwidth = fix_sigmaelse:bandwidth = torch.sum(L2_distance.data) / (n_samples**2-n_samples)#以fix_sigma为中值,以kernel_mul为倍数取kernel_num个bandwidth值(比如fix_sigma为1时,得到[0.25,0.5,1,2,4]bandwidth /= kernel_mul ** (kernel_num // 2)bandwidth_list = [bandwidth * (kernel_mul**i) for i in range(kernel_num)]#高斯核函数的数学表达式kernel_val = [torch.exp(-L2_distance / bandwidth_temp) for bandwidth_temp in bandwidth_list]#得到最终的核矩阵return sum(kernel_val)#/len(kernel_val)def mmd_rbf(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None):'''计算源域数据和目标域数据的MMD距离Params:source: 源域数据(n * len(x))target: 目标域数据(m * len(y))kernel_mul:kernel_num: 取不同高斯核的数量fix_sigma: 不同高斯核的sigma值Return:loss: MMD loss'''batch_size = int(source.size()[0])#一般默认为源域和目标域的batchsize相同kernels = guassian_kernel(source, target, kernel_mul=kernel_mul, kernel_num=kernel_num, fix_sigma=fix_sigma)#根据式(3)将核矩阵分成4部分XX = kernels[:batch_size, :batch_size]YY = kernels[batch_size:, batch_size:]XY = kernels[:batch_size, batch_size:]YX = kernels[batch_size:, :batch_size]loss = torch.mean(XX + YY - XY -YX)return loss#因为一般都是n==m,所以L矩阵一般不加入计算

② 参考博客

这几位的博客十分好,隆重推荐!

  1. https://blog.csdn.net/dwenjun/article/details/81914683
  2. https://blog.csdn.net/m_buddy/article/details/80224409
  3. https://blog.csdn.net/zkq_1986/article/details/86747841
  4. https://blog.csdn.net/a529975125/article/details/81176029

机器学习、增量学习中的各种损失函数解析相关推荐

  1. 机器学习--LR逻辑回归与损失函数理解

    损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好.损失函数是经验 ...

  2. Caffe中的损失函数解析

    Caffe中的损失函数解析 导言 在有监督的机器学习中,需要有标签数据,与此同时,也需要有对应的损失函数(Loss Function). 在Caffe中,目前已经实现了一些损失函数,包括最常见的L2损 ...

  3. 一文看懂机器学习中的常用损失函数

    作者丨stephenDC 编辑丨zandy 来源 | 大数据与人工智能(ID: ai-big-data) 导语:损失函数虽然简单,却相当基础,可以看做是机器学习的一个组件.机器学习的其他组件,还包括激 ...

  4. 入门|机器学习中常用的损失函数你知多少?

    本文作者将常用的损失函数分为了两大类:分类和回归.然后又分别对这两类进行了细分和讲解,其中回归中包含了一种不太常见的损失函数:平均偏差误差,可以用来确定模型中存在正偏差还是负偏差. 机器通过损失函数进 ...

  5. 机器学习中的常见问题—损失函数

    机器学习中的常见问题--损失函数 一.分类算法中的损失函数 在分类算法中,损失函数通常可以表示成损失项和正则项的和,即有如下的形式: J(w)=∑iL(mi(w))+λR(w)J(w)=∑iL(mi( ...

  6. 机器学习中的各种损失函数(Hinge loss,交叉熵,softmax)

    机器学习中的各种损失函数 SVM multiclass loss(Hinge loss) 这是一个合页函数,也叫Hinge function,loss 函数反映的是我们对于当前分类结果的不满意程度.在 ...

  7. 机器学习:Leaning without Forgetting -- 增量学习中的抑制遗忘

    传统的机器学习中,训练数据的类别都是固定的,这里也有一个假设,就是测试集也是类别固定的,这也是为什么现在很多模型在人类看来非常白痴的原因,套用一句非常经典的话来说,就是对于一个只见过猫狗的模型来说,那 ...

  8. 机器学习模型中的损失函数loss function

    1. 概述 在机器学习算法中,有一个重要的概念就是损失函数(Loss Function).损失函数的作用就是度量模型的预测值f(x)f\left ( \mathbf{x} \right )f(x)与真 ...

  9. 机器学习中常见的损失函数_机器学习中最常见的损失函数

    机器学习中常见的损失函数 现实世界中的DS (DS IN THE REAL WORLD) In mathematical optimization and decision theory, a los ...

最新文章

  1. php怎么生成前端网页,PHP自动生成前端的表单框架
  2. 56 - I. 数组中数字出现的次数
  3. c++ 随机字符串_第3章 别碰白块(《C和C++游戏趣味编程》配套教学视频)
  4. Ceph:一个新时代的开始
  5. sql-mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION问题解决
  6. python怎么使用-如何使用 Python 开始建立
  7. try catch finally的理解
  8. mysql在官网下载完解压后安装
  9. bt porting
  10. 【路径规划】局部路径规划算法——B样条曲线法(含python实现)
  11. 计算机网络波特率定义,传输速率——比特率和波特率
  12. 《智慧城市 顶层设计指南》解读与指导
  13. 必须知道的python专属骚技巧25例
  14. 关于 ZVT 的后期蜈蚣打发研究
  15. [嵌入式开发模块]SHT30/20 温湿度传感器 驱动模块
  16. 14期《读万卷书,行万里路》4月刊
  17. STM32F4 FPU和DSP库使用
  18. 正睿集训数论专题【8.9】
  19. 回顾去哪儿的这些年,最让我骄傲的是收获了这9点管理心得
  20. 电脑无线共享手机wify上网

热门文章

  1. DateTime的日期转化
  2. android自动获取天气,android通过google api获取天气信息示例
  3. 【paddleocr】发票ocr
  4. AI炒股回报率500%?内行揭秘玄机
  5. CAN总线基础知识(三)
  6. Mysql----复制
  7. python iloc iat_loc() iloc() at() iat()函数
  8. 【Python】收集python2代码转python3遇到的问题
  9. GPS的UTC时间,计算年月日,时分秒
  10. html实现图片在立体,css3实现图片立体化缩放