Pouvez-vous clarifier pour moi et les personnes qui ont besoin de comprendre la définition de paramètres non entraînables dans un modèle?
Par exemple, pendant que vous construisez votre propre modèle, sa valeur est 0 par défaut, mais lorsque vous souhaitez utiliser un modèle de démarrage, il devient autre chose que 0. Quelle en serait la raison?
Merci beaucoup pour vos éclaircissements à l'avance.
Les paramètres non entraînables sont un sujet assez large. 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 cachées lui-même (2). D'autres pourraient être les nœuds sur chaque couche caché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étropropagation) optimiseront et mettez à jour les poids de votre réseau, qui sont les paramètres réels à former ici (généralement plusieurs milliers, selon vos connexions). Vos données d'entraînement telles qu'elles sont 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 entraînable, 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; la manière la plus simple serait de définir un autre algorithme ML qui prend ce modèle en entrée et le forme avec plusieurs valeurs de numberHiddenLayers
. La meilleure valeur est obtenue avec le modèle qui a surpassé les autres, optimisant ainsi la variable numberHiddenLayers
.
En d'autres termes, les paramètres non modifiables d'un modèle sont ceux que vous ne mettrez pas à jour et ne serez pas optimisés pendant la formation, et qui doivent être définis a priori , ou passé en entrée.
En keras, les paramètres non entraînables (comme indiqué dans model.summary()
) signifient les 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:
Les poids sont les valeurs à l'intérieur du réseau qui effectuent les opérations et peuvent être ajustées pour donner ce que nous voulons. L'algorithme de rétropropagation modifie les pondérations vers une erreur plus faible à la fin.
Par défaut, tous les poids d'un modèle de kéros peuvent être entraînés.
Lorsque vous créez des calques, en interne, il crée ses propres poids et ils peuvent être entraînés. (L'algorithme de rétropropagation mettra à jour ces poids)
Lorsque vous les rendez non entraînables, l'algorithme ne mettra plus à jour ces poids. Cela est utile, par exemple, lorsque vous voulez une couche convolutionnelle avec un filtre spécifique, comme un filtre Sobel, par exemple. Vous ne voulez pas que la formation modifie cette opération, ces poids/filtres doivent donc être maintenus constants.
Il y a beaucoup d'autres raisons pour lesquelles vous voudrez peut-être rendre les poids non entraînables.
Modification des paramètres:
Pour décider si les poids peuvent être entraînés ou non, vous prenez les couches du modèle et définissez trainable
:
model.get_layer(layerName).trainable = False #or True
Cela doit être fait avant la compilation.
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 par 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 formable 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 sont entraînables 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 être utilisés 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 calculée et à l'écart type des activations utilisées pendant le temps de test, et ces paramètres ne seront jamais entraînables par descente de gradient et ne sont pas affectés par l'indicateur trainable
.
Il est clair que si vous gelez n'importe quelle couche du réseau. tous les paramètres de cette couche gelée 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. Ainsi, la couche de normalisation par lots est très probablement la raison pour laquelle votre réseau personnalisé possède des paramètres non entraînables.