我希望在Tensorflow上为我的网络编写一个新的优化算法。 我希望实现Levenberg Marquardt 优化算法,尽管它现在已被排除在TF API之外。 我发现很少关于如何编写自定义优化器的文档,所以我想问问是否有人可以给我一些建议。 谢谢。
我希望在Tensorflow上为我的网络编写一个新的优化算法。 我希望实现Levenberg Marquardt 优化算法,尽管它现在已被排除在TF API之外。 我发现很少关于如何编写自定义优化器的文档,所以我想问问是否有人可以给我一些建议。 谢谢。
最简单的优化器例子可能是梯度下降优化器。它展示了如何创建基本优化器类的实例。优化器基类文档解释了方法的作用。
优化器的Python部分添加了新节点到计算和应用反向传播梯度的图中。它提供传递给操作的参数,并进行一些优化器的高级管理。然后,您需要实际的“应用”操作。
操作具有Python和C++组件。编写训练操作与将操作添加到TensorFlow的一般过程相同(但是是专门的)。
例如一组训练操作,用于计算和应用梯度,请参见python/training/training_ops.py - 这是实际训练操作的Python粘合剂。请注意,这里的代码大多涉及形状推断 - 计算将在C++中进行。
应用梯度的实际数学由Op处理(回想一下,一般来说,ops是用C++编写的)。在这种情况下,应用梯度ops在core/kernels/training_ops.cc中定义。您可以在其中看到ApplyGradientDescentOp的实现,它引用了一个函数对象ApplyGradientDescent:
var.device(d) -= grad * lr();
apply_gradient
操作在进行什么数学运算呢?例如,我正在阅读https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/optimizer.py,但它似乎没有任何数学表达式,梯度下降优化器的代码https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/gradient_descent.py也是一样。我在哪里可以看到如何使用apply gradient呢? - Charlie Parker在运行TensorFlow会话之前,应按照以下所示初始化一个优化器:
# Gradient Descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
tf.train.GradientDescentOptimizer是GradientDescentOptimizer类的一个对象,它实现了梯度下降算法。
方法minimize()带有“cost”参数,并由两个方法compute_gradients()和apply_gradients()组成。
对于大多数(自定义)优化器实现,需要调整方法apply_gradients()。
该方法依赖于新的优化器(类),我们将创建并实现以下方法:_create_slots(),_prepare(),_apply_dense()和_apply_sparse()。
_create_slots()和_prepare()创建和初始化其他变量,例如动量。
_apply_dense()和_apply_sparse()实现实际的操作,更新变量。
操作通常是用C++编写的。通过这些方法,您仍然可以返回一些操作的Python包装器而无需更改C++头文件。实现如下:
def _create_slots(self, var_list):
# Create slots for allocation and later management of additional
# variables associated with the variables to train.
# for example: the first and second moments.
'''
for v in var_list:
self._zeros_slot(v, "m", self._name)
self._zeros_slot(v, "v", self._name)
'''
def _apply_dense(self, grad, var):
#define your favourite variable update
# for example:
'''
# Here we apply gradient descents by substracting the variables
# with the gradient times the learning_rate (defined in __init__)
var_update = state_ops.assign_sub(var, self.learning_rate * grad)
'''
#The trick is now to pass the Ops in the control_flow_ops and
# eventually groups any particular computation of the slots your
# wish to keep track of:
# for example:
'''
m_t = ...m... #do something with m and grad
v_t = ...v... # do something with v and grad
'''
return control_flow_ops.group(*[var_update, m_t, v_t])
如需更详细的解释和示例,请参阅此博客文章 https://www.bigdatarepublic.nl/custom-optimizer-in-tensorflow/
ExternalOptimizerInterface
:https://www.tensorflow.org/api_docs/python/tf/contrib/opt/ExternalOptimizerInterface - hydronium