我想在Tensorflow上为我的网络编写一个新的优化算法。我希望实现Levenberg Marquardt optimization algorithm,现在已从TF API中排除。我发现关于如何编写自定义优化器的文档很差,所以我问是否有人可以给我任何建议。感谢。
答案 0 :(得分:15)
优化器的最简单示例可能是gradient descent optimizer。它显示了如何创建基本optimizer class的实例。优化器基类文档解释了这些方法的用途。
优化器的python端向图中添加了新节点,用于计算和应用反向传播的渐变。它提供了传递给ops的参数,并对优化器进行了一些高级管理。然后,您需要实际的“应用”操作。
Ops同时具有python和C ++组件。编写训练操作与general process of adding an Op to TensorFlow一样(但专门)。
有关计算和应用渐变的一组示例训练操作,请参阅 python/training/training_ops.py - 这是实际培训操作的Python粘合剂。请注意,这里的代码主要是关于形状推断 - 计算将在C ++中进行。
应用渐变的实际数学运算由Op处理(回想一下,ops是用C ++编写的)。在这种情况下,应用渐变操作在core/kernels/training_ops.cc中定义。例如,您可以看到ApplyGradientDescentOp的实现,它引用了一个仿函数ApplyGradientDescent:
var.device(d) -= grad * lr();
Op本身的实现遵循add-an-op docs中描述的任何其他op的实现。
答案 1 :(得分:8)
在运行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()实现更新变量的实际Ops。
Ops通常用C ++编写。无需自己更改C ++标头,您仍然可以通过这些方法返回一些Ops的python包装器。 这样做如下:
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/