python - 随机梯度下降和性能

标签 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是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

此函数运行 100 次迭代 (nIter) 大约需要 12 秒,因此对于 100*50000*785 次乘法,因为 (h(theta,X)-y) 是一个 50000*1 向量。 我发现的分类器也令人满意,但我很惊讶,因为这段代码并不比第一个慢多少。我知道矢量化在点函数中起着重要作用,但我预计性能会更差。 有没有办法提高随机梯度下降的性能?

感谢您的帮助。

最佳答案

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

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

附言 像 Caffe、Torch、Theano、Neon (Nirvana) 这样的库......有一些非常复杂和神奇的优化,使它们能够在 GPU 支持之外获得一些非常高的性能。

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

关于python - 随机梯度下降和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35248698/

相关文章:

python - 有趣的 Django `NoReverseMatch error`

python - 向量化微分方程组的正向欧拉法

python - 将掩码结果转换为不同的随机数

c++ - 计算梯度方向

c# - 如何在 iTextSharp 中绘制垂直渐变?

python - 为什么我的 linkExtractor 在 scrapy 蜘蛛中伪装成不抓取允许的链接?

使用 jaccard 相似度的 Python Pandas 距离矩阵

c++ - 是否可以使用 g++ 或 clang++ 获取矢量化报告 - openmp

matlab - 在matlab中快速计算图像的梯度

python - Python 中的自适应 ODE 算法