文章目录

  • Sigmoid
    • 公式
    • 求导过程
    • 优点:
    • 缺点:
    • 自定义Sigmoid
    • 与Torch定义的比较
    • 可视化
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F%matplotlib inlineplt.rcParams['figure.figsize'] = (7, 3.5)
plt.rcParams['figure.dpi'] = 150
plt.rcParams['axes.unicode_minus'] = False  #解决坐标轴负数的铅显示问题

Sigmoid

公式

sigmoid(x)=σ(x)=11+e−x\text{sigmoid}(x)= \sigma(x) = \frac{1}{1+e^{-x}}sigmoid(x)=σ(x)=1+e−x1​

求导过程

σ′(x)=[(1+e−x)−1]′=(−1)(1+e−x)−2(−1)e−x=(1+e−x)−2e−x=e−x(1+e−x)2=1+e−x−1(1+e−x)2=1+e−x(1+e−x)2−1(1+e−x)2=1(1+e−x)(1−1(1+e−x))=σ(x)(1−σ(x))\begin{aligned} \sigma'(x) =&[(1+e^{-x})^{-1}]' \\ =&(-1)(1+e^{-x})^{-2}(-1)e^{-x}\\ =&(1+e^{-x})^{-2}e^{-x}\\ =&\frac{e^{-x}}{(1+e^{-x})^2} \\ =&\frac{1+e^{-x}-1}{(1+e^{-x})^2} \\ =&\frac{1+e^{-x}}{(1+e^{-x})^2} - \frac{1}{(1+e^{-x})^2} \\ =&\frac{1}{(1+e^{-x})}(1-\frac{1}{(1+e^{-x})}) \\ =&\sigma(x)(1-{\sigma(x)}) \end{aligned}σ′(x)========​[(1+e−x)−1]′(−1)(1+e−x)−2(−1)e−x(1+e−x)−2e−x(1+e−x)2e−x​(1+e−x)21+e−x−1​(1+e−x)21+e−x​−(1+e−x)21​(1+e−x)1​(1−(1+e−x)1​)σ(x)(1−σ(x))​

用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。Sigmoid作为激活函数有以下优缺点:

优点:

  • 输出范围有限,数据在传递的过程中不容易发散。
  • 输出范围为(0,1),所以可以用作输出层,输出表示概率。
  • 抑制两头,对中间细微变化敏感,对分类有利。
  • 在特征相差比较复杂或是相差不是特别大时效果比较好。

缺点:

  • 梯度消失(Gradient Vanishing)会导致backpropagate时,w的系数太小,w更新很慢。所以对初始化时要特别注意,避免过大的初始值使神经元进入饱和区。
  • 输出不是zero-center 这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in ),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解
  • 指数运算耗时,计算效率低

自定义Sigmoid

class SelfDefinedSigmoid(torch.autograd.Function):@staticmethoddef forward(ctx, inp):result = torch.divide(torch.tensor(1), (1 + torch.exp(-inp)))ctx.save_for_backward(result)return result@staticmethoddef backward(ctx, grad_output):# ctx.saved_tensors is tuple (tensors, grad_fn)result, = ctx.saved_tensorsreturn grad_output * result * (1 - result)class Sigmoid(nn.Module):def __init__(self):super().__init__()def forward(self, x):out = SelfDefinedSigmoid.apply(x)return out

与Torch定义的比较

# self defined
torch.manual_seed(0)sigmoid = Sigmoid()  # SelfDefinedSigmoid
inp = torch.randn(5, requires_grad=True)
out = sigmoid((inp + 1).pow(2))print(f'Out is\n{out}')out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nFirst call\n{inp.grad}")out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nSecond call\n{inp.grad}")inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nCall after zeroing gradients\n{inp.grad}")
Out is
tensor([0.9984, 0.6223, 0.8005, 0.9213, 0.5018],grad_fn=<SelfDefinedSigmoidBackward>)First call
tensor([ 0.0080,  0.3322, -0.3765,  0.2275, -0.0423])Second call
tensor([ 0.0159,  0.6643, -0.7530,  0.4549, -0.0845])Call after zeroing gradients
tensor([ 0.0080,  0.3322, -0.3765,  0.2275, -0.0423])
# torch defined
torch.manual_seed(0)
inp = torch.randn(5, requires_grad=True)
out = torch.sigmoid((inp + 1).pow(2))print(f'Out is\n{out}')out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nFirst call\n{inp.grad}")out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nSecond call\n{inp.grad}")inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nCall after zeroing gradients\n{inp.grad}")
Out is
tensor([0.9984, 0.6223, 0.8005, 0.9213, 0.5018], grad_fn=<SigmoidBackward>)First call
tensor([ 0.0080,  0.3322, -0.3765,  0.2275, -0.0423])Second call
tensor([ 0.0159,  0.6643, -0.7530,  0.4549, -0.0845])Call after zeroing gradients
tensor([ 0.0080,  0.3322, -0.3765,  0.2275, -0.0423])

从上面结果,可以看出与torch定义sigmoid得到是一样的结果

可视化

# visualization
inp = torch.arange(-8, 8, 0.1, requires_grad=True)
out = sigmoid(inp)
out.sum().backward()inp_grad = inp.gradplt.plot(inp.detach().numpy(),out.detach().numpy(),label=r"$\sigma(x)=\frac{1}{1+e^{-x}} $",alpha=0.7)
plt.plot(inp.detach().numpy(),inp_grad.numpy(),label=r"$\sigma'(x)$",alpha=0.5)
plt.grid()
plt.legend()
plt.show()

Pytorch 自定义激活函数前向与反向传播 sigmoid相关推荐

  1. Pytorch 自定义激活函数前向与反向传播 Tanh

    看完这篇,你基本上可以自定义前向与反向传播,可以自己定义自己的算子 文章目录 Tanh 公式 求导过程 优点: 缺点: 自定义Tanh 与Torch定义的比较 可视化 import matplotli ...

  2. Pytorch 自定义激活函数前向与反向传播 ReLu系列 含优点与缺点

    文章目录 ReLu 公式 求导过程 优点: 缺点: 自定义ReLu 与Torch定义的比较 可视化 Leaky ReLu PReLu 公式 求导过程 优点: 缺点: 自定义LeakyReLu 与Tor ...

  3. 4.6 前向和反向传播-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 4.5 搭建深层神经网络快 回到目录 4.7 参数 vs. 超参数 前向和反向传播 (Forward and Backward Propagation) 之前我们学习了构成深 ...

  4. 卷积神经网络前向及反向传播过程数学解析

    卷积神经网络前向及反向传播过程数学解析 文章目录 <center>卷积神经网络前向及反向传播过程数学解析 1.卷积神经网络初印象 2.卷积神经网络性质 3.前向传播 3.1.卷积层层级间传 ...

  5. meanpool maxpool 前向和反向传播

    mean max 前向和反向传播 感觉平均迟化对值不太公平,应该加个权重,让算法自动去决定哪个 cnn中关于平均池化和最大池化的理解 接触到pooling主要是在用于图像处理的卷积神经网络中,但随着深 ...

  6. numpy实现简单的二层网络------前向和反向传播

    会推导神经网络的前向和反向传播是深度学习的基础,也许大家在实验使用Tensorflow框架,只需要调用某一个损失函数,传入参数就可以得到损失,或者Mxnet框架,你都不需要调用任何函数,给个标志就可以 ...

  7. 神经网络的前向和反向传播

    1.前向传播 前向传播的作用就是为了获取误差损失:现在以示例来说明: 上图是一个典型的神经网络结构,包括了输入层.隐含层和输出层,为了更好的讲解,现在对其进行赋值: 目标:给出输入数据i1,i2(0. ...

  8. 4.2 前向和反向传播

  9. 前向传播、反向传播(后向传播)、梯度下降、导数、链式法则

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 2.4 神经网络最优化过程 2.4.1 最优化(Optimiz ...

最新文章

  1. android重启软件用不了,应用程序重启而不是重启
  2. The server time zone value is unrecognized or repr
  3. yii 清除mysql缓存_Yii2开启数据表结构缓存和清除
  4. .重要开源协定的比较以及区别
  5. 团队计划(5.25)
  6. C语言学习之分别用while、for 编写程序,计算2*4*6*......*100的值
  7. Akamai托管服务应对多重网络性能挑战
  8. 学习windows 应用层 inline hook 原理总结
  9. 计算机考研的调查和改进建议
  10. 装饰器模式 decorator
  11. 用VC写Assembly代码
  12. 015、JVM实战总结:大厂面试题:什么情况下JVM内存中的一个对象会被垃圾回收?
  13. 计算机的组成 —— PCI(PCIE)、PCB
  14. HDI与普通PCB的4点主要区别
  15. 移动安全-安卓Smail代码入门讲解
  16. tp5微信开发(一) ---- 微信公众号配置token
  17. SpringMvc入门学习(IDEA创建SpringMVC项目)
  18. 人类历史上最智慧的169条警世箴言(句句珠玑,发人深省)
  19. 深度学习中的几大模型
  20. Spring----Spring入门

热门文章

  1. 第二课 运算符(day10)
  2. 『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)
  3. ThinkPHP简单的验证码实现
  4. BootstrapValidator验证
  5. android 中如何模拟back键
  6. iOS- 如何改变section header
  7. 提高表格可读性的一些技巧
  8. javascript实例_网页空降与抖动
  9. PP团队圣经巨著《Application Architecture Guide2.0》14章-数据访问层
  10. 〈转贴〉如何解决 Windows XP 中的硬件和软件驱动程序问题