激活函数大汇总(七)(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的结果在特征维度上进行拼接。
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 x≤0
其中,
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。
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 x≤0
在正值部分,梯度为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,并对其在防止过拟合方面的潜力进行了评估。