supposons que je veux former un algorithme de régression de descente de gradient stochastique en utilisant un ensemble de données qui a N échantillons. Puisque la taille de l'ensemble de données est fixe, je vais réutiliser les données T fois. À chaque itération ou "époque", j'utilise chaque échantillon d'entraînement exactement une fois après avoir réorganisé au hasard l'ensemble de l'entraînement.
Mon implémentation est basée sur Python et Numpy. Par conséquent, l'utilisation d'opérations vectorielles peut considérablement réduire le temps de calcul. Venir avec une implémentation vectorisée de la descente de gradient par lots est assez simple. Cependant, dans le cas de la descente de gradient stochastique, je ne peux pas comprendre comment éviter la boucle externe qui itère à travers tous les échantillons à chaque époque.
Quelqu'un connaît-il une implémentation vectorisée de la descente de gradient stochastique?
EDIT : On m'a demandé pourquoi j'aimerais utiliser la descente de gradient en ligne si la taille de mon ensemble de données est fixe.
D'après [1], on peut voir que la descente de gradient en ligne converge plus lentement que la descente de gradient par lots vers le minimum du coût empirique. Cependant, il converge plus rapidement vers le minimum du coût attendu, qui mesure les performances de généralisation. Je voudrais tester l'impact de ces résultats théoriques sur mon problème particulier, au moyen d'une validation croisée. Sans implémentation vectorisée, mon code de descente de gradient en ligne est beaucoup plus lent que celui de descente de gradient par lots. Cela augmente considérablement le temps nécessaire pour terminer le processus de validation croisée.
EDIT : J'inclus ici le pseudocode de mon implémentation de descente de gradient en ligne, comme demandé par ffriend. Je résous un problème de régression.
Method: on-line gradient descent (regression)
Input: X (nxp matrix; each line contains a training sample, represented as a length-p vector), Y (length-n vector; output of the training samples)
Output: A (length-p+1 vector of coefficients)
Initialize coefficients (assign value 0 to all coefficients)
Calculate outputs F
prev_error = inf
error = sum((F-Y)^2)/n
it = 0
while abs(error - prev_error)>ERROR_THRESHOLD and it<=MAX_ITERATIONS:
Randomly shuffle training samples
for each training sample i:
Compute error for training sample i
Update coefficients based on the error above
prev_error = error
Calculate outputs F
error = sum((F-Y)^2)/n
it = it + 1
[1] "Apprentissage en ligne à grande échelle", L. Bottou, Y. Le Cunn, NIPS 2003.