深度学习 (DeepLearning) 基础 [2]---神经网络常用的损失函数


Introduce

在上一篇“深度学习 (DeepLearning) 基础 [1]---监督学习和无监督学习”中我们介绍了监督学习和无监督学习相关概念。本文主要介绍神经网络常用的损失函数。

以下均为个人学习笔记,若有错误望指出。


神经网络常用的损失函数

pytorch损失函数封装在torch.nn中。

损失函数反映了模型预测输出与真实值的区别,模型训练的过程即让损失函数不断减小,最终得到可以拟合预测训练样本的模型。

note:由于PyTorch神经网络模型训练过程中每次传入一个mini-batch的数据,因此pytorch内置损失函数的计算出来的结果如果没有指定reduction参数,则默认对mini-batch取平均

以下对几个常用的损失函数以及其应用场景做一个简单总结。(以下损失函数的公式均代表单个min-batch的损失,且假设x为神经网络的预测输出,y为样本的真实值,xi为一个mini-batch中第i个样本的预测输出,yi同理,n为一个批量mini-batch的大小

  • nn.L1Loss(L1损失,也称平均绝对误差MAE):计算模型输出x与目标y之间差的绝对值。常用于回归任务。

\[loss(x,y) = {1\over n}\sum|x_i-y_i|
\]

'''代码示例'''
loss_func = torch.nn.L1Loss(reduction='mean')
'''note:
reduction=None 啥也不干
reduction='mean' 返回loss和的平均值
reduction='mean' 返回loss的和。
不指定即默认mean。
'''
  • nn.MSELoss(L2损失,也称均方误差MSE):计算模型输出x与目标y之间差的平方的均值,均方差。常用于回归任务。

\[loss(x,y) = {1\over n}\sum(x_i-y_i)^2
\]

'''代码示例'''
loss_func = torch.nn.MSELoss(reduction='mean')
# note: reduction同上。
  • nn.BCELoss(二进制交叉熵损失):计算模型输出x与目标y之间的交叉熵。(我对于交叉熵的理解,交叉熵为相对熵(即KL散度,用来衡量两个分布的差异程度)中的一项,最小化两个分布的差异,即最小化相对熵,由相对熵公式,由于真实分布是确定的,那么最小化相对熵就是最小化交叉熵,而最小化交叉熵的目标就是寻找一个预测分布尽可能逼近真实分布,这和我们模型的训练目标是一致的,即让模型预测逼近样本真实值,参考链接)常用于二分类任务。

\[loss(x,y) = {1\over n}\sum-w_i[y_i*logx_i + (1-y_i)*log(1-x_i)]
\]

'''代码示例'''
loss_func = torch.nn.BCELoss(weight=None, reduction='mean')
# note:
# weight为长度为n的tensor,用来指定一个batch中各样本占有的权重,如公式中的wi,不指定默认为各样本权重均为1。
# reduction同上。 # 用的时候需要在该层前面加上 Sigmoid 函数。
  • nn.NLLLoss(负对数似然损失):将神经网络输出的隶属各个类的概率向量x与对应真实标签向量(个人理解应该是one-hot向量吧)相差再相加,最后再取负。如果不取负的话,应该是loss值越大预测标签越接近真实标签,取负的话反过来,越小则越接近真实标签,符合loss函数的定义。常用于多分类任务。 以下公式假设节点xi属于第j类,x[j]为预测的x属于第j类的概率,且w[j]为第j类的权重

\[loss(x,class) = {1\over n}\sum -w[j]*x[j]
\]

'''代码示例'''
loss_func = torch.nn.NLLLoss(weight=None, reduction='mean')
# note:
# weight同上,如公式中的w代表各个类在损失中占有的权重,即类的重要程度,若不赋予权重w,则各类同等重要,上述公式中的w[class]去掉。
# reduction同上。
  • nn.CrossEntropyLoss (交叉熵损失):如上述二进制交叉熵所示,随着预测的概率分布越来越接近实际标签,交叉熵会逐渐减小。pytorch将nn.LogSoftmax()和nn.NLLLoss()组合到nn.CrossEntropyLoss(),即调用nn.CrossEntropyLoss() 底层会调用上述两个函数,可以理解为 CrossEntropyLoss = LogSoftmax + NLLLoss。因此一般多分类任务都常用交叉熵损失。 以下label_i代表节点xi的真实标签,c为总的标签数。

\[loss(x,class) = {1 \over n}\sum-w[label_i]log{exp(x_i[label_i])\over \sum_{j=1}^cexp(x[j])} = {1 \over n}\sum w[label_i](-x_i[label_i]+log(\sum_{j=1}^c)exp(x[j]))
\]

'''代码示例'''
loss_func = torch.nn.CrossEntropyLoss(weight=None,reduction='mean') # note:
# weight同nn.NLLLoss。
# reduction同上。

本文参考-1

本文参考-2

Pytorch_第六篇_深度学习 (DeepLearning) 基础 [2]---神经网络常用的损失函数的更多相关文章

  1. Pytorch_第七篇_深度学习 (DeepLearning) 基础 [3]---梯度下降

    深度学习 (DeepLearning) 基础 [3]---梯度下降法 Introduce 在上一篇"深度学习 (DeepLearning) 基础 [2]---神经网络常用的损失函数" ...

  2. Pytorch_第八篇_深度学习 (DeepLearning) 基础 [4]---欠拟合、过拟合与正则化

    深度学习 (DeepLearning) 基础 [4]---欠拟合.过拟合与正则化 Introduce 在上一篇"深度学习 (DeepLearning) 基础 [3]---梯度下降法" ...

  3. Pytorch_第五篇_深度学习 (DeepLearning) 基础 [1]---监督学习与无监督学习

    深度学习 (DeepLearning) 基础 [1]---监督学习与无监督学习 Introduce 学习了Pytorch基础之后,在利用Pytorch搭建各种神经网络模型解决问题之前,我们需要了解深度 ...

  4. Pytorch_第十篇_卷积神经网络(CNN)概述

    卷积神经网络(CNN)概述 Introduce 卷积神经网络(convolutional neural networks),简称CNN.卷积神经网络相比于人工神经网络而言更适合于图像识别.语音识别等任 ...

  5. Coursera深度学习(DeepLearning.ai)编程题&笔记

    因为是Jupyter Notebook的形式,所以不方便在博客中展示,具体可在我的github上查看. 第一章 Neural Network & DeepLearning week2 Logi ...

  6. (zhuan) 126 篇殿堂级深度学习论文分类整理 从入门到应用

    126 篇殿堂级深度学习论文分类整理 从入门到应用 | 干货 雷锋网 作者: 三川 2017-03-02 18:40:00 查看源网址 阅读数:66 如果你有非常大的决心从事深度学习,又不想在这一行打 ...

  7. 2020年深度学习DeepLearning技术实战班

    深度学习DeepLearning核心技术实战2020年01月03日-06日 北京一.深度学习基础和基本思想二.深度学习基本框架结构 1,Tensorflow2,Caffe3,PyTorch4,MXNe ...

  8. 深度学习DeepLearning核心技术理论与实践

    深度学习DeepLearning核心技术开发与应用时间地点:2019年11月01日-04日(北京) 联系人杨老师  电话(同微信)17777853361

  9. 2020年12月18号--21号 人工智能(深度学习DeepLearning)python、TensorFlow技术实战

    深度学习DeepLearning(Python)实战培训班 时间地点: 2020 年 12 月 18 日-2020 年 12 月 21日 (第一天报到 授课三天:提前环境部署 电脑测试) 一.培训方式 ...

随机推荐

  1. day17 装饰器(上)

    目录 一.什么是装饰器 二.为什么要有装饰器 三.无参装饰器的使用 一.什么是装饰器 装饰:是对其他已有的事物添加额外具有一定意义的事物 器:是一种工具,在程序内可以定义成函数 合到一起就是: ​ 装 ...

  2. __FILE__和__DIR__的用法

    dirname(__FILE__)由两部分组成, __FILE__ 魔术变量和 dirname() 函数.__FILE__是当前脚本的绝对路径,通过 dirname() 函数后,就可以获得脚本所在目录 ...

  3. requests接口自动化8-传递数据为xml形式的post请求:data

    传递数据为xml形式的post请求 请求体内容: <?xml version=“1.0” encoding = “UTF-8”?> <COM> <REQ name=&qu ...

  4. python数据处理(八)之展示数据

    1.前言 1.1.不要擅自假定要讲的故事和数据是一致的,要先研究数据,然后讲述数据研究所得 1.2.讲故事是成为领域专家的重要部分. 1.3.将故事方法: a. 确定想要讲的故事 b.无论选择什么方式 ...

  5. unity-热更-InjectFix(一)

    1 C#热更新预备知识 1.1 mono.cecil注入 使用Mono.Cecil实现IL代码注入 注入之后修改dll,新增mdb文件: 注意,待了解参数注释打开会报错: 1.2 InjectFix ...

  6. 从零搭建Spring Cloud Gateway网关(三)——报文结构转换

    背景 作为网关,有些时候可能报文的结构并不符合前端或者某些服务的需求,或者因为某些原因,其他服务修改报文结构特别麻烦.或者需要修改的地方特别多,这个时候就需要走网关单独转换一次. 实现 话不多说,直接 ...

  7. Go Pentester - HTTP Servers(2)

    Routing with the gorilla/mux Package A powerful HTTP router and URL matcher for building Go web serv ...

  8. Nginx/Httpd负载均衡tomcat配置

    在前一篇博客中我们聊了下用Nginx和httpd对后端tomcat服务做反代相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13334180.html: ...

  9. humlbe bundle如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 humlbe bundle如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器? 二次验证码小程序于谷歌身份验证器APP的 ...

  10. ASP.NET WebAPI2复杂请求跨域设置

    ASP.Net Core的跨域设置比较简单  官方都整合了 具体的参见微软官方文档: https://docs.microsoft.com/zh-cn/aspnet/core/security/cor ...