自定义神经网络三之梯度和损失函数激活函数

文章目录

    • 前言
    • 梯度概述
      • 梯度下降算法
        • 梯度下降的过程
      • optimize优化器
    • 梯度问题
      • 梯度消失
      • 梯度爆炸
    • 损失函数
      • 常用的损失函数
      • 损失函数使用原则
    • 激活函数
      • 激活函数和损失函数的区别
      • 激活函数Relu-隐藏层
      • 激活函数Sigmoid和Tanh-隐藏层
        • Sigmoid函数
        • Tanh(双曲正切)
      • <br />softmax激活函数-输出层
    • 总结

前言

自定义神经网络一之Tensor和神经网络
自定义神经网络二之模型训练推理

我们在模型篇介绍了模型的基础概念以及训练和推理的过程。在模型训练部分有提到几个概念,例如:

  1. 参数更新:利用优化算法(如梯度下降算法)根据梯度信息对模型参数进行更新。
  2. 损失函数: 将模型预测的结果与真实标签进行比较,计算模型的误差。
  3. 激活函数: 每个神经元接收到输入后对其加权求和,然后传递给激活函数,根据激活函数的结果确定神经元的输出。

那么梯度是什么意思呢?梯度下降又是什么意思?常见的梯度问题有哪些? 损失函数是什么意思?损失函数和激活函数的区别是什么呢?

梯度概述

梯度的方向是函数在某一点变化最快的方向。也就是说,如果你站在一座山上,梯度的方向是指向山坡最陡峭(上升最快)的方向。如果你需要找到函数的最大值,那你应该朝着梯度的方向前进,因为这样能使函数值最快地上升。

梯度下降算法

神经网络的两种数字运算。前向传播是指预测给定输入向量的输出的计算过程,而反向传播和梯度下降描述的是改进网络的权重和偏差以做出更好预测的过程。

梯度下降是一种常用的优化算法,其目标是找到某个函数的最小值。在机器学习和深度学习中,这个函数通常是损失函数,即模型预测的输出值和实际值之间的差异度量。
在深度学习中,我们通常希望找到损失函数的最小值,也就是我们希望找到山谷而不是山顶。因此,我们需要朝着梯度的反方向,也就是下山的方向前进。这就是为什么这种方法叫做"梯度下降",我们是在"下降",向着梯度的反方向移动。
对于机器学习或深度学习模型,参数就是你的位置,损失函数就如同山的高度。你希望找到能使损失最小的参数。具体地,你会计算损失函数对每个参数的梯度,然后将参数向梯度的反方向更新一小步。这个步长,也叫做学习率,是需要手动设置的。
通过重复这个过程多次,参数将会接近到使损失函数值最小的位置。这就是为什么梯度下降可以被用来最小化模型预测的输出值和实际值之间的差异,也就是损失函数的值。

梯度下降的过程

具体的操作过程是这样的:
第一步,先前向传播:首先,网络会进行前向传播操作,从输入层开始,依次通过每一层,最后到达输出层并生成预测值。在这个过程中,每一层的输入都是上一层的输出。

第二步,计算损失:当网络生成了预测值后,就可以计算出预测值与真实值之间的差异,也就是损失函数的值。

第三步,反向传播误差:这是反向传播的关键步骤。开始于输出层,计算损失函数对每一层的参数(权重和偏置)的梯度。这一步通常通过链式法则完成。

第四步,更新参数:一旦计算出了每个参数的梯度,就可以使用这些梯度来更新参数。更新的方式通常是:新的参数值 = 原来的参数值 - 学习率 * 梯度。这个过程就是梯度下降的过程。
这个过程会反复进行,每进行一次,网络的预测值就会更接近真实值,损失函数的值就会更小。直到达到设定的迭代次数,或者损失函数的值已经足够小,训练过程就会结束。

optimize优化器

神经网络的目标是找到一组权重参数,可以使损失函数的值最小。这就是一个优化问题,在这个问题中,损失函数就是我们需要最小化的目标函数。
然而,手动寻找这样一组参数是很困难的,因为参数的数量通常非常大,且权重参数与损失函数之间的关系非常复杂。因此,我们需要借助优化器自动进行这一过程。

优化器的工作原理是,首先,计算损失函数相对于每个参数的梯度,也就是每个参数变动一点点,损失函数会变化多少。然后,根据这个梯度,进行一次优化步骤,也就是更新参数的值。具体的更新策略会由所选择的优化器决定。

例如,SGD(随机梯度下降)优化器会直接减去学习率乘以梯度的结果来更新参数。这样,如果损失函数对某个参数的梯度为正,那么参数的值就会减小,使得损失函数值降低。反之,如果梯度为负,那么参数的值就会增大。
有很多种优化器,比如SGD、Adam、RMSprop等等,它们都有自己的特点和不同的更新策略。选择哪一种优化器,会依情况而定,它依赖于具体的问题和数据。
通过迭代更新,优化器能够帮助我们找到损失函数最小的权重参数,使得神经网络的预测结果尽可能接近真实值,从而完成神经网络的训练过程。

梯度问题

梯度消失

在神经网络的训练过程中,更新权重依赖于误差反向传播的梯度。然而,某些情况下,梯度可能会变得非常小,以至于权重几乎不会有太大的变化,这就是所谓的‘梯度消失’。这个问题常常出现在深度神经网络中,特别是在使用sigmoid或者tanh等激活函数的情况下,因为这些函数的梯度在接近0或1时会非常接近于0。

解决梯度消失问题的策略:

  • 更改激活函数:使用ReLU(Rectified Linear Unit)及其变体(例如Leaky ReLU,PReLU),它们在正值上没有梯度限制,可以缓解梯度消失的问题。
  • 使用批量归一化(Batch Normalization):这种技术可以调整每一层的输出,使其保持适当的分布,可以一定程度上防止梯度消失。
  • 使用LSTM或GRU等门控循环单元:对于循环神经网络,可以使用LSTM或GRU等门控循环单元,它们设计了专门的机制来捕捉长期依赖,对抗梯度消失的问题。

梯度爆炸

梯度爆炸是指在反向传播过程中,梯度变得非常大,以至于更新的权重过大,导致网络难以收敛。这种现象常见于深度网络和递归神经网络(RNN)。

解决梯度爆炸问题的策略:

  • 梯度裁剪(Gradient Clipping):这是一种常见的处理梯度爆炸的策略。当梯度超过某个阈值时,会将其限制在该阈值之内。
  • 权重初始化方法:适当的权重初始化方法可以防止梯度在反向传播过程中变得过大或过小。
  • 使用批量归一化(Batch Normalization):正如上面所述,它也可以帮助缓解梯度爆炸的问题。
  • 使用更小的学习率:如果梯度爆炸导致训练不稳定,可能需要减小学习率。

损失函数

损失函数(Loss Function)是用于度量机器学习模型预测的结果和真实值之间差距的函数。训练机器学习模型的过程,就是让损失函数尽可能小的过程。损失函数的选择会直接影响到模型训练的效果。

常用的损失函数

  1. 均方误差(Mean Squared Error,MSE):它是最常见的回归损失函数,计算方法为预测值与真实值之差的平方和的均值。MSE对于大的误差值具有很高的惩罚程度,因为差值会被平方。

    1. MSE(均方误差): 预测值与实际值之差平方的期望值。取值越小,模型准确度越高。
    2. RMSE(均方根误差):为MSE的平方根,取值越小,模型准确度越高。
    3. MAE(平均绝对误差): 绝对误差的平均值,能反映预测值误差的实际情况。取值越小,模型准确度越高
    4. MAPE(平均绝对百分比误差): 是 MAE 的变形,它是一个百分比值。取值越小,模型准确度越高。
  2. 交叉熵损失(Cross-Entropy Loss):这是处理分类问题最常用的损失函数。在二分类问题中,它的形式与logistic回归的损失函数相同。对于多分类问题,它经常配合Softmax函数使用。

  3. Hinge损失(Hinge Loss):这是支持向量机(SVM)中使用的损失函数。如果样本被完全正确分类,且预测结果落在“边界”内,则损失为0;否则,损失为样本到“边界”的距离。

  4. Huber损失(Huber Loss):它是均方误差和绝对值误差的折中产物。对于较小的误差,它的行为类似于MSE,对于较大的误差,它的行为则类似于MAE(Mean Absolute Error)。在实践中,Huber损失对于噪声(异常值)具有很强的鲁棒性。

  5. 对数损失(Log Loss):对数损失也叫做逻辑损失或交叉熵损失,是二分类问题中最常用的损失函数之一。

  6. CTC(Connectionist Temporal Classification):CTC损失函数用于序列任务,如语音识别或手写识别,其中输入的序列长度与输出的序列长度可能不匹配。

损失函数使用原则

1、损失函数衡量神经网络模型在执行特定任务时的好坏程度。为了使神经网络更好,我们必须在反向传播步骤中最小化损失函数的值。
2、当使用神经网络预测概率时,只在分类任务中使用交叉熵损失函数
3、对于回归任务,想让网络预测连续数时,就必须使用均方误差损失函数。
4、我们在需求预测期间使用平均绝对百分比误差损失函数来关注网络在训练期间的性能。

激活函数

激活函数和损失函数的区别

  1. 损失函数(Loss Function) ,也叫成本函数,主要用来衡量模型预测结果和真实结果之间的差距。模型训练的目的就是要通过优化算法(如梯度下降)使得损失函数的值尽可能的小。常见的损失函数有均方误差(MSE),交叉熵(Cross Entropy)等。
  2. 激活函数(Activation Function) 是用来给神经元添加一些非线性因素,使得神经网络可以逼近任何复杂函数,提高神经网络模型的表达能力。通常来讲,激活函数会被应用在每个神经元的输出上。知名的激活函数包括ReLU (Rectified Linear Unit),Sigmoid,TanH,Softmax等。

损失函数用于衡量模型的预测能力,而激活函数用于增强模型的表达能力。

激活函数Relu-隐藏层

ReLU是目前最常用的激活函数之一,ReLU函数非常快速且简单,数值范围从0到正无穷,可以避免和降低梯度消失问题。其公式如下:f(x) = max(0, x)
image.png
ReLU的优点是收敛快,求梯度简单。ReLU函数有助于实现快速收敛,因此模型训练速度很快。计算本质上线性函数的导数也更快。
问题在于函数的常量部分,这也是梯度为零的地方。梯度下降过程无法继续,模型的训练停止。
学习率调整将缓解这个问题。
ReLU 是一种常用的激活函数,特别是在深度神经网络中。它的形式是 f(x) = max(0, x),意味着当输入小于0时,输出是0;当输入大于0时,输出等于输入。
ReLU **函数的优点:**简单、计算高效,并且在输入为正数时梯度不会饱和,有利于网络的训练。
缺点ReLU 函数在输入为负数时梯度为0,可能会导致一些神经元不再更新,这被称为"死亡ReLU"问题

激活函数Sigmoid和Tanh-隐藏层

Sigmoid函数

Sigmoid函数可以将任何范围的数值映射到0和1之间,对于二分类问题常常用于输出层。其公式如下:
f(x) = 1 / (1 + e^-x)
image.png
函数很快变平(值变为 0 或 1)。这也会导致偏导数很快为零,从而导致权重无法更新并且模型无法学习。这可以通过适当的权重初始化来缓解。

缺点:Sigmoid 函数在输入值较大或较小的情况下梯度接近于0,可能导致梯度消失问题,使网络难以训练。

Tanh(双曲正切)

它将数值映射到-1和1之间,使得输出以0为中心,常常用于隐藏层。其公式如下:
f(x) = (e^x - e^-x) / (e^x + e^-x)
Tanh 可以被认为是缩放的 sigmoid 函数,并且与原始 sigmoid 函数具有类似的梯度问题。调整权重将抑制梯度消失的模型问题。
image.png


softmax激活函数-输出层

Softmax函数确实是一种激活函数,更准确地说,它是一种“归一化指数函数”。

Softmax函数一般应用在神经网络的输出层。具体来说,在分类问题中,Softmax函数常被应用于多分类模型的输出层,如,逻辑回归,多层感知机,卷积神经网络(CNN)和循环神经网络(RNN)等。它可以计算出一个概率分布,为每个类别生成一个概率值。这些概率加起来总和为1,最高的概率值对应的类别就是模型的预测结果。

总结

本篇博客分别解释了梯度,损失函数,激活函数等相关概念。前期概念准备部分基本结束,接下来我们就尝试自定义一个神经网络,实现训练,推理和生成模型等,也算是对基础概念部分的一个实践。

end

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python从入门到进阶】49、当当网Scrapy项目实战(二)

接上篇《48、当当网Scrapy项目实战&#xff08;一&#xff09;》 上一篇我们正式开启了一个Scrapy爬虫项目的实战&#xff0c;对当当网进行剖析和抓取。本篇我们继续编写该当当网的项目&#xff0c;讲解刚刚编写的Spider与item之间的关系&#xff0c;以及如何使用item&#xff…

Excel工作表控件实现滚动按钮效果

实例需求&#xff1a;工作表中有多个Button控件&#xff08;工作表Form控件&#xff09;和一个ScrollBar控件&#xff08;工作表ActiveX控件&#xff0c;名称为ScrollBar2&#xff09;&#xff0c;需要实现如下图所示效果。点击ScrollBar控件实现按钮的滚动效果&#xff0c;实际…

Go的CSP并发模型实现M, P, G简介

GMP概念简介 G: goroutine&#xff08;协程&#xff0c;也叫用户态线程&#xff09; M: 工作线程(内核态线程) P: 上下文(也可以认为是cpu&#xff0c;逻辑cpu数量&#xff0c;可以在程序启动的时候设置这个数量&#xff0c;gomaxprocs函数设置) GMP 模型 在 Go 中&#xff…

黄金回收是去当铺还是金店?

黄金回收是指将闲置的黄金饰品或金条等物品出售或交换成现金或其他有价物。在选择回收渠道时&#xff0c;很多人会犹豫是去当铺还是金店。本文将探讨这两种回收方式的特点。 当铺是一种专门经营典当业务的场所&#xff0c;也提供黄金回收服务。通过当铺回收&#xff0c;您可以在…

【简写Mybatis】02-注册机的实现以及SqlSession处理

前言 注意&#xff1a; 学习源码一定一定不要太关注代码的编写&#xff0c;而是注意代码实现思想&#xff1a; 通过设问方式来体现代码中的思想&#xff1b;方法&#xff1a;5W1H 源代码&#xff1a;https://gitee.com/xbhog/mybatis-xbhog&#xff1b;https://github.com/xbh…

51单片机学习(5)-----蜂鸣器的介绍与使用

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 目录 一. 蜂鸣器的介绍 1.蜂鸣器介绍 2.压电式蜂鸣器 &#xff08;无源…

生成式 AI - Diffusion 模型的数学原理(5)

来自 论文《 Denoising Diffusion Probabilistic Model》&#xff08;DDPM&#xff09; 论文链接&#xff1a; https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 讲到这里还没有解决的问题是&#xff0c;为什么这里还要多加一个噪声。Denoise模型算出来的是高斯分布的均…

NeurIPS 2023 Spotlight | VoxDet:基于3D体素表征学习的新颖实例检测器

本文提出基于3D体素表征学习的新颖实例检测器VoxDet。给定目标实例的多视图&#xff0c;VoxDet建立该实例的三维体素表征。在更加杂乱的测试图片上&#xff0c;VoxDet使用体素匹配算法检测目标实例。实验表明&#xff0c;VoxDet中的三维体素表征与匹配比多种二维特征与匹配要更…

【深入理解设计模式】适配器设计模式

适配器设计模式 适配器设计模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而使得原本由于接口不兼容而不能一起工作的类能够一起工作。适配器模式通常用于以下场景&#xff1a; 现有接口与需求不匹配&#xff1a;当需要…

IP对讲终端SV-6002(防水)

SV-6002&#xff08;防水&#xff09;是一款IP对讲终端&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;解码后播放&#xff0c;外部DC12~24V电源供电端子&#xff0c;提供单路2W的音频输出。基于TCP/IP网络通信协议和数字音频技术&#xff0c;…

【Java EE初阶二十三】servlet的简单理解

1. 初识servlet Servlet 是一个比较古老的编写网站的方式&#xff0c;早起Java 编写网站,主要使用 Servlet 的方式&#xff0c;后来 Java 中产生了一个Spring(一套框架)&#xff0c;Spring 又是针对 Servlet 进行了进一步封装,从而让我们编写网站变的更简单了&#xff1b;Sprin…

都有金蝶了,也能开发报表,为什么要用BI?

很多企业在一开始时都会有这样的困惑&#xff1a;我都有金蝶ERP了&#xff0c;也能自己开发报表&#xff0c;为什么还要买BI&#xff1f; 答案是显而易见的&#xff0c;金蝶ERP毕竟不是专业的数据分析系统&#xff0c;它的主要任务是在企业管理流程上&#xff0c;虽然很多企业…

Linux内核网络

文章目录 前言网络协议栈图解功能 发送Linux内核网络数据包图解流程 接收Linux内核网络数据包图解流程 最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;因为Linux内核涉及的内容极多&#xff0c;我们初学者如果一上来就开始深挖细节&#xff0c;很有可能会在Linux内核代码…

MySQL - 事务日志

目录 1. redo日志 1.1 为什么需要REDO日志 1.2 REDO日志的好处、特点 1. 好处 2. 特点 1.3 redo的组成 1.4 redo的整体流程 1.5 redo log的刷盘策略 1.6 不同刷盘策略演示 1. 流程图 ​编辑2. 举例 1.7 写入redo log buffer 过程 1.8 redo log file 1. 相关参数…

[云原生] 二进制安装K8S(中)部署网络插件和DNS

书接上文&#xff0c;我们继续部署剩余的插件 一、K8s的CNI网络插件模式 2.1 k8s的三种网络模式 K8S 中 Pod 网络通信&#xff1a; &#xff08;1&#xff09;Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享…

批量解决opencv cv2.imread读取32位抠图png图像后,出现隐藏背景无法去除的问题

一、问题展示 1.原始png含蒙版抠图信息&#xff1a;位深度为32位&#xff0c;4通道图像信息&#xff0c;含蒙版背景信息 2.使用opencv读取保存后图像信息&#xff1a;位深度为24位&#xff0c;3通道图像信息&#xff0c;显示了扣除的背景 二、问题分析 1.用cv模块无法识别深度…

Stable Diffusion 绘画入门教程(webui)-ControlNet(线稿约束)

上篇文章介绍了openpose&#xff0c;本篇文章介绍下线稿约束&#xff0c;关于线稿约束有好几个处理器都属于此类型&#xff0c;但是有一些区别。 包含&#xff1a; 1、Canny(硬边缘&#xff09;&#xff1a;识别线条比较多比较细&#xff0c;一般用于更大程度得还原照片 2、ML…

C++ : string类

目录 介绍&#xff1a; string类的七种构造函数&#xff1a; string类的第三个构造函数 string类的第四个构造函数 string类的第五个构造函数 string类的第六个构造函数 string类常用的构造 string类对象的访问遍历操作 第一种遍历方式&#xff1a; 第二种遍历方…

使用Node.js开发RESTful API

在当今信息时代&#xff0c;不管是企业级应用还是个人项目&#xff0c;都离不开RESTful API的使用。RESTful API 是现代 web 应用的基石&#xff0c;通过它&#xff0c;我们可以实现前后端的高效沟通和数据传输。而在开发 RESTful API 的过程中&#xff0c;Node.js 的强大功能和…