【问题标题】:Dealing with Memory Problems in Network with Many Weights处理多权重网络中的内存问题
【发布时间】:2013-02-21 02:51:36
【问题描述】:

我有一个架构为1024, 512, 256, 1 的神经网络(输入层有1024 单元,输出层有1 单元等)。我想使用scipy.optimize 中的一种优化算法来训练这个网络。

问题是这些算法期望函数参数在一个向量中给出;这意味着,就我而言,我必须将所有权重展开为长度向量

1024*512 + 512*256 + 256*1 = 655616

一些算法(如fmin_bfgs)需要使用恒等矩阵,所以它们会调用类似

I = numpy.eye(655616)

不出所料,它产生了MemoryError。除了使scipy.optimize 中的算法适应我自己的需要之外,我有什么办法可以避免将所有权重展开到一个向量中?

【问题讨论】:

  • 哇,要适应很多重量。 (+1)
  • @NPE 我不得不承认我真的不知道自己在做什么。我正在训练大小为32x32 的图像。我应该让图片更小吗?
  • 再一次,将图像的大小减小到16x16 并使用架构256, 128, 1,我仍然拥有长度为32896 的展开权重向量。
  • 一般来说,如果您在 Python 中遇到性能问题,可能是时候尝试使用其他语言完成繁重的工作了。

标签: python numpy machine-learning scipy


【解决方案1】:

我认为内存映射可以解决您的问题。我建议使用numpy.memmap,它针对 numpy 数组进行了优化。请注意,虽然内存映射可能非常快,但您应该留意thrashing

对于您的一般文化,mmap 模块是一个更通用的内存映射库,包含在标准库中。

【讨论】:

    【解决方案2】:

    不要尝试使用 L-BFGS 将权重拟合到 NN。它的效果不是特别好(请参阅 Yann LeCun 早期的论文),并且因为它是一种二阶方法,您将尝试逼近 Hessian,对于这么多的权重,它是一个 655,000 x 650,000 矩阵:这引入了一个根本不合理的性能开销。

    网络没有那么深:您是否有理由避免使用标准的反向支持?如果您可以访问库实现,这只是梯度下降,梯度的计算成本很低,而且因为它只是一阶方法,所以您不会有相同的性能开销。

    编辑:

    反向传播意味着 w_i 在步骤 t 的更新规则是:

    w_i(t) = w_i(t-1) - \alpha (dError / dw_i)

    此外,您还遇到了视觉领域的人经常使用Convolutional NNs 的原因:稀疏连接大大减小了每个像素有一个神经元的权重向量的大小。

    【讨论】:

    • +1 用于指出内存问题是由 Hessian 引起的。我不避免使用标准反向传播,我使用反向传播来计算误差 wrt 的梯度。网络的权重。我仍然需要一个可以遍历误差面的优化算法(使用反向传播计算的梯度)来找到它的最小值。
    • 反向传播,至少我会使用这个术语,意味着使用梯度下降。您可以随机(每个示例依次)或分批进行。 IE。您的更新是步长乘以梯度的负数。
    • 编辑了我的答案,因为我想到了另一个有用的花絮:为此使用了卷积网络。
    • 用什么算法来计算误差梯度wrt。权重叫什么?此外,“反向传播”是否有技术或概念上的原因仅指使用梯度下降进行的训练?
    • 我不认为这是一种算法:权重的误差梯度来自微积分,它们通常是解析的(假设你的激活函数是可微的)。我认为反向传播这个名字来自于对 delta 规则的概括,在对优化方法进行大量研究之前。碰巧这相当于梯度下降。其他方法也是可能的,最著名的是 James Martens 的 Hessian Free 方法,但实现起来并不容易,而且您可能会从简单的反向传播中获得很多好处。
    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多