ReLU上的花样

ReLU上的花样

CNN出现以来,感觉在各个地方,即便是非常小的地方都有点可以挖掘。比如ReLU。

ReLU的有效性体现在两个方面:

  • 克服梯度消失的问题
  • 加快训练速度

而这两个方面是相辅相成的,因为克服了梯度消失问题,所以训练才会快。

ReLU的起源,在这片博文里,对ReLU的起源的介绍已经很详细了,包括如何从生物神经衍生出来,如何与稀疏性进行关联等等。

其中有一段特别精彩的话我引用在下面:

几十年的机器学习发展中,我们形成了这样一个概念:非线性激活函数要比线性激活函数更加先进。

尤其是在布满Sigmoid函数的BP神经网络,布满径向基函数的SVM神经网络中,往往有这样的幻觉,非线性函数对非线性网络贡献巨大。

该幻觉在SVM中更加严重。核函数的形式并非完全是SVM能够处理非线性数据的主力功臣(支持向量充当着隐层角色)。

那么在深度网络中,对非线性的依赖程度就可以缩一缩。另外,在上一部分提到,稀疏特征并不需要网络具有很强的处理线性不可分机制。

综合以上两点,在深度学习模型中,使用简单、速度快的线性激活函数可能更为合适。

而本文要讲的,则是ReLU上的改进,所谓麻雀虽小,五脏俱全,ReLU虽小,但也是可以改进的。

ReLU的种类

ReLU的区分主要在负数端,根据负数端斜率的不同来进行区分,大致如下图所示。

普通的ReLU负数端斜率是0,Leaky ReLU则是负数端有一个比较小的斜率,而PReLU则是在后向传播中学习到斜率。而Randomized Leaky ReLU则是使用一个均匀分布在训练的时候随机生成斜率,在测试的时候使用均值斜率来计算。

效果

其中,NDSB数据集是Kaggle的比赛,而RReLU正是在这次比赛中崭露头角的。

通过上述结果,可以看到四点:

  • 对于leaky ReLU来说,如果斜率很小,那么与ReLU并没有大的不同,当斜率大一些时,效果就好很多。
  • 在训练集上,PReLU往往能达到最小的错误率,说明PReLU容易过拟合。
  • 在NSDB数据集上RReLU的提升比cifar10和cifar100上的提升更加明显,而NSDB数据集比较小,从而可以说明,RReLU在与过拟合的对抗中更加有效
  • 对于RReLU来说,还需要研究一下随机化得斜率是怎样影响训练和测试过程的。

参考文献

[1]. Xu B, Wang N, Chen T, et al. Empirical evaluation of rectified activations in convolutional network[J]. arXiv preprint arXiv:1505.00853, 2015.

06-25
### ReLU 激活函数的原理 ReLU(Rectified Linear Unit)是一种常用的激活函数,其数学表达式为 $ f(x) = \max(0, x) $。该函数的作用是将所有负值输入设为零,而正值输入保持不变。这种简单的分段线性形式使得 ReLU 在计算上非常高效,避免了传统激活函数如 Sigmoid 和 Tanh 所需的指数运算[^5]。 在反向传播过程中,ReLU 的导数也非常简单:当输入大于 0 时,导数为 1;当输入小于或等于 0 时,导数为 0。这使得梯度计算更加高效,并减少了梯度消失问题的发生[^5]。 ### ReLU 的应用 ReLU 被广泛应用于深度学习模型中,尤其是在卷积神经网络(CNN)和全连接网络中。它通常被用作隐藏层的激活函数,以引入非线性特性,从而提升模型的表示能力。例如,在 PyTorch 中,可以通过 `torch.relu(x)` 对输入张量 `x` 应用 ReLU 激活函数[^1]。 由于其稀疏激活特性,ReLU 可以促使网络中的部分神经元在训练过程中不被激活,从而形成稀疏表示,有助于缓解过拟合问题[^5]。 ### ReLU 在深度学习中的优势与局限性 ReLU 的主要优势包括: - **计算效率高**:无需复杂的数学运算,适合大规模并行计算。 - **缓解梯度消失问题**:相比 Sigmoid 和 Tanh,ReLU 在正区间具有恒定梯度,有利于深层网络的训练[^2]。 - **稀疏激活**:可以产生接近生物神经系统的稀疏激活模式,提高模型泛化能力[^5]。 然而,ReLU 也存在一些局限性: - **“死区”问题**:对于负值输入,ReLU 输出始终为 0,可能导致某些神经元在训练过程中不再更新权重,成为“死亡神经元”。 - **数据分布偏移**:ReLU 可能导致输出特征分布偏向正值,影响后续层的学习效果。 为了解决这些问题,研究者提出了多种改进版本,如 Leaky ReLU、PReLU、RReLU 和 GELU 等,以增强模型的鲁棒性和表现力。 ### 示例代码 以下是一个使用 PyTorch 实现 ReLU 激活函数的示例: ```python import torch import torch.nn as nn # 创建一个输入张量 x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0]) # 使用 torch.relu 函数 output = torch.relu(x) print(output) # tensor([0., 0., 0., 1., 2.]) # 或者使用 nn.ReLU 模块 relu = nn.ReLU() output_module = relu(x) print(output_module) # tensor([0., 0., 0., 1., 2.]) ``` 上述代码展示了如何在 PyTorch 中通过函数和模块两种方式对输入张量应用 ReLU 激活函数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值