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

深度学习激活函数:从Sigmoid到GELU的演变历程——早期激活函数的局限与突破

一、引言

在深度学习领域,激活函数是神经网络中不可或缺的组成部分。它们为神经网络引入了非线性特性,使得网络能够学习到复杂的模式和关系。从早期的Sigmoid函数到如今广泛应用的GELU(Gaussian Error Linear Unit)函数,激活函数经历了漫长的演变历程。本文将深入探讨这一演变过程,重点关注关键概念、核心技巧、应用场景,并通过详细的代码案例分析展示不同激活函数的特点,最后展望其未来发展趋势。

二、关键概念

(一)Sigmoid函数

Sigmoid函数的表达式为 ,它将输入值映射到0到1的区间内。其输出具有平滑的S形曲线,常用于二分类问题的输出层,将神经元的输出解释为概率。

(二)ReLU函数

ReLU(Rectified Linear Unit)函数表达式为 。当输入大于0时,输出等于输入;当输入小于等于0时,输出为0。ReLU函数计算简单,能够有效缓解梯度消失问题,在深度神经网络中被广泛应用。

(三)GELU函数

GELU函数的表达式较为复杂,其核心思想是基于高斯分布对输入进行加权。它考虑了输入与高斯分布的关系,对于输入值较大的部分给予更高的权重,能够更灵活地处理输入信息。

三、核心技巧

(一)选择合适的激活函数

在不同的网络结构和任务中,选择合适的激活函数至关重要。例如,在二分类问题的输出层,Sigmoid函数是常用的选择;而在隐藏层,ReLU函数由于其计算效率和缓解梯度消失的能力,常常被优先考虑;对于一些对输入信息处理要求更灵活的任务,如自然语言处理中的Transformer模型,GELU函数可能表现更优。

(二)避免梯度消失和爆炸

Sigmoid函数在输入值较大或较小时,梯度趋近于0,容易导致梯度消失问题。ReLU函数在一定程度上缓解了这个问题,但在输入为负时梯度为0,可能导致神经元“死亡”。GELU函数通过更平滑的梯度变化,减少了梯度消失和爆炸的风险。

四、应用场景

(一)Sigmoid函数

主要用于二分类问题的输出层,如判断邮件是否为垃圾邮件、疾病诊断中的患病概率预测等。在这些场景中,需要将模型的输出解释为概率值。

(二)ReLU函数

广泛应用于各种深度神经网络的隐藏层,如图像识别、语音识别等领域。其简单的计算方式和良好的性能,使得网络能够快速收敛。

(三)GELU函数

在自然语言处理任务中表现出色,如机器翻译、文本生成等。Transformer模型中就使用了GELU函数作为激活函数,能够更好地处理文本中的语义信息。

五、详细代码案例分析

(一)Sigmoid函数代码实现与分析

import numpy as np
import matplotlib.pyplot as plt# 定义Sigmoid函数
def sigmoid(x):return 1 / (1 + np.exp(-x))# 生成输入数据
x = np.linspace(-10, 10, 100)
y = sigmoid(x)# 绘制Sigmoid函数图像
plt.plot(x, y)
plt.title('Sigmoid Function')
plt.xlabel('x')
plt.ylabel('sigmoid(x)')
plt.grid(True)
plt.show()# 分析代码
# 首先,我们导入了numpy库用于数值计算,matplotlib库用于绘图。
# 定义Sigmoid函数时,使用numpy的exp函数计算指数部分。通过np.linspace生成从 -10到10的100个均匀分布的点作为输入数据x。
# 然后将x传入sigmoid函数计算对应的输出y。最后使用matplotlib绘制x和y的图像,直观展示Sigmoid函数的S形曲线。
# 在实际应用中,当我们将Sigmoid函数应用于神经网络的输出层时,对于一个批量输入数据,同样可以使用这个函数对每个元素进行处理。
# 例如,假设我们有一个批量输入数据batch_x,形状为 (batch_size, features),可以使用sigmoid(batch_x)对每个元素进行转换,将其映射到0到1的区间。
# 然而,Sigmoid函数存在梯度消失问题,当输入值非常大或非常小时,其导数趋近于0。在反向传播过程中,会导致梯度更新缓慢,影响网络训练效率。
# 比如,当x很大时,sigmoid(x)趋近于1,其导数sigmoid(x) * (1 - sigmoid(x))趋近于0。这在深层神经网络中,随着梯度的不断传递,会使得前面层的参数几乎无法更新。

上述代码实现了Sigmoid函数的定义、输入数据的生成、函数值的计算以及函数图像的绘制。通过对代码的分析,我们了解到Sigmoid函数的基本原理和在实际应用中可能存在的问题。

(二)ReLU函数代码实现与分析

import numpy as np
import matplotlib.pyplot as plt# 定义ReLU函数
def relu(x):return np.maximum(0, x)# 生成输入数据
x = np.linspace(-10, 10, 100)
y = relu(x)# 绘制ReLU函数图像
plt.plot(x, y)
plt.title('ReLU Function')
plt.xlabel('x')
plt.ylabel('relu(x)')
plt.grid(True)
plt.show()# 分析代码
# 导入必要的库后,定义ReLU函数时使用了numpy的maximum函数,该函数会比较输入x和0的大小,取较大值作为输出。
# 同样生成从 -10到10的100个点作为输入数据x,计算对应的ReLU函数值y,然后绘制图像。
# ReLU函数的优点是计算简单,当输入大于0时,梯度为1,能够有效缓解梯度消失问题。在神经网络的隐藏层中,大量的神经元使用ReLU函数可以加快网络的训练速度。
# 但是,ReLU函数存在神经元“死亡”的问题,即当输入一直小于等于0时,该神经元的输出始终为0,梯度也为0,在后续的训练中该神经元将不再更新参数。
# 例如,在一个深度神经网络中,如果某一层的输入数据经过某种变换后大部分都小于等于0,那么使用ReLU函数可能会导致该层的部分神经元“死亡”,影响网络的表达能力。
# 为了解决这个问题,后续出现了一些改进的ReLU函数,如Leaky ReLU、Parametric ReLU等。

此代码展示了ReLU函数的定义、图像绘制以及对代码的分析。我们看到了ReLU函数的简单高效以及存在的问题,这也促使了更多改进激活函数的出现。

(三)GELU函数代码实现与分析

import numpy as np
import matplotlib.pyplot as plt# 定义GELU函数
def gelu(x):return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * np.power(x, 3))))# 生成输入数据
x = np.linspace(-10, 10, 100)
y = gelu(x)# 绘制GELU函数图像
plt.plot(x, y)
plt.title('GELU Function')
plt.xlabel('x')
plt.ylabel('gelu(x)')
plt.grid(True)
plt.show()# 分析代码
# 导入库后,定义GELU函数时,其表达式基于高斯分布的思想,通过一系列的数学运算实现对输入的非线性转换。
# 这里使用了numpy的tanh函数(双曲正切函数)、sqrt函数(平方根函数)、power函数(幂函数)来构建GELU函数的具体形式。
# 生成输入数据x并计算对应的GELU函数值y,最后绘制图像。
# GELU函数与Sigmoid和ReLU函数相比,具有更平滑的过渡特性。它考虑了输入与高斯分布的关系,对于输入值较大的部分给予更高的权重。
# 在自然语言处理任务中,如Transformer模型中,这种特性使得模型能够更好地处理文本中的语义信息,捕捉到更复杂的语言模式。
# 例如,在Transformer的自注意力机制中,GELU函数能够更灵活地对输入的查询、键和值进行转换,从而提高模型对文本的理解和生成能力。
# 然而,GELU函数的计算相对复杂,相比于ReLU函数,需要更多的数学运算,在一些对计算资源要求极高的场景中,可能需要权衡其使用的必要性。
# 但随着硬件性能的提升,GELU函数在更多领域得到了广泛应用,并且也有研究在探索如何进一步优化其计算效率。

这段代码实现了GELU函数的定义、图像绘制和代码分析。我们深入了解了GELU函数的复杂计算过程以及其在自然语言处理等任务中的优势,同时也考虑到了其计算复杂度带来的挑战。

六、未来发展趋势

未来,激活函数的研究将继续朝着更高效、更灵活的方向发展。一方面,研究人员可能会进一步优化现有激活函数的计算效率,减少计算资源的消耗。另一方面,随着深度学习在更多领域的应用,可能会出现针对特定任务和数据特点的定制化激活函数。此外,激活函数与其他神经网络技术的结合,如与注意力机制、强化学习等的融合,也将为深度学习带来新的突破。

http://www.dtcms.com/a/427158.html

相关文章:

  • Transformer模型:深度解析自然语言处理的革命性架构——从预训练范式到产业级实践
  • 网站建设公司网站建设专业品牌租服务器价格一览表
  • [ARC114 C] - Sequence Scores
  • php网站开发实例教程 源码表格在网站后台是居中可到前台为什么不居中
  • 网站建设是什么?政务网站建设目的_意义
  • 【微调大模型】中的梯度概念
  • Android TabLayout使用记录
  • 打开这个你会感谢我的网站网络考试
  • 核心营销词库管理助力品牌提升竞争力
  • UNIX下C语言编程与实践19-UNIX 三级索引结构:直接索引、一级/二级/三级间接索引的文件存储计算
  • 有了实名制域名怎么做网站国内跨境电商公司排行榜
  • 每种字符至少取K个
  • random.gauss()函数和numpy.random.normal()函数生成正态分布随机数
  • 【C++】STL -- 仿函数的定义与使用
  • Linux新环境安装solana开发所需全部套件(持续更新)
  • 一个高性能的HTTP和反向代理服务器:Nginx
  • 人工智能客服应用如何重塑电商服务生态?智能AI软件带来的三大变革
  • 网站建设的注意学校网站开发方案模板
  • 分布式架构初识:为什么需要分布式
  • asp网站用ftp怎么替换图片办公室oa管理系统
  • 个性化的个人网站广州企业开办一网通
  • Transformer(一)---背景介绍及架构介绍
  • 【完整源码+数据集+部署教程】气动铣刀型号分类图像分割系统: yolov8-seg-C2f-SCConv
  • 【Android】强制使用 CPU 大核或超大核
  • 【算法竞赛学习笔记】基础概念篇:算法复杂度
  • SLA操作系统双因素认证实现Windows远程桌面OTP双因子安全登录—从零搭建企业级RDP安全加固体系
  • 现在主流的网站开发语言360房产网郑州官网
  • 石家庄哪个公司做网站好做外贸c2c网站有哪些
  • 伪路径约束
  • 新天力:以全链协同能力构筑食品容器行业领军优势