[PYTHON] [Deep Learning from scratch] Valeur initiale du poids du réseau neuronal utilisant la fonction sigmoïde

introduction

Cet article est une sortie facile à comprendre du ** Deep Learning from scratch Chapter 7 Learning Techniques **. J'ai pu le comprendre moi-même, j'espère donc que vous pourrez le lire confortablement. De plus, je serais plus qu'heureux si vous pouviez vous y référer lors de l'étude de ce livre.

À propos de la valeur initiale du poids du réseau de neurones

Jusqu'à présent, la valeur initiale du poids du réseau de neurones utilisait la méthode aléatoire pour générer un nombre aléatoire, mais cela élargirait le succès de l'apprentissage.

La valeur initiale du poids et l'entraînement du réseau neuronal sont très étroitement liés, et si la valeur initiale est appropriée, le résultat d'apprentissage sera bon, et si la valeur initiale est inappropriée, le résultat d'apprentissage sera mauvais.

Par conséquent, cette fois, je voudrais mettre en œuvre une méthode de définition d'une valeur initiale appropriée de poids dans un réseau neuronal en utilisant la fonction sigmoïde.

Valeur initiale de Xavier

La valeur initiale du poids qui convient le mieux au réseau de neurones utilisant la fonction sigmoïde est la valeur initiale de Xavier.

scale = np.sqrt(1.0 / all_size_list[idx - 1]) 
scale * np.random.randn(all_size_list[idx-1], all_size_list[idx])

La valeur initiale de Xavier peut être créée en calculant 1 ÷ le nombre de nœuds dans la couche précédente avec une racine et en le multipliant par un nombre aléatoire aléatoire.

Vous trouverez ci-dessous un exemple de réseau de neurones qui utilise les valeurs initiales de He et Xavier.

#Application de la valeur initiale du poids ・ Réseau neuronal implémentant la décroissance du poids
class MutiLayerNet:
    def __init__(self,input_size,hiden_size_list,output_size,
                activation='relu',weight_init_std='relu',weight_decay_lambda=0):#weight_decay_Plus le lambda est grand, plus fort
        self.input_size = input_size#Nombre de neurones dans la couche d'entrée
        self.output_size = output_size#Nombre de neurones dans la couche de sortie
        self.hiden_size_list = hiden_size_list#Nombre de neurones dans chaque couche de la couche intermédiaire
        self.hiden_layer_num = len(hiden_size_list)#Nombre de couches dans la couche intermédiaire
        self.weight_decay_lambda = weight_decay_lambda#Réglage de la force de décroissance du poids
        self.params = {}#Entrez les paramètres
        
        #Initialisation du poids
        self.__init_weight(weight_init_std)
        
        #Création de couches
        activation_layer = {'sigmoid': Sigmoid,'relu': Relu}
        self.layers = OrderedDict()#Dictionnaire ordonné pour stocker les couches
        for idx in range(1, self.hiden_layer_num+1):#Répétez pour le nombre de couches intermédiaires
            self.layers['Affine' + str(idx)] = Affine(self.params['W' + str(idx)],
                                                      self.params['b' + str(idx)])
            self.layers['Activation_function' + str(idx)] = activation_layer[activation]()#Sélectionnez le calque de fonction Relu

        idx = self.hiden_layer_num + 1#Créer une couche affine avant la couche de sortie
        self.layers['Affine' + str(idx)] = Affine(self.params['W' + str(idx)],
            self.params['b' + str(idx)])

        self.last_layer = SoftmaxWithLoss()#Couche de la couche de sortie à la fonction de perte
        
    def __init_weight(self, weight_init_std):#Méthode d'initialisation du poids / biais
        all_size_list = [self.input_size] + self.hiden_size_list + [self.output_size]#Contient le nombre de neurones dans toutes les couches
        for idx in range(1, len(all_size_list)):
            scale = weight_init_std#Contient le nombre à multiplier par le poids aléatoire
            if str(weight_init_std).lower() in ('relu', 'he'):#Créer la valeur initiale de he lors de l'utilisation de la fonction relu
                scale = np.sqrt(2.0 / all_size_list[idx - 1])  #Valeur initiale recommandée lors de l'utilisation de ReLU
            elif str(weight_init_std).lower() in ('sigmoid', 'xavier'):#Lors de l'utilisation de la fonction sigmoïde Créez la valeur initiale de xavier
                scale = np.sqrt(1.0 / all_size_list[idx - 1])  #Valeur initiale recommandée lors de l'utilisation de sigmoïde

            self.params['W' + str(idx)] = scale * np.random.randn(all_size_list[idx-1], all_size_list[idx])#Initialisation du poids
            self.params['b' + str(idx)] = np.zeros(all_size_list[idx])#Initialisation du biais
            
    def predict(self, x):#Traitement de propagation avant du réseau neuronal
        for layer in self.layers.values():
            x = layer.forward(x)

        return x
    
    def loss(self, x, t):#Traitement de propagation avant du réseau neuronal à la fonction de perte + traitement de la décroissance du poids
        y = self.predict(x)

        weight_decay = 0
        for idx in range(1, self.hiden_layer_num + 2):#Dans le processus de décroissance du poids, les carrés des poids de chaque couche sont additionnés et le processus suivant est effectué pour résumer.
            W = self.params['W' + str(idx)]
            weight_decay += 0.5 * self.weight_decay_lambda * np.sum(W ** 2)

        return self.last_layer.forward(y, t) + weight_decay

    def accuracy(self, x, t):#Calculez le taux de réponse correct
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        if t.ndim != 1 : t = np.argmax(t, axis=1)

        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy

    def numerical_gradient(self, x, t):#Différenciation numérique
        loss_W = lambda W: self.loss(x, t)

        grads = {}
        for idx in range(1, self.hidden_layer_num+2):
            grads['W' + str(idx)] = slopeing_grad(loss_W, self.params['W' + str(idx)])
            grads['b' + str(idx)] = slopeing_grad(loss_W, self.params['b' + str(idx)])

        return grads

    def gradient(self, x, t):#Méthode de propagation de retour d'erreur
        # forward
        self.loss(x, t)

        # backward
        dout = 1
        dout = self.last_layer.backward(dout)

        layers = list(self.layers.values())
        layers.reverse()
        for layer in layers:
            dout = layer.backward(dout)

        #Récupération de gradient
        grads = {}
        for idx in range(1, self.hiden_layer_num+2):#Gère également la décroissance du poids
            grads['W' + str(idx)] = self.layers['Affine' + str(idx)].dW + self.weight_decay_lambda * self.layers['Affine' + str(idx)].W
            grads['b' + str(idx)] = self.layers['Affine' + str(idx)].db

        return grads

Recommended Posts

[Deep Learning from scratch] Valeur initiale du poids du réseau neuronal utilisant la fonction sigmoïde
[Deep Learning from scratch] Poids initial du réseau neuronal lors de l'utilisation de la fonction Relu
Mémo d'auto-apprentissage «Deep Learning from scratch» (n ° 10-2) Valeur initiale du poids
Python vs Ruby "Deep Learning from scratch" Chapitre 3 Implémentation d'un réseau neuronal à 3 couches
Chapitre 3 Réseau de neurones Ne découpez que les bons points de Deeplearning à partir de zéro
Version Lua Apprentissage profond à partir de zéro Partie 6 [Traitement d'inférence de réseau neuronal]
Enregistrement d'apprentissage de la lecture "Deep Learning from scratch"
Python vs Ruby "Deep Learning from scratch" Chapitre 4 Implémentation de la fonction de perte
Apprentissage profond / rétropropagation d'erreur de la fonction sigmoïde
[Mémo d'apprentissage] Apprentissage profond à partir de zéro ~ Mise en œuvre de l'abandon ~
Application de Deep Learning 2 à partir de zéro Filtre anti-spam
[Deep Learning] Exécuter la console de réseau neuronal SONY à partir de CUI
Apprentissage profond à partir de zéro 1 à 3 chapitres
Apprentissage des classements à l'aide d'un réseau neuronal (implémentation RankNet par Chainer)
Essayez de créer un réseau de neurones / d'apprentissage en profondeur avec scratch
[Apprentissage en profondeur] Découvrez comment utiliser chaque fonction du réseau neuronal convolutif [DW jour 3]
[Deep Learning from scratch] Implémentez le traitement de rétropropagation dans le réseau neuronal par la méthode de propagation de retour d'erreur
Apprentissage profond à partir de zéro (calcul des coûts)
Mémo d'apprentissage profond créé à partir de zéro
[Deep Learning from scratch] Principales méthodes de mise à jour des paramètres pour les réseaux neuronaux
Écrivez vos impressions sur l'édition du framework Deep Learning 3 créée à partir de zéro
Mémo d'auto-apprentissage "Deep Learning from scratch" (n ° 13) Essayez d'utiliser Google Colaboratory
[Deep Learning from scratch] À propos des couches requises pour implémenter le traitement de rétropropagation dans un réseau neuronal
Deep Learning from scratch 4.4.2 Gradient pour les réseaux de neurones La question sur la fonction numerical_gradient a été résolue.
Apprentissage profond à partir de zéro (propagation vers l'avant)
Implémentation d'un réseau neuronal à 3 couches (pas d'apprentissage)
Apprentissage profond / Apprentissage profond à partir de zéro 2-Essayez de déplacer GRU
Deep learning / Deep learning made from scratch Chapitre 6 Mémo
[Deep Learning from scratch] J'ai essayé d'implémenter la couche sigmoïde et la couche Relu
[Mémo d'apprentissage] Deep Learning fait de zéro [Chapitre 5]
[Mémo d'apprentissage] Le Deep Learning fait de zéro [Chapitre 6]
"Deep Learning from scratch" avec Haskell (inachevé)
Deep learning / Deep learning made from scratch Chapitre 7 Mémo
[Windows 10] Construction de l'environnement "Deep Learning from scratch"
[Deep Learning from scratch] Implémentation de couche de la fonction softmax à l'erreur d'entropie croisée
[Deep Learning from scratch] À propos de l'optimisation des hyper paramètres
Mémo d'auto-apprentissage "Deep Learning from scratch" (partie 12) Deep learning
[Mémo d'apprentissage] Deep Learning fait de zéro [~ Chapitre 4]
Deep Learning from scratch La théorie et la mise en œuvre de l'apprentissage profond appris avec Python Chapitre 3
[Deep Learning from scratch] Accélération du réseau de neurones J'ai expliqué le traitement de la propagation arrière
Mémo d'auto-apprentissage "Deep Learning from scratch" (glossaire illisible)
[Python / Machine Learning] Pourquoi le Deep Learning # 1 Perceptron Neural Network
"Deep Learning from scratch" Mémo d'auto-apprentissage (n ° 9) Classe MultiLayerNet
Apprentissage par renforcement 10 Essayez d'utiliser un réseau neuronal formé.
Deep Learning from scratch ① Chapitre 6 "Techniques liées à l'apprentissage"
GitHub du bon livre "Deep Learning from scratch"
Deep Learning from scratch Chapter 2 Perceptron (lecture du mémo)
Résumé Python vs Ruby "Deep Learning from scratch"
Mémo d'auto-apprentissage «Deep Learning from scratch» (10) Classe MultiLayerNet
Mémo d'auto-apprentissage «Deep Learning from scratch» (n ° 11) CNN
Contre-mesures pour l'erreur "Impossible d'obtenir le répertoire supérieur" lors de l'utilisation du Deep Learning ② fait à partir de zéro avec le spyder d'ANACONDA
Deep Learning from scratch 4.3.3 Dessinez un vecteur de gradient de votre propre fonction en vous basant sur l'exemple de code de différenciation partielle.
Python vs Ruby "Deep Learning from scratch" Chapitre 1 Graphique de la fonction sin et de la fonction cos
[Deep Learning from scratch] J'ai implémenté la couche Affine
Mémo d'auto-apprentissage «Deep Learning from scratch» (n ° 19) Augmentation des données
Othello ~ De la troisième ligne de "Implementation Deep Learning" (4) [Fin]
Implémentation d'un réseau de neurones convolutifs utilisant uniquement Numpy
[Deep Learning from scratch] J'ai essayé d'expliquer le décrochage
Collecte et automatisation d'images érotiques à l'aide du deep learning
Chapitre 2 Implémentation de Perceptron Ne découpez que les bons points de Deeplearning à partir de zéro