(深度学习快速入门)第三章第三节2:深度学习必备组件之损失函数和激活函数

news2024/11/16 23:51:35

文章目录

  • 一:损失函数
    • (1)均方误差损失(MSE)
    • (2)交叉熵损失(Cross Entropy)
  • 二:激活函数
    • (1)tanh
    • (2)ReLU
    • (3)Leaky ReLU
    • (4)mish
    • Pytorch中的写法

一:损失函数

损失函数(loss function):深度学习中所有算法的目标都是为了最小化或最大化一个函数,称之为损失函数或者是目标函数、代价函数,损失函数是衡量模型的效果苹果

在深度学习中损失函数可以分为如下两类

  • 回归损失:适用于回归问题,典型代表是均方误差(MSE)
  • 分类损失:适用于分类问题,典型代表是交叉熵损失(Cross Entropy)

(1)均方误差损失(MSE)

均方误差损失(MSE):均方误差适用于回归问题,计算的是预测值和真实值之间的欧氏距离,预测值和真实值之间越接近,均方误差就越小。MSE公式如下

M S E = 1 N ( y ︿ − y ) 2 MSE=\frac{1}{N}(\mathop{y}\limits^{︿}-y)^{2} MSE=N1(y︿y)2

  • N N N:样本个数
  • y ︿ \mathop{y}\limits^{︿} y︿:样本真实值
  • y y y:样本预测值

MSE在Pytorch中有实现,用法如下

loss_fn = torch.nn.MSELoss(reduction='sum')
loss = loss_fn(pred, y) / pred.size(0)

其实现如下

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)
#其结果和上面一样

(2)交叉熵损失(Cross Entropy)

  • 交叉熵属于信息论中的内容,想要了解什么是交叉熵,必须先要了解信息量、信息熵和相对熵(KL 散度)等概念,一一介绍如下

信息量 信息奠基人Shannon认为“信息是用来消除随机不确定性的东西”,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度

  • “太阳从东边升起”:这条信息并没有减少不确定性,因为太阳肯定是从东边升起的,这是一句废话,信息量为0
  • 2026年中国队成功进入世界杯:首先,因为中国队进入世界杯的不确定性因素很大,而这句话消除了进入世界杯的不确定性,所以这句话的信息量非常大

所以,信息量的大小与信息发生的概率成反比,概率越大,信息量越小。概率越小,信息量越大。故设某一事件发生的概率为 P ( X ) P(X) P(X),则其信息量可表示为 I ( X ) = − l o g ( P ( x ) ) I(X)=-log(P(x)) I(X)=log(P(x))


信息熵 用于表示所有信息量的期望,所以信息熵可以表示为 H ( X ) = − ∑ i = 1 n P ( x i ) l o g ( P ( x i ) ) H(X)=-\sum\limits_{i=1}^{n}P(x_{i})log(P(x_{i})) H(X)=i=1nP(xi)log(P(xi)) X = x 1 , x 2 , . . . , x n X=x{1},x_{2},...,x_{n} X=x1,x2,...,xn


相对熵(KL散度) 如果对于同一个随机变量 X X X有两个单独的概率分布 P ( X ) P(X) P(X) Q ( X ) Q(X) Q(X),则我们可以使用相对熵来衡量这两个概率分布之间的差异,即 D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) q ( x i ) D_{KL}(p||q)=\sum\limits_{i=1}^{n}p(x_{i})log(\frac{p(x_{i})}{q(x_{i}}) DKL(p∣∣q)=i=1np(xi)log(q(xip(xi))

在机器学习、深度学习中,常常使用 P ( X ) P(X) P(X) Q ( X ) Q(X) Q(X)分别代表样本的真实分布和模型的预测分布,例如对于一个三分类任务,一张图片的真实分布为 P ( X ) = [ 1 , 0 , 0 ] P(X)=[1, 0 , 0] P(X)=[1,0,0],预测分布为 Q ( X ) = [ 0.7 , 0.2 , 0.1 ] Q(X)=[0.7, 0.2, 0.1] Q(X)=[0.7,0.2,0.1],则KL散度计算为0.36.所以KL散度越小表示 P ( X ) P(X) P(X) Q ( X ) Q(X) Q(X)的分布更加接近,因此可以反复训练 Q ( X ) Q(X) Q(X)来使得 Q ( x ) Q(x) Q(x)分布逼近 P ( X ) P(X) P(X)


交叉熵 将KL散度公式拆开后可发现,交叉熵=KL散度+信息熵

在这里插入图片描述

H ( p , q ) = − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) H(p, q)=-\sum\limits_{i=1}^{n}p(x_{i})log(q(x_{i})) H(p,q)=i=1np(xi)log(q(xi)),在训练网络时,由于输入数据和标签常常已确定,所以真实概率分布 P ( X ) P(X) P(X)就确定下来了,因此信息熵是一个常量,而交叉熵公式明显要比KL散度容易计算,所以我们直接最小化交叉熵来代替最小化KL散度作为损失函数

二:激活函数

激活函数:可以将非线性特性引入神经网络中。如下图神经元中,输入的inputs通过加权求和后还被作用了一个函数,这个函数就是激活函数

在这里插入图片描述
为什么需要激活函数?如果不使用激活函数,那么每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这样做就没有意义了。

  • 没有激活函数:每一层都相当于是一个矩阵相乘,那么即便你叠加了n多层,无非还是矩阵相乘罢了

使用激活函数后,就会给神经元引入非线性因素,这使得神经网络可以任意逼近任何非线性函数(通用近似定理),这样神经网络就可以应用到众多非线性模型中

常用激活函数介绍如下,可分为如下两类

  • 饱和激活函数sigmoidtanh

    • 非饱和激活函数相对于饱和激活函数来讲可以解决梯度消失问题,而且它能加快收敛速度
  • 非饱和激活函数ReLULeaky ReLUELUPReLURReLU

这里只介绍一下比较有名和重要的激活函数,如果需要了解其他激活函数可跳转至下面这篇文章

  • 机器学习中的数学——激活函数:基础知识

在这里插入图片描述
在这里插入图片描述

(1)tanh

tanh:也即双曲正切函数,等于双曲余弦除以双曲正弦,它是一个奇函数。它相较于sigmoid函数提高了其收敛速度,但是仍然会导致梯度消失和梯度爆炸问题

t a n h ( x ) = s i n h ( x ) c o s h ( x ) = e x − e − x e x + e − x tanh(x)=\frac{sinh(x)}{cosh(x)}=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanh(x)=cosh(x)sinh(x)=ex+exexex

在这里插入图片描述

(2)ReLU

ReLU:也即修正线性单元,这是目前深度学习中最为常用的激活函数,是一种“万金油”式的激活函数。如下图,ReLU提供了一种非常简单的非线性变换,给定元素 x x x,ReLU函数被定义为该元素与0的最大值

R e L U ( x ) = m a x ( x , 0 ) ReLU(x)=max(x, 0) ReLU(x)=max(x,0)

ReLU函数通过将相应的活性值设为0,仅保留正元素并且丢弃所有负元素

在这里插入图片描述

ReLU函数优点在于:其求导表现很好,要么让参数消失,要么让参数通过,所以在使用梯度下降法时收敛速度更快

在这里插入图片描述

(3)Leaky ReLU

Leaky ReLU:与ReLU相比,Leaky ReLU给所有负值赋予一个非零斜率leaky是一个很小的数 a i a_{i} ai,这样就保留了一些负轴的值,使得负轴的信息不回全部丢失

在这里插入图片描述

(4)mish

mish:这是20左右新提出来的一个激活函数,经验证,该函数精确度要比ReLU高1.671%,所以很多时候我们也会选择它作为激活函数,其公式为

m i s h ( x ) = x ∗ t a n h ( s o f t p l u s ( x ) ) mish(x) = x *tanh(softplus(x)) mish(x)=xtanh(softplus(x))

  • s o f t p l u s ( x ) = 1 β ∗ l o g ( 1 + e β x ) softplus(x)=\frac{1}{\beta}*log(1+e^{\beta x}) softplus(x)=β1log(1+eβx):Softplus可以看作是Relu平滑版本

Mish激活函数无边界(即正值可以达到任何高度)避免了由于封顶而导致的饱和。理论上对负值的轻微允许更好的梯度流,而不是像ReLU中那样的硬零边界、同时,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化

在这里插入图片描述

Pytorch中的写法

import torch
import torch.nn.functional as AF
import warnings
warnings.filterwarnings("ignore")

# 定义一个线性层
layer = torch.nn.Linear(in_features=16, out_features=5)
X = torch.randn(size=(8, 16))
pred = layer(X)
print(pred.size())

###   激活函数不会改变输入数据维度   ###

# sigmoid激活函数
sigmoid = AF.sigmoid(pred)
print(pred.size())

# ReLU激活函数
ReLU = AF.relu(pred)
print(pred.size())

# leaky ReLU激活函数
leay_ReLU = AF.leaky_relu(pred)
print(pred.size())

# mish激活函数
leay_ReLU = AF.mish(pred)
print(pred.size())

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot数据响应与内容协商

目录 数据响应与内容协商 1、响应JSON 1.1、jackson.jarResponseBody 1.2、SpringMVC到底支持哪些返回值 2、内容协商 1、引入xml依赖 2、postman分别测试返回json和xml 3、开启浏览器参数方式内容协商功能 数据响应与内容协商 1、响应JSON 1.1、jackson.jarResponseBo…

区块链北大肖老师学习笔记6

第七节 比特币的挖矿难度调整 H(block header) < target 目标(target)预值越小&#xff0c;挖矿的难度越大。调整挖矿的难度就是调整目标空间在整个输出空间中所占的比例。 比特币用的哈希算法是SHA-256&#xff0c;这个产生的哈希值是256位。所以整个输出空间是2的256次…

[JavaEE]synchronized 与 死锁

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1.synchronized 的特性 2. synchronized 使用示例:…

new做了什么

function structure (name, age) {this.name namethis.age age}// 给构造函数--prototype加上一个方法structure.prototype.sayName function () {console.log(this.name, 调用打印);return this.name}structure.one 5const person new structure(张龙, 188)// 打印构造函…

【基础算法】前缀和 与 差分

前缀和 用来求解一段区间&#xff08;一维&#xff09;的总和 或者一块矩形区域&#xff08;二维&#xff09;的总和 一维前缀和 原数组a[N]&#xff0c;前缀和数组s[N]// ---读入数组a[N] // ---// 处理前缀和数组 s[N] s[0] 0; //定义在全局变量&#xff0c;不用写这一句 f…

SOA 和微服务有何区别?

玩过 Dubbo 的小伙伴应该都有听说过一个概念叫做 SOA&#xff0c;每当我们说起微服务的时候&#xff0c;很多人就会去纠结这和 SOA 有啥关系呀&#xff1f;感觉换汤不换药呀。 今天松哥来稍微和小伙伴们讨论下这个话题&#xff0c;我们一起来看看 SOA 和微服务到底有何异同。 …

c语言进阶(3)——指针进阶笔试题详解

1.指针和数组笔试题解析 关键&#xff1a;数组名在两种情况下是指整个数组&#xff1a; &#xff08;1&#xff09;sizeof&#xff08;数组名&#xff09;&#xff08;2&#xff09;&数组名 其它的情况下&#xff0c;都是代表数组的首元素地址。 例题 1 &#xff1a;一维…

【算法面试】算法在面试中考察的是什么(金三银四面试专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/Liunx内核/C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1f4…

Kafka消息中间件

Kafka消息中间件 同时市场上也发展处ActiveMq、RabbitMQ、Kafka、RocketMQ、Pulsar等众多优秀的框架&#xff1b;在大数据领域中Kafka目前是使用较多的框架。Kafka作为内部消息通知的框架&#xff0c;可以适应项目中大数据量的高吞吐、实时流计算等功能实现。 分布式消息中间…

【自学C++】C++整型

C整型 C整型教程 C 的整型用来存放整数 类型 的数字&#xff0c;即不可以带小数&#xff0c;C 整型可以分为短整型 short&#xff0c;整型 int&#xff0c;长整型 long 和 long long 类型。 C整型取值范围 数据类型取值范围字节数short-32768 ~ 327672int-2147483648 ~ 214…

小米万兆路由器里的Docker安装drawio

小米2022年12月份发布了万兆路由器&#xff0c;里面可以使用Docker。 今天尝试在小米的万兆路由器里安装drawio 20.8.3。 准备工作 请参考https://engchina.blog.csdn.net/article/details/128515422的准备工作。 查看Docker Hub镜像信息 访问https://hub.docker.com/r/jgr…

axios系列之并发

文章の目录一、axios.all(iterable)二、axios.spread(callback)写在最后处理并发请求的助手函数 一、axios.all(iterable) function a() {return axios.get("http://localhost/a"); } function b() {return axios.get("http://localhost/b"); }axios.all…

【Linux 进程控制】进程创建、进程终止、进程等待、进程替换

1.进程创建&#xff08;fork&#xff09;#include<iostream> #include<unistd.h> using std::cout; using std::endl;int main() {if(fork()0){cout<<"child:"<<"I am child"<<endl;}else{cout<<"parent:"&…

用555定时器接成的施密特触发器电路/滞回电压比较器中,用什么方法能调节回差电压的大小?包含工作原理与应用

一、简答:电源电压或外接控制电压改变时&#xff0c;可以改变回差电压的大小。二、施密特触发器电路工作原理&#xff1a;滞回电压比较器&#xff0c;又名施密特触发器&#xff0c;有两个稳定状态&#xff0c;与一般触发器不同的是&#xff0c;施密特触发器采用电位触发方式&am…

【免杀】通用shellcode原理及思路——FS段寄存器获取kernel32.dll基址逻辑、根据函数名进行查找逻辑、双指针循环遍历获取函数名称

通用shellcode通用shellcode思路FS段寄存器获取kernel32.dll基址逻辑根据函数名进行查找逻辑双指针循环遍历获取函数字符串总结通用shellcode思路 1、保存相关字符串 user32.dll、LoadLibraryA、GetProcAddress、MessageBoxA、hello 51hook 2、通过fs寄存器获取kernel32.dll…

8.Isaac教程--在Kaya上运行IsaacSDK

在Kaya上运行IsaacSDK 构建自己的 NVIDIA Kaya 机器人后&#xff0c;请按照本页中的步骤在其上运行一些示例应用程序。 文章目录在Kaya上运行IsaacSDK安装和设置操纵杆应用程序跟随我的应用程序物体检测应用地图应用安装和设置 在 Kaya 上运行应用程序之前完成这些先决条件步…

Jenkins+Git+Maven自动化部署配置

JenkinsGitMaven自动化部署配置基本思路1、jenkins安装maven依赖2、git安装3、Jenkins中新建任务3.1 git配置3.2 maven配置3.3 pom.xml配置3.4 build4、自动化发布到测试服务器并自动执行(Test-server)4.1 安装Publish Over SSH插件4.2 修改Post Steps配置4.3 执行构建5、小插曲…

实战6 :基于mmdetection搭建Faster R-CNN实现酒液杂质检测

项目介绍: 本教程讲述如何解决依赖运动变化来区分目标的目标检测问题。以酒液杂质目标检测为例,讲述如何合理利用运动的酒液图像来设计算法进行杂质的检测。通过学习掌握依赖运动变化区分目标的检测任务的解决方法。首先我们对酒液杂质检验任务做了简要介绍。接下来再对数据…

【C进阶】qsort函数详解

qsort函数前言qsort函数&#xff08;一&#xff09;引例&#xff1a;简单的冒泡排序&#xff08;二&#xff09;qsort函数接收1.介绍2.void*&#xff08;三&#xff09;使用1.用qsort实现一个比较整型的函数2.用qsort实现一个比较结构体的函数3.用qsort实现一个比较浮点型的函数…

试读:目标检测定义及技术详解

1.通用目标检测Generic Object Detection定义 目标检测旨在从图像、视频或者类似高维数据中定位大量预定义类别的物体实例&#xff0c;原始的图像、视频或类似数据经过数据预处理后&#xff0c;进入目标检测模型进行前向预测&#xff0c;最终得到数据中每个实例的位置以及该实…