【问题标题】:Stochastic gradient descent and performance随机梯度下降和性能
【发布时间】: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


    【解决方案1】:

    就我而言,向量化是提高 SGD 性能的最简单方法。您还可以尝试其他一些事情。例如对 Cython 版本进行编码,使用几个样本的小批量(它们倾向于平均单个样本的“噪声”),或者您可以简单地尝试使用不同的停止标准:提前停止、足够接近零、阈值-停下来,...

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

    附: 像 Caffe、Torch、Theano、Neon (Nirvana) 等库......有一些非常复杂和神奇的优化,除了 GPU 支持之外,它们还能获得一些非常高的性能。

    在一些最流行的库中编码的 ImageNet 获胜者模型的基准测试: https://github.com/soumith/convnet-benchmarks

    【讨论】:

    • 感谢您的回答。事实上,我只是熟悉机器学习,但会尝试测试这些库。我有两个问题:如果我使用小批量(假设大小为 10),我真的会看到使用矢量化的改进吗?由于我的情况没有真正的改进(小批量大小 = 1),我想知道。另外,我可以做些什么来提高我的特定代码的性能,这个小批量大小 = 1?我们知道如何计算“常量*向量”吗?听起来可能很愚蠢,但系数是否一个接一个地乘以常数?还是同时?
    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 2016-09-25
    • 2018-12-10
    • 2021-02-20
    • 2021-12-18
    • 1970-01-01
    • 2011-07-04
    • 2019-06-19
    相关资源
    最近更新 更多