• 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.

    ReLU、LReLU、PReLU、CReLU、ELU、SELU

    ReLU

    这里写图片描述 
    tensorflow中:tf.nn.relu(features, name=None)

    LReLU

    (Leaky-ReLU) 
    这里写图片描述 
    其中aiai是固定的。ii表示不同的通道对应不同的aiai. 
    tensorflow中:tf.nn.leaky_relu(features, alpha=0.2, name=None)

    PReLU

    这里写图片描述 
    其中aiai是可以学习的的。如果ai=0ai=0,那么 PReLU 退化为ReLU;如果 aiai是一个很小的固定值(如ai=0.01ai=0.01),则 PReLU 退化为 Leaky ReLU(LReLU)。 
    PReLU 只增加了极少量的参数,也就意味着网络的计算量以及过拟合的危险性都只增加了一点点。特别的,当不同 channels 使用相同的aiai时,参数就更少了。BP 更新aiai时,采用的是带动量的更新方式(momentum)。 
    tensorflow中:没找到啊!

    CReLU

    (Concatenated Rectified Linear Units) 
    dd 
    tensorflow中:tf.nn.crelu(features, name=None)

    ELU

    这里写图片描述 
    这里写图片描述 
    其中α是一个可调整的参数,它控制着ELU负值部分在何时饱和。 
    右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒。ELU的输出均值接近于零,所以收敛速度更快 
    tensorflow中:tf.nn.elu(features, name=None)

    SELU

    这里写图片描述 
    经过该激活函数后使得样本分布自动归一化到0均值和单位方差(自归一化,保证训练过程中梯度不会爆炸或消失,效果比Batch Normalization 要好) 
    其实就是ELU乘了个lambda,关键在于这个lambda是大于1的。以前relu,prelu,elu这些激活函数,都是在负半轴坡度平缓,这样在activation的方差过大的时候可以让它减小,防止了梯度爆炸,但是正半轴坡度简单的设成了1。而selu的正半轴大于1,在方差过小的的时候可以让它增大,同时防止了梯度消失。这样激活函数就有一个不动点,网络深了以后每一层的输出都是均值为0方差为1。

    tensorflow中:tf.nn.selu(features, name=None)

    这里写图片描述

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20909377/article/details/79133981
  • 相关阅读:
    贪心法之最优装载问题
    判断回文
    P1217 [USACO1.5]回文质数 Prime Palindromes
    李白打酒
    P1036 选数
    P1028 数的计算
    P1316 丢瓶盖
    P1181 数列分段Section I
    P1182 数列分段`Section II`
    P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles
  • 原文地址:https://www.cnblogs.com/adong7639/p/9213038.html
Copyright © 2020-2023  润新知