随机梯度下降和性能

时间:2016-02-07 01:30:42

标签: python vectorization gradient stochastic

我试图用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是转置(theta).X

的sigmoid函数

X是50000 * 785,其中50000是训练集的大小,785 =(我的图像大小)+ 1(对于常数theta0)

此功能在大约9秒内运行100次迭代(nIter),因此对于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向量。 我发现的分类器也令人满意,但我很惊讶,因为这段代码并不比第一段快。我理解矢量化在点函数中起着重要的作用,但我预计会有更差的表现。 有没有办法改善随机梯度下降的表现?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

就我而言,矢量化是提高SGD性能的最简单方法。您还可以尝试其他一些事情。例如,编写一个Cython版本,使用几个样本的小批量(他们倾向于平均单个样本的“噪音”)或者只是你可以尝试使用不同的停止标准:早期停止,接近零到零,阈值 - 停止,...

如果您的目标是实现一些ML学习算法或优化功能,以便将其作为第一次接触来学习,那么就完美了。继续工作。但是如果你想以专业的方式工作,你应该使用已经优化(并且经过良好测试的)库。

P.S。 Caffe,Torch,Theano,Neon(Nirvana)等图书馆有一些非常复杂和神奇的优化,可以让它们在GPU支持下获得一些非常高的性能。

在一些最受欢迎的图书馆中编码的ImageNet获胜者模型的基准: https://github.com/soumith/convnet-benchmarks