常见激活函数整理

本文详细介绍了激活函数在神经网络中的关键作用,包括Sigmoid、tanh和ReLU三种常见函数的定义、优缺点,以及它们如何引入非线性克服线性模型的局限。重点讲解了Sigmoid的梯度消失问题,tanh的0均值优势,以及ReLU的高效运算和动态稀疏性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、常见激活函数及分类

【激活函数的饱和】定义:x趋向于正无穷或者负无穷时,函数导数趋近于0,此时称为饱和;

  1. 饱和激活函数:sigmod、tanh
  2. 非饱和激活函数:ReLU、Leaky Relu、gelu

二、激活函数作用

给神经网络引入非线性元素,使神经网络可以完成非线性映射。如果不使用激活函数,无论神经网络有多少层,都只是线性组合而已。

三、激活函数介绍+优缺点分析

3.1 sigmod

sigmoid函数输入一个实值的数,然后将其压缩到0~1的范围内。特别地,大的负数被映射成0,大的正数被映射成1,数值绝对值越大,梯度越平坦,敏感度越低。
公式:

  • f(x)=11+e−xf(x)=\frac{1}{1+e^{-x}}f(x)=1+ex1
  • f′(x)=f(x)∗(1−f(x))f^{'}(x)=f(x)*(1-f(x))f(x)=f(x)(1f(x))

sigmod图像:
sigmod图像
sigmod导数图像:
sigmod导数图像
sigmod激活函数优点:

  • 平滑、易于求导

sigmod激活函数缺点:

  • 梯度消失:Sigmoid 函数趋近 0 和 1 的时候变化率会变得平坦,也就是说,Sigmoid 的梯度趋近于 0。神经网络使用 Sigmoid 激活函数进行反向传播时,输出接近 0 或 1 的神经元其梯度趋近于 0,与此类神经元相连的神经元的权重也更新得很慢。该问题叫作梯度消失。
  • Sigmoid的输出不是0均值(即zero-centered);这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入,随着网络的加深,会改变数据的原始分布。
  • 激活函数计算量大(在正向传播和反向传播中都包含幂运算和除法)

3.2 tanh

tanh和 sigmoid 相似,都属于饱和激活函数,区别在于输出值范围由 (0,1) 变为了 (-1,1),可以把 tanh 函数看做是 sigmoid 向下平移和拉伸后的结果。
公式:
tanh(x)=ex−e−xex+e−x=21+e−2x−1tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} =\frac{2}{1+e^{-2x}}-1tanh(x)=ex+exexex=1+e2x21

tanh′(x)=1−tanh2(x)tanh^{'}(x)=1-tanh^2(x)tanh(x)=1tanh2(x)

tanh图像:
tanh图像
tanh导数图像:
tanh导数图像

tanh优点:

  • 它是0均值的,解决了sigmoid非0均值的缺点,所以实际中tanh会比sigmoid更常用

tanh缺点:

  • 仍然存在sigmod一样的梯度消失问题
  • 仍然含有复杂的幂运算

3.3 ReLU

relu函数是目前主流的激活函数,它的公式很简单,输入小于0的时候为0,大于0的时候是本身。
公式:
f(x)=max(0,x)f(x)=max(0,x)f(x)=max(0,x)

ReLU图像:
ReLU图像
ReLU导数图像:
在这里插入图片描述
ReLU函数优点:

  • 相比Sigmoid和tanh,ReLU摒弃了复杂的计算,提高了运算速度。
  • 解决了梯度消失问题,收敛速度快于Sigmoid和tanh函数
  • ReLU将x<0的输出置为0,就是一个去噪音,稀疏矩阵的过程。而且在训练过程中,这种稀疏性是动态调节的,网络会自动调整稀疏比例,保证矩阵有最优的有效特征

ReLU函数缺点:

  • 当x>0时,ReLU导数为常数1的好处就是在“链式反应”中不会出现梯度消失,但梯度下降的强度就完全取决于权值的乘积,这样就可能会出现梯度爆炸问题。解决这类问题:一是控制权值,让它们在(0,1)范围内;二是做梯度裁剪,控制梯度下降强度,如ReLU(x)=min(6, max(0,x))
  • 当x<0时,ReLU将x<0的输出置为0,可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于‘dead’状态,所以使用ReLU的网络,学习率不能设置太大。
<think>好的,我现在需要回答用户关于如何在Keras中使用和实现激活函数的问题。首先,我要确保自己理解用户的需求。用户已经看过一些关于激活函数的引用内容,现在想知道具体如何在Keras中应用这些激活函数。 首先,我应该回忆Keras的基本结构,激活函数通常可以在哪些地方使用。记得在Keras中,激活函数可以通过两种方式添加:一种是在层的定义中通过`activation`参数指定,另一种是使用`Activation`层单独添加。比如,全连接层Dense、卷积层Conv2D等都有`activation`参数。 接下来,我需要整理常见激活函数在Keras中的名称。例如,ReLU对应`'relu'`,Sigmoid是`'sigmoid'`,Tanh是`'tanh'`,LeakyReLU可能需要通过单独的层来使用,因为它是参数化的,可能需要导入。此外,Softmax通常用于多分类的输出层。 然后,我需要考虑用户可能需要示例代码来理解如何实现。比如,如何在Sequential模型中添加激活函数,或者如何在函数式API中使用。比如,使用`Dense(units=64, activation='relu')`或者`Activation('relu')`。 另外,用户可能想知道如何自定义激活函数,比如LeakyReLU的参数调整。这时候需要提到从`keras.layers`导入LeakyReLU,并在层中使用。例如,`LeakyReLU(alpha=0.3)`作为激活函数。 还要注意引用用户提供的参考资料,特别是引用[1]提到Keras中的激活函数,引用[2]和[3]关于ReLU和其他激活函数的说明。在回答时,应该在适当的位置添加引用标识,如[^1][^2][^3]。 接下来,我需要验证示例代码的正确性,确保语法正确,比如是否正确使用字符串名称,或者导入必要的模块。例如,LeakyReLU可能需要从`tensorflow.keras.layers`导入,而不是直接作为字符串使用。 可能还需要提到激活函数在模型编译后的行为,比如在前向传播中的应用,以及训练过程中的梯度计算,但可能不需要太深入,用户的问题更偏向于使用而非理论。 最后,生成相关问题时要围绕Keras中激活函数的高级应用、自定义方法、选择建议等。比如,如何自定义激活函数,或者不同激活函数的适用场景。 现在需要组织这些内容,确保结构清晰,分步骤说明,并包含代码示例和正确引用。同时,检查是否符合用户要求的格式:行内数学公式用$...$,独立公式用$$...$$,中文回答,正确引用标识等。</think>### 如何在Keras中使用和实现激活函数 在Keras中使用激活函数是构建神经网络模型的关键步骤,主要通过以下两种方式实现: --- #### 1. **通过层的`activation`参数直接指定** 在定义神经网络层时,可以直接通过`activation`参数选择内置的激活函数。例如: ```python from tensorflow.keras import layers # 在Dense层中使用ReLU激活函数 layer = layers.Dense(units=64, activation='relu') # 在卷积层中使用Sigmoid激活函数 conv_layer = layers.Conv2D(32, (3,3), activation='sigmoid') ``` Keras支持的常见激活函数包括: - `'relu'`:修正线性单元(ReLU) - `'sigmoid'`:S型函数,适用于二分类输出层[^3] - `'tanh'`:双曲正切函数 - `'softmax'`:多分类输出层的归一化函数 --- #### 2. **通过`Activation`层单独添加** 如果需要在现有层之后单独添加激活函数,可以使用`Activation`层: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Activation model = Sequential([ Dense(64), Activation('relu') # 显式添加激活层 ]) ``` --- #### 3. **使用参数化激活函数(如LeakyReLU)** 对于需要参数的激活函数(如LeakyReLU),需从`keras.layers`导入并实例化: ```python from tensorflow.keras.layers import LeakyReLU # 在层中使用LeakyReLU(负区斜率为0.3) model.add(layers.Dense(64)) model.add(LeakyReLU(alpha=0.3)) # alpha控制负值斜率 ``` --- #### 4. **自定义激活函数** 若需自定义激活函数(如$f(x) = x^2$),可通过Lambda层实现: ```python from tensorflow.keras.layers import Lambda custom_activation = Lambda(lambda x: x**2) model.add(Dense(64)) model.add(custom_activation) ``` --- #### 示例模型 以下是一个完整的Sequential模型示例,包含多种激活函数: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, LeakyReLU model = Sequential([ Dense(128, activation='relu', input_shape=(784,)), # 输入层使用ReLU Dense(64, activation='sigmoid'), # 隐层使用Sigmoid Dense(10, activation='softmax') # 输出层使用Softmax ]) ``` --- ### 关键注意事项 1. **输出层选择**: - 二分类:输出层使用`sigmoid` - 多分类:输出层使用`softmax` 2. **隐层推荐**: - ReLU及其变种(如LeakyReLU)能有效缓解梯度消失问题,是隐层的默认选择 3. **性能影响**: - 激活函数的选择直接影响模型训练速度和收敛性,需根据任务类型调整。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值