让我们假设我想使用具有N个样本的数据集来训练随机梯度下降回归算法。由于数据集的大小是固定的,因此我将重复使用数据T次。在每次迭代或“纪元”时,在对整个训练集进行随机重新排序后,我都会使用每个训练样本一次。
我的实现基于Python和Numpy。因此,使用向量运算可以显着减少计算时间。提出批量梯度下降的矢量化实现非常简单。但是,在随机梯度下降的情况下,我无法弄清楚如何避免在每个时期迭代所有样本的外部循环。
有人知道随机梯度下降的任何矢量化实现吗?
编辑:有人问我,如果我的数据集大小固定,为什么要使用在线梯度下降。
从[1]中可以看出,在线梯度下降的收敛速度比批量梯度下降的慢,且经验成本最低。但是,它收敛得更快,达到了预期成本的最小值,从而衡量了通用性能。我想通过交叉验证来测试这些理论结果对我的特定问题的影响。没有矢量化的实现,我的在线梯度下降代码要比批处理梯度下降代码慢得多。这显着增加了完成交叉验证过程所需的时间。
编辑:根据ffriend的要求,我在这里包括了我的在线梯度下降实现的伪代码。我正在解决回归问题。
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]“大规模在线学习”,L。Bottou,Y。Le Cunn,NIPS 2003。