如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机。

如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

上图就是一个最简单的激活函数,当∑i=0N>0\sum_{i=0}^N>0∑i=0N​>0时节点才会激活。
但是这个激活函数有一个问题是不可导,在∑i=0N=0\sum_{i=0}^N=0∑i=0N​=0处是处于不连续的情况下,因此不可以求导,因此这个函数无法直接使用梯度下降的方式来优化,当时使用了启发式搜索的方式来求解单层感知机最优解的情况。

为了解决单层激活函数阶梯不可导的情况,科学家提出了sigmoid函数(Logistic函数):
f(x)=σ(x)=11+e−xf(x) =\sigma(x)= \frac{1}{1+e^{-x}} f(x)=σ(x)=1+e−x1​

当x→∞x \to \inftyx→∞时,f(x)→1f(x) \to 1f(x)→1,当x→−∞x \to -\inftyx→−∞时,f(x)→0f(x) \to 0f(x)→0。而且可以看出倒数是连续可导的。

实际上sigmoid激活函数使用的非常多,最主要的是因为它连续光滑,而且值压缩在(0,1)的范围内,我们很多时候都需要(0,1)这样一个范围,比如概率和RGB。

但是sigmoid存在一个致命的权限,当f(x)→∞f(x) \to \inftyf(x)→∞和f(x)→−∞f(x) \to -\inftyf(x)→−∞时,导数都为0,因此当值处在这部分区间时,参数θ′=θ−∇=θ−0=θ\theta'=\theta-\nabla=\theta-0=\thetaθ′=θ−∇=θ−0=θ长时间得不到更新,出现梯度离线现象。

sigmoid在PyTorch实现

import torchz = torch.linspace(-100,100,10)
# tensor([-100.0000,  -77.7778,  -55.5556,  -33.3333,  -11.1111,   11.1111,
#          33.3333,   55.5556,   77.7778,  100.0000])torch.sigmoid(z)
# tensor([0.0000e+00, 1.6655e-34, 7.4564e-25, 3.3382e-15, 1.4945e-05, 9.9999e-01,
#        1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00])

或者使用from torch.nn import functional as F的方式:

from torch.nn import functional as FF.sigmoid(z)
# tensor([0.0000e+00, 1.6655e-34, 7.4564e-25, 3.3382e-15, 1.4945e-05, 9.9999e-01,
#        1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00])

可以看出当z=−100z=-100z=−100的时候,sigmoid的值已经是非常小的了,接近于0了;当z=100z=100z=100的时候,sigmoid的值也接近于0了

Tanh激活函数

Tanh激活函数在RNN中用的比较多。
f(x)=tanh(x)=ex−e−x(ex+e−x)=2sigmoid(2x)−1f(x) = tanh(x)=\frac{e^x-e^{-x}}{(e^x+e^{-x})}=2sigmoid(2x)-1 f(x)=tanh(x)=(ex+e−x)ex−e−x​=2sigmoid(2x)−1

所以Tanh的取值范围是(-1,1)。

z = torch.linspace(-1,1,10)
torch.tanh(z)
#tensor([-0.7616, -0.6514, -0.5047, -0.3215, -0.1107,  0.1107,  0.3215,  0.5047,
#         0.6514,  0.7616])

Rectified Linear Unit (ReLU)激活函数

非常简单,但是可以说是现在深度学习的奠基石的激活函数。现在深度学习使用最多的激活函数就是ReLU激活函数。

f(x)={0for x<0x,x≥0f(x)=\begin{cases} 0 & \text {for x<0} \\ x, & \text{x}\geq 0 \end{cases} f(x)={0x,​for x<0x≥0​

ReLU函数的导数:
f′(x)={0for x<01,x≥0f'(x)=\begin{cases} 0 & \text {for x<0} \\ 1, & \text{x}\geq 0 \end{cases} f′(x)={01,​for x<0x≥0​
因为当x≥0x\ge0x≥0时,梯度是1,因此在向后传播时,梯度计算起来非常方便,不会放大也不会缩小,不会出现梯度离散和梯度爆炸的情况。

z = torch.linspace(-1,1,10)
torch.relu(z)
# tensor([  0.0000,   0.0000,   0.0000,   0.0000,   0.0000,  11.1111,  33.3333,
#         55.5556,  77.7778, 100.0000])
F.relu(z)
# tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1111, 0.3333, 0.5556, 0.7778,
#        1.0000])

一般在做research的时候,通常都是用ReLU激活函数。

PyTorch教程(八):常见激活函数与Loss的梯度相关推荐

  1. pytorch教程龙曲良26-30

    26什么是梯度1 导数(在给定方向的变化量)和偏微分(在给定的自变量上的变化量)都是标量,只有大小没有方向 梯度就是所有偏微分的向量,有方向有大小 函数梯度是一个向量,向量方向表示这个函数在当前点的一 ...

  2. pytorch教程龙曲良31-35

    31激活函数与Loss的梯度3 softmax 概率0-1,且所有所属结点的概率和为1,用softmax适合多分类,且把之间的差距拉大,本来2.0与1.0差两倍,现在0.7与0.2差3.5倍 求的是p ...

  3. Stanford CS224N: PyTorch Tutorial (Winter ‘21) —— 斯坦福CS224N PyTorch教程 (第二部分)

    本教程译文的第一部分,请见我的上一篇博文: Stanford CS224N: PyTorch Tutorial (Winter '21) -- 斯坦福CS224N PyTorch教程 (第一部分)_放 ...

  4. 深度学习之常见激活函数-Sigmoid、Tanh、ReLu、softplus、softmax、ELU、PReLU

    一.常见激活函数总结 激活函数: 就是在神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端. 常见的激活函数包括 Sigmoid TanHyperbolic(tanh) ReLu softp ...

  5. 【2】激活函数与Loss函数求导

    文章目录 1.常见的激活函数与梯度 Sign函数 Sigmoid函数 Tanh函数 ReLU函数 Softmax函数 Leaky ReLU函数 SELU函数 Softplus函数 2.常见的Loss与 ...

  6. (四)激活函数与loss梯度

    (四)激活函数与loss梯度 激活函数 科学家对于青蛙的神经元的研究,发现青蛙的神经元有多个输入,中间是一个对输入加权的响应,但是这个响应不是线性的输出,而是基于一个阈值来作为标准,当响应值大于阈值时 ...

  7. 【STM32】标准库与HAL库对照学习教程八--串口通信详解

    [STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...

  8. java 世界协调时间格式_Java核心教程之常见时间日期的处理方法

    Java日期处理类Date详解 时间的基础知识 时区:整个地球分为二十四时区,每个时区都有自己的本地时间. 为了统一起见,使用一个统一的时间,称为全球标准时间(UTC,Universal Time C ...

  9. 聊一聊CNN中的感受野、优化函数、激活函数、Loss函数等

    目录: 1.感受野 2.优化函数 3.激活函数 4.loss 函数. 前言 文章有点长,内容有点丰富,基本涵盖整个深度卷积神经网络,涉及 网络中的感受野.激活函数.loss函数以及各种相关知识. Pa ...

最新文章

  1. 中科院sci分区表_最新 | 2020中科院SCI分区表 食品科技类
  2. php集成jpush教程,Laravel 集成 JPush 极光推送指北
  3. 动态密码卡TOTP算法
  4. 技术 KPI 的量化
  5. BZOJ 3362 Navigation Nightmare 带权并查集
  6. php oracle新增数据类型,oracle数据类型
  7. 复述-软考高级-网规-数据灾备
  8. 源码分析Dubbo服务提供者启动流程-上篇
  9. MyBatis-${}与#{}
  10. 微软 HoloLens 2 的幕后故事
  11. qt 不允许 dllimport 静态数据成员 的定义_C++类和对象的定义
  12. h系列标签自动加了bold
  13. 廖雪峰Python基础练习作业
  14. Passthrough技术简介
  15. 【RPA】PDF生成器FPDF(Python篇)
  16. java web在线购物_JAVAWEB网上商城购物系统
  17. cass简码大全_南方CASS简码.doc
  18. <论文阅读> M2BEV Multi-Camera Joint 3D Detection and Segmentation with Unified Bird’s-Eye View Represen
  19. DNK开发—Eclipse环境变量配置
  20. setPositiveButton和setNegativeButton

热门文章

  1. java bigdecimal赋值_Java中BigDecimal类介绍及用法(亲测)
  2. Python学到什么程度可以面试工作?
  3. Go的channel与map是否并发安全以及原因
  4. Vue的模板字符串${}用法
  5. Git一电脑配置config多个git用户 一个用于公司工作 一个用于个人学习
  6. Linux之Apache与Nginx的对比比较:并发性能 消耗机器资源 处理静态资源 模块 稳定性
  7. 反思供应链项目:实践出真知 多反思提升效率的方法
  8. MySQL中group_concat()函数用法总结
  9. php页面代码简化,代码求简化
  10. 海南橡胶机器人成本_完成专利授权20余件!海南橡胶中橡科技搭建高标准研发平台...