首页 > 其他分享 >深度学习理解非线性因素,知道常见激活函数

深度学习理解非线性因素,知道常见激活函数

时间:2024-08-14 23:27:07浏览次数:15  
标签:__ axes 函数 sigmoid 非线性 图像 激活

网络非线性因素的理解

激活函数用于对每层的输出数据进行变换, 进而为整个网络结构结构注入了非线性因素。此时, 神经网络就可以拟合各种曲线。如果不使用激活函数,整个网络虽然看起来复杂,其本质还相当于一种线性模型,如下公式所示:

另外通过图像可视化的形式理解:

我们发现增加激活函数之后, 对于线性不可分的场景,神经网络的拟合能力更强。

常见的激活函数

激活函数主要用来向神经网络中加入非线性因素,以解决线性模型表达能力不足的问题,它对神经网络有着极其重要的作用。我们的网络参数在更新时,使用的反向传播算法(BP),这就要求我们的激活函数必须可微。

sigmoid 激活函数

sigmoid 激活函数的函数图像如下:

从 sigmoid 函数图像可以得到,sigmoid 函数可以将任意的输入映射到 (0, 1) 之间,当输入的值大致在 <-6 或者 >6 时,意味着输入任何值得到的激活值都是差不多的,这样会丢失部分的信息。比如:输入 100 和输出 10000 经过 sigmoid 的激活值几乎都是等于 1 的,但是输入的数据之间相差 100 倍的信息就丢失了。

对于 sigmoid 函数而言,输入值在 [-6, 6] 之间输出值才会有明显差异,输入值在 [-3, 3] 之间才会有比较好的效果。

通过上述导数图像,我们发现导数数值范围是 (0, 0.25),当输入 <-6 或者 >6 时,sigmoid 激活函数图像的导数接近为 0,此时网络参数将更新极其缓慢,或者无法更新。

一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。而且,该激活函数并不是以 0 为中心的,所以在实践中这种激活函数使用的很少。sigmoid函数一般只用于二分类的输出层。

在 PyTorch 中使用 sigmoid 函数的示例代码如下:

import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F


def test():
    _, axes = plt.subplots(1, 2)

    # 函数图像
    x = torch.linspace(-20, 20, 1000)
    y = F.tanh(x)
    axes[0].plot(x, y)
    axes[0].grid()
    axes[0].set_title('Sigmoid 函数图像')

    # 导数图像
    x = torch.linspace(-20, 20, 1000, requires_grad=True)
    torch.sigmoid(x).sum().backward()

    axes[1].plot(x.detach(), x.grad)
    axes[1].grid()
    axes[1].set_title('Sigmoid 导数图像')

    plt.show()


if __name__ == '__main__':
    test()

 tanh 激活函数

Tanh 叫做双曲正切函数,其公式如下:

Tanh 的函数图像、导数图像如下:

由上面的函数图像可以看到,Tanh 函数将输入映射到 (-1, 1) 之间,图像以 0 为中心,在 0 点对称,当输入 大概<-3 或者 >3 时将被映射为 -1 或者 1。其导数值范围 (0, 1),当输入的值大概 <-3 或者 > 3 时,其导数近似 0。

与 Sigmoid 相比,它是以 0 为中心的,使得其收敛速度要比 Sigmoid 快,减少迭代次数。然而,从图中可以看出,Tanh 两侧的导数也为 0,同样会造成梯度消失。

若使用时可在隐藏层使用tanh函数,在输出层使用sigmoid函数。

import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F


def test():

    _, axes = plt.subplots(1, 2)

    # 函数图像
    x = torch.linspace(-20, 20, 1000)
    y = F.tanh(x)
    axes[0].plot(x, y)
    axes[0].grid()
    axes[0].set_title('Tanh 函数图像')

    # 导数图像
    x = torch.linspace(-20, 20, 1000, requires_grad=True)
    F.tanh(x).sum().backward()

    axes[1].plot(x.detach(), x.grad)
    axes[1].grid()
    axes[1].set_title('Tanh 导数图像')

    plt.show()

if __name__ == '__main__':
    test()

ReLU 激活函数

ReLU 激活函数公式如下:

函数图像如下:

从上述函数图像可知,ReLU 激活函数将小于 0 的值映射为 0,而大于 0 的值则保持不变,它更加重视正信号,而忽略负信号,这种激活函数运算更为简单,能够提高模型的训练效率。

但是,如果我们网络的参数采用随机初始化时,很多参数可能为负数,这就使得输入的正值会被舍去,而输入的负值则会保留,这可能在大部分的情况下并不是我们想要的结果。

ReLU 的导数图像如下:

ReLU是目前最常用的激活函数。 从图中可以看到,当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。这种现象被称为“神经元死亡”。

与sigmoid相比,RELU的优势是:

采用sigmoid函数,计算量大(指数运算),反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。 sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。 Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

 SoftMax

softmax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。

计算方法如下图所示:

Softmax 直白来说就是将网络输出的 logits 通过 softmax 函数,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们将它理解成概率,选取概率最大(也就是值对应最大的)节点,作为我们的预测目标类别。

import torch


if __name__ == '__main__':

    scores = torch.tensor([0.2, 0.02, 0.15, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75])
    probabilities = torch.softmax(scores, dim=0)
    print(probabilities)

程序输出结果:

tensor([0.0212, 0.0177, 0.0202, 0.0202, 0.0638, 0.0287, 0.0185, 0.0522, 0.0183,
        0.7392])

小节

除了上述的激活函数,还存在很多其他的激活函数,如下图所示:

对于隐藏层:

  1. 优先选择RELU激活函数

  2. 如果ReLu效果不好,那么尝试其他激活,如Leaky ReLu等。

  3. 如果你使用了Relu, 需要注意一下Dead Relu问题, 避免出现大的梯度从而导致过多的神经元死亡。

  4. 不要使用sigmoid激活函数,可以尝试使用tanh激活函数

对于输出层

  1. 二分类问题选择sigmoid激活函数

  2. 多分类问题选择softmax激活函数

  3. 回归问题选择identity激活函数

标签:__,axes,函数,sigmoid,非线性,图像,激活
From: https://blog.csdn.net/DGFfdAf/article/details/141202574

相关文章

  • C语言函数(上)
    前言与概述笔者打算通过两篇文章详细介绍C语言函数的相关知识,本文章将会介绍C语言函数定义、C语言函数分类、函数参数、函数调用。下一篇文章将会介绍函数声明、链式访问,并详细介绍函数递归。笔者不才,如有错误,欢迎各位编程大佬在评论区批评指正。C语言函数定义维基百科中将C......
  • mathtype7永久激活码密钥怎么获取?如何破解软件
    ......
  • 【树莓派学习笔记2】opencv常用的视觉方案,特征颜色提取,模式匹配,图形映射函数
    本文主要介绍opencv里面一些常用的视觉方案,所需的全部代码均在如下1.给视觉单独开一个进程持续运行并更新全局变量#获取并处理图像defget_image():whileTrue:#开全局变量处理,分理处红绿蓝globalimage,image_red,image_green,image_blue......
  • 2024版,一键安装永久激活!
    2024版,一键安装永久激活!https://mp.weixin.qq.com/s?__biz=MzkxMzEyNTA2Nw==&mid=2247504674&idx=1&sn=6402cfd91b92f85e28a282fe10216aea&chksm=c100e886f67761904f3eab4607504da67c7342d29cb6ae4374a9f9b4b459d237f1bee0095510&mpshare=1&scene=23&sr......
  • openGauss怎么工作SQL函数接口读取逻辑解码结果?
    功能描述在openGauss中如果实现数据复制呢?可以通过数据迁移工具定期向目标数据库进行数据库的同步,说的定期,这就意味着这种方式不能满足数据实时复制的需求。在openGauss中为我们提供了逻辑解码功能,工作原理就是反解xlog,从而生成逻辑日志,在目标数据库中通过对逻辑进行解析......
  • 23:Python的map函数,filter函数,reduce函数
    #map函数#例子1num_1=[1,2,10,5,3,7]ret=[]foriinnum_1:ret.append(i**2)print(ret)#完成一个,#例子2num_1=[1,2,10,5,3,7]defmap_test(array):#array,数组ret=[]foriinnum_1:ret.append(i**2)returnretr......
  • week日期的函数
     如下是hive的函数 selectdayofweek('2022-02-27');--dayofweek展示的是周几共计7个值,6代表周五=1selectweekofyear('2022-12-22');--51   如下为mysql的语句:SELECTWEEK(purchase_date)-WEEK('2023-11-01')+1week_of_month,--用......
  • LoadRunner常用函数介绍
    内置函数和Jmeter差不多,Jmeter更火,更好百度,毕竟开源,用的人多,所以有些函数如果不太懂用法,可以百度Jmeter作为参考来使用LR。 大家使用中应用函数不会的话留言就行,我开始用的时候反正不懂,不明白怎么使用,怎么应用,有和我一样的童鞋可交流脚本中常用函数事务组lr_start_transac......
  • 【AI 生图赢奖】用函数计算绘出「少年江湖」,与热播网剧梦幻联动
    在这个数字化时代,人工智能不再只是科幻小说中的幻想,创意与技术的界限正在被重新定义。摩拳擦掌研究AI的你,是否想用自己的新技术和创造力一试身手呢?阿里云联合优酷推出【少年白马醉春风·AI江湖创作大赛】,无论您是开发者、设计师、还是AI绘画爱好者,都可以使用阿里云函数计......
  • 关于c++ 匿名函数的 记录
    后续补充与测试在C++中,匿名函数(lambda表达式)要使用同作用域下的一个临时变量,可以通过捕获列表和参数列表的不同组合来实现。以下是几种常见的组合:1.按值捕获([=]):inttemp=10;autolambda=[=](){returntemp;};1.按引用捕获([&]):inttemp=10;autolambda=[&](){r......