神经网络常见激活函数 6-RReLU函数

文章目录

RReLU

  • 随机修正线性单元:Randomized Leaky ReLU

函数+导函数

  • RReLU函数
    R R e L U = { x x ≥ 0 a x x < 0 \rm RReLU = \left\{ \begin{array}{} x \quad x \ge 0 \\ a x \quad x < 0 \end{array} \right. RReLU={xx≥0axx<0

    其中,( a ) 是一个在训练过程中随机从均匀分布 ( U(l, u) ) 中采样的值,( l ) 和 ( u ) 是预先设定的下界和上界,通常 ( 0 < l < u < 1 )。

  • RReLU函数导数
    d d x R R e L U = { 1 x ≥ 0 a x < 0 \frac{d}{dx} \rm RReLU = \left\{ \begin{array}{} 1 \quad x \ge 0 \\ a \quad x < 0 \end{array} \right. dxdRReLU={1x≥0ax<0

    在 RReLU 中,当 ( x < 0 ) 时,导数是一个随机变量 ( a ),这个随机变量在每次训练时都会从 ( U(l, u) ) 中重新采样。与 LeakyReLU 不同,RReLU 的斜率 ( a ) 是随机的,而不是固定的。


函数和导函数图像

  • 画图

    分为两张图了,上面是训练阶段,在训练阶段,负值部分的斜率P是随机从区间[lower, upper]中采样的。在测试阶段,负值部分的斜率P是区间[lower, upper]的平均值((lower + upper) / 2)

    python 复制代码
    import numpy as np
    from matplotlib import pyplot as plt
    
    # 定义 RReLU 函数
    def rrelu_train(x, lower=0.125, upper=0.333):
        P = np.random.uniform(lower, upper)  # 训练阶段:随机化负值部分的斜率
        return np.where(x < 0, P * x, x)
    
    def rrelu_test(x, lower=0.125, upper=0.333):
        P = (lower + upper) / 2  # 测试阶段:使用负值部分的平均斜率
        return np.where(x < 0, P * x, x)
    
    # 定义 RReLU 的导数
    def rrelu_derivative_train(x, lower=0.125, upper=0.333):
        P = np.random.uniform(lower, upper)  # 训练阶段:随机化负值部分的斜率
        return np.where(x < 0, P, 1)
    
    def rrelu_derivative_test(x, lower=0.125, upper=0.333):
        P = (lower + upper) / 2  # 测试阶段:使用负值部分的平均斜率
        return np.where(x < 0, P, 1)
    
    # 生成数据
    x = np.linspace(-2, 2, 1000)
    lower = 1/8  # 负值部分斜率的下限
    upper = 1/3  # 负值部分斜率的上限
    
    # 训练阶段
    y_train = [rrelu_train(xi, lower, upper) for xi in x]
    y1_train = [rrelu_derivative_train(xi, lower, upper) for xi in x]
    
    # 测试阶段
    y_test = [rrelu_test(xi, lower, upper) for xi in x]
    y1_test = [rrelu_derivative_test(xi, lower, upper) for xi in x]
    
    # 绘制图形
    fig, axs = plt.subplots(2, 1, figsize=(12, 12))
    
    # 训练阶段
    axs[0].plot(x, y_train, label='RReLU (Train)', color='blue')
    axs[0].plot(x, y1_train, label='Derivative (Train)', color='orange')
    axs[0].set_title(f'RReLU (Train) and Derivative (lower={lower}, upper={upper})')
    axs[0].legend(loc='upper left')
    axs[0].spines['right'].set_color('none')
    axs[0].spines['top'].set_color('none')
    axs[0].spines['bottom'].set_position(('data', 0))
    axs[0].spines['left'].set_position(('data', 0))
    
    # 测试阶段
    axs[1].plot(x, y_test, label='RReLU (Test)', color='blue', linestyle='--')
    axs[1].plot(x, y1_test, label='Derivative (Test)', color='orange', linestyle='--')
    axs[1].set_title(f'RReLU (Test) and Derivative (lower={lower}, upper={upper})')
    axs[1].legend(loc='upper left')
    axs[1].spines['right'].set_color('none')
    axs[1].spines['top'].set_color('none')
    axs[1].spines['bottom'].set_position(('data', 0))
    axs[1].spines['left'].set_position(('data', 0))
    
    plt.tight_layout()
    plt.show()


优缺点

  • RReLU函数相对于PeLU函数的改进
    1. RReLU函数和PReLU函数的表达式一样,但是参数 α \alpha α 不一样,这里的 α \alpha α 是个随机震荡的数,范围是 1 8 − 1 3 \frac{1}{8} - \frac{1}{3} 81−31
    2. 负部分的斜率在训练中被随机化 到给定的范围内,然后再测试中被固定。而PReLU训练中的斜率是训练出来的。
  • RReLU 的优点

    1. 缓解"死亡ReLU"问题:与ReLU不同,RReLU在负输入时引入了一个随机的斜率,这使得神经元不会因为负输入而完全失去梯度,从而避免了"死亡ReLU"问题。
    2. 增强梯度流:RReLU通过在负输入时提供一个非零梯度,有助于改善梯度消失问题,使得网络在训练过程中能够更好地更新权重。
    3. 增加模型的灵活性:RReLU的随机斜率在训练过程中可以动态调整,这增加了模型的灵活性和适应性,使其能够更好地处理复杂的模式。
    4. 提高模型的泛化能力:由于RReLU在训练时引入了随机性,这可以作为一种正则化手段,有助于提高模型的泛化能力。
  • RReLU 的缺点

    1. 计算复杂度增加:RReLU的随机斜率需要在每次训练时进行计算,这增加了计算复杂度和训练时间。
    2. 参数选择敏感:RReLU的随机斜率范围需要合理选择,如果选择不当,可能会导致模型训练不稳定。
    3. 测试时的确定性问题:在训练阶段,RReLU使用随机斜率,而在测试阶段,通常会使用一个固定的斜率(通常是训练阶段随机斜率的期望值)。这种从随机到确定性的转换可能会导致测试时的性能与训练时略有差异。
    4. 可能的过拟合风险:由于RReLU引入了额外的随机性,如果数据集较小或模型复杂度较高,可能会增加过拟合的风险。

pytorch中的RReLU函数

  • 代码

    这里仅仅演示训练阶段 α \alpha α 为随机值的时候

    l o w e r = 1 / 8 \mathrm lower = 1/8 lower=1/8

    u p p e r = 1 / 3 \mathrm upper = 1/3 upper=1/3

    python 复制代码
    # 定义 RReLU 函数
    f = torch.nn.RReLU(lower=0.125,upper=0.333)  # PyTorch 提供的 RReLU 激活函数模块
    x = torch.randn(2)    # 生成一个随机张量作为输入
    
    rrelu_x = f(x)        # 应用 RReLU 函数
    
    print(f"x: \n{x}")
    print(f"rrelu_x:\n{rrelu_x}")
    
    """输出"""

tensorflow 中的RReLU函数

  • 代码

    python: 3.10.9

    tensorflow: 2.18.0

    rrelu并不是tensorflow标准库的一部分,为此我们实现一个RReLU函数,包含训练阶段和推理阶段

    这里仅仅演示训练阶段 α \alpha α 为随机值的时候

    l o w e r = 1 / 8 \mathrm lower = 1/8 lower=1/8

    u p p e r = 1 / 3 \mathrm upper = 1/3 upper=1/3

    python 复制代码
    import tensorflow as tf
    
    class RReLU(tf.keras.layers.Layer):
        def __init__(self, lower=0.125, upper=0.333, **kwargs):
            super(RReLU, self).__init__(**kwargs)
            self.lower = lower
            self.upper = upper
    
        def call(self, inputs, training=None):
            if training:
                # 在训练模式下,随机选择一个斜率
                alpha = tf.random.uniform(shape=inputs.shape, minval=self.lower, maxval=self.upper)
            else:
                # 在推理模式下,使用平均斜率
                alpha = (self.lower + self.upper) / 2.0
            return tf.where(inputs >= 0, inputs, alpha * inputs)
    
    # 创建 RReLU 激活函数层
    rrelu = RReLU()
    
    # 生成随机输入
    x = tf.random.normal([2])
    
    # 应用 RReLU 激活函数
    rrelu_x = rrelu(x, training=True)
    
    print(f"x: \n{x}")
    print(f"rrelu_x:\n{rrelu_x}")
    
    
    """输出"""
    x: 
    [-0.97807205  0.9327775 ]
    rrelu_x:
    [-0.26978785  0.9327775 ]

相关推荐
小高Baby@5 分钟前
Deepseek
人工智能·笔记
Amarantine、沐风倩✨14 分钟前
区块链技术未来发展趋势(人工智能和物联网领域)
人工智能·物联网·区块链
LeeZhao@28 分钟前
【AIGC魔童】DeepSeek v3提示词Prompt书写技巧
人工智能·语言模型·自然语言处理·面试·prompt·aigc
nangonghen31 分钟前
user、assistant、system三大角色在大语言模型中的作用(通俗解释)
人工智能·语言模型·大模型
huaqianzkh1 小时前
了解深度信念网络(Deep Belief Networks,DBN)
人工智能
chengpei1471 小时前
Spring Boot整合DeepSeek实现AI对话
人工智能·spring boot·ai
Lostgreen1 小时前
解密K-means:简单易懂的算法指南
算法·机器学习·kmeans
张登杰踩1 小时前
【模型部署】大模型部署工具对比:SGLang, Ollama, VLLM, LLaMA.cpp如何选择?
人工智能·llama
微软技术栈2 小时前
活动预告 |【Part1】Microsoft Azure 在线技术公开课:AI 基础知识
人工智能·microsoft·azure
nbsaas-boot5 小时前
人工智能浪潮下脑力劳动的变革与重塑:挑战、机遇与应对策略
人工智能