【问题标题】:Why the 6 in relu6?为什么relu6中的6?
【发布时间】:2017-11-10 10:25:06
【问题描述】:

我已经在 R 中从头开始破解了一个深度前馈 NN,它使用“硬 sigmoid”激活 - max(0,min(1,x)) - 似乎比 ReLU 更稳定。尝试将其移植到 TensorFlow,并注意到他们没有内置这个激活函数,只有 relu6,它在 6 处使用了上限。这是有原因的吗? (我知道你可以做 relu6(x*6)/6,但如果 TF 的家伙把 6 放在那里是有充分理由的,我想知道。) 另外,我想知道其他人在前馈网络中是否存在 ReLU 爆炸问题(我知道 RNN 问题)。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    来自this reddit thread

    这对于使网络准备好进行定点推理很有用。 如果你取消了上限,你会丢失太多位到 Q 部分 Q.f 数。保持 ReLU 以 6 为界将使它们 最多 3 位(最多 8 位),剩下 4/5 位用于 .f

    看来,6 只是根据您希望能够将网络的训练参数压缩成的位数选择的任意值。 根据“为什么”只实现值为 6 的版本,我认为这是因为这是最适合 8 位的值,这可能是最常见的用例。

    【讨论】:

    • 我是 stackoverflow 的新手,所以我不确定是否应该感谢,但还是要感谢!
    • 如果这回答了您的问题,请将问题标记为已解决:)
    【解决方案2】:

    Tensorflows 文档 (https://www.tensorflow.org/api_docs/python/tf/nn/relu6) 指向以下论文:

    ...首先,我们将单位限制为 6,因此我们的 ReLU 激活 功能是 y = min(max(x, 0), 6)。 在我们的测试中,这鼓励模型更早地学习稀疏特征。在[8]的公式中,这是 相当于想象每个 ReLU 单元仅由 6 个复制的偏置偏移伯努利单元组成,而不是 比无穷大。我们将上限为 n 的 ReLU 单元称为 ReLU-n 单元。

    http://www.cs.utoronto.ca/~kriz/conv-cifar10-aug2010.pdf

    由于它源自论文,我怀疑他们使用不同的 n 对其进行了测试,并在 n=6 的测试集上获得了最佳结果。

    【讨论】:

    • @MikhailVasilyev 其他答案如何适合图片?定点推理的好处仅仅是一个很好的副作用吗?还是选择relu6的次要原因?
    • 数字本身是任意的,它比其他任何东西都更像一个比例因子。 relu6 真正做的是给你一个 Z 形而不是 V 形,这样 ReLU 将在与 0 的一定距离之外最大化。这与你从 sigmoid 和 tanh 得到的行为相同。我怀疑选择 6 是因为它大致对应于 sigmoid(6) == 0.997,这大致是 sigmoid 最大值接近 1 的位置。
    【解决方案3】:

    如果您想要一个不同的数字,例如,如果您对二进制数据使用硬编码权重并想要 ReLU1(),则可以按如下方式实现:

    class ReLU1(nn.Module):
        def forward(self, x):
            return F.relu6(x * 6.0) / 6.0
    
    
    class ReLUX(nn.Module):
        def __init__(self, max_value: float=1.0):
            super(ReLUX, self).__init__()
            self.max_value = float(max_value)
            self.scale     = 6.0/self.max_value
    
        def forward(self, x):
            return F.relu6(x * self.scale) / (self.scale)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-09
      • 2018-09-27
      • 1970-01-01
      • 2011-04-24
      • 2019-01-16
      • 2012-11-22
      • 2023-03-09
      • 2011-11-12
      相关资源
      最近更新 更多