SciPy 每次迭代后共轭梯度优化不调用回调方法
SciPy Conjugate Gradient Optimisation not invoking callback method after each iteration
为了使用 theano 实现逻辑回归,我遵循了教程 here。上述教程使用 SciPy 的 fmin_cg
优化程序。上述函数的重要参数包括:f
要最小化的 object/cost 函数,x0
用户提供的参数初始猜测,fprime
提供函数 f
在 x
和 callback
处的导数一个可选的用户提供的函数,在每次迭代后调用。
训练函数定义如下:
# 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" 和 "callback" 打印修改 train_fn
和 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
?
对 train_fn
的每次调用 而不是 必然是一个单一的训练时期。我不确定 fmin_cg
是如何实现的,但一般来说,conjugate gradient methods 可能会在每个最小化步骤中多次调用成本或梯度函数。这是(据我所知)有时需要找到相对于上一步的共轭向量。1
因此,每次 fmin_cg
进行 步 时都会调用您的回调。如果需要每次调用cost或者gradient函数的时候都调用一个函数,直接把调用放在相关的函数里面就可以了。
1. 编辑:至少当它们是 非线性 方法时,如 fmin_cg
是。维基百科页面建议普通共轭梯度 (CG) 方法可能不需要多次调用,但我认为它们不适合优化非线性函数。我见过的 CG 代码——我猜这一定是非线性 CG 代码——肯定每一步至少涉及一次线搜索。这当然需要对梯度函数进行多次评估。
为了使用 theano 实现逻辑回归,我遵循了教程 here。上述教程使用 SciPy 的 fmin_cg
优化程序。上述函数的重要参数包括:f
要最小化的 object/cost 函数,x0
用户提供的参数初始猜测,fprime
提供函数 f
在 x
和 callback
处的导数一个可选的用户提供的函数,在每次迭代后调用。
训练函数定义如下:
# 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" 和 "callback" 打印修改 train_fn
和 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
?
对 train_fn
的每次调用 而不是 必然是一个单一的训练时期。我不确定 fmin_cg
是如何实现的,但一般来说,conjugate gradient methods 可能会在每个最小化步骤中多次调用成本或梯度函数。这是(据我所知)有时需要找到相对于上一步的共轭向量。1
因此,每次 fmin_cg
进行 步 时都会调用您的回调。如果需要每次调用cost或者gradient函数的时候都调用一个函数,直接把调用放在相关的函数里面就可以了。
1. 编辑:至少当它们是 非线性 方法时,如 fmin_cg
是。维基百科页面建议普通共轭梯度 (CG) 方法可能不需要多次调用,但我认为它们不适合优化非线性函数。我见过的 CG 代码——我猜这一定是非线性 CG 代码——肯定每一步至少涉及一次线搜索。这当然需要对梯度函数进行多次评估。