Quelle est la définition du paramètre non entraînable dans un modèle?

Par exemple, pendant que vous construisez votre propre modèle, sa valeur par défaut est 0, mais lorsque vous souhaitez utiliser un modèle de démarrage, il devient autre chose plutôt que 0. Quelle en serait la raison?

20
TheWho 15 nov. 2017 à 19:11

4 réponses

Meilleure réponse

Les paramètres non formables sont un sujet assez vaste. Un exemple simple est de considérer le cas de tout modèle NN spécifique et de son architecture.

Supposons que nous ayons déjà configuré votre définition de réseau dans Keras et que votre architecture ressemble à 256->500->500->1. Sur la base de cette définition, nous semblons avoir un modèle de régression (une sortie) avec deux couches cachées (500 nœuds chacune) et une entrée de 256.

Un des paramètres non entraînables de votre modèle est, par exemple, le nombre de couches masquées lui-même (2). D'autres pourraient être les nœuds sur chaque couche masquée (500 dans ce cas), ou même les nœuds sur chaque couche individuelle, vous donnant un paramètre par couche plus le nombre de couches lui-même.

Ces paramètres sont "non entraînables" car vous ne pouvez pas optimiser sa valeur avec vos données d'entraînement. Les algorithmes d'entraînement (comme la rétro-propagation) optimiseront et mettront à jour les pondérations de votre réseau, qui sont les paramètres réellement entraînables ici (généralement plusieurs milliers, selon vos connexions). Vos données d'entraînement telles quelles ne peuvent pas vous aider à déterminer ces paramètres non entraînables.

Cependant, cela ne signifie pas que numberHiddenLayers n'est pas du tout formable, cela signifie seulement que dans ce modèle et sa mise en œuvre, nous ne pouvons pas le faire. Nous pourrions rendre numberHiddenLayers entraînable ; le moyen le plus simple serait de définir un autre algorithme ML qui prend ce modèle en entrée et l'entraîne avec plusieurs valeurs de numberHiddenLayers. La meilleure valeur est obtenue avec le modèle qui a surperformé les autres, optimisant ainsi la variable numberHiddenLayers.

En d'autres termes, les paramètres non entraînables d'un modèle sont ceux que vous ne serez pas mis à jour et optimisés pendant l'entraînement, et qui doivent être définis a priori , ou passés en entrée.

17
DarkCygnus 15 nov. 2017 à 16:42

Dans les keras, les paramètres non entraînables (comme indiqué dans model.summary()) désignent le nombre de poids qui ne sont pas mis à jour pendant l'entraînement avec rétropropagation.

Il existe principalement deux types de poids non entraînables:

  • Ceux que vous avez choisi de garder constants lors de l'entraînement. Cela signifie que les keras ne mettront pas du tout à jour ces poids pendant l'entraînement.
  • Ceux qui fonctionnent comme des statistiques dans les couches BatchNormalization. Ils sont mis à jour avec la moyenne et la variance, mais ils ne sont pas "entraînés à la rétropropagation".

Les poids sont les valeurs à l'intérieur du réseau qui effectuent les opérations et peuvent être ajustés pour obtenir ce que nous voulons. L'algorithme de rétropropagation modifie les poids vers une erreur inférieure à la fin.

Par défaut, tous les poids d'un modèle keras peuvent être entraînés.

Lorsque vous créez des couches, il crée en interne ses propres poids et ils peuvent être entraînés. (L'algorithme de rétropropagation mettra à jour ces poids)

Lorsque vous les rendez non formables, l'algorithme ne mettra plus à jour ces poids. Ceci est utile, par exemple, lorsque vous voulez une couche convolutive avec un filtre spécifique, comme un filtre Sobel, par exemple. Vous ne voulez pas que la formation change cette opération, donc ces poids / filtres doivent être maintenus constants.

Il y a beaucoup d'autres raisons pour lesquelles vous pourriez vouloir rendre les poids non entraînables.


Modification des paramètres:

Pour décider si les pondérations peuvent être entraînées ou non, vous prenez des couches du modèle et définissez trainable:

model.get_layer(layerName).trainable = False #or True

Cela doit être fait avant la compilation.

26
Daniel Möller 27 janv. 2019 à 13:02

Il y a certains détails que d'autres réponses ne couvrent pas.

Dans Keras, les paramètres non entraînables sont ceux qui ne sont pas entraînés à l'aide de la descente de gradient . Ceci est également contrôlé par le paramètre trainable dans chaque couche, par exemple:

from keras.layers import *
from keras.models import *
model = Sequential()
model.add(Dense(10, trainable=False, input_shape=(100,)))
model.summary()

Cela imprime zéro paramètre entraînable et 1010 paramètres non entraînables.

_________________________________________________________________    
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 10)                1010      
=================================================================
Total params: 1,010
Trainable params: 0
Non-trainable params: 1,010
_________________________________________________________________

Maintenant, si vous définissez le calque comme entraînable avec model.layers [0] .trainable = True puis il imprime:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 10)                1010      
=================================================================
Total params: 1,010
Trainable params: 1,010
Non-trainable params: 0
_________________________________________________________________

Maintenant, tous les paramètres peuvent être entraînés et il n'y a aucun paramètre non entraînable. Mais il y a aussi des couches qui ont à la fois des paramètres entraînables et non entraînables, un exemple est la couche BatchNormalization, où la moyenne et l'écart type des activations sont stockés pour une utilisation pendant le temps de test. Un exemple:

model.add(BatchNormalization())
model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 10)                1010      
_________________________________________________________________
batch_normalization_1 (Batch (None, 10)                40        
=================================================================
Total params: 1,050
Trainable params: 1,030
Non-trainable params: 20
_________________________________________________________________

Ce cas spécifique de BatchNormalization a 40 paramètres au total, 20 entraînables et 20 non entraînables. Les 20 paramètres non entraînables correspondent à la moyenne et à l'écart type calculés des activations utilisées pendant le temps de test, et ces paramètres ne pourront jamais être entraînés en utilisant la descente de gradient et ne sont pas affectés par le drapeau trainable.

20
Dr. Snoopy 19 oct. 2018 à 14:30

Il est clair que si vous gelez une couche du réseau. tous les paramètres de ce calque gelé deviennent non entraînables. D'un autre côté, si vous concevez votre réseau à partir de zéro, il peut également avoir des paramètres non entraînables. Par exemple, la couche de normalisation par lots a 4 paramètres qui sont;

[gamma weights, beta weights, moving_mean, moving_variance]

Les deux premiers d'entre eux peuvent être entraînés, mais les deux derniers ne le sont pas. La couche de normalisation par lots est donc très probablement la raison pour laquelle votre réseau personnalisé a des paramètres non entraînables.

2
M. Balcilar 10 août 2018 à 21:07
47312219