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

文章目录

    • 前言
    • 梯度概述
      • 梯度下降算法
        • 梯度下降的过程
      • 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

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

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

相关文章

Panalog大数据日志审计系统libres_syn_delete.php命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 1、产品简介 Panalog大数据日志审计系统定位于将大数据产品应用于高校…

Linux之vim的使用详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.vim简介 二.vim的基本概念 三.vim的基本操作 3.1准备 …

STL - B树

1、常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N&#xff09;二分查找有序O( )二叉搜索树无要求O(N)二叉平衡树(AVL树和红黑树)无要求O( )哈希无要求O(1) 以上结构适合用于数据量相对不是很大&#xff0c;能够一次性存放在内存中&#xff0c;进行数据查找的场景…

图像的压缩感知的MATLAB实现(第3种方案)

前面介绍了两种不同的压缩感知实现&#xff1a; 图像压缩感知的MATLAB实现&#xff08;OMP&#xff09; 压缩感知的图像仿真&#xff08;MATLAB源代码&#xff09; 上述两种方法还存在着“速度慢、精度低”等不足。 本篇介绍一种新的方法。 压缩感知&#xff08;Compressed S…

macOS系统下载IDEA的操作流程

第一步 进入官网 Download IntelliJ IDEA – The Leading Java and Kotlin IDE 第二步 根据mac的芯片选择版本下载 芯片的查看位置是【设置】-【通用】-【关于本机】-第二个&#xff0c;我的是Apple芯片&#xff0c;选Apple Silicon -- 第三步 右上角下载处打开安装包&…

汇编语言与接口技术实践——秒表

1. 设计要求 基于 51 开发板,利用键盘作为按键输入,将数码管作为显示输出,实现电子秒表。 功能要求: (1)计时精度达到百分之一秒; (2)能按键记录下5次时间并通过按键回看 (3)设置时间,实现倒计时,时间到,数码管闪烁 10 次,并激发蜂鸣器,可通过按键解除。 2. 设计思…

第十三章 Linux——备份与恢复

第十三章 Linux——备份与恢复 基本介绍安装dump和restore使用dump完成备份dump语法说明dump应用案例1dump应用案例2dump-w查看备份时间文件备份文件或者目录备注 使用restore基本语法基本介绍restore基本语法应用案例1应用案例2应用案例3应用案例4 基本介绍 实体机无法做快照…

SpringBoot:数据访问-整合 spring-boot-starter-data-jpa

点击查看数据访问demo&#xff1a;LearnSpringBoot06DataJPA Spring Data JPA - Reference 文档 简介 Spring Data的JPA模块包含一个允许定义存储库bean的自定义名称空间。它还包含JPA特有的某些特性和元素属性。通常&#xff0c;可以使用repositories元素来设置JPA存储库: 点…

学习使用在mysql中查询指定字段字符串包含多个字符串的方法

学习使用在mysql中查询指定字段字符串包含多个字符串的方法 使用LIKE关键字使用REGEXP关键字使用FIND_IN_SET函数使用INSTR函数和AND关键字 使用LIKE关键字 SELECT * FROM table_name WHERE column_name LIKE %string1% AND column_name LIKE %string2%;使用LIKE关键字&#x…

异常统一处理:Exception(兜底异常)

一、引言 本篇内容是“异常统一处理”系列文章的重要组成部分&#xff0c;主要聚焦于对 Exception&#xff08;兜底异常&#xff09; 的原理解析与异常处理机制&#xff0c;并给出测试案例。 关于 全局异常统一处理 的原理和完整实现逻辑&#xff0c;请参考文章&#xff1a; 《…

yolov8学习笔记(二)模型训练

目录 yolov8的模型训练 1、制作数据集&#xff08;标记数据集&#xff09; 2、模型训练&#xff08;标记数据集、参数设置、跟踪模型随时间的性能变化&#xff09; 2.1、租服务器训练 2.2、加训练参数 2.3、看训练时的参数&#xff08;有条件&#xff0c;就使用TensorBoard&…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-27-处理单选和多选按钮-番外篇

1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo&#xff0c;然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何使用playwright来处理单选按钮和多选按钮进行自动化测试&#xff0c;想必大家都已经掌握的八九不离十了吧。这一篇其实也很简单&#xff1a…

JavaSE——面向对象基础(4/4)-成员变量和局部变量的区别、面向对象综合案例(电影信息系统)

目录 补充&#xff1a;成员变量和局部变量的区别 面向对象综合案例 设计一个电影类 IDEA快捷操作 设计一个电影操作类 准备电影数据 业务处理 运行结果 补充&#xff1a;成员变量和局部变量的区别 区别成员变量&#xff08;对象的属性&#xff09;局部变量类中位置不同…

Project_Euler-07 题解

Project_Euler-07 题解 题目 思路 一个线性筛解决问题&#xff0c;当然也可以用埃式筛或者标准的暴力破解&#xff0c;这里选用最优秀的方式&#xff0c;顺便复习一下线性筛的内容&#xff1a; #include<stdio.h> #include<stdlib.h> #include<math.h> #in…

spring源码概念解析-spring生命周期

1.Spring生命周期 BeanFactory的⽣命周期 ApplicationContext的⽣命周期 初始化的过程都是⽐较⻓&#xff0c;我们可以分类来对其进⾏解析&#xff1a; Bean⾃身的⽅法&#xff1a;如调⽤ Bean 构造函数实例化 Bean&#xff0c;调⽤ Setter 设置 Bean 的属性值以及通 过的 in…

matlab新能源汽车三自由度操纵稳定性分析及优化

1、内容简介 略 可以交流、咨询、答疑 55-新能源汽车三自由度操纵稳定性分析及优化 2、内容说明 略 摘 要 电动化是节能减排、寻求替代能源的最佳途径&#xff0c;已成为行业共识&#xff0c;论文基于江西科技学院桑塔纳轿车油改气项目&#xff0c;在拆除发动机、变速…

Unity(第六部)向量的理解和算法

标量:只有大小的量。185 888 999 &#xff08;类似坐标&#xff09; 向量:既有大小&#xff0c;也有方向。&#xff08;类似以个体为主体的方向&#xff0c;前方一百米&#xff09; 向量的模:向量的大小。&#xff08;类似以个体为主体的方向&#xff0c;前方一百米、只取一百米…

【Crypto | CTF】BugKu 简单的RSA

天命&#xff1a;这题也不算简单了&#xff0c;要反编译&#xff0c;要灵活一点 首先收到pyc文件&#xff0c;拿去反编译出来&#xff0c;可以用在线反编译&#xff0c;也可以用工具反编译 在线&#xff1a;python反编译 - 在线工具 工具&#xff1a;https://download.csdn.n…

基于Java的传统工艺品销售系统的设计与实现

网上购物尚未流行前需要购买传统工艺品的人们都是到遍布于大街小巷的商场商店中进行挑选购买&#xff0c;除非抱有非常明确的目标&#xff0c;否则是很难在短时间内挑选购买到所需传统工艺品的。网上购物在国内的兴起则彻底颠覆了传统的线下购物模式&#xff0c;线下实体商场也…

Git命令操作

什么是Git&#xff1f; Git是⼀个免费的&#xff0c;开源的分布式版本控制软件系统 git区域 存储区域&#xff1a;Git软件⽤于存储资源得区域。⼀般指得就是.git⽂件夹 ⼯作区域&#xff1a;Git软件对外提供资源得区域&#xff0c;此区域可⼈⼯对资源进⾏处理。 暂存区&am…