【问题标题】:SciPy Conjugate Gradient Optimisation not invoking callback method after each iterationSciPy 共轭梯度优化在每次迭代后不调用回调方法
【发布时间】:2015-05-11 16:40:51
【问题描述】:

我按照教程 here 来使用 theano 实现逻辑回归。上述教程使用 SciPy 的 fmin_cg 优化过程。上述函数的重要参数包括:f 要最小化的对象/成本函数,x0 用户提供的参数初始猜测,fprime 提供函数 f 的导数的函数xcallback 一个可选的用户提供的函数,在每次迭代后调用。

训练函数定义如下:

# creates a function that computes the average cost on the training set
def train_fn(theta_value):
    classifier.theta.set_value(theta_value, borrow=True)
    train_losses = [batch_cost(i * batch_size)
                    for i in xrange(n_train_batches)]
    return numpy.mean(train_losses)

上述代码的作用基本上是遍历训练数据集中的所有小批量,为每个小批量计算平均批量成本(即应用于小批量中每个训练样本的成本函数的平均值)和平均值所有批次的成本。值得指出的是,每个批次的成本是由 batch_cost 计算的——一个 theano 函数。

在我看来,callback 函数似乎被任意调用,而不是像 SciPy 中的文档所声称的那样在每次迭代之后调用。

这是我在修改train_fncallback 后收到的输出,分别添加“train”和“callback”打印。

... training the model
train
train
train
callback
validation error 29.989583 %
train
callback
validation error 24.437500 %
train
callback
validation error 20.760417 %
train
callback
validation error 16.937500 %
train
callback
validation error 14.270833 %
train
callback
validation error 14.156250 %
train
callback
validation error 13.177083 %
train
callback
validation error 12.270833 %
train
train
callback
validation error 11.697917 %
train
callback
validation error 11.531250 %

我的问题是,由于每次调用train_fn 确实是一个训练时期,我该如何改变行为,以便在train_fn 之后调用callback

【问题讨论】:

    标签: python optimization machine-learning scipy theano


    【解决方案1】:

    train_fn 的每次调用不一定是一个单独的训练时期。我不确定fmin_cg 是如何实现的,但总的来说,conjugate gradient methods 在每个最小化步骤中可能会多次调用成本或梯度函数。这是(据我所知)有时需要找到与上一步相关的共轭向量。1

    所以每次fmin_cg 采取步骤时都会调用您的回调。如果您需要每次调用成本或梯度函数时都调用一个函数,您可以将调用放在相关函数中。

    1. 编辑:至少当它们是 nonlinear 方法时,就像fmin_cg 一样。维基百科页面建议香草共轭梯度(CG)方法可能不需要多次调用,但我认为它们不适合优化非线性函数。我见过的 CG 代码——我猜它一定是非线性 CG 的——肯定每一步至少涉及一次线搜索。这当然需要对梯度函数进行多次评估。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-15
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 2014-01-25
      • 1970-01-01
      相关资源
      最近更新 更多