【问题标题】:Is there some way can accomplish stochastic gradient descent not from scratch是否有某种方法可以完成随机梯度下降而不是从头开始
【发布时间】:2018-09-27 03:19:25
【问题描述】:

对于标准机器学习问题,例如 MNIST 上的图像分类,损失函数是固定的,因此优化过程可以简单地通过调用函数并将输入输入其中来完成。无需手动推导梯度和编码下降过程。

但现在当我遇到一些复杂的公式时,我感到很困惑。假设我们正在解决一个半监督问题,损失函数有两部分:Ls + lambda * Lu。第一部分是正常的分类公式,例如交叉熵损失。第二部分各不相同。在我的情况下,Lu 是矩阵分解损失,具体为:Lu = MF(D, C * W)。而总损失函数可以写成:

L = \sum log p(yi|xi) + MF(D, C * W) = \sum log p(yi|Wi) + MF(D, C * W) = \sum log p(yi|T * Wi + b) + MF(D, C * W)

其中参数为W, C, Tb。第一部分是分类损失,输入xiW的原始值,即Wi,一个大小为(d, 1)的向量。而标签yi 可以是大小为(c, 1) 的单热向量,因此参数Tb 将输入映射到标签大小。第二部分是矩阵分解损失。

现在,当我要使用 sgd 优化此功能时,我感到很困惑。它可以通过写下公式导出梯度然后从头开始完成训练过程来解决。但我想知道是否有更简单的方法?因为很容易使用 Tensorflow 或 Keras 等深度学习工具来训练分类模型,所以您需要做的就是建立一个网络并提供数据。

同样,在我定义了损失函数之后,有没有可以自动计算梯度的工具?因为派生渐变并从头开始实现它们真的很烦人。分类损失和矩阵分解损失都很常见,所以我认为可以彻底结合。

【问题讨论】:

    标签: python optimization machine-learning tensorflow deep-learning


    【解决方案1】:

    如果您可以在他们的框架/语言中制定优化问题,Theano 和 Tensorflow 将完全为您做到这一点。这些框架也足够通用,可以实现非基于神经网络的算法,比如像您这样的简单的基于一阶的优化。

    如果这不可行,您可以尝试autograd,它可以在 numpy 的子集上执行此操作。只需将您的损失表述为 numpy-function(同时坚持支持的函数;阅读文档)并让 autograd 构建渐变。

    请记住,Theano 和 Tensorflow 使用的有点构建方法会更有效(因为定义更明确的输入,并且因为这两个库更加进化)。

    【讨论】:

    • 非常感谢。我正在阅读 Tensorflow 的手册,因为我以前没有使用过它。我会问我是否遇到其他问题。谢谢你的建议。还有一个问题,我需要导出渐变吗?还是我只需要制定损失函数?
    【解决方案2】:

    Theano 和 Tensorflow 都为您提供了内置的差异化功能。所以你只需要形成损失。

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 1970-01-01
      • 2018-10-17
      • 2014-02-16
      • 2019-11-29
      • 2016-09-25
      • 2018-12-10
      • 2012-12-10
      • 2021-02-20
      相关资源
      最近更新 更多