我在R中从头开始破解了一个深度前馈神经网络,它似乎在“硬sigmoid”激活时- max(0,min(1,x)) -比ReLU更稳定。尝试将其移植到TensorFlow,注意到他们没有内置这个激活函数,只有relu6,它使用的上限是6。这是有原因的吗?(我知道您可以使用relu6(x*6)/6,但如果TF人员将6放在那里是有充分理由的,我想知道。)另外,我想知道其他人是否在前馈网络中遇到了ReLU爆炸问题(我知道RNN问题)。
发布于 2017-11-10 18:33:26
这在使网络为定点推理做好准备时很有用。如果取消绑定上限,Q.f数字的Q部分会丢失太多比特。将ReLU限制为6将允许它们最多占用3位(最多8位),剩下4/5位用于.f
因此,看起来6只是一个任意值,根据您希望能够将网络的训练参数压缩成的位数来选择。根据“为什么”只实现了值为6的版本,我认为这是因为这是最适合8位的值,这可能是最常见的用例。
发布于 2017-11-10 20:23:51
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获得了最好的结果。
发布于 2020-10-03 00:45:17
如果您想要一个不同的数字,例如,如果您对二进制数据使用硬编码权重并希望使用ReLU1(),则可以按如下方式实现:
class ReLU1(nn.Module):
def forward(self, x):
return F.relu6(x * 6.0) / 6.0class 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)https://stackoverflow.com/questions/47220595
复制相似问题