深度学习中的所有学习算法都必须有一个 最小化或最大化一个函数,称之为损失函数(loss function),或“目标函数”、“代价函数”。损失函数是衡量模型的效果评估。比如:求解一个函数最小点最常用的方法是梯度下降法:梯度下降详解

(比如:全批量梯度下降 Batch GD、随机梯度下降 SGD、小批量梯度下降 mini-batch GD、Adagrad法,Adadelta法、Adam法等)。损失函数就像起伏的山,梯度下降就像从山上滑下来到达最底部的点。

显然,不存在一个损失函数可以适用于所有的任务。损失函数的选择需要取决于很多因素,其中包括异常值的处理、深度学习算法的选择、梯度下降的时间效率等。本文的目的介绍损失函数,以及它们的基本原理。

损失函数(Loss_function):

在前面的学习中我们学习过机器学习模型(分类、回归、聚类,降维):机器学习基本模型介绍,在深度学习中:损失函数严格上可分为两类:分类损失回归损失,其中分类损失根据类别数量又可分为二分类损失多分类损失。在使用的时候需要注意的是:回归函数预测数量,分类函数预测标签。

1、均方差损失(MSE)

均方差 Mean Squared Error (MSE) 损失是机器学习、深度学习回归任务中最常用的一种损失函数。从直觉上理解均方差损失,这个损失函数的最小值为 0(当预测等于真实值时),最大值为无穷大。MSE就是计算预测值和真实值之间的欧式距离。预测值和真实值越接近,两者的均方差就越小,均方差函数常用于线性回归(linear regression),即函数拟合(function fitting)。

均方差损失函数是预测数据和原始数据对应点误差的平方和的均值,公式为:

N:样本个数,:样本真实值,y为输出值

MSE代码实现:

import torch.nn as nn
import torch
import random
#MSE损失参数
# loss_fun=nn.MSELoss(size_average=None, reduce=None, reduction='mean')
input=torch.randn(10)#定义输出(随机的1,10的数组)可以理解为概率分布
#tensor([-0.0712,  1.9697,  1.4352, -1.3250, -1.1089, -0.5237,  0.2443, -0.8244,0.2344,  2.0047])
print(input)
target= torch.zeros(10)#定义标签
target[random.randrange(10)]=1#one-hot编码
#tensor([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.])
print(target)
loss_fun= nn.MSELoss()
output = loss_fun(input, target)#输出,标签
print(output)#loss:tensor(0.8843)#=============不用nn.MSELoss实现均方差===================
result=(input-target)**2
result =sum(result)/len(result)#求和之后求平均
print(result)#tensor(0.8843)
#其结果和上面一样

注意:若多分类任务中要使用均方差作为损失函数,需要将标签转换成one-hot编码形式:one-hot编码,这与交叉熵损失函数恰巧相反。均方差不宜和sigmoid函数一起使用(sigmoid函数有一个特点,那就是横坐标越远离坐标原点,导数越接近于0,当输出越接近1时导数越小,最终会造成梯度消失。)

2、交叉熵损失(Cross Entropy)

关于交叉熵损失函数的来厉和介绍我在这篇文章里有详细阐述:深度学习入门理解——从概率和信息的角度(数学篇后记)

我们现在可以这样它理解:在机器学习中,使用KL散度就可以评价真实标签与预测标签间的差异,但由于KL散度的第一项是个定值,故在优化过程中只关注交叉熵就可以了。一般大多数机器学习算法会选择交叉熵作为损失函数。

根据交叉熵的公式:

代表真实标签,在真实标签中,除了对应类别其它类别的概率都为0,所以可以简写为:

这里的代表标签(label)

Cross Entropy代码实现:

#交叉熵
import torch.nn as nn
nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
import torch
import torch.nn as nn
# #假设batch size为4,待分类标签有3个,隐藏层的输出为:
input = torch.tensor([[ 0.8082,  1.3686, -0.6107],#1[ 1.2787,  0.1579,  0.6178],#0[-0.6033, -1.1306,  0.0672],#2[-0.7814,  0.1185, -0.2945]])#取1
target = torch.tensor([1,0,2,1])#假设标签值(不是one-hot编码,直接代表类别)
loss = nn.CrossEntropyLoss()#定义交叉熵损失函数(自带softmax输出函数)
output = loss(input, target)
print(output)#tensor(0.6172)#======不用 nn.CrossEntropyLoss(),解释其计算方法======
net_out=nn.Softmax(dim=1)(input)#input前面已经定义
print(net_out)
out= torch.log(net_out)#对每个size(每行求log)
"""
tensor([[-1.0964, -0.5360, -2.5153],[-0.6111, -1.7319, -1.2720],[-1.2657, -1.7930, -0.5952],[-1.6266, -0.7267, -1.1397]])
"""
print(out)
#根据公式求和
out=torch.max(out,dim=1)#我们默认取每个size的输出最大值为类别
print(out)
"""
torch.return_types.max(
values=tensor([-0.5360, -0.6111, -0.5952, -0.7267]),
indices=tensor([1, 0, 2, 1]))
"""
#tages=(1,0,2,2),这里的输出out就是每一个size(样本)的交叉熵损失
#别忘了除以batch size(4),我们最后求得的是整个batch(批次,一批次4个样本)的平均loss
#out求和再除以size(4)————————求平均
out_Input=-torch.mean(out.values)#这里求平均时只取max输出的values
print(out_Input)#tensor(0.6172)

注意:除了torch.nn.CrosEntropyLoss()函数外还有一个计算交叉熵的函数torch.nn.BCELoss(),与前者不同,该函数是用来计算二项分布(0-1分布)的交叉熵(含sigmiod输出函数)。

总结:

由于本人现阶段能力有限,没办法对这两个函数进行细致的比较,也没有了解更多的损失函数,还望见谅,后面通过学习,我会慢慢完善。

总的来说MSE要得到一个线性的梯度,必须输出不经过激活函数才行。这样的情况只有线性回归,所以SE较适合做回归问题,而CE更适合做分类问题,在分类问题中,CE都能得到线性的梯度,能有效的防止梯度的消失;MSE作为分类问题的loss时,由于激活函数求导的影响,造成连续乘以小于1大于0的数造成梯度的消失,同时也使得error曲面变的崎岖,更慢的到的局部最优值。

深度学习之——损失函数(loss)相关推荐

  1. 深度学习之损失函数小结

    深度学习之损失函数小结 开篇 损失函数在深度学习中的作用相当于引领模型学习的方式,其重要程度不言而喻: 下图为一些损失函数的关系: Sigmoid和Softmax损失 Sigmoid公式:S(x)=1 ...

  2. 多分类svm的hinge loss公式推导_损失函数—深度学习常见损失函数总结【图像分类|下】...

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 学习 笔记 常见损失函数总结-图像分类下篇 一.前言 在深度学习中,损失函数扮演着至关重要的角色.通过最小化损失函数,使模型达到收敛状态,减少模 ...

  3. 深度学习常用损失函数总览:基本形式、原理、特点

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:王桂波,来源:极市平台 机器学习中的监督学习本质上是给定一系列训练 ...

  4. 六个深度学习常用损失函数总览:基本形式、原理、特点

    来源:极市平台 本文共4500字,建议阅读8分钟本文将介绍机器学习.深度学习中分类与回归常用的几种损失函数. 机器学习中的监督学习本质上是给定一系列训练样本  ,尝试学习  的映射关系,使得给定一个  ...

  5. display函数怎么使用_损失函数—深度学习常见损失函数总结【图像分类|上】

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 学习 笔记 常见损失函数总结-图像分类篇[上] 一.前言在深度学习中,损失函数扮演着至关重要的角色.通过最小化损失函数,使模型达到收敛状态,减少 ...

  6. 【深度学习】损失函数详解

    损失函数 什么是损失函数? 损失函数的分类 回归损失 L1 Loss L2 Loss Smooth L1 Loss IoU Loss IoU Loss vs Lx Loss GIoU Loss DIo ...

  7. 深度学习常见损失函数总结+Pytroch实现

    文章目录 一.引言 二.损失函数 1.均方差损失(Mean Squared Error Loss) 2.平均绝对误差损失(Mean Absolute Error Loss) 3.交叉熵(Cross E ...

  8. 《深度学习笔记》——loss函数的学习笔记

    1 loss的作用 在南溪看来,loss函数是对目标target和预测prediction之间的一种距离度量的公式: 2 loss函数的设计原则 此设计原则参考了距离的定义,(注意:距离跟范数是两个概 ...

  9. 深度学习基础-损失函数详解

    一,损失函数概述 大多数深度学习算法都会涉及某种形式的优化,所谓优化指的是改变 x x x 以最小化或最大化某个函数 f ( x ) f(x) f(x

最新文章

  1. 组原,汇编语言关于代码段的定义
  2. 特别推荐:RHCE考试经验
  3. cURL error 60: SSL certificate problem: unable to get local issuer certifica 解决
  4. 生物化学与分子生物学分析技术 Analytical Techniques in Biochemistry and Molecular Biology 英文原版
  5. TED演讲——人生的12条法则
  6. sql数据库实例(c#查询登录界面)
  7. Cocos2d-x VS. OGEngine,联盟与部落的战争
  8. nginx mime.types php,使用重写和有效的mime类型配置NGINX的正确方法
  9. Python使用Scrapy爬虫框架爬取天涯社区小说“大宗师”全文
  10. Docker组队学习(三)
  11. Java System.getProperty()
  12. codeforces:ProblemMset
  13. Android内存泄漏分析实战
  14. 创建一个新数组并指定数组的长度
  15. geetest极验空间推理验证码破解与研究
  16. FIT2CLOUD获网宿科技战略投资 深度聚焦混合云管理价值交付
  17. 微信公众号开发文档,微信小程序开发文档,微信扫码支付文档,微信委托代扣模式开发文档
  18. html中<img src=““ alt=““>标签里面alt的作用
  19. Cousera吴恩达机器学习week8笔记
  20. PTA Huffman树及其应用题

热门文章

  1. solrj java_【solr】java整合solr5.0之solrj的使用
  2. L1-008 求整数段和(Python3)
  3. linux 数据库备份
  4. Flutter 动画转场欢迎屏 concentric_transition
  5. NI lookout组态软件编程详解(一)
  6. KVM 虚拟化管理平台 VManagePlatform
  7. 清理win7系统闲置服务器,教你还原win7系统WICleanup清理Windows Installer冗余文件的方案...
  8. voltDB 集群 配置
  9. python布尔类型怎么使用_python 布尔类型 - 刘江的python教程
  10. 洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery dijkstra 最短路