激活函数大汇总(七)(CReLU & RReLU附代码和详细公式)

更多激活函数见激活函数大汇总列表

一、引言

欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与表现力。鉴于激活函数的重要性和多样性,我们将通过几篇文章的形式,本篇详细介绍两种激活函数,旨在帮助读者深入了解各种激活函数的特点、应用场景及其对模型性能的影响。

在接下来的文章中,我们将逐一探讨各种激活函数,从经典到最新的研究成果。

限于笔者水平,对于本博客存在的纰漏和错误,欢迎大家留言指正,我将不断更新。

二、CReLU

CReLU(Concatenated Rectified Linear Unit)是一种特殊的激活函数,它在处理深度学习模型中的特征时采用了一种创新的方法。CReLU通过对每个神经元的输入进行正向和负向的ReLU操作,并将结果拼接起来,以此来增强模型对信息的捕获能力。

1. 数学定义

对于任意输入 x x x,CReLU激活函数的输出由正的 ReLU ⁡ ( x ) \operatorname{ReLU}(x) ReLU(x)和负的 ReLU ⁡ ( − x ) \operatorname{ReLU}(-x) ReLU(x)拼接而成,可以数学表示为:

CReLU ⁡ ( x ) = [ ReLU ⁡ ( x ) ; ReLU ⁡ ( − x ) ] \operatorname{CReLU}(x)=[\operatorname{ReLU}(x) ; \operatorname{ReLU}(-x)] CReLU(x)=[ReLU(x);ReLU(x)]
其中, ReLU ⁡ ( x ) = max ⁡ ( 0 , x ) \operatorname{ReLU}(x)=\max (0, x) ReLU(x)=max(0,x)是标准的ReLU激活函数,分号表示将两个ReLU的结果在特征维度上进行拼接。
【DL经典回顾】激活函数大汇总(七)(CReLU & RReLU附代码和详细公式)-LMLPHP

2. 函数特性

  • 捕获正负信息:CReLU通过同时考虑输入的正部分和负部分,使模型能够更全面地捕获输入数据的信息。
  • 增加输出维度:由于CReLU将正向和负向的ReLU结果进行拼接,它实际上增加了模型输出的维度,这有助于增强模型的表示能力。
  • 非线性激活:尽管CReLU使用了线性的ReLU函数,但拼接操作引入了额外的非线性,有助于深度学习模型学习复杂的数据表示。

3. 导数

CReLU函数的导数相对简单,对于正值输入,导数为1;对于负值输入,导数也为1,但作用于拼接后的负部分;对于零值输入,导数未定义(实践中通常视为0)。具体而言,导数可以表示为:

CReLU ⁡ ′ ( x ) = [ 1 x > 0 ; 1 x < 0 ] \operatorname{CReLU}^{\prime}(x)=\left[1_{x>0} ; 1_{x<0}\right] CReLU(x)=[1x>0;1x<0]
其中, 1 x > 0 1_{x>0} 1x>0 1 x < 0 1_{x<0} 1x<0分别是正部分和负部分的指示函数。

4. 使用场景与局限性

使用场景

  • 增强模型表示能力:在需要模型具有捕获输入正负信息能力的场景下,CReLU可以作为一种有效的选择。
  • 视觉任务和特征学习:CReLU特别适用于视觉任务和特征学习领域,其中对输入数据的全面表示尤为重要。

局限性

  • 增加计算负担:由于CReLU会增加输出特征的维度,这可能会导致后续层的计算负担加重,尤其是在深层网络中。
  • 设计和实现复杂性:在使用CReLU时,需要仔细设计网络结构,以适应输出特征维度的增加,这可能增加模型设计和实现的复杂性。

5.代码实现

CReLU激活函数将输入数组的正部分和负部分分别通过ReLU函数处理后拼接起来,因此我们需要先计算这两部分,然后使用NumPy的拼接操作将它们组合起来。

import numpy as np

def crelu(x):
    """计算CReLU激活函数的值。
    
    参数:
    x -- 输入值,可以是一个数值、NumPy数组或者多维数组。
    
    返回:
    CReLU激活后的结果,其中正的ReLU和负的ReLU结果被拼接在一起。
    """
    relu_positive = np.maximum(0, x)  # 计算正的ReLU
    relu_negative = np.maximum(0, -x) # 计算负的ReLU
    return np.concatenate([relu_positive, relu_negative], axis=-1) # 沿最后一个轴拼接

解读

  • 正负部分的处理:首先,np.maximum(0, x)计算输入x的正部分,即标准的ReLU操作。接着,np.maximum(0, -x)通过对x取负再计算ReLU,得到输入的负部分的ReLU结果。
  • 拼接操作:使用np.concatenate函数将正的ReLU结果和负的ReLU结果沿最后一个轴拼接起来。这一步骤增加了输出的维度,正如CReLU函数的特性所述。
  • 多维数组支持:通过指定axis=-1参数,该实现支持对多维数组进行操作,使得它可以适用于处理多个数据样本的批量操作。

示例使用

下面是如何使用定义的crelu函数来计算一组输入值的CReLU激活:

x = np.array([-2, -1, 0, 1, 2])
crelu_values = crelu(x)

print("CReLU Values:", crelu_values)

三、RReLU

RReLU(Randomized Leaky Rectified Linear Unit)是一种变体的ReLU激活函数,旨在通过引入随机性来解决ReLU在训练过程中可能遇到的一些问题,如神经元死亡(即永远不激活的神经元)。RReLU通过为负输入值应用一个随机选取的小的斜率,增加了模型的鲁棒性和泛化能力。

1. 数学定义

RReLU函数的数学表达式可以定义为:

RReLU ⁡ ( x ) = { x  if  x > 0 α x  if  x ≤ 0 \operatorname{RReLU}(x)= \begin{cases}x & \text { if } x>0 \\ \alpha x & \text { if } x \leq 0\end{cases} RReLU(x)={xαx if x>0 if x0
其中, x x x是函数的输入,而 α \alpha α是一个在训练期间从均匀分布 U ( l , u ) U(l, u) U(l,u)中随机抽取的系数, l l l u u u是分布的下限和上限。在测试期间, α \alpha α通常被设置为 l l l u u u的均值,即 α = l + u 2 \alpha=\frac{l+u}{2} α=2l+u
【DL经典回顾】激活函数大汇总(七)(CReLU &amp; RReLU附代码和详细公式)-LMLPHP

2. 函数特性

  • 随机性:RReLU通过为每个神经元的负输入引入随机的斜率,帮助模型避免过拟合,增加了泛化能力。
  • 鲁棒性:引入的随机性也增加了模型的鲁棒性,使其更能够应对不同的输入变化。
  • 减少神经元死亡:与标准的ReLU相比,RReLU通过为负输入提供一个非零的斜率,减少了神经元死亡的问题。

3. 导数

RReLU函数的导数为:

RReLU ⁡ ′ ( x ) = { 1  if  x > 0 α  if  x ≤ 0 \operatorname{RReLU}^{\prime}(x)= \begin{cases}1 & \text { if } x>0 \\ \alpha & \text { if } x \leq 0\end{cases} RReLU(x)={1α if x>0 if x0
在正值部分,梯度为1;在负值部分,梯度为随机选取的 α \alpha α值。

4. 使用场景与局限性

使用场景

  • 避免过拟合:在小数据集上训练深度网络时,RReLU可以作为一种有效的正则化手段。
  • 提高模型泛化:在需要提高模型泛化能力的场景下,RReLU通过其随机性可以作为一种选择。

局限性

  • 随机性的不确定性:RReLU的随机性虽然可以提高泛化能力,但也可能导致模型训练的不稳定性,特别是在每次训练迭代中如果随机性变化较大时。
  • 参数选择:RReLU的效果很大程度上依赖于下限(l)和上限(u)的选择,不恰当的参数可能会导致性能下降。

5.代码实现

在Python中实现RReLU(Randomized Leaky ReLU)激活函数时,我们需要为负值输入随机选择一个斜率。这意味着在训练期间,对于每个负输入,我们将使用一个从预定范围内随机抽取的 α \alpha α值。在测试期间,我们通常使用这个范围的平均值作为 α \alpha α的值。以下是一个简单的RReLU实现,它采用了在训练期间随机选择 α \alpha α,而在测试期间使用固定 α \alpha α的策略。

为了简化,这里我们将展示一个基本的实现,不包括动态调整 α \alpha α的部分。

import numpy as np

def rrelu(x, l=0.01, u=0.05, training=True):
    """
    计算RReLU激活函数的值。
    
    参数:
    x -- 输入值,可以是一个数值、NumPy数组或者多维数组。
    l, u -- 随机alpha的下限和上限。
    training -- 指示当前是否为训练模式。在训练模式下,alpha将从[l, u]范围内随机选取;在测试模式下,将使用(l + u) / 2。
    
    返回:
    RReLU激活后的结果。
    """
    if training:
        # 训练阶段: 对每个元素随机选择alpha
        alpha = np.random.uniform(l, u, x.shape)
    else:
        # 测试阶段: 使用固定的alpha
        alpha = (l + u) / 2
    
    return np.where(x > 0, x, alpha * x)

解读

  • 随机斜率 α \alpha α:在训练模式下,该函数对每个负输入随机选择一个斜率 α \alpha α,这个斜率是从区间 [ l , u ] [l, u] [l,u]中随机选取的。这一随机性有助于增强模型的泛化能力并减少过拟合风险。
  • 固定斜率 α \alpha α:在测试模式下,为了保持预测的一致性,我们使用一个固定的值 α \alpha α,通常为 l l l u u u的平均值。
  • 向量化操作:通过使用NumPy的np.where函数,该实现支持向量化操作,能够高效地处理整个数组的激活计算,无论是单个样本还是批量样本。

示例使用

以下是如何使用定义的rrelu函数来计算一组输入值的RReLU激活,假设我们处于训练模式:

x = np.array([-2, -1, 0, 1, 2])
rrelu_values_training = rrelu(x, training=True)

print("RReLU Values (Training):", rrelu_values_training)

rrelu_values_testing = rrelu(x, training=False)
print("RReLU Values (Testing):", rrelu_values_testing)

四、参考文献

CReLU

  • Shang, W., Sohn, K., Almeida, D., & Lee, H. (2016). “Understanding and Improving Convolutional Neural Networks via Concatenated Rectified Linear Units.” In International Conference on Machine Learning (ICML). 这篇文章首次提出了CReLU激活函数,并展示了其在卷积神经网络中提升模型性能的能力。通过分析CReLU如何利用输入的正负信息,作者证明了CReLU在某些情况下比标准ReLU表现更好。

RReLU

  • Xu, B., Wang, N., Chen, T., & Li, M. (2015). “Empirical Evaluation of Rectified Activations in Convolutional Network.” arXiv preprint arXiv:1505.00853. 虽然这篇文章中主要讨论了多种激活函数的性能,包括Leaky ReLU和Parametric ReLU,但提到了RReLU,并对其在防止过拟合方面的潜力进行了评估。
03-15 00:51