supongamos que quiero entrenar un algoritmo de regresión de descenso de gradiente estocástico usando un conjunto de datos que tiene N muestras. Como el tamaño del conjunto de datos es fijo, reutilizaré los datos T veces. En cada iteración o "época", uso cada muestra de entrenamiento exactamente una vez después de reordenar aleatoriamente todo el conjunto de entrenamiento.
Mi implementación se basa en Python y Numpy. Por lo tanto, el uso de operaciones vectoriales puede disminuir notablemente el tiempo de cálculo. Proponer una implementación vectorizada del descenso de gradiente por lotes es bastante sencillo. Sin embargo, en el caso del descenso de gradiente estocástico, no puedo entender cómo evitar el bucle externo que recorre todas las muestras en cada época.
¿Alguien sabe alguna implementación vectorizada de descenso de gradiente estocástico?
EDITAR : Me han preguntado por qué me gustaría usar el descenso de gradiente en línea si el tamaño de mi conjunto de datos es fijo.
A partir de [1], se puede ver que el descenso de gradiente en línea converge más lentamente que el descenso de gradiente por lotes al mínimo del costo empírico. Sin embargo, converge más rápido al mínimo del costo esperado, que mide el rendimiento de la generalización. Me gustaría probar el impacto de estos resultados teóricos en mi problema particular, mediante validación cruzada. Sin una implementación vectorizada, mi código de descenso de gradiente en línea es mucho más lento que el de descenso de gradiente por lotes. Eso aumenta notablemente el tiempo que lleva completar el proceso de validación cruzada.
EDITAR : Incluyo aquí el pseudocódigo de mi implementación de descenso de gradiente en línea, según lo solicitado por ffriend. Estoy resolviendo un problema de regresión.
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] "Aprendizaje en línea a gran escala", L. Bottou, Y. Le Cunn, NIPS 2003.