Une des méthodes d'initialisation du coefficient de poids, également connue sous le nom de "MSRA". Il est utilisé dans l'article de Kaiming He et al., et il semble que l'auteur et Microsoft Research soient à l'origine du nom.
HeNormal initialise le facteur de pondération $ W $ avec un nombre aléatoire qui suit une distribution normale avec un écart type de $ \ sqrt {2 / N} $. Ici, $ N $ est la taille de l'entrée. Dans le cas de links.Linear
, c'est la taille du vecteur d'entrée, et dans le cas de links.Convolution2D
, c'est le nombre de canaux x hauteur du noyau x largeur du noyau.
Comme méthode d'initialisation avec HeNormal, math.sqrt (2)
peut être spécifié pour wscale
lors de la création d'une instance de lien.
Par exemple, spécifiez chainer.links.Linear (100, 100, wscale = math.sqrt (2))
.
Cette méthode est également utilisée dans le modèle Network-in-Network de l'exemple ImageNet de Chainer (https://github.com/pfnet/chainer/blob/master/examples/imagenet/nin.py).
Cependant, il s'avère que le comportement de wscale
a changé involontairement depuis la v1.9.0.
J'ai déjà enregistré un problème.
wscale doesn't have backward compatibility
Si vous voulez utiliser HeNormal explicitement, vous devriez éviter de le spécifier avec wscale
jusqu'à ce que ce problème soit résolu.
Par exemple, si vous dites "initialisé avec HeNormal" lors de la publication du résultat à l'aide de l'implémentation Chainer, ou si vous utilisez HeNormal dans la recherche d'autres équipes et souhaitez organiser la méthode d'initialisation pour la reproduire. , Je pense qu'il vaut mieux utiliser Weight Initializer comme décrit ci-dessous.
Dans Chainer, vous pouvez spécifier comment initialiser le coefficient de pondération en utilisant Weight Initializer. Pour initialiser à l'aide d'Initializer, spécifiez une instance d'initializer dans ʻinitialW` du lien. Exemple:
class MLP(chainer.Chain):
def __init__(self, n_in, n_units, n_out):
initializer = chainer.initializers.HeNormal()
super(MLP, self).__init__(
l1=L.Linear(None, n_units, initialW=initializer), # n_in -> n_units
l2=L.Linear(None, n_units, initialW=initializer), # n_units -> n_units
l3=L.Linear(None, n_out, initialW=initializer), # n_units -> n_out
)
...
Recommended Posts