【发布时间】:2016-05-16 21:06:08
【问题描述】:
我正在尝试使用 MNIST 集(一组手写数字)训练分类器,并且我想实现随机梯度下降算法。这是我写的函数:
def Stochastic_gradient_descent(theta, y, X, alpha, nIter):
costs = numpy.zeros([nIter, 1])
N = y.size
for i in range(nIter):
random = randint(0,49999)
theta -= alpha*(tls.h(theta, X)[random] - y[random])*X[[random],:].T
costs[i] = (1/N)*tls.cost(theta, y, X)
return theta, costs
alpha 是步长
h 是 transpose(theta).X 的 sigmoid 函数
X 是 50000*785,其中 50000 是训练集的大小,785 =(我的图像大小)+1(对于常数 theta0)
此函数运行 100 次迭代 (nIter) 大约需要 9 秒,因此对于 100*1*785 次乘法。我发现的分类器是令人满意的。 我想将此运行时间与梯度下降算法进行比较,其中:
theta -= alpha * (1/N) * (numpy.dot((tls.h(theta, X) - y).T, X)).T
这个函数在大约 12 秒内运行 100 次迭代 (nIter),因此对于 100*50000*785 次乘法, (h(theta,X)-y) 是 50000*1 向量。 我发现的分类器也很令人满意,但我很惊讶,因为这段代码并不比第一个慢很多。我了解矢量化在点函数中起着重要作用,但我预计性能会更差。 有没有办法提高我的随机梯度下降的性能?
感谢您的帮助。
【问题讨论】:
标签: python vectorization gradient stochastic