文章目录
- CELU
- 函数+导函数
- 函数和导函数图像
- 优缺点
- pytorch中的CELU函数
- tensorflow 中的CELU函数
CELU
- 连续可微指数线性单元:CELU(Continuously Differentiable Exponential Linear Unit),是一种连续可导的激活函数,结合了
ELU
和ReLU
的特点,旨在解决ELU
在某些情况下的梯度问题。
函数+导函数
CELU
函数
C E L U ( x ) = { x x ≥ 0 α ( e x α − 1 ) x < 0 \rm CELU(x) = \left\{ \begin{array}{} x \quad x \ge 0 \\ \alpha(e^{\frac{x}{\alpha}} - 1) \quad x < 0 \end{array} \right. CELU(x)={xx≥0α(eαx−1)x<0
-
CELU
函数导数
d d x C E L U ( x ) = { 1 x ≥ 0 e x α x < 0 \frac{d}{dx} \rm CELU(x) = \left\{ \begin{array}{} 1 \quad x \ge 0 \\ e^{\frac{x}{\alpha}} \quad x < 0 \end{array} \right. dxdCELU(x)={1x≥0eαxx<0
其中, α \alpha α 是一个非负参数,用于控制 x < 0 x<0 x<0时曲线的平滑度。当 α = 0 \alpha=0 α=0时,CELU函数退化为ReLU函数。对于 x < 0 x<0 x<0的部分,CELU使用指数函数来确保梯度不会消失,有助于加速训练过程中的梯度流动。
函数和导函数图像
-
画图
下面的是 α = 1 \alpha = 1 α=1
import numpy as np from matplotlib import pyplot as plt # 定义 CELU 函数 def celu(x, alpha=1.0): return np.where(x > 0, x, alpha * (np.exp(x / alpha) - 1)) # 定义 CELU 的导数 def celu_derivative(x, alpha=1.0): return np.where(x > 0, 1, np.exp(x / alpha)) # 生成数据 x = np.linspace(-3, 3, 1000) alpha = 1.0 # 可以调整 alpha 的值 y = celu(x, alpha) y1 = celu_derivative(x, alpha) # 绘制图形 plt.figure(figsize=(12, 8)) ax = plt.gca() plt.plot(x, y, label=f'CELU (α={alpha})') plt.plot(x, y1, label='Derivative') plt.title(f'CELU (α={alpha}) and Derivative') # 设置上边和右边无边框 ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') # 设置 x 坐标刻度数字或名称的位置 ax.xaxis.set_ticks_position('bottom') # 设置边框位置 ax.spines['bottom'].set_position(('data', 0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data', 0)) plt.legend(loc=2) plt.show()
优缺点
-
CELU 的优点
- 连续可导:CELU函数在整个定义域上都是连续可导的,这使得它在优化过程中更加稳定。
- 缓解梯度消失问题:CELU在负输入时引入非零梯度,有助于缓解梯度消失问题。
- 平滑过渡:CELU函数在零点处是平滑的,避免了ReLU在零点处的不连续性。
- 灵活性:CELU可以表示ReLU作为其特例,当α趋近于0时,CELU趋近于ReLU。
- 加速收敛:在某些情况下,CELU能够比ReLU更快地收敛。
-
CELU 的缺点
- 计算复杂度高:CELU的指数运算比ReLU更复杂,计算成本更高。
- 参数敏感:CELU的性能对α参数的选择较为敏感,不同的α值可能会显著影响模型的性能。
- 可能的过拟合风险:在某些情况下,CELU可能会导致模型过拟合,尤其是在数据集较小或模型复杂度较高时。
- 训练时间增加:由于计算复杂度的增加,CELU可能会导致训练时间变长。
pytorch中的CELU函数
-
代码
import torch # 定义 CELU 函数 f = torch.nn.CELU() # PyTorch 提供的 CELU 激活函数模块 x = torch.randn(2) # 生成一个随机张量作为输入 celu_x = f(x) # 应用 CELU 函数 print(f"x: \n{x}") print(f"celu_x:\n{celu_x}") """输出""" x: tensor([-0.8057, -0.8352]) celu_x: tensor([-0.5532, -0.5662])
tensorflow 中的CELU函数
-
代码
python: 3.10.9
tensorflow: 2.18.0
import tensorflow as tf # 创建 CELU 激活函数 celu = tf.keras.activations.celu # 生成随机输入 # x = tf.random.normal([2]) x = [-0.8057, -0.8352] # 应用 CELU 激活函数 celu_x = celu(x) print(f"x: \n{x}") print(f"celu_x:\n{celu_x}") """输出""" x: [-0.8057, -0.8352] celu_x: [-0.5532249 -0.5662123]