Les échantillons d'apprentissage prélevés au hasard pour les mini-réseaux de neurones d'apprentissage doivent-ils être prélevés sans remplacement?

18

Nous définissons une époque comme ayant parcouru l'intégralité de tous les échantillons d'apprentissage disponibles, et la taille du mini-lot comme le nombre d'échantillons sur lesquels nous faisons la moyenne pour trouver les mises à jour des poids / biais nécessaires pour descendre le gradient.

Ma question est de savoir si nous devons puiser sans remplacement dans l'ensemble d'exemples de formation afin de générer chaque mini-lot à une époque. Je pense que nous devrions éviter le remplacement pour nous assurer que nous "tirons tous les échantillons" pour répondre à l'exigence de fin de période, mais j'ai du mal à trouver une réponse définitive d'une manière ou d'une autre.

J'ai essayé de googler et de lire Ch. 1 des réseaux neuronaux et de l'apprentissage profond de Nielsen, mais n'ont pas trouvé de réponse claire. Dans ce texte, Nielsen ne précise pas que l'échantillonnage aléatoire doit être fait sans remplacement, mais semble impliquer que c'est le cas.

Une formalisation plus claire de la formation aux époques peut être trouvée ici si vous le souhaitez - /stats//a/141265/131630

Edit: cette question m'a semblé similaire mais il n'était pas clair comment appliquer le fait que la linéarité de l'attente est indifférente à l'indépendance à cette situation - Si l'échantillonnage a lieu avec ou sans remplacement

bobo
la source
À moins qu'il n'y ait une raison spécifique aux données, le mini-lot pour l'entraînement au réseau neuronal est toujours tracé sans remplacement. L'idée est que vous voulez être quelque part entre le mode batch, qui calcule le gradient avec l'ensemble de données complet et SGD, qui utilise un seul aléatoire.
horaceT
SGD n'est pas limité à l'utilisation d'un échantillon aléatoire. Ce processus est appelé formation en ligne. "Une version extrême de la descente de gradient consiste à utiliser une taille de mini-lot de seulement 1 ... Cette procédure est connue sous le nom d'apprentissage en ligne, en ligne ou incrémentiel." Et aussi, "Une idée appelée descente de gradient stochastique peut être utilisée pour accélérer l'apprentissage. L'idée est d'estimer le gradient ∇C en le calculant pour un petit échantillon d'entrées d'entraînement choisies au hasard. En faisant la moyenne sur ce petit échantillon. .nous pouvons rapidement obtenir une bonne estimation du vrai gradient ". Les deux citations de Nielsen Ch. 1.
bobo

Réponses:

13

Une bonne analyse théorique des schémas avec et sans remplacement dans le contexte d'algorithmes itératifs basés sur des tirages aléatoires (qui sont le nombre de réseaux de neurones profonds discriminants (DNN) formés contre) peut être trouvée ici

Bref, il s'avère que l'échantillonnage sans remplacement conduit à une convergence plus rapide que l'échantillonnage avec remplacement.

Je donnerai ici une brève analyse basée sur l'exemple de jouet qu'ils fournissent: Disons que nous voulons optimiser la fonction objectif suivante:

xopt=argminx12i=1N(xyi)2

où la cible . Dans cet exemple, nous essayons de résoudre pour le optimal , étant donné labels de évidemment.x N y iyjeN(μ,σ2)XNyje

Ok, donc si nous devions résoudre le optimal directement ci-dessus, nous prendrions ici la dérivée de la fonction de perte, la définirions à 0 et nous résoudrions pour . Donc, pour notre exemple ci-dessus, la perte estxXX

L=12je=1N(X-yje)2

et sa première dérivée serait:

δLδX=je=1N(X-yje)

Mettre à 0 et résoudre pour , donne: xδLδXx

xopt=1Ni=1Nyi

En d'autres termes, la solution optimale n'est rien d'autre que la moyenne de l'échantillon de tous les échantillons de .yNy

Maintenant, si nous ne pouvions pas effectuer le calcul ci-dessus d'un coup, nous devions le faire de manière récursive, via l'équation de mise à jour de la descente de gradient ci-dessous:

Xje=Xje-1-λje(F(Xje-1))

et simplement insérer nos termes ici donne:

Xje=Xje-1-λje(Xje-1-yje)

Si nous exécutons ce qui précède pour tous les , alors nous effectuons effectivement cette mise à jour sans remplacement. La question devient alors: pouvons-nous obtenir également la valeur optimale de de cette façon? (N'oubliez pas que la valeur optimale de n'est rien d'autre que la moyenne de l'échantillon de ). La réponse est oui, si vous laissez . Pour voir, cela nous développons: x x y λ i = 1 / ije1,2,...NXXyλje=1/je

Xje=Xje-1-λje(Xje-1-yje) Xje=Xje-1-1je(Xje-1-yje) Xje=jeXje-1-(Xje-1-yje)je Xje=(je-1)Xje-1+yjeje jeXje=(je-1)Xje-1+yje 

La dernière équation n'est cependant que la formule de la moyenne mobile! Ainsi, alors que nous parcourons l'ensemble de , , etc. jusqu'à , nous aurions effectué nos mises à jour sans remplacement, et notre formule de mise à jour nous donne la solution optimale de , qui est la échantillon moyen!i = 2 i = N xje=1je=2je=NX

NXN=(N-1)XN-1+yN==>XN=1Nje=1Nyje=μ

En revanche cependant, si nous dessinions avec remplacement, alors que nos tirages seraient alors vraiment indépendants, la valeur optimisée serait différente de la moyenne (optimale) , et l'erreur carrée serait donnée par:XNμ

E{(XN-μ)2}

qui va être une valeur positive, et ce simple exemple de jouet peut être étendu à des dimensions plus élevées. Cela a pour conséquence que nous voudrions effectuer l'échantillonnage sans remplacement comme une solution plus optimale.

J'espère que cela clarifie un peu plus!

Tarin Ziyaee
la source
Cet exemple utilise beaucoup d'hypothèses, c'est-à-dire l'utilisation de l'erreur quadratique et de la convexité du paysage de perte. Le résultat est-il valable lorsque ces hypothèses ne sont pas satisfaites?
bayerj
@bayerj Cet exemple de jouet particulier, oui. Cependant, l'article continue à l'étendre à d'autres autres cas théoriques. Je crois que d'autres sources [Boutou je pense] montrent un soutien empirique pour que l'échantillonnage sans remplacement soit supérieur.
Tarin Ziyaee
@TarinZiyaee Merci pour cette réponse - pouvez-vous clarifier λ_k = 1 / k? De quel k parlons-nous ici, le k de l'équation ci-dessus? Je ne vous ai pas suivi ici, ce qui a rendu difficile la suite de la sommation et de la conclusion. Merci.
bobo du
1
@bobo Je vais essayer de clarifier le message ce soir.
Tarin Ziyaee
1
@bobo J'ai mis à jour ma réponse un tas. Veuillez jeter un coup d'œil et faites-moi savoir si cela aide.
Tarin Ziyaee
5

Selon le code du référentiel de Nielsen, les mini-lots sont dessinés sans remplacement:

    def SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None):
    n = len(training_data)
    for j in range(epochs):
            random.shuffle(training_data)
            mini_batches = [
                training_data[k:k+mini_batch_size]
                for k in range(0, n, mini_batch_size)
            ]
            for mini_batch in mini_batches:
                self.update_mini_batch(mini_batch, eta)

Nous pouvons voir qu'il n'y a pas de remplacement d'échantillons d'apprentissage dans une époque. Fait intéressant, nous pouvons également voir que Nielsen choisit de ne pas se soucier d'ajuster eta(le taux d'apprentissage) pour la dernière taille de mini_batch, qui peut ne pas avoir autant d'échantillons d'entraînement que les mini-lots précédents. Vraisemblablement, c'est une modification avancée qu'il laisse pour les chapitres suivants. **

** EDIT: En fait, cette mise à l'échelle se produit dans la def update_mini_batchfonction. Par exemple, avec les poids:

self.weights = [w-(eta/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)]     

Cela est nécessaire car le dernier mini_batch peut être plus petit que les mini_batches précédents si le nombre d'échantillons d'apprentissage par mini_batch ne se divise pas également en nombre total d'échantillons d'apprentissage disponibles.

mylist = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
n = len(mylist)
mini_batch_size = 2
mini_batches = [
    mylist[k:k+mini_batch_size]
    for k in range(0, n, mini_batch_size)
    ]
for mini_batch in mini_batches:
    print(mini_batch)

Production:

['1', '2']
['3', '4']
['5', '6']
['7', '8']
['9', '10']

Changer mini_batch_sizepour 3, qui ne se divise pas également en nos 10 échantillons d'entraînement. Pour la sortie, nous obtenons:

['1', '2', '3']
['4', '5', '6']
['7', '8', '9']
['10']

Lors de l'évaluation d'une plage sur des indices de liste (quelque chose de la forme [x:y]xet ysont des indices dans la liste), si notre valeur de droite dépasse la longueur de la liste, python renvoie simplement les éléments de la liste jusqu'à ce que la valeur sorte de la plage d'index .

Ainsi, le dernier mini-lot peut être plus petit que les mini-lots précédents, mais s'il est pondéré par le même, etaces échantillons d'apprentissage contribueront davantage à l'apprentissage que les échantillons des autres mini-lots plus grands. Étant donné qu'il ne s'agit que du dernier mini-lot, cela ne vaut probablement pas la peine de s'inquiéter de trop, mais peut facilement être résolu en adaptant etala longueur du mini-lot.

bobo
la source