假设我想使用具有 N 个样本的数据集训练随机梯度下降回归算法。由于数据集的大小是固定的,我将重复使用数据 T 次。在每次迭代或“epoch”中,我在对整个训练集进行随机重新排序后,只使用每个训练样本一次。
我的实现基于 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。