Keras: verschil tussen kernel- en activiteitregulatoren

Ik heb gemerkt dat weight_regularizerniet meer beschikbaar is in Keras en dat er in plaats daarvan activityen kernelregularizer zijn.
Ik zou graag willen weten:

  • Wat zijn de belangrijkste verschillen tussen kernelen activiteitregularizers?
  • Kan ik activity_regularizergebruiken in plaats van weight_regularizer?

Antwoord 1, autoriteit 100%

De activity regularizer werkt als een functie van de output van het net, en wordt meestal gebruikt om verborgen eenheden te regulariseren, terwijl weight_regularizer, zoals de naam al zegt, werkt op de gewichten (door ze bijvoorbeeld te laten vervallen). In principe kan je het regularisatieverlies uitdrukken als een functie van de output (activity_regularizer) of van de gewichten (weight_regularizer).

De nieuwe kernel_regularizervervangt weight_regularizer– hoewel dit niet erg duidelijk is uit de documentatie.

Van de definitie van kernel_regularizer:

kernel_regularizer: Regularizer-functie toegepast op
de kernelgewichtsmatrix
(zie regularizer).

En activity_regularizer:

activity_regularizer: Regularizer-functie toegepast op
de uitvoer van de laag (de “activering”).
(zie regularizer).

Belangrijke bewerking: merk op dat er een bug in de activity_regularizerzit die alleen is opgelost in versie 2.1.4 van Keras(tenminste met Tensorflow-backend). In de oudere versies wordt de activiteitsregulatorfunctie inderdaad toegepast op de invoer van de laag, in plaats van op de uitvoer (de eigenlijke activeringen van de laag, zoals bedoeld). Dus pas op als je een oudere versie van Keras gebruikt (vóór 2.1.4), de regularisatie van activiteiten werkt waarschijnlijk niet zoals bedoeld.

Je kunt de commit zien op GitHub

Vijf maanden geleden bracht François Chollet een oplossing aan voor de activiteitsregulator, die toen werd opgenomen in Keras 2.1.4


Antwoord 2, autoriteit 71%

Dit antwoord is een beetje laat, maar is nuttig voor de toekomstige lezers.
Dus, noodzaak is de moeder van de uitvinding zoals ze zeggen. Ik begreep het alleen toen ik het nodig had.
Het bovenstaande antwoord geeft niet echt het verschil aan, want beide hebben uiteindelijk invloed op de gewichten, dus wat is het verschil tussen straffen voor de gewichten zelf of de uitvoer van de laag?
Hier is het antwoord: ik ben een geval tegengekomen waarin de gewichten van het net klein en mooi zijn, variërend van [-0.3] tot [+0.3].
Ik kan ze dus echt niet straffen, er is niets mis met ze. Een kernel regularizer is nutteloos. De uitvoer van de laag is echter ENORM, in 100’s.
Houd er rekening mee dat de invoer naar de laag ook klein is, altijd minder dan één. Maar die kleine waarden werken op zo’n manier samen met de gewichten dat ze die enorme output produceren. Hier realiseerde ik me dat ik een activity regularizer nodig heb, in plaats van een kernel regularizer. Hiermee straf ik de laag voor die grote outputs, het kan me niet schelen of de gewichten zelf klein zijn, ik wil gewoon voorkomen dat het een dergelijke toestand bereikt, want dit verzadigt mijn sigmoid-activering en veroorzaakt tal van andere problemen, zoals verdwijnen helling en stagnatie.

Other episodes