Je ne comprends pas pourquoi le décrochage fonctionne comme ça dans tensorflow. Le blog de CS231n dit que, "dropout is implemented by only keeping a neuron active with some probability p (a hyperparameter), or setting it to zero otherwise."
Vous pouvez également le voir sur l'image (Tiré du même site)
Depuis le site tensorflow, With probability keep_prob, outputs the input element scaled up by 1 / keep_prob, otherwise outputs 0.
Maintenant, pourquoi l'élément d'entrée est mis à l'échelle par 1/keep_prob
? Pourquoi ne pas conserver l'élément d'entrée tel qu'il est avec probabilité et ne pas le mettre à l'échelle avec 1/keep_prob
?
Cette mise à l'échelle permet d'utiliser le même réseau pour la formation (avec keep_prob < 1.0
) Et l'évaluation (avec keep_prob == 1.0
). Du papier abandonné :
L'idée est d'utiliser un seul réseau neuronal au moment du test sans abandon. Les poids de ce réseau sont des versions réduites des poids entraînés. Si une unité est conservée avec probabilité p pendant l'entraînement, les poids sortants de cette unité sont multipliés par p au moment du test, comme le montre la figure 2.
Plutôt que d'ajouter des opérations pour réduire les poids de keep_prob
Au moment du test, l'implémentation TensorFlow ajoute une opération pour augmenter les poids de 1. / keep_prob
Au moment de la formation. L'effet sur les performances est négligeable et le code est plus simple (car nous utilisons le même graphique et traitons keep_prob
Comme un tf.placeholder()
alimenté d'une valeur différente selon savoir si nous formons ou évaluons le réseau).
Disons que le réseau avait n
neurones et nous avons appliqué le taux de décrochage 1/2
Phase de formation, nous nous retrouverions avec n/2
neurones. Donc, si vous vous attendiez à une sortie x
avec tous les neurones, vous allez maintenant passer à x/2
. Donc, pour chaque lot, les poids du réseau sont formés en fonction de ce x/2
Phase de test/inférence/validation, nous n'appliquons aucun abandon donc la sortie est x. Donc, dans ce cas, la sortie serait avec x et non x/2, ce qui vous donnerait un résultat incorrect. Donc, ce que vous pouvez faire est de le mettre à l'échelle x/2 pendant le test.
Plutôt que la mise à l'échelle ci-dessus spécifique à la phase de test. Ce que la couche d'abandon de Tensorflow fait, c'est que, que ce soit avec abandon ou sans (formation ou test), il met à l'échelle la sortie afin que la somme soit constante.
Si vous continuez à lire cs231n , la différence entre abandon et abandon inversé est expliqué.
Étant donné que nous voulons laisser la passe avant au moment du test intacte (et modifier notre réseau juste pendant la formation), tf.nn.dropout
implémente directement le décrochage inversé , en mettant à l'échelle les valeurs.