当前位置: 首页 > news >正文

【1.2】神经网络:神经元与激活函数

作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏: 神经网络(随缘更新)
特色专栏: 知识分享
🥭本文内容:【1.2】神经网络:神经元与激活函数
📚 ** ps **  : 阅读这篇文章如果有问题或者疑惑,欢迎各位在评论区提问或指出!

 -----------------------------------------------------       目录       ---------------------------------------------------------

目录

一、介绍

1. 简介

神经元

激活函数

2. 作用

神经元

激活函数

二、常见激活函数分类及特点

阶跃函数

恒等函数

Sigmoid 函数

ReLU函数

Softmax函数

ELU函数

Swish函数

反正切函数

 三、激活函数选择

非线性变换能力

梯度消失问题

计算效率

稀疏激活性

任务特性

实验和经验

四、激活函数改进

参数化激活函数

自适应激活函数

门控激活函数

带参数的激活函数

多阶段激活函数

五、 神经元和激活函数的组合

全连接层

卷积层

池化层

 六、神经元和激活函数的优化

正则化

批归一化

 残差连接

激活函数的选择


---------------------------------------------------------------------------------------------------------------------------------

一、介绍

1. 简介

神经元

人工神经网络是模拟人脑系统工作原理进行设计的计算模型。它包含很多(模拟)神经元,每个神经元接收来自其它神经元的输入,并通过激活函数处理这些输入,然后产生输出。



神经元通常由三部分组成:

  1. 输入层:接受来自其它神经元或外部输入的信号。
  2. 权重:每个输入信号都有一个权重与之对应,用于调节该信号对神经网络输出的影响程度。
  3. 激活函数:接收加权输入信号的总和,并将其映射到一个特定的输出范围内。

激活函数

神经元中,输入的的inputs通过加权,求和后,还会被作用一个函数,这个函数就是激活函数,它决定了神经元输出形式和范围。

2. 作用

神经元

每个神经元都有一个权重参数,用于调整输入数据的权重。神经元对输入数据进行加权求和,并将结果传递给激活函数。可以将它看作是神经网络中的基本单位。


激活函数

激活函数对于人工神经网络的学习,理解非常复杂和非线性函数来说具有重要的作用。它让神经元不会止步于线性的数学运算(没有激活函数的每层相当于矩阵相乘,就算增加若干层,无非也还是简单的矩阵相乘法罢了),而是让输入输出之间通过非线性形成更加复杂的关系,有效提高学习效率,使神经网络更加强大。

二、常见激活函数分类及特点

神经网络的激活函数通常是一种非线性函数,用于引入非线性特征,提高神经网络的表达能力,常见的神经网络激活函数分类:

  • 阶跃函数

    • 二元阶跃函数:将输入值映射为两个离散的输出值,通常是0和1。它在输入大于等于某个阈值时输出1,否则输出0。
    • 双曲正切阶跃函数:一个连续的版本,将输入值映射到[-1, 1]的范围内。它在输入大于等于某个阈值时输出1,小于该阈值时输出-1。
  • 恒等函数

    • 一种简单的线性函数,它将输入值原样输出。在神经网络中,恒等函数常用于回归问题。
  • Sigmoid 函数

    • Logistic 函数一种常用的Sigmoid函数,将输入值映射到[0, 1]的范围内。它具有平滑的S形曲线,常用于二分类问题和概率估计。
    • 双曲正切函数:将输入值映射到[-1, 1]的范围内。与Logistic函数相比,它的输出范围更广,适用于更广泛的问题。
  • ReLU函数

    • 一种非常简单且广泛使用的激活函数,它将负值映射为0,并保持正值不变。这使得ReLU函数在处理大规模数据和深层网络时非常高效。
      • Leaky ReLU函数:对ReLU函数的改进,当输入为负值时,它引入一个小的斜率,以避免出现“神经元死亡”问题。
      • Parametric ReLU函数:Leaky ReLU的扩展版本,它允许斜率成为可学习的参数。
      • Randomized Leaky ReLU函数:在Parametric ReLU的基础上引入了随机性,以增加模型的鲁棒性。
  • Softmax函数

    • Softmax函数用于多分类问题,将一组实数映射到[0, 1]的范围内,并且所有输出值的总和等于1。它常用于输出层,将神经网络的原始输出转换为概率分布。
  • ELU函数

    • 在负值区域引入了指数增长的特性,以解决ReLU函数在负值部分的限制。相比于ReLU,ELU函数在某些情况下可以提供更好的训练性能。
  • Swish函数

    • 一种近似于ReLU的激活函数,它在正值区域具有ReLU的性质,在负值区域引入了平滑的曲线。Swish函数在一些情况下可以提供更好的性能。
  • 反正切函数

    • 将输入值映射到[-π/2, π/2]的范围内。它是一个平滑的、具有对称性的函数,常用于某些特定的问题领域。


 三、激活函数选择

没有一种激活函数可以用于所有情况,通常情况下,激活函数的选择可以考虑下面几个方面:

  1. 非线性变换能力

    激活函数应该具有一定的非线性变换能力,以便神经网络可以学习非线性模式和复杂关系。常见的非线性激活函数如sigmoid、tanh、ReLU等。
  2. 梯度消失问题

    某些激活函数(如sigmoid和tanh)在输入较大或较小时,梯度会接近于零,导致梯度消失的问题。为了避免这个问题,可以选择具有更好梯度传播性质的激活函数,如ReLU、Leaky ReLU、ELU等。
  3. 计算效率

    激活函数的计算效率也是一个考虑因素。一些激活函数(如sigmoid和tanh)在计算上相对较慢,尤其是在大规模神经网络中。相比之下,ReLU和其变种计算速度更快。
  4. 稀疏激活性

    某些激活函数具有稀疏激活性,即只有部分神经元被激活,这有助于减少网络的参数数量和计算复杂度。例如,稀疏自编码器常使用稀疏激活函数如稀疏ReLU。
  5. 任务特性

    不同的任务可能对激活函数有不同的要求。例如,对于二分类问题,sigmoid函数在输出层上常被使用,而对于多分类问题,softmax函数更为常见。
  6. 实验和经验

    激活函数的选择也可以基于实验和经验。根据具体的任务、数据集和网络结构,通过尝试不同的激活函数并进行实验评估,找到最适合的激活函数。

四、激活函数改进

改进激活函数主要是为了提高网络性能和效率,常见的激活函数改进方法有下面这些:

  1. 参数化激活函数

    传统的激活函数是非参数化的,即没有可学习的参数。而参数化激活函数则引入了可学习的参数,使得激活函数可以根据数据进行自适应调整。例如,PReLU(Parametric ReLU)通过引入一个可学习的负斜率参数来改进ReLU,可以在一定程度上缓解ReLU的负数部分输出为零的问题。
  2. 自适应激活函数

    自适应激活函数是指根据输入数据动态调整激活函数的形状和参数。例如,AdaReLU(Adaptive ReLU)通过引入一个可学习的阈值参数,根据输入数据动态调整ReLU的形状,可以提高ReLU在不同数据分布下的表现。
  3. 门控激活函数

    门控激活函数是指通过引入门控机制来控制激活函数的输出。例如,GELU(Gaussian Error Linear Units)通过引入门控机制,可以在一定程度上缓解ReLU的负数部分输出为零的问题,并提高网络的性能。
  4. 带参数的激活函数

    带参数的激活函数是指在激活函数中引入额外的参数,以提高激活函数的表达能力和灵活性。例如,Swish激活函数通过引入一个可学习的参数,可以在一定程度上提高网络的性能。
  5. 多阶段激活函数

    多阶段激活函数是指将激活函数分为多个阶段,每个阶段使用不同的激活函数。例如,SELU(Scaled Exponential Linear Units)通过引入多个阶段的激活函数,可以提高网络的性能和稳定性。

五、 神经元和激活函数的组合

神经元是构成神经网络的基本单元,激活函数则是神经元中的一个重要组成部分。将神经元和激活函数组合起来,可以构建出不同类型的神经网络,包括全连接层、卷积层和池化层等。

下面简单介绍一下不同类型的层是如何组合的:

  1. 全连接层

    在全连接层中,每个神经元都与上一层的所有神经元相连接。每个连接都有一个权重,用于调整输入的重要性。神经元的输入是上一层神经元的输出乘以对应的权重之和。然后,这个加权和会经过激活函数的处理,得到神经元的输出。
  2. 卷积层

    在卷积层中,神经元只与输入数据的局部区域相连接。每个神经元有一个局部感受野(receptive field),它会与输入数据的对应区域进行卷积操作。卷积操作将局部感受野的输入与权重进行乘积求和,并通过激活函数进行处理,得到神经元的输出。
  3. 池化层

    在池化层中,神经元的作用是对输入数据进行降采样,减少数据的维度和计算量。常见的池化操作包括最大池化和平均池化。神经元在池化层中没有可学习的参数,它的作用仅仅是对输入数据进行池化操作,并将池化后的结果作为输出。

 六、神经元和激活函数的优化

实际中如果需要提高神经网络的性能和训练效果。通常会优化神经元和激活函数,常见方式包括正则化、批归一化和残差连接。下面是一些对它们的一些简单介绍:

正则化

通过在损失函数中添加正则项来控制模型的复杂度,避免过拟合。常见的正则化方法有L1正则化和L2正则化。

  1. L1正则化:将L1范数乘以一个正则化参数λ加到损失函数中,强制使得一些权重变为0,从而实现特征选择和稀疏性。
  2. L2正则化:将L2范数乘以一个正则化参数λ加到损失函数中,惩罚权重的平方和,使得权重值趋向于较小的值,防止过拟合。

批归一化

一种在深度神经网络中广泛使用的技术,通过对每一层的输入进行归一化来加速网络的收敛和提高泛化能力

  1. 批归一化的操作是在每一层的输入上进行的,将输入减去均值后再除以标准差,使得输入的均值为0,方差为1。
  2. 批归一化不仅可以加速网络的收敛,还有正则化的效果,能够一定程度上避免过拟合。

 残差连接

一种用于解决梯度消失和网络退化问题的技术,通过直接将某一层的输出与之前某一层的输入相加,使得信息能够更容易地传递。

  1. 残差连接可以有效地减少梯度消失的问题,使得网络能够更深更容易训练。
  2. 残差连接也有助于提高网络的表达能力,使得网络可以学习到更复杂的特征。

激活函数的选择

通过引入非线性,增加网络的表达能力。常见的激活函数包括Sigmoid、ReLU、Leaky ReLU、ELU等。

  1. Sigmoid函数:将输入映射到一个介于0和1之间的值,但它存在梯度饱和和输出不以0为中心的问题,不适合在深度神经网络中使用。
  2. ReLU函数:ReLU函数在正区间上输出输入值,而在负区间上输出0,解决了梯度饱和问题,但存在神经元死亡的问题。
  3. Leaky ReLU函数:在负区间上不是输出0,而是输出一个小的负数,解决了神经元死亡问题。
  4. ELU函数:在负区间上输出一个接近于0的值,解决了ReLU函数在负区间上不平滑的问题。


最后,

        后续内容会陆续更新,希望文章对你有所帮助!

相关文章:

【1.2】神经网络:神经元与激活函数

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 神经网络(随缘更新) ✨特色…...

【PythonRS】Pyrsgis库安装+基础函数使用教程

pyrsgis库是一个用于处理地理信息系统(GIS)数据的Python库。它提供了一组功能强大的工具,可以帮助开发人员使用Python语言创建、处理、分析和可视化GIS数据。通过使用pyrsgis库,开发人员可以更轻松地理解和利用地理信息。 pyrsgis库包含了许多常见的GIS操…...

线扫相机DALSA--分频倍频计算公式及原理

分频倍频计算公式及原理 推导原理: 假设编码器脉冲精度为P;同步轮/辊周长为C,Fov为视野,Res为线扫相机分辨率,N代表N倍频编码器,分频为D,倍频为M 线扫项目常规采用N(N 4&#xff0…...

1818_ChibiOS的计数信号量

全部学习汇总: GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 之前见过计数信号量,也是在FreeRTOS中看到的。也看到过这样的功能在驱动设计中的应用,但是当时没有理解这个使用的方式。 1.…...

企业微信接入芋道SpringBoot项目

背景:使用芋道框架编写了一个数据看板功能需要嵌入到企业微信中,方便各级人员实时观看 接入企业微信的话肯定不能像平常pc端一样先登录再根据权限看页面,不然的话不如直接手机浏览器打开登录账号来得更为方便,所以迎面而来面临两…...

群晖上搭建teamspeak3语音服务器

什么是 TeamSpeak ? TeamSpeak (简称 TS)是一款团队语音通讯工具,但比一般的通讯工具具有更多的功能而且使用方便。它由服务器端程序和客户端程序两部分组成,如果不是想自己架设 TS 服务器,只需下载客户端程…...

Python爬虫(二十四)_selenium案例:执行javascript脚本

本章叫介绍如何使用selenium在浏览器中使用js脚本,更多内容请参考:Python学习指南 隐藏百度图片 #-*- coding:utf-8 -*- #本篇将模拟执行javascript语句from selenium import webdriver from selenium.webdriver.common.keys import Keysdriver webdri…...

Devops团队

DevOps(Development 和 Operations的缩写)是一种软件开发和运维(IT运营)之间协作和沟通的文化、原则和实践。DevOps团队是专注于实施DevOps原则的团队,旨在促进软件开发和运维之间的紧密协作,以加速软件交付…...

力扣labuladong——一刷day10

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣76. 最小覆盖子串二、力扣567. 字符串的排列三、力扣438. 找到字符串中所有字母异位词四、力扣3. 无重复字符的最长子串 前言 一、力扣76. 最小覆盖子串…...

https下载图片

OpenSSL用法示例 OpenSSL源码安装 对于ubuntu,懒得编译源码可以直接安装 sudo apt-get install libssl–dev /usr/include/openssl/ssl.h CMakeLists中添加 link_libraries(ssl crypto) apt-get安装不需要再制定libssl.a, libcrypto.a的路径了, 就像用libc标…...

二叉树的后续遍历(迭代法)

迭代法实现二叉树的后续遍历 1、递归版本 public static void dfs(TreeNode root){if(rootnull){return;}if(root.left!null)dfs(root.left);if(root.right!null)dfs(root.right);System.out.println(root.val); }从递归版本可以看出我们第一步需要遍历完所有的左节点 这里我…...

CVE-2021-41773/42013 apache路径穿越漏洞

影响范围 CVE-2021-41773 Apache HTTP server 2.4.49 CVE-2021-42013 Apache HTTP server 2.4.49/2.4.50 漏洞原理 Apache HTTP Server 2.4.49版本使用的ap_normalize_path函数在对路径参数进行规范化时会先进行url解码,然后判断是否存在…/的路径穿越符&#xf…...

前端性能测试工具WebPagetest

简介:一款web性能在线性能评测工具,可测试有关页面在各种条件下的性能,并且提供深入诊断信息。 WebPagetest 的主页:https://www.webpagetest.org/,也就是工具的使用界面。 注意:WebPageTest 并不是完全免…...

易语言软件定制软件开发脚本开发协议软件电脑网站APP应用视频制作工程制作

随着信息技术的不断发展,易语言软件定制开发已成为许多公司的一项重要业务。本文将探讨如何利用易语言承接软件定制软件开发脚本开发协议软件电脑网站APP应用视频制作工程制作。 一、易语言概述 易语言是一种简单易学的编程语言,它采用中文编程&#xff…...

Windows上配置IP端口转发

在通常涉及到使用网络地址转换(NAT)规则,可以使用一些工具和命令行选项来实现。以下是在Windows上配置端口转发的一般步骤: **注意:端口转发需要管理员权限,因此请确保以管理员身份运行命令行工具。** 1.…...

韦东山D1S板子——汇编启动代码第一行分析(.long 0x0300006f)

1、汇编启动源码 2、分析二进制&#xff1a;0x0300006f 2.1、反汇编代码 2.2、jal指令 jal指令的作用&#xff1a;跳转到当前PC值偏移offset处执行&#xff0c;其中offset由jal指令的bi[31:12]表示&#xff1b; 2.3、分析指令&#xff1a;j 20030 <reset> j 20030 //伪…...

了解单域名证书和通配符证书的区别,选择合适的SSL证书解决方案

随着互联网的不断发展&#xff0c;网站安全性问题一直备受关注&#xff0c;在保护网站数据安全的过程中&#xff0c;SSL证书一直发挥着至关重要的作用。而在选择SSL证书时&#xff0c;单域名证书和通配符证书是两种常见的选择。本文将详细介绍单域名证书和通配符证书的区别&…...

【LeetCode】7. 整数反转

题目链接 文章目录 Python3官方解法 ⟮ O ( ∣ x ∣ ) 、 O ( 1 ) ⟯ \lgroup O(|x|)、O(1)\rgroup ⟮O(∣x∣)、O(1)⟯写法2写法3 C官方解法 ⟮ O ( ∣ x ∣ ) 、 O ( 1 ) ⟯ \lgroup O(|x|)、O(1)\rgroup ⟮O(∣x∣)、O(1)⟯ Python3 官方解法 ⟮ O ( ∣ x ∣ ) 、 O ( 1…...

防止请求重复提交:注解+拦截器的实现方案

文章目录 了解请求重复提交解决思路具体实现 了解请求重复提交 请求重复提交是指用户在一次请求还未处理完成时&#xff0c;重复提交了相同的请求。这种情况通常发生在网络延迟、用户误操作或系统性能不佳等情况下。 请求重复提交可能会导致以下问题和影响&#xff1a; 数据不…...

C#使用mysql-connector-net驱动连接mariadb报错

给树莓派用最新的官方OS重刷了一下&#xff0c;并且用apt install mariadb-server装上“mysql”作为我的测试服务器。然后神奇的事情发生了&#xff0c;之前用得好好的程序突然就报错了&#xff0c;经过排查&#xff0c;发现在连接数据库的Open阶段就报错了。写了个最单纯的Con…...

SpringBoot 定时任务:@EnableScheduling @Scheduled

Scheduled注解参数 cron参数 这个参数是最经常使用的参数&#xff0c;表示接收一个cron参数&#xff0c;cron它是一个表达式&#xff0c;最多接收7个参数&#xff0c;从左到右分别表示&#xff1a;秒 分 时 天 月 周 年&#xff1b;参数以空格隔开&#xff0c;其中年不是必须参…...

Jquery 如何获取子元素。如何找到所有 HTML select 标签的选中项。jQuery 里的 ID 选择器和 class 选择器有何不同

可以使用 jQuery 的子选择器&#xff08;Child Selector&#xff09;或 find() 方法来获取子元素。 子选择器&#xff08;Child Selector&#xff09;&#xff1a; 使用父元素的选择器和 > 符号来选取该父元素的子元素。 例如&#xff1a;选取 id 为 parent 的元素内所有 cl…...

Python Selenium 之数据驱动测试的实现!

数据驱动模式的测试好处相比普通模式的测试就显而易见了吧&#xff01;使用数据驱动的模式&#xff0c;可以根据业务分解测试数据&#xff0c;只需定义变量&#xff0c;使用外部或者自定义的数据使其参数化&#xff0c;从而避免了使用之前测试脚本中固定的数据。可以将测试脚本…...

【Proteus仿真】【STM32单片机】智能语音家居陪护机器人

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用OLED显示模块、红外传感器、蜂鸣器、DS18B20温度传感器&#xff0c;风扇LED、语音识别模块等。 主要功能&#xff1a; 系统运行后&#xff0c;…...

C#上位机序列10: 批量读写+点对点更新+数据类型处理

一、源码结构 二、运行效果 三、源码解析 PLC批量读写点对点更新数据类型处理 优点&#xff1a;根据数据类型&#xff0c;判定监听的地址范围&#xff08;40120_int 监听两个word&#xff1a;40120 40121&#xff1b;40130_long 监听四个word&#xff1a;40130 40131 40132 4…...

MySQL 概述 数据库表操作 数据增删改

目录 MySQL概述前言安装与配置MySQL登录与卸载 数据模型概述SQL简介SQL通用语法简介SQL分类 数据库设计(数据库操作)-DDL数据库操作查询数据库 show databases、select database()创建数据库 create database使用数据库 use删除数据库 drop database 图形化工具连接数据库操作数…...

存储器概述

一、存储系统基本概念...

Fabric.js 使用自定义字体

本文简介 点赞 关注 收藏 学会了 如果你使用 Fabric.js 做编辑类的产品&#xff0c;有可能需要给用户配置字体。 这次就讲讲在 Fabric.js 中创建文本时怎么使用自定义字体、在项目运行时怎么修改字体、以及推荐一个精简字体库的工具。 学习本文前&#xff0c;你必须有一点…...

【C++项目】高并发内存池第七讲性能分析

目录 1.测试代码2.代码介绍3.运行结结果 1.测试代码 #include"ConcurrentAlloc.h" #include"ObjectPool.h" #include"Common.h" void BenchmarkMalloc(size_t ntimes, size_t nworks, size_t rounds) {std::vector<std::thread> vthread(…...

【JavaScript】快速学习JS

JS区分大小写&#xff0c;后面的分号可有可无&#xff1b; 输出语句 window.alter() // 写入警告框&#xff1b;在浏览器中的警告弹窗输出 document.write() // 写入html输出&#xff1b;在html页面中输出 console.log() // 写入浏览器控制台&#xff1b;在控制台输出 变量…...