Waarom de 6 in relu6?

Ik heb een diepe feed-forward NN helemaal opnieuw gehackt in R, en het lijkt stabieler met “harde sigmoid”-activeringen – max(0,min(1,x)) – dan ReLU. Ik probeerde het naar TensorFlow te porteren en merkte op dat ze deze activeringsfunctie niet ingebouwd hebben, alleen relu6, die een bovengrens gebruikt bij 6. Is hier een reden voor?
(Ik realiseer me dat je relu6(x*6)/6 zou kunnen doen, maar als de TF-jongens de 6 daar om een ​​goede reden hebben geplaatst, zou ik dat graag willen weten.)
Ik zou ook graag willen weten of anderen explosieproblemen hebben met ReLU in feedforward-netten (ik ben op de hoogte van RNN-problemen).


Antwoord 1, autoriteit 100%

Van deze reddit-thread:

Dit is handig om de netwerken klaar te maken voor vaste-puntinferentie.
Als u de bovengrens loskoppelt, verliest u te veel bits aan het Q-gedeelte
van een Q.f-nummer. Door de ReLU’s begrensd door 6 te houden, kunnen ze een
max van 3 bits (tot 8) met 4/5 bits voor .f

Het lijkt er dus op dat 6 slechts een willekeurige waarde is die is gekozen op basis van het aantal bits waarin u de getrainde parameters van uw netwerk wilt kunnen comprimeren.
Volgens het “waarom” is alleen de versie met waarde 6 geïmplementeerd, ik neem aan dat dit komt omdat dat de waarde is die het beste past in 8 bits, wat waarschijnlijk de meest voorkomende use-case is.


Antwoord 2, autoriteit 93%

Tensorflows-documentatie (https://www.tensorflow.org/api_docs/python /tf/nn/relu6) verwijst naar het volgende artikel:

… Eerst beperken we de eenheden tot 6, dus onze ReLU-activering
functie is
y = min(max(x, 0), 6).
In onze tests moedigt dit het model aan om eerder schaarse functies te leren. In de formulering van [8] is dit:
gelijk aan je voorstellen dat elke ReLU-eenheid uit slechts 6 gerepliceerde, bias-verschoven Bernoulli-eenheden bestaat, in plaats van
dan een oneindig bedrag. We zullen naar ReLU-eenheden met een maximum van n verwijzen als ReLU-n-eenheden.

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

Omdat het afkomstig is van het papier, vermoed ik dat ze het met verschillende n’s hebben getest en de beste resultaten hebben gekregen voor hun testset met n=6.


Antwoord 3

Als u een ander nummer wilt, bijvoorbeeld als u hardgecodeerde gewichten met binaire gegevens gebruikt en ReLU1() wilt, kan dit als volgt worden geïmplementeerd:

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)

Other episodes