神经网络中常见的激活函数

深度学习中已经成为了人工智能领域的必备工具,源于人工神经网络的研究,含多个隐藏层的多层感知器就是一种深度学习结构。寻找隐藏层的权重参数和偏置的过程,就是常说的“学习”过程,其遵循的基本原则就是使得网络最终的输出误差最小化。在神经⽹络中,激活函数是必须选择的众多参数之⼀,从而使神经⽹络获得最优的结果和性能。

经常用到的激活函数有哪些呢?如何进行选择呢?

关于激活函数

激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端,激活函数将神经网络中将输入信号的总和转换为输出信号。激活函数大多是非线性函数,才能将多层感知机的输出转换为非线性,使得神经网络可以任意逼近任何非线性函数,进而可以应用到众多的非线性模型中。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

图片

也就是说,非线性激活函数可以创建输入与输出键的复杂映射关系,神经网络也能通过“学习”来更新参数。并且,因为非线性函数的导数与输入有关,从而可以通过向后传播算法计算梯度,也可以构建多层神经网络,以处理复杂问题。

常见的激活函数有用于浅层网络的sigmoid 系列,用于深层网络的ReLU系列,用于递归网络的tanh系列以及Softmax 系列等等。

sigmoid 系列

sigmoid函数也叫Logistic函数,用于隐层神经元输出,能将( − ∞ , + ∞ )的数值映射到(0,1)的区间,当以概率形式表示预测值时,一般使用这个函数。sigmod激活函数的Python 代码如下:

import numpy as np

def sigmoid(x):
s = 1 / (1 + np.exp(-x))
return s

函数的图像如下所示:

图片

Sigmoid函数的优点在于它可导,并且值域在0到1之间,使得神经元的输出标准化,是神经网络最早采用的激活函数。它的不足也很明显,在增加或减少到一定程度时,函数值变化很小,这就是所谓的“梯度消失”,致使网络的收敛速度变慢,进而耗费计算资源。另外,输出值不是以0为中心,而是0.5。

一般的Sigmoid 函数应用于浅层网络。

HardSigmoid

在Sigmoid的基础上,又有HardSigmoid,因为当输入值趋向无穷大的时候,输出值趋向于1;当输入值趋向无穷小的时候,输出值趋向于0。所以,顾名思义,HardSigmoid是在Sigmoid的基础上,当输入值超过某个范围强行置1和0。HardSigmoid 的python 代码如下:

def Hard_sigmoid(x):
y = []
for i in x:
if i < -2.5:
y_i = 0
elif i >= -2.5 and i <= 2.5:
y_i = 0.2 * i + 0.5
else:
y_i = 1
y.append(y_i)
return y

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

图片

Swish

swish的表达式为:f ( x ) = x ⋅ s i g m o i d ( b x ),python代码如下:

def Swish(x):
return x / (1 + np.exp(-b*x))

其中b是可学参数, Swish 具备无上界有下界、平滑、非单调的特性。

图片

Swish 在深层模型上的效果优于 ReLU。例如,仅仅使用 Swish 单元替换 ReLU 就能把 Mobile NASNetA 在 ImageNet 上的分类准确率提高 0.9%。

maxout

Maxout可以看做是在深度学习网络中加入一层激活函数层,包含一个参数k。这一层相比ReLU,sigmoid等,其特殊之处在于增加了k个神经元,然后输出激活值最大的值。

图片

maxout是一个函数逼近器,对于一个标准的MLP网络来说,如果隐藏层的神经元足够多,那么理论上是可以逼近任意的函数的。Maxout的拟合能力非常强,可以拟合任意的凸函数,具有ReLU的所有优点,线性、不饱和性,同时没有ReLU的一些缺点,如神经元的死亡。

Relu系列

Relu (Rectified Linear Unit)称为“线性整流函数”或者“修正线性单元”,通常就直接称为 ReLU 函数,是解决梯度消失问题的方法。将 ReLU 函数引入神经网络时,也引入了很大的稀疏性。然而,由于稀疏性,时间和空间复杂度更低,不涉及成本更高的指数运算,允许网络快速收敛。

图片

尽管Relu看起来像线性函数,但它具有导数函数并允许反向传播,python 代码如下:

import numpy as np

def relu(x):
s = np.where(x < 0, 0, x)
return s

ReLU引入了神经元死亡问题,当输入接近零或为负时,函数的梯度变为零,网络将无法执行反向传播,也无法学习,也就是说,网络的大部分分量都永远不会更新,另外,它不能避免梯度爆炸问题。

ReLU是现在DNN模型中比较常用的激活函数。

ELU

指数线性单元激活函数ELU解决了 ReLU 的一些问题,同时也保留了一些好的方面。这种激活函数要选取一个 α 值;常见的取值是在 0.1 到 0.3 之间。但α =0.3时的函数图像如下:

图片

ELU能避免神经元死亡问题,能得到负值输出,这能帮助网络向正确的方向推动权重和偏置变化,在计算梯度时能得到激活,而不是让它们等于 0。ELU 的python 代码如下:

import numpy as np

def elu(x):
s = np.where(x >= 0, x, α(np.exp(x)-1)
return s

但是,由于包含了指数运算,计算时间更长,同样无法避免梯度爆炸问题,另外,神经网络不学习 α 值。

Leaky ReLU

渗漏型整流线性单元激活函数也有一个 α 值,通常取值在 0.1 到 0.3 之间。Leaky ReLU 激活函数很常用,相比于 ELU 也有一些缺陷,但比 ReLU 具有一些优势。

图片

LeakyReLU的负值斜率很小,而不是平坦的斜率。斜率系数需要在训练前确定,即在训练过程中不学习。这种类型的激活函数在可能遇到稀疏梯度的任务中很流行,例如训练生成式对抗网络。

import numpy as np

def lrelu(x):
s = np.where(x >= 0, x, αx)
return s

类似 ELU,Leaky ReLU 也能避免死亡 ReLU 问题,因为其在计算导数时允许较小的梯度,由于不包含指数运算,所以计算速度比 ELU 快。

扩展型指数线性单元激活函数(SELU)

SELU 激活能够对神经网络进行自归一化,归一化就是首先减去均值,然后除以标准差。因此,经过归一化之后,网络的组件(权重、偏置和激活)的均值为 0,标准差为 1,而这正是 SELU 激活函数的输出值。通过归一化,网络参数会被初始化一个正态分布。

图片

通过归一化,网络参数会被初始化一个正态分布。

def SeLU(x,alpha=1.6732632423543772848170429916717,scale=1.0507009873554804934193349852946):
y = []
for i in x:
if i >= 0:
y_i = scale * i
else:
y_i = scale * alpha * (np.exp(i) - 1)
y.append(y_i)
return y

SELU内部归一化的速度比外部归一化快,这意味着网络能更快收敛,而且避免了出现梯度消失或爆炸问题,在CNN或RNN 网络架构中有所应用。

先见AI 先见AI

数据为基,先见未见

先见AI 95 查看详情 先见AI

高斯误差线性单元激活函数GELU

GELU是某些函数(比如双曲正切函数 tanh)与近似数值的组合,

图片

当 x 大于 0 时,输出为 x;但 x=0 到 x=1 的区间除外,这时曲线更偏向于 y 轴。

import numpy as np
def tanh(x):
s1 = np.exp(x) - np.exp(-x)
s2 = np.exp(x) + np.exp(-x)
s = s1 / s2
return s
gelu = lambda x:0.5 * x * (1 + tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * np.power(x, 3))))

GELU 在NLP 领域有较好表现,尤其在 Transformer 模型中表现最好,能避免梯度消失问题。

tanh系列

tanh

Tanh函数,即双曲正切函数,比sigmoid函数更受欢迎,能为多层神经网络提供更好的性能。

图片

它的输出更多地以零为中心,这有助于加速收敛,尤其是在训练初期。双曲线正切函数的python代码如下:

import numpy as np

def tanh(x):
s1 = np.exp(x) - np.exp(-x)
s2 = np.exp(x) + np.exp(-x)
s = s1 / s2
return s

Tanh函数的最大优点是输出值以 0为中心,即关于坐标原点对称,分属为正数和负数两大类别,函数及其导数都是单调的,收敛速度比sigmoid快,从而可以减少迭代次数。这使得它具有了Sigmoid函数的优势,又克服了某些不足。但是,“梯度消失”的问题都还存在,进而导致收敛速度变慢。

Tanh 一般用于递归神经网络。

HardTanh

Hardtanh激活函数是Tanh的线性分段近似。相较而言,它更易计算,这使得学习计算的速度更快,尽管首次派生值为零可能导致静默神经元/过慢的学习速率。

图片

TanhShrink

基于Tanh之上,计算输入输出的差值,即为TanhShrink,函数图像如下。

图片

在当输入在0附近时,梯度近乎为0,而在输入极大或极小时,梯度反而为正常梯度。

softmax 系列

Softmax函数比较适合作为多分类模型的激活函数,一般会与交叉熵损失函数相配。

图片

通常,Softmax函数只应用于输出层,把一堆实数的值映射到0-1区间,并且使他们的和为1,可以理解为对应每个类别对应的预测概率。python代码如下:

def softmax(x):
x_exp = np.exp(x)
x_sum = np.sum(x_exp, axis=1, keepdims=True)
s = x_exp / x_sum
return s

如果某一个zj大过其他z,那这个映射的分量就逼近于1,其他就逼近于0。

图片

Softmax函数用于将输入进行归一化到(0,1),并且其和为1,普遍应用于分类模型(互斥)的预测概率值。事实上,但凡涉及到概率的地方基本都会用到softmax,典型的就比如attention layer当中,都会使用softmax来计算attention值。

LogSoftMax

 LogSoftmax是基于Softmax函数之上,计算其对应的对数值,范围在(-∞,0)用来计算交叉熵损失函数(根据groundtruth的标签取出对应的值即可)。LogSoftMax 加快了运算速度,提高数据稳定性。

Softmin

Softmin是在Softmax的基础上,做相反变换。Softmin是在Softmax的基础上,做相反变换。  跟softmax类似,输入n维t数据,对它们进行重新缩放使得n维输出的每个元素都在[0, 1]区间内,且和为1。不同的是,softmax是单调递增而softmin是单调递减,意味着softmax操作会使得最大的值在激活操作后依然保持最大,而softmin会使得最小的数在经过了softmin后变成最大值。

激活函数的选择

以终为始,激活函数的选择也是为最终的任务目标服务的。不存在普遍适用各种神经网络的万能的激活函数,在选择激活函数的时候,要考虑不同的条件限制,例如,如果函数可导,求导数的计算难度如何?函数光滑程度如何?输出是否保持标准化?网络的收敛速度如何?等等。

一般地,在用于分类器时,Sigmoid函数及其组合通常效果更好。为了避免梯度消失问题,又需要避免使用Sigmoid和TanH。如果是回归模型,在输出层上可以使用线性激活函数。如果是浅层神经网络,如不超过4层的,可选择使用多种激励函数,没有太大的影响。如果网络中存在大量未激活神经元,可以考虑leaky ReLU函数。

ReLU函数是应用比较广泛的激活函数,可以作为默认选项。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。

一个经验上的建议是:SELU > ELU > Leaky ReLU > ReLU> tanh > sigmoid,但是,如果网络的体系结构阻止自归一化,那么 ELU 可能是比 SELU 更好的选择。如果速度很重要,Leaky ReLU 将是比慢很多的 ELU 更好的选择。

更重要的是,激活函数仍在发展,需要跟踪业界的最新进展,并勇于探索和创新。

一句话小结

激活函数是神经网络中的重要参数,一般地,Sigmoid 系列用于二分类任务输出层,softmax系列用于多分类任务输出层,tanh系列用于模型隐藏层,Relu系列用于回归任务以及卷积神经网络隐藏层。但事无绝对,而且,新研究的激活函数仍在涌现。

附,reddit上有一张激活函数的图,挺有意思的!

图片

以上就是神经网络中常见的激活函数的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/567341.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 04:12:15
下一篇 2025年11月10日 04:13:53

相关推荐

  • 如何用HTML插入标签云组件_HTML CSS3变换与随机颜色生成算法

    使用HTML构建标签结构,CSS3添加旋转与过渡效果,JavaScript生成随机HSL颜色并设置字体大小,实现动态交互的标签云组件。 要在网页中实现一个动态的标签云组件,结合 HTML、CSS3 变换和随机颜色生成算法,可以按照以下步骤操作。这个组件不仅能提升页面视觉效果,还能通过色彩和旋转增加交…

    2025年12月23日
    000
  • 如何在Go Gin应用中集成前端JavaScript模块(如Sentry)

    本文探讨了在Go Gin框架下,通过HTML模板服务前端页面时,如何有效集成JavaScript模块(如Sentry)。针对浏览器不直接支持Node.js模块导入语法的问题,文章详细阐述了利用CDN引入Sentry SDK的解决方案,并提供了具体的代码示例,帮助开发者实现前端错误监控功能,避免了复杂…

    2025年12月23日
    000
  • html官网浏览入口_html网站设计免费平台

    html官网浏览入口在https://www.codepen.io,该平台支持实时预览代码、创建Pen项目、Fork开源示例,可添加外部资源,具备点赞评论收藏等社区互动功能,设有挑战活动与作品集分类,开放API接口,界面简洁适合初学者,在线编写无需配置环境,支持多种预处理器和响应式测试。 html官…

    2025年12月23日
    000
  • HTMLPagelinks怎么优化_分页链接SEO优化技巧

    答案是:分页SEO的核心在于通过“查看全部”页面集中权重或构建清晰的内部链接结构来引导搜索引擎理解页面关系。应优先创建“查看全部”页面整合内容,并设置canonical标签指向该页,同时确保分页导航为可抓取的HTML链接,包含前后页、首尾页及附近页码链接,以提升抓取效率、传递权重并改善用户体验,从而…

    2025年12月22日
    000
  • html如何修改日期样式

    在html中,可以使用“::-webkit-datetime-edit”伪元素选择器来修改日期格式,只需要用该选择器选中元素,在设置具体样式即可,具体语法为“::-webkit-datetime-edit{属性:属性值}”。 本教程操作环境:windows7系统、CSS3&&HTML…

    2025年12月21日
    100
  • 单选框的type属性值为什么

    单选框的type属性值为“radio”。html type属性可以规定要显示的输入框“”元素的类型;值为“radio”时显示为单选框、“checkbox”时显示为复选框、“select”时显示为下拉式选框等等。 本教程操作环境:windows7系统、HTML5版、Dell G3电脑。 在HTML中,…

    2025年12月21日
    000
  • HTML中type是什么意思

    在HTML中,type是类型的意思,是一个标签属性,主要用于定义标签元素的类型或文档(脚本)的MIME类型;例在input标签中type属性可以规定input元素的类型,在script标签中type属性可以规定脚本的MIME类型。 本教程操作环境:windows7系统、html5版、Dell G3电…

    2025年12月21日
    000
  • HTML中ul标签如何去掉点?HTML无序列表的样式实例解析

    本篇文章主要讲述的是关于html中的ul标签的默认小点给取消掉,还有关于html的无序列表ul标签的样式解释,给出了ul标签中的type属性三种值的介绍。现在就让我们一起来看本篇文章吧 首先这篇文章一开始我们就开始介绍在html中是怎么把ul标签的点给去掉的: 大家应该都使用过ul无序列表标签,ul…

    2025年12月21日 好文分享
    000
  • html中的ol标签如何去掉标号呢?标签的使用方法总结

    本篇文章介绍了html的ol标签是怎么去掉序号标号的,这里还有代码的详细解释,还有介绍了关于html ol有序列表标签如何更改序号,下文介绍了三种序号,大家也可以自己去想填写怎样的序号。现在来看这篇文章吧 一、我们先看看html中的ol标签是如何去掉标号的呢: 我们都知道html的ol标签是个有序列…

    2025年12月21日 好文分享
    000
  • HTML ul标签的什么意思?HTML ul标签的作用详解

    本篇文章主要的为大家讲解了关于html ul标签的三种重要的用法,还有关于html ul标签的解释,包含li标签的还有type属性对ul标签的使用情况,好了,下面大家一起来看文章吧 首先让我们先来解释一下HTML ul标签的意思: ul标签定义的是表格当中无序列表,表格当中的无序列表都是在 标签之中…

    2025年12月21日
    000
  • javascript的机器学习如何入门_有哪些可用的JavaScript库

    JavaScript适合浏览器端轻量推理与教学,不宜训练大模型;推荐从线性回归、KNN等简单任务入手,优先掌握张量操作、模型流程及Chrome调试技巧。 JavaScript 做机器学习确实可行,但得明确一点:它不适合训练大型模型,更适合在浏览器端做轻量推理、数据预处理、教学演示或与 Web 应用集…

    2025年12月21日
    000
  • javascript框架和库是什么_如何选择React、Vue或Angular?

    JavaScript框架与库分别提供按需调用的功能集合和约束性开发结构;React是UI组件库,生态灵活但需自行整合工具;Vue渐进式易上手,兼顾原型与工程化;Angular是全功能TypeScript框架,适合强规范企业级项目。 JavaScript框架和库是封装好的代码集合,用来简化前端开发——…

    2025年12月21日
    000
  • React应用生产环境环境变量配置深度指南

    本文针对react应用在生产环境中无法读取`.env`文件配置的环境变量问题,深入剖析其工作原理、常见原因及排查方法。通过详细的步骤和示例代码,指导开发者正确配置和使用环境变量,解决api调用层面的`null`响应问题,确保应用在生产环境下的稳定运行。 在React应用开发中,环境变量(如API密钥…

    2025年12月21日
    000
  • JS注解怎么实现文档化_ JS注解生成开发文档的流程与工具

    JSDoc是一种JavaScript结构化注释规范,通过@param、@returns等标签描述代码元素,并借助工具生成HTML文档,结合IDE支持和CI/CD可提升团队协作效率。 JavaScript本身不支持原生注解(Annotation)像Java那样的语法,但通过约定的注释格式和配套工具,可…

    2025年12月21日
    000
  • JS注解怎么标注联合类型_ JS联合类型的注解书写与使用技巧

    在JavaScript中可通过JSDoc使用联合类型注解,如string|number表示多类型支持,结合@param、@typedef等标签提升代码可读性与编辑器提示,适用于函数参数、返回值等场景。 在JavaScript中,虽然原生不支持类型注解,但在使用JSDoc配合现代编辑器(如VS Cod…

    2025年12月21日
    000
  • JavaScript数学计算与数值分析库

    math.js适合日常复杂计算,numeric.js专精数值分析,simple-statistics用于统计分析,TensorFlow.js适用于AI与大规模数值运算。 JavaScript虽然原生支持基本的数学运算,但在处理复杂数学计算、数值分析或科学计算时,依赖第三方库能大幅提升开发效率和计算精…

    2025年12月21日
    000
  • JavaScript机器学习库应用

    答案:JavaScript机器学习库适用于多种场景。TensorFlow.js支持浏览器端图像分类与姿态识别,利用WebGL加速;ML5.js封装简洁,适合初学者快速调用预训练模型;Synaptic.js灵活构建自定义神经网络;Brain.js专注数值预测任务。选择依据为:功能全面选TensorFl…

    2025年12月21日
    100
  • LangChain HNSWLib 向量存储机制与数据持久化指南

    本文详细解析langchain中hnswlib向量存储的工作原理,明确其作为内存存储的特性,指出数据实际存储在项目部署的服务器上,而非langchain官方服务器。同时,文章将指导如何通过save_local()方法将内存中的向量数据持久化到本地文件,确保数据安全与可靠性,并探讨在实际应用中的注意事…

    2025年12月20日
    000
  • VS Code主题开发:告别JSON,拥抱脚本化生成

    vs code主题扩展最终需json格式定义,但开发者可通过javascript或typescript等脚本语言生成此json文件。这种方法有效解决了大型json文件难以维护、不支持注释等问题,并能实现颜色动态计算,显著提升主题开发的灵活性与效率。 为什么选择脚本化生成VS Code主题? 在开发V…

    2025年12月20日
    000
  • 如何用机器学习库(如TensorFlow.js)在浏览器中训练模型?

    完全可行,适合轻量级任务与隐私保护场景。通过CDN引入TensorFlow.js后,使用tf.sequential()构建模型,编译时配置优化器、损失函数等。将数据转为张量并归一化,调用model.fit()训练,支持回调监控。训练后可保存至本地或导出文件,后续加载进行预测。虽计算力受限,但合理设计…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信