神经网络常见激活函数 1-sigmoid函数

sigmoid

1 函数+求导
  • sigmoid函数
    σ ( x ) = 1 1 + e ( − x ) \sigma(x) = \frac{1}{1+e^{(-x)}} σ(x)=1+e(x)1

  • sigmoid函数求导
    d d x σ ( x ) = d d x ( 1 1 + e − x ) = e − x ( 1 + e − x ) 2 = ( 1 + e − x ) − 1 ( 1 + e − x ) 2 = 1 1 + e − x − 1 ( 1 + e − x ) 2 = σ ( x ) − σ ( x ) 2 = σ ( x ) ( 1 − σ ( x ) ) \begin{aligned} \frac{d}{dx}\sigma(x) & = \frac{d}{dx}\left( \frac{1}{1+e^{-x}} \right) \\ & = \frac{e^{-x}}{(1+e^{-x})^2} \\ & = \frac{(1+e^{-x})-1}{(1+e^{-x})^2} \\ & = \frac{1}{1+e^{-x}} - \frac{1}{(1+e^{-x})^2} \\ & = \sigma(x)-\sigma(x)^2 \\ & = \sigma(x)(1-\sigma(x)) \end{aligned} dxdσ(x)=dxd(1+ex1)=(1+ex)2ex=(1+ex)2(1+ex)1=1+ex1(1+ex)21=σ(x)σ(x)2=σ(x)(1σ(x))
    在神经网络的梯度计算中,通过缓存每层的 Sigmoid 函数输出值,即可在需 要的时候计算出其导数.

2 函数和导函数图像
  • 画图

    import pandas as pd
    import numpy as np
    from matplotlib import pyplot as pltdef sigmoid(x):return 1/(1+np.exp(-x))x = np.linspace(-4,4,1000)
    y = [sigmoid(i) for i in x]
    y1 = [sigmoid(i)*(1-sigmoid(i)) for i in x]
    y2  = [1 for i in x]ax = plt.gca()
    plt.plot(x,y,label='Sigmoid')
    plt.plot(x,y1,label='Derivative')
    plt.plot(x,y2,color='black',linestyle='--')#设置上边和右边无边框
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    #设置x坐标刻度数字或名称的位置
    ax.xaxis.set_ticks_position('bottom')
    #设置边框位置
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data',0))plt.legend(loc = 6)

    image-20220119000123191

3 优缺点
  • sigmoid 函数优点:

    1. 值域为 [ 0 , 1 ] [0,1] [0,1],适合输出概率值sigmoid 函数的值域为 ( 0 , 1 ) (0,1) (0,1),非常适合作为模型的输出函数,用于输出 ( 0 , 1 ) (0,1) (0,1) 范围内的概率值。它可以用于将预测概率作为输出的模型(如风控中的评分卡、逻辑回归等),例如表示二分类的类别概率或置信度。

    2. 输出值限定在 0 到 1,对神经元输出进行归一化

      由于 sigmoid 函数的输出范围是 ( 0 , 1 ) (0,1) (0,1),它对每个神经元的输出进行了“软”归一化,将任意实数输入压缩到 ( 0 , 1 ) (0,1) (0,1) 之间。(这里注意sigmoid和softmax的区别,经过sigmoid的所有输出加起来不等于1)

    3. 连续可导,提供平滑的梯度值sigmoid 函数是连续可导的(即可微),能够提供非常平滑的梯度值,防止模型训练过程中出现突变的梯度(即避免“跳跃”的输出值)。

  • sigmoid 函数缺点:

    1. 梯度消失问题:从 sigmoid 函数的导数图像可以看出,其导数的最大值只有 0.25。当输入 x x x [ − 5 , 5 ] [-5,5] [5,5] 的范围之外时,导数值几乎接近于 0。这种情况会导致训练过程中神经元处于饱和状态(即导数趋于 0),反向传播时权重几乎得不到更新,从而使得模型难以训练,这种现象被称为梯度消失问题。
    2. 输出不以 0 为中心sigmoid 函数的输出总是大于 0(即不以 0 为中心),这会降低权重更新的效率。下一层神经元会接收到上一层输出的全正信号作为输入,导致权重更新时出现“zig-zag”现象。因此,sigmoid 激活函数通常不适合放在神经网络的隐藏层,而一般用于最后的输出层。
    3. 计算量大及计算复杂度高sigmoid 函数需要进行指数运算,计算量较大且计算复杂度高,训练耗时。此外,随着输入值的增大,sigmoid 函数的导数会迅速减小,容易产生梯度消失问题。
  • 补充说明:

    1. 梯度消失问题sigmoid 函数在深层神经网络中容易导致梯度消失问题,但在浅层网络或输出层中使用时,这个问题的影响相对较小。因此,sigmoid 函数通常用于输出层,而不是隐藏层。**
    2. 替代方案:在现代深度学习中,ReLU(Rectified Linear Unit)及其变体(如 Leaky ReLUELU 等)通常被用作隐藏层的激活函数,因为它们能够有效缓解梯度消失问题,并且计算速度更快。
    3. zig-zag 现象:具体来说,当激活函数的输出不以 0 为中心(如 sigmoid 函数的输出总是大于 0),会导致反向传播时梯度的更新方向不一致,从而使得权重在优化过程中沿着“锯齿形”路径缓慢收敛。
4 pytorch 中的sigmoid函数
  • 代码

    import torchf = torch.nn.Sigmoid()
    x = torch.randn(2)sigmoid_x = f(x)
    print(f"x: \n{x}")
    print(f"sigmoid_x:\n{sigmoid_x}")"""输出"""
    x: 
    tensor([ 0.0259, -2.4006])
    sigmoid_x:
    tensor([0.5065, 0.0831])
    

5 tensorflow中的sigmoid函数
  • 代码

    python: 3.10.9

    tensorflow: 2.18.0

    import tensorflow as tff = tf.nn.sigmoid
    x = tf.random.normal([2])sigmoid_x = f(x)
    print(f"x: \n{x}")
    print(f"sigmoid_x:\n{sigmoid_x}")"""输出"""
    x:
    [-1.2805938 -1.4400458]
    sigmoid_x:
    [0.21744916 0.19153824]
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工

目录 决策树&#xff1a;代码设计代码&#xff1a; 决策树&#xff1a; 代码设计 代码&#xff1a; class Solution {boolean[][] vis;int ret,m,n;public int getMaximumGold(int[][] grid) {m grid.length;n grid[0].length;vis new boolean[m][n]; for(int i 0; i <…

rabbitMQ消息转换器

消息转换器 Spring的消息发送代码接收的消息体是一个Object&#xff1a; 而在数据传输时&#xff0c;它会把你发送的消息序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;还会把字节反序列化为Java对象。 只不过&#xff0c;默认情况下Spring采用的序列化方式是J…

Java 如何覆盖第三方 jar 包中的类

目录 一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理 背景&#xff1a; 在我们日常的开发中&#xff0c;经常需要使用第三方的 jar 包&#xff0c;有时候我们会发现第三方的 jar 包中的某一个类有问题&#xff0c;或者我们需要定制化修改其中的逻辑&#xff0c…

CS 与 BS 架构的差异

在数字化的今天&#xff0c;选择软件架构模式对系统的性能、维护、安全和成本都有很大影响。BS架构和CS架构是最常见的两种模式&#xff0c;了解它们的区别和特点对开发人员和企业决策者都很重要。 CS架构最早出现&#xff0c;当时用户直接从主机获取数据。随着客户端和服务端…

HTML之table表格学习

HTML table使用 thead、tbody、tfoot均可省略&#xff1b; 浏览器解析的时候会自动套上tbody tr 行 td 列 th 标题列属性 colspan 列占用数 rowspan 行占用数 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

常用抓包工具tcpdump、Fiddler、Charles、Wireshark 和 Sniffmaster 下载地址

抓包大师官网下载地址 Sniff Master Download - Free TCP and HTTPS Proxy Sniffing Tool, Supports IOS Sniffing Fiddler classic官网下载地址 Download Fiddler Web Debugging Tool for Free by Telerik Fiddler Everywhere官网下载地址 The Ultimate Web Debugging Tool …

【PostgreSQL内核学习 —— (WindowAgg(二))】

WindowAgg WindowAggState 结构体窗口聚合行为ExecInitWindowAgg 函数ExecWindowAgg 函数代码逻辑解释&#xff1a;计算窗口偏移量代码逻辑详细解释&#xff1a; 代码逻辑解释&#xff1a;窗口聚合分区初始化与行推进逻辑代码逻辑详细解释&#xff1a; 代码逻辑解释&#xff1a…

区块链项目孵化与包装设计:从概念到市场的全流程指南

区块链技术的快速发展催生了大量创新项目&#xff0c;但如何将一个区块链项目从概念孵化成市场认可的产品&#xff0c;是许多团队面临的挑战。本文将从孵化策略、包装设计和市场落地三个维度&#xff0c;为你解析区块链项目成功的关键步骤。 一、区块链项目孵化的核心要素 明确…

【React】受控组件和非受控组件

目录 受控组件非受控组件基于ref获取DOM元素1、在标签中使用2、在组件中使用 受控组件 表单元素的状态&#xff08;值&#xff09;由 React 组件的 state 完全控制。组件的 state 保存了表单元素的值&#xff0c;并且每次用户输入时&#xff0c;React 通过事件处理程序来更新 …

C#开发的进销存管理系统软件

#### 介绍 进销存管理系统实现的功能及用途 含模块销售管理、采购管理、存货管理、库存管理、账款管理、用户管理、职员管理七个部分 进销存管理系统实现以下功能&#xff1a; 1. 库存管理 2. 应付账款和应收账款的统计 3. 对订单未结数量和采购单未结数量的统计 4. 权限的管理…

高性能 AI 处理器亲和性调度算法实现

目录 题目描述解题思路分析C 语言实现 生成组合的函数主程序实现C 语言代码使用示例Python 实现 生成组合的函数主程序实现Python 代码使用示例总结与展望题目描述 某公司研发的高性能 AI 处理器,每台物理设备 a 包含 8 颗 AI 处理器,编号为 0 - 7。其中,编号 0 - 3 的处理…

快手ip属地是定位吗?怎么改

在当今数字化时代&#xff0c;随着网络平台的不断发展&#xff0c;用户隐私和数据安全成为了公众关注的焦点。各大社交媒体平台纷纷推出的“IP属地”功能&#xff0c;无疑为网络环境增添了一抹新的色彩。其中&#xff0c;快手的IP属地显示功能尤为引人注目。那么&#xff0c;快…

Git 常用基础命令详解:init、add、commit

一、引言 在软件开发的世界里&#xff0c;版本控制是一项至关重要的技术&#xff0c;它就像是一个时光机器&#xff0c;让开发者能够追踪代码的每一次变化&#xff0c;轻松回溯到任意历史版本&#xff0c;同时也为多人协作开发提供了强大的支持。而 Git&#xff0c;作为目前最…

1-kafka服务端之延时操作前传--时间轮

文章目录 背景时间轮层级时间轮时间轮降级kafka中的时间轮kafka如何进行时间轮运行 背景 Kafka中存在大量的延时操作&#xff0c;比如延时生产、延时拉取和延时删除等。Kafka并没有使用JDK自带的Timer或DelayQueue来实现延时的功能&#xff0c;而是基于时间轮的概念自定义实现…

从零开始:OpenCV 图像处理快速入门教程

文章大纲 第1章 OpenCV 概述 1.1 OpenCV的模块与功能  1.2 OpenCV的发展 1.3 OpenCV的应用 第2章 基本数据类型 2.1 cv::Vec类 2.2 cv&#xff1a;&#xff1a;Point类 2.3 cv&#xff1a;&#xff1a;Rng类 2.4 cv&#xff1a;&#xff1a;Size类 2.5 cv&#xff1a;&…

网络工程师 (22)网络协议

前言 网络协议是计算机网络中进行数据交换而建立的规则、标准或约定的集合&#xff0c;它规定了通信时信息必须采用的格式和这些格式的意义。 一、基本要素 语法&#xff1a;规定信息格式&#xff0c;包括数据及控制信息的格式、编码及信号电平等。这是协议的基础&#xff0c;确…

vue如何解决跨域

文章目录 vue如何解决跨域1. 什么是跨域2. 如何解决2.1 CROS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨域资源共享&#xff09;2.2 Proxy2.2.1 使用webpack proxy2.2.2 服务端代理转发2.2.3 通过nginx实现代理 vue如何解决跨域 1. 什么是跨域 跨域本质是浏览器…

算法与数据结构(括号匹配问题)

思路 从题干可以看出&#xff0c;只要给出的括号对应关系正确&#xff0c;那么就可以返回true,否则返回false。这个题可以使用栈来解决 解题过程 首先从第一个字符开始遍历&#xff0c;如果是括号的左边&#xff08;‘&#xff08;‘&#xff0c;’[‘&#xff0c;’}‘&…

在linux 中搭建deepseek 做微调,硬件配置要求说明

搭建 可参考 使用deepseek-CSDN博客 官方网站&#xff1a;DeepSeek DeepSeek 是一个基于深度学习的开源项目&#xff0c;旨在通过深度学习技术来提升搜索引擎的准确性和效率。如果你想在 Linux 系统上搭建 DeepSeek&#xff0c;你可以遵循以下步骤。这里我将提供一个基本的指…

mounted钩子函数里如何操作子组件的DOM?

在 Vue 的 mounted 钩子函数中,操作子组件的 DOM 可以通过几种方式实现,具体取决于对子组件的访问方式。以下是一些常用的方法: 一、使用 ref 引用 定义 ref在父组件中,给子组件添加一个 ref 属性,这样就可以在父组件中通过 this.$refs 访问到子组件的实例。 父组件示例…