SciPy Conjugate Gradient Optimization在每次迭代后不调用回调方法

时间:2015-05-11 16:40:52

标签: python optimization machine-learning scipy theano

我遵循教程here以使用theano实现Logistic回归。上述教程使用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"和#34;回调"分别打印。

... 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确实是一个训练时代,我该如何更改行为,以便在callback之后调用train_fn

1 个答案:

答案 0 :(得分:3)

train_fn的每次调用都不是而不是必然是一个训练时代。我不确定fmin_cg是如何实现的,但一般来说,conjugate gradient methods可能会在每个最小化步骤中多次调用成本或渐变函数。这是(据我所知)有时需要找到相对于前一步骤的共轭矢量。 1

因此,每次fmin_cg执行步骤时,都会调用您的回调。如果每次调用成本或渐变函数时都需要调用函数,则可以将调用放在相关函数中。

1.编辑:至少当它们是非线性方法时,至于fmin_cg。维基百科页面表明,vanilla共轭梯度(CG)方法可能不需要多次调用,但我认为它们不适合优化非线性函数。我见过的CG代码 - 我猜想一定是针对非线性CG的 - 每个步骤至少涉及一次线搜索。这当然可以要求对梯度函数进行多次评估。